X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/9456885954b0bff02721bbb14da296be212efdc4..dd9651140d782919e475a6252e4c770c46d96252:/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 02d8c153a8..3442eda244 100644 --- a/services/api/test/functional/arvados/v1/groups_controller_test.rb +++ b/services/api/test/functional/arvados/v1/groups_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 Arvados::V1::GroupsControllerTest < ActionController::TestCase @@ -116,6 +120,7 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase authorize_with :active get :contents, { format: :json, + limit: 200, id: users(:active).uuid } assert_response :success @@ -477,4 +482,227 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase assert_operator(json_response['items'].count, :<, json_response['items_available']) end + + test 'get contents, recursive=true' do + authorize_with :active + params = { + id: groups(:aproject).uuid, + recursive: true, + format: :json, + } + get :contents, params + owners = json_response['items'].map do |item| + item['owner_uuid'] + end + assert_includes(owners, groups(:aproject).uuid) + assert_includes(owners, groups(:asubproject).uuid) + end + + [false, nil].each do |recursive| + test "get contents, recursive=#{recursive.inspect}" do + authorize_with :active + params = { + id: groups(:aproject).uuid, + format: :json, + } + params[:recursive] = false if recursive == false + get :contents, params + owners = json_response['items'].map do |item| + item['owner_uuid'] + end + assert_includes(owners, groups(:aproject).uuid) + refute_includes(owners, groups(:asubproject).uuid) + end + end + + test 'get home project contents, recursive=true' do + authorize_with :active + get :contents, { + id: users(:active).uuid, + recursive: true, + format: :json, + } + owners = json_response['items'].map do |item| + item['owner_uuid'] + end + assert_includes(owners, users(:active).uuid) + assert_includes(owners, groups(:aproject).uuid) + assert_includes(owners, groups(:asubproject).uuid) + end + + ### trashed project tests ### + + [:active, :admin].each do |auth| + # project: to query, to untrash, is visible, parent contents listing success + [[:trashed_project, [], false, true], + [:trashed_project, [:trashed_project], true, true], + [:trashed_subproject, [], false, false], + [:trashed_subproject, [:trashed_project], true, true], + [:trashed_subproject3, [:trashed_project], false, true], + [:trashed_subproject3, [:trashed_subproject3], false, false], + [:trashed_subproject3, [:trashed_project, :trashed_subproject3], true, true], + ].each do |project, untrash, visible, success| + + test "contents listing #{project} #{untrash} as #{auth}" do + authorize_with auth + untrash.each do |pr| + Group.find_by_uuid(groups(pr).uuid).update! is_trashed: false + end + get :contents, { + id: groups(project).owner_uuid, + format: :json + } + if success + assert_response :success + item_uuids = json_response['items'].map do |item| + item['uuid'] + end + if visible + assert_includes(item_uuids, groups(project).uuid) + else + assert_not_includes(item_uuids, groups(project).uuid) + end + else + assert_response 404 + end + end + + test "contents of #{project} #{untrash} as #{auth}" do + authorize_with auth + untrash.each do |pr| + Group.find_by_uuid(groups(pr).uuid).update! is_trashed: false + end + get :contents, { + id: groups(project).uuid, + format: :json + } + if visible + assert_response :success + else + assert_response 404 + end + end + + test "index #{project} #{untrash} as #{auth}" do + authorize_with auth + untrash.each do |pr| + Group.find_by_uuid(groups(pr).uuid).update! is_trashed: false + end + get :index, { + format: :json, + } + assert_response :success + item_uuids = json_response['items'].map do |item| + item['uuid'] + end + if visible + assert_includes(item_uuids, groups(project).uuid) + else + assert_not_includes(item_uuids, groups(project).uuid) + end + end + + test "show #{project} #{untrash} as #{auth}" do + authorize_with auth + untrash.each do |pr| + Group.find_by_uuid(groups(pr).uuid).update! is_trashed: false + end + get :show, { + id: groups(project).uuid, + format: :json + } + if visible + assert_response :success + else + assert_response 404 + end + end + + test "show include_trash #{project} #{untrash} as #{auth}" do + authorize_with auth + untrash.each do |pr| + Group.find_by_uuid(groups(pr).uuid).update! is_trashed: false + end + get :show, { + id: groups(project).uuid, + format: :json, + include_trash: true + } + assert_response :success + end + + test "index include_trash #{project} #{untrash} as #{auth}" do + authorize_with auth + untrash.each do |pr| + Group.find_by_uuid(groups(pr).uuid).update! is_trashed: false + end + get :index, { + format: :json, + include_trash: true + } + assert_response :success + item_uuids = json_response['items'].map do |item| + item['uuid'] + end + assert_includes(item_uuids, groups(project).uuid) + end + end + + test "delete project #{auth}" do + authorize_with auth + [:trashed_project].each do |pr| + Group.find_by_uuid(groups(pr).uuid).update! is_trashed: false + end + assert !Group.find_by_uuid(groups(:trashed_project).uuid).is_trashed + post :destroy, { + id: groups(:trashed_project).uuid, + format: :json, + } + assert_response :success + assert Group.find_by_uuid(groups(:trashed_project).uuid).is_trashed + end + + test "untrash project #{auth}" do + authorize_with auth + assert Group.find_by_uuid(groups(:trashed_project).uuid).is_trashed + post :untrash, { + id: groups(:trashed_project).uuid, + format: :json, + } + assert_response :success + assert !Group.find_by_uuid(groups(:trashed_project).uuid).is_trashed + end + + test "untrash project with name conflict #{auth}" do + authorize_with auth + [:trashed_project].each do |pr| + Group.find_by_uuid(groups(pr).uuid).update! is_trashed: false + end + gc = Group.create!({owner_uuid: "zzzzz-j7d0g-trashedproject1", + name: "trashed subproject 3", + group_class: "project"}) + post :untrash, { + id: groups(:trashed_subproject3).uuid, + format: :json, + ensure_unique_name: true + } + assert_response :success + assert_match /^trashed subproject 3 \(\d{4}-\d\d-\d\d.*?Z\)$/, json_response['name'] + end + + test "move trashed subproject to new owner #{auth}" do + authorize_with auth + assert_nil Group.readable_by(users(auth)).where(uuid: groups(:trashed_subproject).uuid).first + put :update, { + id: groups(:trashed_subproject).uuid, + group: { + owner_uuid: users(:active).uuid + }, + include_trash: true, + format: :json, + } + assert_response :success + assert_not_nil Group.readable_by(users(auth)).where(uuid: groups(:trashed_subproject).uuid).first + end + end end