Repo name and VM are optional to the setup method
[arvados.git] / services / api / test / unit / user_test.rb
1 require 'test_helper'
2
3 class UserTest < ActiveSupport::TestCase
4
5         # The fixture services/api/test/fixtures/users.yml serves as the input for this test case
6         setup do
7                 @all_users = User.find(:all)
8
9                 @all_users.each do |user|
10                         if user.is_admin && user.is_active 
11                                 @admin_user = user
12                         elsif user.is_active && !user.is_admin
13                                 @active_user = user
14                         elsif !user.is_active && !user.is_invited 
15                                 @uninvited_user = user
16                         end
17                 end
18         end
19
20   test "check non-admin active user properties" do
21     assert !@active_user.is_admin, 'is_admin should not be set for a non-admin user'
22     assert @active_user.is_active, 'user should be active'
23     assert @active_user.is_invited, 'is_invited should be set'
24     assert_not_nil @active_user.prefs, "user's preferences should be non-null, but may be size zero"
25                 assert (@active_user.can? :read=>"#{@active_user.uuid}"), "user should be able to read own object"
26                 assert (@active_user.can? :write=>"#{@active_user.uuid}"), "user should be able to write own object"
27                 assert (@active_user.can? :manage=>"#{@active_user.uuid}"), "user should be able to manage own object"
28
29                 assert @active_user.groups_i_can(:read).size > 0, "active user should be able read at least one group"
30
31     # non-admin user cannot manage or write other user objects
32                 assert !(@active_user.can? :read=>"#{@uninvited_user.uuid}")
33                 assert !(@active_user.can? :write=>"#{@uninvited_user.uuid}")
34                 assert !(@active_user.can? :manage=>"#{@uninvited_user.uuid}")
35   end
36
37   test "check admin user properties" do
38     assert @admin_user.is_admin, 'is_admin should be set for admin user'
39     assert @admin_user.is_active, 'admin user cannot be inactive'
40     assert @admin_user.is_invited, 'is_invited should be set'
41     assert_not_nil @admin_user.uuid.size, "user's uuid should be non-null"
42     assert_not_nil @admin_user.prefs, "user's preferences should be non-null, but may be size zero"
43     assert @admin_user.identity_url.size > 0, "user's identity url is expected"
44                 assert @admin_user.can? :read=>"#{@admin_user.uuid}"
45                 assert @admin_user.can? :write=>"#{@admin_user.uuid}"
46                 assert @admin_user.can? :manage=>"#{@admin_user.uuid}"
47
48                 assert @admin_user.groups_i_can(:read).size > 0, "admin active user should be able read at least one group"
49                 assert @admin_user.groups_i_can(:write).size > 0, "admin active user should be able write to at least one group"
50                 assert @admin_user.groups_i_can(:manage).size > 0, "admin active user should be able manage at least one group"
51
52     # admin user can also write or manage other users
53                 assert @admin_user.can? :read=>"#{@uninvited_user.uuid}"
54                 assert @admin_user.can? :write=>"#{@uninvited_user.uuid}"
55                 assert @admin_user.can? :manage=>"#{@uninvited_user.uuid}"
56   end
57
58   test "check inactive and uninvited user properties" do
59     assert !@uninvited_user.is_admin, 'is_admin should not be set for a non-admin user'
60     assert !@uninvited_user.is_active, 'user should be inactive'
61     assert !@uninvited_user.is_invited, 'is_invited should not be set'
62                 assert @uninvited_user.can? :read=>"#{@uninvited_user.uuid}"
63                 assert @uninvited_user.can? :write=>"#{@uninvited_user.uuid}"
64                 assert @uninvited_user.can? :manage=>"#{@uninvited_user.uuid}"
65
66                 assert @uninvited_user.groups_i_can(:read).size == 0, "inactive and uninvited user should not be able read any groups"
67                 assert @uninvited_user.groups_i_can(:write).size == 0, "inactive and uninvited user should not be able write to any groups"
68                 assert @uninvited_user.groups_i_can(:manage).size == 0, "inactive and uninvited user should not be able manage any groups"
69   end
70
71   test "find user method checks" do
72                 User.find(:all).each do |user|
73                         assert_not_nil user.uuid, "non-null uuid expected for " + user.full_name
74                 end
75
76     user = users(:active)               # get the active user
77
78                 found_user = User.find(user.id)         # find a user by the row id
79
80     assert_equal found_user.full_name, user.first_name + ' ' + user.last_name
81     assert_equal found_user.identity_url, user.identity_url
82   end
83
84         test "create new user" do 
85                 Thread.current[:user] = @admin_user     # set admin user as the current user
86
87                 user = User.new
88                 user.first_name = "first_name_for_newly_created_user"
89                 user.save
90
91                 # verify there is one extra user in the db now
92                 assert (User.find(:all).size == @all_users.size+1)
93
94                 user = User.find(user.id)               # get the user back
95                 assert_equal(user.first_name, 'first_name_for_newly_created_user')
96                 assert_not_nil user.uuid, 'uuid should be set for newly created user'
97                 assert_nil user.email, 'email should be null for newly created user, because it was not passed in'
98                 assert_nil user.identity_url, 'identity_url should be null for newly created user, because it was not passed in'
99
100                 user.first_name = 'first_name_for_newly_created_user_updated'
101                 user.save
102                 user = User.find(user.id)               # get the user back
103                 assert_equal(user.first_name, 'first_name_for_newly_created_user_updated')
104         end
105
106         test "update existing user" do 
107                 Thread.current[:user] = @active_user            # set active user as current user
108                 @active_user.first_name = "first_name_changed"
109                 @active_user.save
110
111                 @active_user = User.find(@active_user.id)               # get the user back
112                 assert_equal(@active_user.first_name, 'first_name_changed')
113
114                 # admin user also should be able to update the "active" user info
115                 Thread.current[:user] = @admin_user # set admin user as current user
116                 @active_user.first_name = "first_name_changed_by_admin_for_active_user"
117                 @active_user.save
118
119                 @active_user = User.find(@active_user.id)               # get the user back
120                 assert_equal(@active_user.first_name, 'first_name_changed_by_admin_for_active_user')
121         end
122         
123         test "delete a user and verify" do 
124                 active_user_uuid = @active_user.uuid
125
126                 Thread.current[:user] = @admin_user             
127                 @active_user.delete
128
129                 found_deleted_user = false
130                 User.find(:all).each do |user| 
131                         if user.uuid == active_user_uuid 
132                                 found_deleted_user = true
133                                 break
134                         end                     
135                 end
136                 assert !found_deleted_user, "found deleted user: "+active_user_uuid
137         
138         end
139
140         test "create new user as non-admin user" do
141                 Thread.current[:user] = @active_user
142
143     begin
144                 user = User.new
145                 user.save
146     rescue ArvadosModel::PermissionDeniedError
147     end
148         end
149
150         test "setup new user as non-admin user" do
151                 Thread.current[:user] = @active_user
152
153     begin
154       user = User.new
155       user.email = 'abc@xyz.com'
156                 
157       User.setup user, 'http://openid/prefix'
158     rescue ArvadosModel::PermissionDeniedError
159     end
160         end
161
162 end
163