X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/e838828374ceed5ef6da260939251e86f72b6f27..44c93373e97da98645d41ae8f09c6eef6788bb26:/services/api/test/functional/arvados/v1/groups_controller_test.rb diff --git a/services/api/test/functional/arvados/v1/groups_controller_test.rb b/services/api/test/functional/arvados/v1/groups_controller_test.rb index 4618305b32..fcdce0e600 100644 --- a/services/api/test/functional/arvados/v1/groups_controller_test.rb +++ b/services/api/test/functional/arvados/v1/groups_controller_test.rb @@ -6,12 +6,19 @@ require 'test_helper' class Arvados::V1::GroupsControllerTest < ActionController::TestCase - test "attempt to delete group without read or write access" do + test "attempt to delete group that cannot be seen" do + Rails.configuration.Users.RoleGroupsVisibleToAll = false authorize_with :active post :destroy, params: {id: groups(:empty_lonely_group).uuid} assert_response 404 end + test "attempt to delete group without read or write access" do + authorize_with :active + post :destroy, params: {id: groups(:empty_lonely_group).uuid} + assert_response 403 + end + test "attempt to delete group without write access" do authorize_with :active post :destroy, params: {id: groups(:all_users).uuid} @@ -29,8 +36,9 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase end assert_includes group_uuids, groups(:aproject).uuid assert_includes group_uuids, groups(:asubproject).uuid + assert_includes group_uuids, groups(:private).uuid assert_not_includes group_uuids, groups(:system_group).uuid - assert_not_includes group_uuids, groups(:private).uuid + assert_not_includes group_uuids, groups(:private_and_can_read_foofile).uuid end test "get list of groups that are not projects" do @@ -44,8 +52,6 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase end assert_not_includes group_uuids, groups(:aproject).uuid assert_not_includes group_uuids, groups(:asubproject).uuid - assert_includes group_uuids, groups(:private).uuid - assert_includes group_uuids, groups(:group_with_no_class).uuid end test "get list of groups with bogus group_class" do @@ -148,6 +154,39 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase refute_includes found_uuids, specimens(:in_asubproject).uuid, "specimen appeared unexpectedly in home project" end + test "list collections in home project" do + authorize_with :active + get(:contents, params: { + format: :json, + filters: [ + ['uuid', 'is_a', 'arvados#collection'], + ], + limit: 200, + id: users(:active).uuid, + }) + assert_response :success + found_uuids = json_response['items'].collect { |i| i['uuid'] } + assert_includes found_uuids, collections(:collection_owned_by_active).uuid, "collection did not appear in home project" + refute_includes found_uuids, collections(:collection_owned_by_active_past_version_1).uuid, "collection appeared unexpectedly in home project" + end + + test "list collections in home project, including old versions" do + authorize_with :active + get(:contents, params: { + format: :json, + include_old_versions: true, + filters: [ + ['uuid', 'is_a', 'arvados#collection'], + ], + limit: 200, + id: users(:active).uuid, + }) + assert_response :success + found_uuids = json_response['items'].collect { |i| i['uuid'] } + assert_includes found_uuids, collections(:collection_owned_by_active).uuid, "collection did not appear in home project" + assert_includes found_uuids, collections(:collection_owned_by_active_past_version_1).uuid, "old collection version did not appear in home project" + end + test "user with project read permission can see project collections" do authorize_with :project_viewer get :contents, params: { @@ -317,7 +356,7 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase end end - test "Collection contents don't include manifest_text" do + test "Collection contents don't include manifest_text or unsigned_manifest_text" do authorize_with :active get :contents, params: { id: groups(:aproject).uuid, @@ -328,7 +367,9 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase refute(json_response["items"].any? { |c| not c["portable_data_hash"] }, "response included an item without a portable data hash") refute(json_response["items"].any? { |c| c.include?("manifest_text") }, - "response included an item with a manifest text") + "response included an item with manifest_text") + refute(json_response["items"].any? { |c| c.include?("unsigned_manifest_text") }, + "response included an item with unsigned_manifest_text") end test 'get writable_by list for owned group' do @@ -431,7 +472,8 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase end test 'get contents with jobs and pipeline instances disabled' do - Rails.configuration.API.DisabledAPIs = ['jobs.index', 'pipeline_instances.index'] + Rails.configuration.API.DisabledAPIs = ConfigLoader.to_OrderedOptions( + {'jobs.index'=>{}, 'pipeline_instances.index'=>{}}) authorize_with :active get :contents, params: { @@ -503,11 +545,60 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase assert_includes(owners, groups(:asubproject).uuid) end + [:afiltergroup, :private_role].each do |grp| + test "delete non-project group #{grp}" do + authorize_with :admin + assert_not_nil Group.find_by_uuid(groups(grp).uuid) + assert !Group.find_by_uuid(groups(grp).uuid).is_trashed + post :destroy, params: { + id: groups(grp).uuid, + format: :json, + } + assert_response :success + # Should not be trashed + assert_nil Group.find_by_uuid(groups(grp).uuid) + end + end + + [ + [false, :inactive, :private_role, false], + [false, :spectator, :private_role, false], + [false, :admin, :private_role, true], + [true, :inactive, :private_role, false], + [true, :spectator, :private_role, true], + [true, :admin, :private_role, true], + # project (non-role) groups are invisible even when RoleGroupsVisibleToAll is true + [true, :inactive, :private, false], + [true, :spectator, :private, false], + [true, :admin, :private, true], + ].each do |visibleToAll, userFixture, groupFixture, visible| + test "with RoleGroupsVisibleToAll=#{visibleToAll}, #{groupFixture} group is #{visible ? '' : 'in'}visible to #{userFixture} user" do + Rails.configuration.Users.RoleGroupsVisibleToAll = visibleToAll + authorize_with userFixture + get :show, params: {id: groups(groupFixture).uuid, format: :json} + if visible + assert_response :success + else + assert_response 404 + end + end + end + ### trashed project tests ### - [:active, :admin].each do |auth| + # + # The structure is + # + # trashed_project (zzzzz-j7d0g-trashedproject1) + # trashed_subproject (zzzzz-j7d0g-trashedproject2) + # trashed_subproject3 (zzzzz-j7d0g-trashedproject3) + # zzzzz-xvhdp-cr5trashedcontr + + [:active, + :admin].each do |auth| # project: to query, to untrash, is visible, parent contents listing success - [[:trashed_project, [], false, true], + [ + [:trashed_project, [], false, true], [:trashed_project, [:trashed_project], true, true], [:trashed_subproject, [], false, false], [:trashed_subproject, [:trashed_project], true, true], @@ -736,20 +827,23 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase assert_equal 0, json_response['included'].length end - test 'get shared, owned by non-project' do + test 'get shared, add permission link' do authorize_with :user_bar_in_sharing_group act_as_system_user do - Group.find_by_uuid(groups(:project_owned_by_foo).uuid).update!(owner_uuid: groups(:group_for_sharing_tests).uuid) + Link.create!(tail_uuid: groups(:group_for_sharing_tests).uuid, + head_uuid: groups(:project_owned_by_foo).uuid, + link_class: 'permission', + name: 'can_manage') end get :shared, params: {:filters => [["group_class", "=", "project"]], :include => "owner_uuid"} assert_equal 1, json_response['items'].length - assert_equal json_response['items'][0]["uuid"], groups(:project_owned_by_foo).uuid + assert_equal groups(:project_owned_by_foo).uuid, json_response['items'][0]["uuid"] assert_equal 1, json_response['included'].length - assert_equal json_response['included'][0]["uuid"], groups(:group_for_sharing_tests).uuid + assert_equal users(:user_foo_in_sharing_group).uuid, json_response['included'][0]["uuid"] end ### contents with exclude_home_project @@ -800,20 +894,23 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase assert_equal 0, json_response['included'].length end - test 'contents, exclude home, owned by non-project' do + test 'contents, exclude home, add permission link' do authorize_with :user_bar_in_sharing_group act_as_system_user do - Group.find_by_uuid(groups(:project_owned_by_foo).uuid).update!(owner_uuid: groups(:group_for_sharing_tests).uuid) + Link.create!(tail_uuid: groups(:group_for_sharing_tests).uuid, + head_uuid: groups(:project_owned_by_foo).uuid, + link_class: 'permission', + name: 'can_manage') end get :contents, params: {:include => "owner_uuid", :exclude_home_project => true} assert_equal 1, json_response['items'].length - assert_equal json_response['items'][0]["uuid"], groups(:project_owned_by_foo).uuid + assert_equal groups(:project_owned_by_foo).uuid, json_response['items'][0]["uuid"] assert_equal 1, json_response['included'].length - assert_equal json_response['included'][0]["uuid"], groups(:group_for_sharing_tests).uuid + assert_equal users(:user_foo_in_sharing_group).uuid, json_response['included'][0]["uuid"] end test 'contents, exclude home, with parent specified' do @@ -823,4 +920,24 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase assert_response 422 end + + test "include_trash does not return trash inside frozen project" do + authorize_with :active + trashtime = Time.now - 1.second + outerproj = Group.create!(group_class: 'project') + innerproj = Group.create!(group_class: 'project', owner_uuid: outerproj.uuid) + innercoll = Collection.create!(name: 'inner-not-trashed', owner_uuid: innerproj.uuid) + innertrash = Collection.create!(name: 'inner-trashed', owner_uuid: innerproj.uuid, trash_at: trashtime) + innertrashproj = Group.create!(group_class: 'project', name: 'inner-trashed-proj', owner_uuid: innerproj.uuid, trash_at: trashtime) + outertrash = Collection.create!(name: 'outer-trashed', owner_uuid: outerproj.uuid, trash_at: trashtime) + innerproj.update_attributes!(frozen_by_uuid: users(:active).uuid) + get :contents, params: {id: outerproj.uuid, include_trash: true, recursive: true} + assert_response :success + uuids = json_response['items'].collect { |item| item['uuid'] } + assert_includes uuids, outertrash.uuid + assert_includes uuids, innerproj.uuid + assert_includes uuids, innercoll.uuid + refute_includes uuids, innertrash.uuid + refute_includes uuids, innertrashproj.uuid + end end