4533: Merge branch 'master' into 4533-remote-reset
[arvados.git] / apps / workbench / test / integration / user_profile_test.rb
1 require 'integration_helper'
2 require 'selenium-webdriver'
3 require 'headless'
4
5 class UserProfileTest < ActionDispatch::IntegrationTest
6   reset_api_fixtures :after_suite
7
8   setup do
9     headless = Headless.new
10     headless.start
11     Capybara.current_driver = :selenium
12
13     @user_profile_form_fields = Rails.configuration.user_profile_form_fields
14   end
15
16   teardown do
17     Rails.configuration.user_profile_form_fields = @user_profile_form_fields
18   end
19
20   def verify_homepage_with_profile user, invited, has_profile
21     profile_config = Rails.configuration.user_profile_form_fields
22
23     if !user
24       assert page.has_text?('Please log in'), 'Not found text - Please log in'
25     elsif user['is_active']
26       if profile_config && !has_profile
27         assert page.has_text?('Save profile'), 'No text - Save profile'
28         add_profile user
29       else
30         assert page.has_text?('Active pipelines'), 'Not found text - Active pipelines'
31         assert page.has_no_text?('Save profile'), 'Found text - Save profile'
32       end
33     elsif invited
34       assert page.has_text?('Please check the box below to indicate that you have read and accepted the user agreement'), 'Not found text - Please check the box below . . .'
35       assert page.has_no_text?('Save profile'), 'Found text - Save profile'
36     else
37       assert page.has_text?('Your account is inactive'), 'Not found text - Your account is inactive'
38       assert page.has_no_text?('Save profile'), 'Found text - Save profile'
39     end
40
41     within('.navbar-fixed-top') do
42       if !user
43         assert page.has_link?('Log in'), 'Not found link - Log in'
44       else
45         # my account menu
46         assert page.has_link?("#{user['email']}"), 'Not found link - email'
47         find('a', text: "#{user['email']}").click
48         within('.dropdown-menu') do
49           if user['is_active']
50             assert page.has_no_link?('Not active'), 'Found link - Not active'
51             assert page.has_no_link?('Sign agreements'), 'Found link - Sign agreements'
52
53             assert page.has_link?('Manage account'), 'No link - Manage account'
54
55             if profile_config
56               assert page.has_link?('Manage profile'), 'No link - Manage profile'
57             else
58               assert page.has_no_link?('Manage profile'), 'Found link - Manage profile'
59             end
60           end
61           assert page.has_link?('Log out'), 'No link - Log out'
62         end
63       end
64     end
65   end
66
67   # Check manage profile page and add missing profile to the user
68   def add_profile user
69     assert page.has_no_text?('My projects'), 'Found text - My projects'
70     assert page.has_no_text?('Projects shared with me'), 'Found text - Projects shared with me'
71
72     assert page.has_text?('Profile'), 'No text - Profile'
73     assert page.has_text?('First name'), 'No text - First name'
74     assert page.has_text?('Last name'), 'No text - Last name'
75     assert page.has_text?('Identity URL'), 'No text - Identity URL'
76     assert page.has_text?('Email'), 'No text - Email'
77     assert page.has_text?(user['email']), 'No text - user email'
78
79     # Using the default profile which has message and one required field
80
81     # Save profile without filling in the required field. Expect to be back in this profile page again
82     click_button "Save profile"
83     assert page.has_text?('Profile'), 'No text - Profile'
84     assert page.has_text?('First name'), 'No text - First name'
85     assert page.has_text?('Last name'), 'No text - Last name'
86     assert page.has_text?('Save profile'), 'No text - Save profile'
87
88     # This time fill in required field and then save. Expect to go to requested page after that.
89     profile_message = Rails.configuration.user_profile_form_message
90     required_field_title = ''
91     required_field_key = ''
92     profile_config = Rails.configuration.user_profile_form_fields
93     profile_config.andand.each do |entry|
94       if entry['required']
95         required_field_key = entry['key']
96         required_field_title = entry['form_field_title']
97       end
98     end
99
100     assert page.has_text? profile_message.gsub(/<.*?>/,'')
101     assert page.has_text?(required_field_title), 'No text - configured required field title'
102
103     page.find_field('user[prefs][:profile][:'+required_field_key+']').set 'value to fill required field'
104
105     click_button "Save profile"
106     # profile saved and in profile page now with success
107     assert page.has_text?('Thank you for filling in your profile'), 'No text - Thank you for filling'
108     click_link 'Back to work!'
109
110     # profile saved and in home page now
111     assert page.has_text?('Active pipelines'), 'No text - Active pipelines'
112   end
113
114   [
115     [nil, nil, false, false],
116     ['inactive', api_fixture('users')['inactive'], true, false],
117     ['inactive_uninvited', api_fixture('users')['inactive_uninvited'], false, false],
118     ['active', api_fixture('users')['active'], true, true],
119     ['admin', api_fixture('users')['admin'], true, true],
120     ['active_no_prefs', api_fixture('users')['active_no_prefs'], true, false],
121     ['active_no_prefs_profile', api_fixture('users')['active_no_prefs_profile'], true, false],
122   ].each do |token, user, invited, has_profile|
123
124     test "visit home page when profile is configured for user #{token}" do
125       # Our test config enabled profile by default. So, no need to update config
126       if !token
127         visit ('/')
128       else
129         visit page_with_token(token)
130       end
131
132       verify_homepage_with_profile user, invited, has_profile
133     end
134
135     test "visit home page when profile not configured for user #{token}" do
136       Rails.configuration.user_profile_form_fields = false
137
138       if !token
139         visit ('/')
140       else
141         visit page_with_token(token)
142       end
143
144       verify_homepage_with_profile user, invited, has_profile
145     end
146
147   end
148
149 end