X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/45f10d80d1b584808a6e375214b5be6bc7d2a730..d53b4de9b3b23d8fec31be0254a9a0ec4355884a:/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..7ff123cd45 100644 --- a/apps/workbench/test/controllers/collections_controller_test.rb +++ b/apps/workbench/test/controllers/collections_controller_test.rb @@ -10,6 +10,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 +112,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 +169,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 +206,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 +463,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 +506,274 @@ 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 end