Merge remote-tracking branch 'origin/master' into 14645-fuse-operations-reporting
[arvados.git] / services / api / test / integration / users_test.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 require 'test_helper'
6 require 'helpers/users_test_helper'
7
8 class UsersTest < ActionDispatch::IntegrationTest
9   include UsersTestHelper
10
11   test "setup user multiple times" do
12     repo_name = 'usertestrepo'
13
14     post "/arvados/v1/users/setup", {
15       repo_name: repo_name,
16       openid_prefix: 'https://www.google.com/accounts/o8/id',
17       user: {
18         uuid: 'zzzzz-tpzed-abcdefghijklmno',
19         first_name: "in_create_test_first_name",
20         last_name: "test_last_name",
21         email: "foo@example.com"
22       }
23     }, auth(:admin)
24
25     assert_response :success
26
27     response_items = json_response['items']
28
29     created = find_obj_in_resp response_items, 'arvados#user', nil
30
31     assert_equal 'in_create_test_first_name', created['first_name']
32     assert_not_nil created['uuid'], 'expected non-null uuid for the new user'
33     assert_equal 'zzzzz-tpzed-abcdefghijklmno', created['uuid']
34     assert_not_nil created['email'], 'expected non-nil email'
35     assert_nil created['identity_url'], 'expected no identity_url'
36
37     # arvados#user, repo link and link add user to 'All users' group
38     verify_link response_items, 'arvados#user', true, 'permission', 'can_login',
39         created['uuid'], created['email'], 'arvados#user', false, 'arvados#user'
40
41     verify_link response_items, 'arvados#repository', true, 'permission', 'can_manage',
42         'foo/usertestrepo', created['uuid'], 'arvados#repository', true, 'Repository'
43
44     verify_link response_items, 'arvados#group', true, 'permission', 'can_read',
45         'All users', created['uuid'], 'arvados#group', true, 'Group'
46
47     verify_link response_items, 'arvados#virtualMachine', false, 'permission', 'can_login',
48         nil, created['uuid'], 'arvados#virtualMachine', false, 'VirtualMachine'
49
50     verify_system_group_permission_link_for created['uuid']
51
52     # invoke setup again with the same data
53     post "/arvados/v1/users/setup", {
54       repo_name: repo_name,
55       vm_uuid: virtual_machines(:testvm).uuid,
56       openid_prefix: 'https://www.google.com/accounts/o8/id',
57       user: {
58         uuid: 'zzzzz-tpzed-abcdefghijklmno',
59         first_name: "in_create_test_first_name",
60         last_name: "test_last_name",
61         email: "foo@example.com"
62       }
63     }, auth(:admin)
64     assert_response 422         # cannot create another user with same UUID
65
66     # invoke setup on the same user
67     post "/arvados/v1/users/setup", {
68       repo_name: repo_name,
69       vm_uuid: virtual_machines(:testvm).uuid,
70       openid_prefix: 'https://www.google.com/accounts/o8/id',
71       uuid: 'zzzzz-tpzed-abcdefghijklmno',
72     }, auth(:admin)
73
74     response_items = json_response['items']
75
76     created = find_obj_in_resp response_items, 'arvados#user', nil
77     assert_equal 'in_create_test_first_name', created['first_name']
78     assert_not_nil created['uuid'], 'expected non-null uuid for the new user'
79     assert_equal 'zzzzz-tpzed-abcdefghijklmno', created['uuid']
80     assert_not_nil created['email'], 'expected non-nil email'
81     assert_nil created['identity_url'], 'expected no identity_url'
82
83     # arvados#user, repo link and link add user to 'All users' group
84     verify_link response_items, 'arvados#repository', true, 'permission', 'can_manage',
85         'foo/usertestrepo', created['uuid'], 'arvados#repository', true, 'Repository'
86
87     verify_link response_items, 'arvados#group', true, 'permission', 'can_read',
88         'All users', created['uuid'], 'arvados#group', true, 'Group'
89
90     verify_link response_items, 'arvados#virtualMachine', true, 'permission', 'can_login',
91         virtual_machines(:testvm).uuid, created['uuid'], 'arvados#virtualMachine', false, 'VirtualMachine'
92
93     verify_system_group_permission_link_for created['uuid']
94   end
95
96   test "setup user in multiple steps and verify response" do
97     post "/arvados/v1/users/setup", {
98       openid_prefix: 'http://www.example.com/account',
99       user: {
100         email: "foo@example.com"
101       }
102     }, auth(:admin)
103
104     assert_response :success
105     response_items = json_response['items']
106     created = find_obj_in_resp response_items, 'arvados#user', nil
107
108     assert_not_nil created['uuid'], 'expected uuid for new user'
109     assert_not_nil created['email'], 'expected non-nil email'
110     assert_equal created['email'], 'foo@example.com', 'expected input email'
111
112     # three new links: system_group, arvados#user, and 'All users' group.
113     verify_link response_items, 'arvados#user', true, 'permission', 'can_login',
114         created['uuid'], created['email'], 'arvados#user', false, 'arvados#user'
115
116     verify_link response_items, 'arvados#group', true, 'permission', 'can_read',
117         'All users', created['uuid'], 'arvados#group', true, 'Group'
118
119     verify_link response_items, 'arvados#virtualMachine', false, 'permission', 'can_login',
120         nil, created['uuid'], 'arvados#virtualMachine', false, 'VirtualMachine'
121
122    # invoke setup with a repository
123     post "/arvados/v1/users/setup", {
124       openid_prefix: 'http://www.example.com/account',
125       repo_name: 'newusertestrepo',
126       uuid: created['uuid']
127     }, auth(:admin)
128
129     assert_response :success
130
131     response_items = json_response['items']
132     created = find_obj_in_resp response_items, 'arvados#user', nil
133
134     assert_equal 'foo@example.com', created['email'], 'expected input email'
135
136      # verify links
137     verify_link response_items, 'arvados#group', true, 'permission', 'can_read',
138         'All users', created['uuid'], 'arvados#group', true, 'Group'
139
140     verify_link response_items, 'arvados#repository', true, 'permission', 'can_manage',
141         'foo/newusertestrepo', created['uuid'], 'arvados#repository', true, 'Repository'
142
143     verify_link response_items, 'arvados#virtualMachine', false, 'permission', 'can_login',
144         nil, created['uuid'], 'arvados#virtualMachine', false, 'VirtualMachine'
145
146     # invoke setup with a vm_uuid
147     post "/arvados/v1/users/setup", {
148       vm_uuid: virtual_machines(:testvm).uuid,
149       openid_prefix: 'http://www.example.com/account',
150       user: {
151         email: 'junk_email'
152       },
153       uuid: created['uuid']
154     }, auth(:admin)
155
156     assert_response :success
157
158     response_items = json_response['items']
159     created = find_obj_in_resp response_items, 'arvados#user', nil
160
161     assert_equal created['email'], 'foo@example.com', 'expected original email'
162
163     # verify links
164     verify_link response_items, 'arvados#group', true, 'permission', 'can_read',
165         'All users', created['uuid'], 'arvados#group', true, 'Group'
166
167     verify_link response_items, 'arvados#virtualMachine', true, 'permission', 'can_login',
168         virtual_machines(:testvm).uuid, created['uuid'], 'arvados#virtualMachine', false, 'VirtualMachine'
169   end
170
171   test "setup and unsetup user" do
172     post "/arvados/v1/users/setup", {
173       repo_name: 'newusertestrepo',
174       vm_uuid: virtual_machines(:testvm).uuid,
175       user: {email: 'foo@example.com'},
176       openid_prefix: 'https://www.google.com/accounts/o8/id'
177     }, auth(:admin)
178
179     assert_response :success
180     response_items = json_response['items']
181     created = find_obj_in_resp response_items, 'arvados#user', nil
182     assert_not_nil created['uuid'], 'expected uuid for the new user'
183     assert_equal created['email'], 'foo@example.com', 'expected given email'
184
185     # five extra links: system_group, login, group, repo and vm
186     verify_link response_items, 'arvados#user', true, 'permission', 'can_login',
187         created['uuid'], created['email'], 'arvados#user', false, 'arvados#user'
188
189     verify_link response_items, 'arvados#group', true, 'permission', 'can_read',
190         'All users', created['uuid'], 'arvados#group', true, 'Group'
191
192     verify_link response_items, 'arvados#repository', true, 'permission', 'can_manage',
193         'foo/newusertestrepo', created['uuid'], 'arvados#repository', true, 'Repository'
194
195     verify_link response_items, 'arvados#virtualMachine', true, 'permission', 'can_login',
196         virtual_machines(:testvm).uuid, created['uuid'], 'arvados#virtualMachine', false, 'VirtualMachine'
197
198     verify_link_existence created['uuid'], created['email'], true, true, true, true, false
199
200     post "/arvados/v1/users/#{created['uuid']}/unsetup", {}, auth(:admin)
201
202     assert_response :success
203
204     created2 = json_response
205     assert_not_nil created2['uuid'], 'expected uuid for the newly created user'
206     assert_equal created['uuid'], created2['uuid'], 'expected uuid not found'
207
208     verify_link_existence created['uuid'], created['email'], false, false, false, false, false
209   end
210
211   def find_obj_in_resp (response_items, kind, head_kind=nil)
212     response_items.each do |x|
213       if x && x['kind']
214         return x if (x['kind'] == kind && x['head_kind'] == head_kind)
215       end
216     end
217     nil
218   end
219
220   test 'merge active into project_viewer account' do
221     post('/arvados/v1/groups', {
222            group: {
223              group_class: 'project',
224              name: "active user's stuff",
225            },
226          }, auth(:project_viewer))
227     assert_response(:success)
228     project_uuid = json_response['uuid']
229
230     post('/arvados/v1/users/merge', {
231            new_user_token: api_client_authorizations(:project_viewer_trustedclient).api_token,
232            new_owner_uuid: project_uuid,
233            redirect_to_new_user: true,
234          }, auth(:active_trustedclient))
235     assert_response(:success)
236
237     get('/arvados/v1/users/current', {}, auth(:active))
238     assert_response(:success)
239     assert_equal(users(:project_viewer).uuid, json_response['uuid'])
240
241     get('/arvados/v1/authorized_keys/' + authorized_keys(:active).uuid, {}, auth(:active))
242     assert_response(:success)
243     assert_equal(users(:project_viewer).uuid, json_response['owner_uuid'])
244     assert_equal(users(:project_viewer).uuid, json_response['authorized_user_uuid'])
245
246     get('/arvados/v1/repositories/' + repositories(:foo).uuid, {}, auth(:active))
247     assert_response(:success)
248     assert_equal(users(:project_viewer).uuid, json_response['owner_uuid'])
249
250     get('/arvados/v1/groups/' + groups(:aproject).uuid, {}, auth(:active))
251     assert_response(:success)
252     assert_equal(project_uuid, json_response['owner_uuid'])
253   end
254 end