X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/922da69f42998b29355796e20e4dee0079d4113e..4154420cdd2a2ac6cdb2cc57357f42513fb287cc:/services/api/test/functional/arvados/v1/collections_controller_test.rb diff --git a/services/api/test/functional/arvados/v1/collections_controller_test.rb b/services/api/test/functional/arvados/v1/collections_controller_test.rb index 9c7f4886af..f2c15c656b 100644 --- a/services/api/test/functional/arvados/v1/collections_controller_test.rb +++ b/services/api/test/functional/arvados/v1/collections_controller_test.rb @@ -26,31 +26,8 @@ class Arvados::V1::CollectionsControllerTest < ActionController::TestCase "basic Collections index included manifest_text") end - test "can get non-database fields via index select" do - authorize_with :active - get(:index, filters: [["uuid", "=", collections(:foo_file).uuid]], - select: %w(uuid owner_uuid files)) - assert_response :success - assert_equal(1, json_response["items"].andand.size, - "wrong number of items returned for index") - assert_equal([[".", "foo", 3]], json_response["items"].first["files"], - "wrong file list in index result") - end - - test "can select only non-database fields for index" do - authorize_with :active - get(:index, select: %w(data_size files)) - assert_response :success - assert(json_response["items"].andand.any?, "no items found in index") - json_response["items"].each do |coll| - assert_equal(coll["data_size"], - coll["files"].inject(0) { |size, fspec| size + fspec.last }, - "mismatch between data size and file list") - end - end - test "index with manifest_text selected returns signed locators" do - columns = %w(uuid owner_uuid data_size files manifest_text) + columns = %w(uuid owner_uuid manifest_text) authorize_with :active get :index, select: columns assert_response :success @@ -102,9 +79,8 @@ class Arvados::V1::CollectionsControllerTest < ActionController::TestCase assert_equal 99999, resp['offset'] end - test "create with unsigned manifest" do - permit_unsigned_manifests - authorize_with :active + test "admin can create collection with unsigned manifest" do + authorize_with :admin test_collection = { manifest_text: <<-EOS . d41d8cd98f00b204e9800998ecf8427e+0 0:0:foo.txt @@ -113,7 +89,7 @@ class Arvados::V1::CollectionsControllerTest < ActionController::TestCase ./baz acbd18db4cc2f85cedef654fccc4a4d8+3 0:3:bar.txt EOS } - test_collection[:uuid] = + test_collection[:portable_data_hash] = Digest::MD5.hexdigest(test_collection[:manifest_text]) + '+' + test_collection[:manifest_text].length.to_s @@ -129,56 +105,66 @@ EOS assert_nil assigns(:objects) get :show, { - id: test_collection[:uuid] + id: test_collection[:portable_data_hash] } assert_response :success assert_not_nil assigns(:object) resp = JSON.parse(@response.body) - assert_equal test_collection[:uuid], resp['uuid'] + assert_equal test_collection[:portable_data_hash], resp['portable_data_hash'] # The manifest in the response will have had permission hints added. # Remove any permission hints in the response before comparing it to the source. stripped_manifest = resp['manifest_text'].gsub(/\+A[A-Za-z0-9@_-]+/, '') assert_equal test_collection[:manifest_text], stripped_manifest - assert_equal 9, resp['data_size'] - assert_equal [['.', 'foo.txt', 0], - ['.', 'bar.txt', 6], - ['./baz', 'bar.txt', 3]], resp['files'] end - test "list of files is correct for empty manifest" do + test "create with owner_uuid set to owned group" do + permit_unsigned_manifests authorize_with :active - test_collection = { - manifest_text: "", - uuid: "d41d8cd98f00b204e9800998ecf8427e+0" - } + manifest_text = ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n" post :create, { - collection: test_collection - } - assert_response :success - - get :show, { - id: "d41d8cd98f00b204e9800998ecf8427e+0" + collection: { + owner_uuid: 'zzzzz-j7d0g-rew6elm53kancon', + manifest_text: manifest_text, + portable_data_hash: "d30fe8ae534397864cb96c544f4cf102+47" + } } assert_response :success resp = JSON.parse(@response.body) - assert_equal [], resp['files'] + assert_equal 'zzzzz-j7d0g-rew6elm53kancon', resp['owner_uuid'] end - test "create with owner_uuid set to owned group" do + test "create fails with duplicate name" do permit_unsigned_manifests - authorize_with :active + authorize_with :admin manifest_text = ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n" post :create, { collection: { - owner_uuid: 'zzzzz-j7d0g-rew6elm53kancon', + owner_uuid: 'zzzzz-tpzed-000000000000000', manifest_text: manifest_text, - uuid: "d30fe8ae534397864cb96c544f4cf102" + portable_data_hash: "d30fe8ae534397864cb96c544f4cf102+47", + name: "foo_file" } } + assert_response 422 + end + + test "create succeeds with with duplicate name with ensure_unique_name" do + permit_unsigned_manifests + authorize_with :admin + manifest_text = ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n" + post :create, { + collection: { + owner_uuid: 'zzzzz-tpzed-000000000000000', + manifest_text: manifest_text, + portable_data_hash: "d30fe8ae534397864cb96c544f4cf102+47", + name: "foo_file" + }, + ensure_unique_name: true + } assert_response :success resp = JSON.parse(@response.body) - assert_equal 'zzzzz-tpzed-000000000000000', resp['owner_uuid'] + assert_equal 'foo_file (2)', resp['name'] end test "create with owner_uuid set to group i can_manage" do @@ -187,30 +173,44 @@ EOS manifest_text = ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n" post :create, { collection: { - owner_uuid: 'zzzzz-j7d0g-8ulrifv67tve5sx', + owner_uuid: groups(:active_user_has_can_manage).uuid, manifest_text: manifest_text, - uuid: "d30fe8ae534397864cb96c544f4cf102" + portable_data_hash: "d30fe8ae534397864cb96c544f4cf102+47" } } assert_response :success resp = JSON.parse(@response.body) - assert_equal 'zzzzz-tpzed-000000000000000', resp['owner_uuid'] + assert_equal groups(:active_user_has_can_manage).uuid, resp['owner_uuid'] end - test "create with owner_uuid set to group with no can_manage permission" do + test "create with owner_uuid fails on group with only can_read permission" do permit_unsigned_manifests authorize_with :active manifest_text = ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n" post :create, { collection: { - owner_uuid: 'zzzzz-j7d0g-it30l961gq3t0oi', + owner_uuid: groups(:all_users).uuid, manifest_text: manifest_text, - uuid: "d30fe8ae534397864cb96c544f4cf102" + portable_data_hash: "d30fe8ae534397864cb96c544f4cf102+47" } } assert_response 403 end + test "create with owner_uuid fails on group with no permission" do + permit_unsigned_manifests + authorize_with :active + manifest_text = ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n" + post :create, { + collection: { + owner_uuid: groups(:public).uuid, + manifest_text: manifest_text, + portable_data_hash: "d30fe8ae534397864cb96c544f4cf102+47" + } + } + assert_response 422 + end + test "admin create with owner_uuid set to group with no permission" do permit_unsigned_manifests authorize_with :admin @@ -219,7 +219,7 @@ EOS collection: { owner_uuid: 'zzzzz-j7d0g-it30l961gq3t0oi', manifest_text: manifest_text, - uuid: "d30fe8ae534397864cb96c544f4cf102" + portable_data_hash: "d30fe8ae534397864cb96c544f4cf102+47" } } assert_response :success @@ -232,7 +232,7 @@ EOS collection: <<-EOS { "manifest_text":". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n",\ - "uuid":"d30fe8ae534397864cb96c544f4cf102"\ + "portable_data_hash":"d30fe8ae534397864cb96c544f4cf102+47"\ } EOS } @@ -246,7 +246,7 @@ EOS collection: <<-EOS { "manifest_text":". d41d8cd98f00b204e9800998ecf8427e 0:0:bar.txt\n",\ - "uuid":"d30fe8ae534397864cb96c544f4cf102"\ + "portable_data_hash":"d30fe8ae534397864cb96c544f4cf102+47"\ } EOS } @@ -259,13 +259,13 @@ EOS post :create, { collection: { manifest_text: ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo.txt\n", - uuid: "d30fe8ae534397864cb96c544f4cf102+47+Khint+Xhint+Zhint" + portable_data_hash: "d30fe8ae534397864cb96c544f4cf102+47+Khint+Xhint+Zhint" } } assert_response :success assert_not_nil assigns(:object) resp = JSON.parse(@response.body) - assert_equal "d30fe8ae534397864cb96c544f4cf102+47", resp['uuid'] + assert_equal "d30fe8ae534397864cb96c544f4cf102+47", resp['portable_data_hash'] end test "get full provenance for baz file" do @@ -306,8 +306,8 @@ EOS where: { any: ['contains', '7f9102c395f4ffc5e3'] } } assert_response :success - found = assigns(:objects).collect(&:uuid) - assert_equal 1, found.count + found = assigns(:objects).collect(&:portable_data_hash) + assert_equal 2, found.count assert_equal true, !!found.index('1f4b0bc7583c2a7f9102c395f4ffc5e3+45') end @@ -350,14 +350,13 @@ EOS post :create, { collection: { manifest_text: signed_manifest, - uuid: manifest_uuid, + portable_data_hash: manifest_uuid, } } assert_response :success assert_not_nil assigns(:object) resp = JSON.parse(@response.body) - assert_equal manifest_uuid, resp['uuid'] - assert_equal 48, resp['data_size'] + assert_equal manifest_uuid, resp['portable_data_hash'] # All of the locators in the output must be signed. resp['manifest_text'].lines.each do |entry| m = /([[:xdigit:]]{32}\+\S+)/.match(entry) @@ -398,14 +397,13 @@ EOS post :create, { collection: { manifest_text: signed_manifest, - uuid: manifest_uuid, + portable_data_hash: manifest_uuid, } } assert_response :success assert_not_nil assigns(:object) resp = JSON.parse(@response.body) - assert_equal manifest_uuid, resp['uuid'] - assert_equal 48, resp['data_size'] + assert_equal manifest_uuid, resp['portable_data_hash'] # All of the locators in the output must be signed. resp['manifest_text'].lines.each do |entry| m = /([[:xdigit:]]{32}\+\S+)/.match(entry) @@ -438,7 +436,7 @@ EOS post :create, { collection: { manifest_text: bad_manifest, - uuid: manifest_uuid + portable_data_hash: manifest_uuid } } @@ -462,7 +460,7 @@ EOS post :create, { collection: { manifest_text: signed_manifest, - uuid: manifest_uuid + portable_data_hash: manifest_uuid } } @@ -484,7 +482,7 @@ EOS test_collection = { manifest_text: manifest_text, - uuid: manifest_uuid, + portable_data_hash: manifest_uuid, } post_collection = Marshal.load(Marshal.dump(test_collection)) post :create, { @@ -493,8 +491,7 @@ EOS assert_response :success assert_not_nil assigns(:object) resp = JSON.parse(@response.body) - assert_equal manifest_uuid, resp['uuid'] - assert_equal 48, resp['data_size'] + assert_equal manifest_uuid, resp['portable_data_hash'] # The manifest in the response will have had permission hints added. # Remove any permission hints in the response before comparing it to the source. @@ -526,14 +523,13 @@ EOS post :create, { collection: { manifest_text: signed_manifest, - uuid: manifest_uuid, + portable_data_hash: manifest_uuid, } } assert_response :success assert_not_nil assigns(:object) resp = JSON.parse(@response.body) - assert_equal manifest_uuid, resp['uuid'] - assert_equal 48, resp['data_size'] + assert_equal manifest_uuid, resp['portable_data_hash'] # All of the locators in the output must be signed. # Each line is of the form "path locator locator ... 0:0:file.txt" # entry.split[1..-2] will yield just the tokens in the middle of the line @@ -554,7 +550,7 @@ EOS post :create, { collection: { manifest_text: unsigned_manifest, - uuid: manifest_uuid, + portable_data_hash: manifest_uuid, } } assert_response 403, @@ -562,4 +558,62 @@ EOS assert_empty Collection.where('uuid like ?', manifest_uuid+'%'), "Collection should not exist in database after failed create" end + + test 'List expired collection returns empty list' do + authorize_with :active + get :index, { + where: {name: 'expired_collection'}, + } + assert_response :success + found = assigns(:objects) + assert_equal 0, found.count + end + + test 'Show expired collection returns 404' do + authorize_with :active + get :show, { + id: 'zzzzz-4zz18-mto52zx1s7sn3ih', + } + assert_response 404 + end + + test 'Update expired collection returns 404' do + authorize_with :active + post :update, { + id: 'zzzzz-4zz18-mto52zx1s7sn3ih', + collection: { + name: "still expired" + } + } + assert_response 404 + end + + test 'List collection with future expiration time succeeds' do + authorize_with :active + get :index, { + where: {name: 'collection_expires_in_future'}, + } + found = assigns(:objects) + assert_equal 1, found.count + end + + + test 'Show collection with future expiration time succeeds' do + authorize_with :active + get :show, { + id: 'zzzzz-4zz18-padkqo7yb8d9i3j', + } + assert_response :success + end + + test 'Update collection with future expiration time succeeds' do + authorize_with :active + post :update, { + id: 'zzzzz-4zz18-padkqo7yb8d9i3j', + collection: { + name: "still not expired" + } + } + assert_response :success + end end