X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/8d2aebfd3a0e4814b292659710386f949cafe092..0f644e242ef37c911ad3dc25aca8135c339de349:/apps/workbench/test/controllers/collections_controller_test.rb diff --git a/apps/workbench/test/controllers/collections_controller_test.rb b/apps/workbench/test/controllers/collections_controller_test.rb index 13644e00bd..26d6fda85e 100644 --- a/apps/workbench/test/controllers/collections_controller_test.rb +++ b/apps/workbench/test/controllers/collections_controller_test.rb @@ -1,3 +1,7 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 + require 'test_helper' class CollectionsControllerTest < ActionController::TestCase @@ -10,6 +14,15 @@ class CollectionsControllerTest < ActionController::TestCase NONEXISTENT_COLLECTION = "ffffffffffffffffffffffffffffffff+0" + def config_anonymous enable + Rails.configuration.anonymous_user_token = + if enable + api_fixture('api_client_authorizations')['anonymous']['api_token'] + else + false + end + end + def stub_file_content # For the duration of the current test case, stub file download # content with a randomized (but recognizable) string. Return the @@ -103,13 +116,6 @@ class CollectionsControllerTest < ActionController::TestCase "controller did not find logger job") end - test "viewing a collection fetches logs about it" do - show_collection(:foo_file, :active) - assert_includes(assigns(:logs).map(&:uuid), - api_fixture('logs')['system_adds_foo_file']['uuid'], - "controller did not find related log") - end - test "sharing auths available to admin" do show_collection("collection_owned_by_active", "admin_trustedclient") assert_not_nil assigns(:search_sharing) @@ -167,8 +173,7 @@ class CollectionsControllerTest < ActionController::TestCase end test 'anonymous download' do - Rails.configuration.anonymous_user_token = - api_fixture('api_client_authorizations')['anonymous']['api_token'] + config_anonymous true expect_content = stub_file_content get :show_file, { uuid: api_fixture('collections')['user_agreement_in_anonymously_accessible_project']['uuid'], @@ -205,15 +210,14 @@ class CollectionsControllerTest < ActionController::TestCase "using a reader token set the session's API token") end - [false, api_fixture('api_client_authorizations')['anonymous']['api_token']]. - each do |anon_conf| - test "download a file using a reader token with insufficient scope (anon_conf=#{!!anon_conf})" do - Rails.configuration.anonymous_user_token = anon_conf + [false, true].each do |anon| + test "download a file using a reader token with insufficient scope, anon #{anon}" do + config_anonymous anon params = collection_params(:foo_file, 'foo') params[:reader_token] = api_fixture('api_client_authorizations')['active_noscope']['api_token'] get(:show_file, params) - if anon_conf + if anon # Some files can be shown without a valid token, but not this one. assert_response 404 else @@ -463,8 +467,7 @@ class CollectionsControllerTest < ActionController::TestCase end test "anonymous user accesses collection in shared project" do - Rails.configuration.anonymous_user_token = - api_fixture('api_client_authorizations')['anonymous']['api_token'] + config_anonymous true collection = api_fixture('collections')['public_text_file'] get(:show, {id: collection['uuid']}) @@ -507,11 +510,334 @@ class CollectionsControllerTest < ActionController::TestCase collection = api_fixture('collections')['foo_file'] get :show, {id: collection['uuid']}, session_for(:active) assert_includes @response.body, collection['name'] - assert_match /href="#{collection['uuid']}\/foo" ><\/i> foo 'file1renamed' + }, + format: :json + }, session_for(:active) + assert_response :success + + collection = Collection.select([:uuid, :manifest_text]).where(uuid: collection['uuid']).first + assert_match /. d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:file1renamed 0:0:file2\n.\/dir1 d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:dir1file1 0:0:dir1file2 0:0:dir1imagefile.png\n$/, collection['manifest_text'] + + # now rename 'file2' such that it is moved into 'dir1' + @test_counter = 0 + post :update, { + id: collection['uuid'], + collection: { + 'rename-file-path:file2' => 'dir1/file2' + }, + format: :json + }, session_for(:active) + assert_response :success + + collection = Collection.select([:uuid, :manifest_text]).where(uuid: collection['uuid']).first + assert_match /. d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:file1renamed\n.\/dir1 d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:dir1file1 0:0:dir1file2 0:0:dir1imagefile.png 0:0:file2\n$/, collection['manifest_text'] + + # now rename 'dir1/dir1file1' such that it is moved into a new subdir + @test_counter = 0 + post :update, { + id: collection['uuid'], + collection: { + 'rename-file-path:dir1/dir1file1' => 'dir2/dir3/dir1file1moved' + }, + format: :json + }, session_for(:active) + assert_response :success + + collection = Collection.select([:uuid, :manifest_text]).where(uuid: collection['uuid']).first + assert_match /. d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:file1renamed\n.\/dir1 d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:dir1file2 0:0:dir1imagefile.png 0:0:file2\n.\/dir2\/dir3 d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:dir1file1moved\n$/, collection['manifest_text'] + + # now rename the image file 'dir1/dir1imagefile.png' + @test_counter = 0 + post :update, { + id: collection['uuid'], + collection: { + 'rename-file-path:dir1/dir1imagefile.png' => 'dir1/dir1imagefilerenamed.png' + }, + format: :json + }, session_for(:active) + assert_response :success + + collection = Collection.select([:uuid, :manifest_text]).where(uuid: collection['uuid']).first + assert_match /. d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:file1renamed\n.\/dir1 d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:dir1file2 0:0:dir1imagefilerenamed.png 0:0:file2\n.\/dir2\/dir3 d41d8cd98f00b204e9800998ecf8427e\+0\+A(.*) 0:0:dir1file1moved\n$/, collection['manifest_text'] + end + + test "renaming file with a duplicate name in same stream not allowed" do + use_token :active + + # rename 'file2' as 'file1' and expect error + post :update, { + id: 'zzzzz-4zz18-pyw8yp9g3pr7irn', + collection: { + 'rename-file-path:file2' => 'file1' + }, + format: :json + }, session_for(:active) + assert_response 422 + assert_includes json_response['errors'], 'Duplicate file path' + end + + test "renaming file with a duplicate name as another stream not allowed" do + use_token :active + + # rename 'file1' as 'dir1/file1' and expect error + post :update, { + id: 'zzzzz-4zz18-pyw8yp9g3pr7irn', + collection: { + 'rename-file-path:file1' => 'dir1/file1' + }, + format: :json + }, session_for(:active) + assert_response 422 + assert_includes json_response['errors'], 'Duplicate file path' + end + + [ + [:active, true], + [:spectator, false], + ].each do |user, editable| + test "tags tab #{editable ? 'shows' : 'does not show'} edit button to #{user}" do + use_token user + + get :tags, { + id: api_fixture('collections')['collection_with_tags_owned_by_active']['uuid'], + format: :js, + }, session_for(user) + + assert_response :success + + found = 0 + response.body.scan /]+>/ do |remove_icon| + remove_icon.scan(/\ collection-tag-remove(.*?)\"/).each do |i,| + found += 1 + end + end + + if editable + assert_equal(3, found) # two from the tags + 1 from the hidden "add tag" row + else + assert_equal(0, found) + end + end + end + + test "save_tags and verify that 'other' properties are retained" do + use_token :active + + collection = api_fixture('collections')['collection_with_tags_owned_by_active'] + + new_tags = {"new_tag1" => "new_tag1_value", + "new_tag2" => "new_tag2_value"} + + post :save_tags, { + id: collection['uuid'], + tag_data: new_tags, + format: :js, + }, session_for(:active) + + assert_response :success + assert_equal true, response.body.include?("new_tag1") + assert_equal true, response.body.include?("new_tag1_value") + assert_equal true, response.body.include?("new_tag2") + assert_equal true, response.body.include?("new_tag2_value") + assert_equal false, response.body.include?("existing tag 1") + assert_equal false, response.body.include?("value for existing tag 1") + + updated_tags = Collection.find(collection['uuid']).properties + assert_equal true, updated_tags.keys.include?(:'new_tag1') + assert_equal new_tags['new_tag1'], updated_tags[:'new_tag1'] + assert_equal true, updated_tags.keys.include?(:'new_tag2') + assert_equal new_tags['new_tag2'], updated_tags[:'new_tag2'] + assert_equal false, updated_tags.keys.include?(:'existing tag 1') + assert_equal false, updated_tags.keys.include?(:'existing tag 2') + end end