X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6d2128ae15825ef03472897e09710b176e3cc1d9..4d2b509734d1ac5351ab6da16e08a092ba77f148:/services/api/test/functional/arvados/v1/links_controller_test.rb diff --git a/services/api/test/functional/arvados/v1/links_controller_test.rb b/services/api/test/functional/arvados/v1/links_controller_test.rb index 804e1bdfdb..4058101501 100644 --- a/services/api/test/functional/arvados/v1/links_controller_test.rb +++ b/services/api/test/functional/arvados/v1/links_controller_test.rb @@ -2,17 +2,21 @@ require 'test_helper' class Arvados::V1::LinksControllerTest < ActionController::TestCase - test "no symbol keys in serialized hash" do - link = { - properties: {username: 'testusername'}, - link_class: 'test', - name: 'encoding', - tail_uuid: users(:admin).uuid, - head_uuid: virtual_machines(:testvm).uuid - } - authorize_with :admin - [link, link.to_json].each do |formatted_link| - post :create, link: formatted_link + ['link', 'link_json'].each do |formatted_link| + test "no symbol keys in serialized hash #{formatted_link}" do + link = { + properties: {username: 'testusername'}, + link_class: 'test', + name: 'encoding', + tail_uuid: users(:admin).uuid, + head_uuid: virtual_machines(:testvm).uuid + } + authorize_with :admin + if formatted_link == 'link_json' + post :create, link: link.to_json + else + post :create, link: link + end assert_response :success assert_not_nil assigns(:object) assert_equal 'testusername', assigns(:object).properties['username'] @@ -118,7 +122,7 @@ class Arvados::V1::LinksControllerTest < ActionController::TestCase link_class: 'test', name: 'stuff', head_uuid: users(:active).uuid, - tail_uuid: virtual_machines(:testvm).uuid + tail_uuid: virtual_machines(:testvm2).uuid } authorize_with :active post :create, link: link @@ -165,7 +169,7 @@ class Arvados::V1::LinksControllerTest < ActionController::TestCase assert_response :success found = assigns(:objects) assert_not_equal 0, found.count - assert_equal found.count, (found.select { |f| f.head_uuid.match /[a-f0-9]{32}\+\d+/}).count + assert_equal found.count, (found.select { |f| f.head_uuid.match /.....-4zz18-.............../}).count end test "test can still use where tail_kind" do @@ -270,4 +274,70 @@ class Arvados::V1::LinksControllerTest < ActionController::TestCase assert_response :success end + test "project owner can show a project permission" do + uuid = links(:project_viewer_can_read_project).uuid + authorize_with :active + get :show, id: uuid + assert_response :success + assert_equal(uuid, assigns(:object).andand.uuid) + end + + test "admin can show a project permission" do + uuid = links(:project_viewer_can_read_project).uuid + authorize_with :admin + get :show, id: uuid + assert_response :success + assert_equal(uuid, assigns(:object).andand.uuid) + end + + test "project viewer can't show others' project permissions" do + authorize_with :project_viewer + get :show, id: links(:admin_can_write_aproject).uuid + assert_response 404 + end + + test "requesting a nonexistent link returns 404" do + authorize_with :active + get :show, id: 'zzzzz-zzzzz-zzzzzzzzzzzzzzz' + assert_response 404 + end + + test "retrieve all permissions using generic links index api" do + skip "(not implemented)" + # Links.readable_by() does not return the full set of permission + # links that are visible to a user (i.e., all permission links + # whose head_uuid references an object for which the user has + # ownership or can_manage permission). Therefore, neither does + # /arvados/v1/links. + # + # It is possible to retrieve the full set of permissions for a + # single object via /arvados/v1/permissions. + authorize_with :active + get :index, filters: [['link_class', '=', 'permission'], + ['head_uuid', '=', groups(:aproject).uuid]] + assert_response :success + assert_not_nil assigns(:objects) + assert_includes(assigns(:objects).map(&:uuid), + links(:project_viewer_can_read_project).uuid) + end + + test "admin can index project permissions" do + authorize_with :admin + get :index, filters: [['link_class', '=', 'permission'], + ['head_uuid', '=', groups(:aproject).uuid]] + assert_response :success + assert_not_nil assigns(:objects) + assert_includes(assigns(:objects).map(&:uuid), + links(:project_viewer_can_read_project).uuid) + end + + test "project viewer can't index others' project permissions" do + authorize_with :project_viewer + get :index, filters: [['link_class', '=', 'permission'], + ['head_uuid', '=', groups(:aproject).uuid], + ['tail_uuid', '!=', users(:project_viewer).uuid]] + assert_response :success + assert_not_nil assigns(:objects) + assert_empty assigns(:objects) + end end