Add "create collection" integration test
[arvados.git] / services / api / test / integration / permissions_test.rb
1 require 'test_helper'
2
3 class PermissionsTest < ActionDispatch::IntegrationTest
4   fixtures :users, :groups, :api_client_authorizations, :collections
5
6   test "adding and removing direct can_read links" do
7     # try to read collection as spectator
8     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
9     assert_response 404
10
11     # try to add permission as spectator
12     post "/arvados/v1/links", {
13       :format => :json,
14       :link => {
15         tail_kind: 'arvados#user',
16         tail_uuid: users(:spectator).uuid,
17         link_class: 'permission',
18         name: 'can_read',
19         head_kind: 'arvados#collection',
20         head_uuid: collections(:foo_file).uuid,
21         properties: {}
22       }
23     }, auth(:spectator)
24     assert_response 422
25
26     # add permission as admin
27     post "/arvados/v1/links", {
28       :format => :json,
29       :link => {
30         tail_kind: 'arvados#user',
31         tail_uuid: users(:spectator).uuid,
32         link_class: 'permission',
33         name: 'can_read',
34         head_kind: 'arvados#collection',
35         head_uuid: collections(:foo_file).uuid,
36         properties: {}
37       }
38     }, auth(:admin)
39     u = jresponse['uuid']
40     assert_response :success
41
42     # read collection as spectator
43     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
44     assert_response :success
45
46     # try to delete permission as spectator
47     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:spectator)
48     assert_response 403
49
50     # delete permission as admin
51     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:admin)
52     assert_response :success
53
54     # try to read collection as spectator
55     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
56     assert_response 404
57   end
58
59
60   test "adding can_read links from user to group, group to collection" do
61     # try to read collection as spectator
62     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
63     assert_response 404
64
65     # add permission for spectator to read group
66     post "/arvados/v1/links", {
67       :format => :json,
68       :link => {
69         tail_kind: 'arvados#user',
70         tail_uuid: users(:spectator).uuid,
71         link_class: 'permission',
72         name: 'can_read',
73         head_kind: 'arvados#group',
74         head_uuid: groups(:private).uuid,
75         properties: {}
76       }
77     }, auth(:admin)
78     assert_response :success
79
80     # try to read collection as spectator
81     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
82     assert_response 404
83
84     # add permission for group to read collection
85     post "/arvados/v1/links", {
86       :format => :json,
87       :link => {
88         tail_kind: 'arvados#group',
89         tail_uuid: groups(:private).uuid,
90         link_class: 'permission',
91         name: 'can_read',
92         head_kind: 'arvados#collection',
93         head_uuid: collections(:foo_file).uuid,
94         properties: {}
95       }
96     }, auth(:admin)
97     u = jresponse['uuid']
98     assert_response :success
99
100     # try to read collection as spectator
101     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
102     assert_response :success
103
104     # delete permission for group to read collection
105     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:admin)
106     assert_response :success
107
108     # try to read collection as spectator
109     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
110     assert_response 404
111     
112   end
113
114
115   test "adding can_read links from group to collection, user to group" do
116     # try to read collection as spectator
117     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
118     assert_response 404
119
120     # add permission for group to read collection
121     post "/arvados/v1/links", {
122       :format => :json,
123       :link => {
124         tail_kind: 'arvados#group',
125         tail_uuid: groups(:private).uuid,
126         link_class: 'permission',
127         name: 'can_read',
128         head_kind: 'arvados#collection',
129         head_uuid: collections(:foo_file).uuid,
130         properties: {}
131       }
132     }, auth(:admin)
133     assert_response :success
134
135     # try to read collection as spectator
136     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
137     assert_response 404
138
139     # add permission for spectator to read group
140     post "/arvados/v1/links", {
141       :format => :json,
142       :link => {
143         tail_kind: 'arvados#user',
144         tail_uuid: users(:spectator).uuid,
145         link_class: 'permission',
146         name: 'can_read',
147         head_kind: 'arvados#group',
148         head_uuid: groups(:private).uuid,
149         properties: {}
150       }
151     }, auth(:admin)
152     u = jresponse['uuid']
153     assert_response :success
154
155     # try to read collection as spectator
156     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
157     assert_response :success
158
159     # delete permission for spectator to read group
160     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:admin)
161     assert_response :success
162
163     # try to read collection as spectator
164     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
165     assert_response 404
166     
167   end
168
169   test "adding can_read links from user to group, group to group, group to collection" do
170     # try to read collection as spectator
171     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
172     assert_response 404
173
174     # add permission for user to read group
175     post "/arvados/v1/links", {
176       :format => :json,
177       :link => {
178         tail_kind: 'arvados#user',
179         tail_uuid: users(:spectator).uuid,
180         link_class: 'permission',
181         name: 'can_read',
182         head_kind: 'arvados#group',
183         head_uuid: groups(:private).uuid,
184         properties: {}
185       }
186     }, auth(:admin)
187     assert_response :success
188
189     # add permission for group to read group
190     post "/arvados/v1/links", {
191       :format => :json,
192       :link => {
193         tail_kind: 'arvados#group',
194         tail_uuid: groups(:private).uuid,
195         link_class: 'permission',
196         name: 'can_read',
197         head_kind: 'arvados#group',
198         head_uuid: groups(:empty_lonely_group).uuid,
199         properties: {}
200       }
201     }, auth(:admin)
202     assert_response :success
203
204     # add permission for group to read collection
205     post "/arvados/v1/links", {
206       :format => :json,
207       :link => {
208         tail_kind: 'arvados#group',
209         tail_uuid: groups(:empty_lonely_group).uuid,
210         link_class: 'permission',
211         name: 'can_read',
212         head_kind: 'arvados#collection',
213         head_uuid: collections(:foo_file).uuid,
214         properties: {}
215       }
216     }, auth(:admin)
217     u = jresponse['uuid']
218     assert_response :success
219
220     # try to read collection as spectator
221     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
222     assert_response :success
223
224     # delete permission for group to read collection
225     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:admin)
226     assert_response :success
227
228     # try to read collection as spectator
229     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
230     assert_response 404
231   end
232
233   test "read-only group-admin sees correct subset of user list" do
234     get "/arvados/v1/users", {:format => :json}, auth(:rominiadmin)
235     assert_response :success
236     resp_uuids = jresponse['items'].collect { |i| i['uuid'] }
237     [[true, users(:rominiadmin).uuid],
238      [true, users(:active).uuid],
239      [false, users(:miniadmin).uuid],
240      [false, users(:spectator).uuid]].each do |should_find, uuid|
241       assert_equal should_find, !resp_uuids.index(uuid).nil?, "rominiadmin should #{'not ' if !should_find}see #{uuid} in user list"
242     end
243   end
244
245   test "read-only group-admin cannot modify administered user" do
246     put "/arvados/v1/users/#{users(:active).uuid}", {
247       :user => {
248         first_name: 'KilroyWasHere'
249       },
250       :format => :json
251     }, auth(:rominiadmin)
252     assert_response 403
253   end
254
255   test "read-only group-admin cannot read or update non-administered user" do
256     get "/arvados/v1/users/#{users(:spectator).uuid}", {
257       :format => :json
258     }, auth(:rominiadmin)
259     assert_response 404
260
261     put "/arvados/v1/users/#{users(:spectator).uuid}", {
262       :user => {
263         first_name: 'KilroyWasHere'
264       },
265       :format => :json
266     }, auth(:rominiadmin)
267     assert_response 404
268   end
269
270   test "RO group-admin finds user's specimens, RW group-admin can update" do
271     [[:rominiadmin, false],
272      [:miniadmin, true]].each do |which_user, update_should_succeed|
273       get "/arvados/v1/specimens", {:format => :json}, auth(which_user)
274       assert_response :success
275       resp_uuids = jresponse['items'].collect { |i| i['uuid'] }
276       [[true, specimens(:owned_by_active_user).uuid],
277        [true, specimens(:owned_by_private_group).uuid],
278        [false, specimens(:owned_by_spectator).uuid],
279       ].each do |should_find, uuid|
280         assert_equal(should_find, !resp_uuids.index(uuid).nil?,
281                      "%s should%s see %s in specimen list" %
282                      [which_user.to_s,
283                       should_find ? '' : 'not ',
284                       uuid])
285         put "/arvados/v1/specimens/#{uuid}", {
286           :specimen => {
287             properties: {
288               miniadmin_was_here: true
289             }
290           },
291           :format => :json
292         }, auth(which_user)
293         if !should_find
294           assert_response 404
295         elsif !update_should_succeed
296           assert_response 403
297         else
298           assert_response :success
299         end
300       end
301     end
302   end
303
304 end