Merge branch 'master' into 5383-api-db-current-time
[arvados.git] / services / api / test / unit / user_test.rb
index 30ca2543176ff1c6c7e36c336c92479ca9603698..9bcb0116fba1628bfda8808a7cfbe408da9dc32e 100644 (file)
@@ -9,6 +9,82 @@ class UserTest < ActiveSupport::TestCase
     system_user
   end
 
+  [[false, 'foo@example.com', true, nil],
+   [false, 'bar@example.com', nil, true],
+   [true, 'foo@example.com', true, nil],
+   [true, 'bar@example.com', true, true],
+   [false, false, nil, nil],
+   [true, false, true, nil]
+  ].each do |auto_admin_first_user_config, auto_admin_user_config, foo_should_be_admin, bar_should_be_admin|
+    # In each case, 'foo' is created first, then 'bar', then 'bar2', then 'baz'.
+    test "auto admin with auto_admin_first=#{auto_admin_first_user_config} auto_admin=#{auto_admin_user_config}" do
+
+      if auto_admin_first_user_config
+        # This test requires no admin users exist (except for the system user)
+        users(:admin).delete
+        @all_users = User.where("uuid not like '%-000000000000000'").where(:is_admin => true).find(:all)
+        assert_equal 0, @all_users.size, "No admin users should exist (except for the system user)"
+      end
+
+      Rails.configuration.auto_admin_first_user = auto_admin_first_user_config
+      Rails.configuration.auto_admin_user = auto_admin_user_config
+
+      # See if the foo user has is_admin
+      foo = User.new
+      foo.first_name = 'foo'
+      foo.email = 'foo@example.com'
+
+      act_as_system_user do
+        foo.save!
+      end
+
+      foo = User.find(foo.id)   # get the user back
+      assert_equal foo_should_be_admin, foo.is_admin, "is_admin is wrong for user foo"
+      assert_equal 'foo', foo.first_name
+
+      # See if the bar user has is_admin
+      bar = User.new
+      bar.first_name = 'bar'
+      bar.email = 'bar@example.com'
+
+      act_as_system_user do
+        bar.save!
+      end
+
+      bar = User.find(bar.id)   # get the user back
+      assert_equal bar_should_be_admin, bar.is_admin, "is_admin is wrong for user bar"
+      assert_equal 'bar', bar.first_name
+
+      # A subsequent user with the bar@example.com address should never be
+      # elevated to admin
+      bar2 = User.new
+      bar2.first_name = 'bar2'
+      bar2.email = 'bar@example.com'
+
+      act_as_system_user do
+        bar2.save!
+      end
+
+      bar2 = User.find(bar2.id)   # get the user back
+      assert !bar2.is_admin, "is_admin is wrong for user bar2"
+      assert_equal 'bar2', bar2.first_name
+
+      # An ordinary new user should not be elevated to admin
+      baz = User.new
+      baz.first_name = 'baz'
+      baz.email = 'baz@example.com'
+
+      act_as_system_user do
+        baz.save!
+      end
+
+      baz = User.find(baz.id)   # get the user back
+      assert !baz.is_admin
+      assert_equal 'baz', baz.first_name
+
+    end
+  end
+
   test "check non-admin active user properties" do
     @active_user = users(:active)     # get the active user
     assert !@active_user.is_admin, 'is_admin should not be set for a non-admin user'
@@ -141,11 +217,13 @@ class UserTest < ActiveSupport::TestCase
     [false, [], [], nil, true, true, false],
 
     [false, [], [], 'arvados', true, true, false],
-    [false, [], [], 'arvados', false, false, true],   # since we are not creating repo and vm login, this blaklisted name is not a problem
+    [false, [], [], 'arvados', true, false, false],   # blacklisted username
+    [false, [], [], 'arvados', false, false, true],   # since we are not creating repo and vm login, this blacklisted name is not a problem
 
-    [false, [], [], 'arvados@example.com', false, false, true],   # since we are not creating repo and vm login, this blaklisted name is not a problem
-    [false, [], [], 'arva.dos@example.com', true, true, true],    # not blaklisted name
-    [true, 'active-notify@example.com', 'inactive-notify@example.com', 'root@example.com', true, false, false], # blacklisted name after removing -._ characters
+    [false, [], [], 'arvados@example.com', false, false, true],   # since we are not creating repo and vm login, this blacklisted name is not a problem
+    [true, 'active-notify@example.com', 'inactive-notify@example.com', 'arvados@example.com', false, false, true],   # since we are not creating repo and vm login, this blacklisted name is not a problem
+    [true, 'active-notify@example.com', 'inactive-notify@example.com', 'root@example.com', true, false, false], # blacklisted name
+    [false, 'active-notify@example.com', 'inactive-notify@example.com', 'root@example.com', true, false, false], # blacklisted name
     [true, 'active-notify@example.com', 'inactive-notify@example.com', 'roo_t@example.com', false, true, true], # not blacklisted name
 
     [false, [], [], '@example.com', true, false, false],  # incorrect format
@@ -192,7 +270,7 @@ class UserTest < ActiveSupport::TestCase
     [true, 'active-notify@example.com', 'inactive-notify@example.com', 'r00t@example.com', false, false, true], # no repo or vm login, so format not checked
     [true, 'active-notify@example.com', 'inactive-notify@example.com', 'r00t@example.com', true, false, true], # valid format
 
-  ].each do |active, active_recipients, inactive_recipients, email, auto_setup_vm, auto_setup_repo, valid_username|
+  ].each do |active, new_user_recipients, inactive_recipients, email, auto_setup_vm, auto_setup_repo, ok_to_auto_setup|
     test "create new user with auto setup #{active} #{email} #{auto_setup_vm} #{auto_setup_repo}" do
       auto_setup_new_users = Rails.configuration.auto_setup_new_users
       auto_setup_new_users_with_vm_uuid = Rails.configuration.auto_setup_new_users_with_vm_uuid
@@ -211,7 +289,7 @@ class UserTest < ActiveSupport::TestCase
 
         Rails.configuration.auto_setup_new_users_with_repository = auto_setup_repo
 
-        create_user_and_verify_setup_and_notifications active, active_recipients, inactive_recipients, email, valid_username
+        create_user_and_verify_setup_and_notifications active, new_user_recipients, inactive_recipients, email, ok_to_auto_setup
       ensure
         Rails.configuration.auto_setup_new_users = auto_setup_new_users
         Rails.configuration.auto_setup_new_users_with_vm_uuid = auto_setup_new_users_with_vm_uuid
@@ -443,11 +521,11 @@ class UserTest < ActiveSupport::TestCase
     end
   end
 
-  def create_user_and_verify_setup_and_notifications (active, active_recipients, inactive_recipients, email, valid_username)
-    Rails.configuration.new_user_notification_recipients = active_recipients
+  def create_user_and_verify_setup_and_notifications (active, new_user_recipients, inactive_recipients, email, ok_to_auto_setup)
+    Rails.configuration.new_user_notification_recipients = new_user_recipients
     Rails.configuration.new_inactive_user_notification_recipients = inactive_recipients
 
-    assert_equal active_recipients, Rails.configuration.new_user_notification_recipients
+    assert_equal new_user_recipients, Rails.configuration.new_user_notification_recipients
     assert_equal inactive_recipients, Rails.configuration.new_inactive_user_notification_recipients
 
     ActionMailer::Base.deliveries = []
@@ -463,7 +541,7 @@ class UserTest < ActiveSupport::TestCase
       g[:uuid].match /-f+$/
     end.first
 
-    if !Rails.configuration.auto_setup_new_users || !valid_username
+    if !Rails.configuration.auto_setup_new_users || !ok_to_auto_setup
       # verify that the user is not added to "All groups" by auto_setup
       verify_link_exists false, group[:uuid], user.uuid, 'permission', 'can_read', nil, nil
 
@@ -523,8 +601,9 @@ class UserTest < ActiveSupport::TestCase
 
     new_user_email_subject = "#{Rails.configuration.email_subject_prefix}New user created notification"
     if Rails.configuration.auto_setup_new_users
-      new_user_email_subject = valid_username ? "#{Rails.configuration.email_subject_prefix}New user created and setup notification" :
-                                                "#{Rails.configuration.email_subject_prefix}New user created, but not setup notification"
+      new_user_email_subject = (ok_to_auto_setup || active) ?
+                                 "#{Rails.configuration.email_subject_prefix}New user created and setup notification" :
+                                 "#{Rails.configuration.email_subject_prefix}New user created, but not setup notification"
     end
 
     ActionMailer::Base.deliveries.each do |d|
@@ -535,6 +614,17 @@ class UserTest < ActiveSupport::TestCase
       end
     end
 
+    # both active and inactive user creations should result in new user creation notification mails,
+    # if the new user email recipients config parameter is set
+    if not new_user_recipients.empty? then
+      assert_not_nil new_user_email, 'Expected new user email after setup'
+      assert_equal Rails.configuration.user_notifier_email_from, new_user_email.from[0]
+      assert_equal new_user_recipients, new_user_email.to[0]
+      assert_equal new_user_email_subject, new_user_email.subject
+    else
+      assert_nil new_user_email, 'Did not expect new user email after setup'
+    end
+
     if not active
       if not inactive_recipients.empty? then
         assert_not_nil new_inactive_user_email, 'Expected new inactive user email after setup'
@@ -544,18 +634,8 @@ class UserTest < ActiveSupport::TestCase
       else
         assert_nil new_inactive_user_email, 'Did not expect new inactive user email after setup'
       end
-    end
-
-    if active
+    else
       assert_nil new_inactive_user_email, 'Expected no inactive user email after setting up active user'
-      if (not active_recipients.empty?) && valid_username then
-        assert_not_nil new_user_email, 'Expected new user email after setup'
-        assert_equal Rails.configuration.user_notifier_email_from, new_user_email.from[0]
-        assert_equal active_recipients, new_user_email.to[0]
-        assert_equal new_user_email_subject, new_user_email.subject
-      else
-        assert_nil new_user_email, 'Did not expect new user email after setup'
-      end
     end
     ActionMailer::Base.deliveries = []