3112: update tests to test ajax success and associated popup changes when a report...
[arvados.git] / apps / workbench / test / integration / application_layout_test.rb
1 require 'integration_helper'
2 require 'selenium-webdriver'
3 require 'headless'
4
5 class ApplicationLayoutTest < ActionDispatch::IntegrationTest
6   setup do
7     headless = Headless.new
8     headless.start
9     Capybara.current_driver = :selenium
10
11     @user_profile_form_fields = Rails.configuration.user_profile_form_fields
12   end
13
14   teardown do
15     Rails.configuration.user_profile_form_fields = @user_profile_form_fields
16   end
17
18   def verify_homepage_with_profile user, invited, has_profile
19     profile_config = Rails.configuration.user_profile_form_fields
20
21     if !user
22       assert page.has_text?('Please log in'), 'Not found text - Please log in'
23       assert page.has_text?('The "Log in" button below will show you a Google sign-in page'), 'Not found text - google sign in page'
24       assert page.has_no_text?('My projects'), 'Found text - My projects'
25       assert page.has_link?("Log in to #{Rails.configuration.site_name}"), 'Not found text - log in to'
26     elsif profile_config && !has_profile && user['is_active']
27       add_profile user
28     elsif user['is_active']
29       assert page.has_text?('My projects'), 'Not found text - My projects'
30       assert page.has_text?('Projects shared with me'), 'Not found text - Project shared with me'
31       assert page.has_no_text?('Save profile'), 'Found text - Save profile'
32     elsif invited
33       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 . . .'
34       assert page.has_no_text?('Save profile'), 'Found text - Save profile'
35     else
36       assert page.has_text?('Your account is inactive'), 'Not found text - Your account is inactive'
37       assert page.has_no_text?('Save profile'), 'Found text - Save profile'
38     end
39
40     within('.navbar-fixed-top') do
41       if !user
42         assert page.has_link?('Log in'), 'Not found link - Log in'
43       else
44         # my account menu
45         assert page.has_link?("#{user['email']}"), 'Not found link - email'
46         find('a', text: "#{user['email']}").click
47         within('.dropdown-menu') do
48           if user['is_active']
49             assert page.has_no_link?('Not active'), 'Found link - Not active'
50             assert page.has_no_link?('Sign agreements'), 'Found link - Sign agreements'
51
52             assert page.has_link?('Manage account'), 'No link - Manage account'
53
54             if profile_config
55               assert page.has_link?('Manage profile'), 'No link - Manage profile'
56             else
57               assert page.has_no_link?('Manage profile'), 'Found link - Manage profile'
58             end
59           end
60           assert page.has_link?('Log out'), 'No link - Log out'
61         end
62       end
63     end
64   end
65
66   # test the help menu
67   def check_help_menu
68     within('.navbar-fixed-top') do
69       page.find("#arv-help").click
70       within('.dropdown-menu') do
71         assert page.has_link?('Tutorials and User guide'), 'No link - Tutorials and User guide'
72         assert page.has_link?('API Reference'), 'No link - API Reference'
73         assert page.has_link?('SDK Reference'), 'No link - SDK Reference'
74         assert page.has_link?('Show version / debugging info'), 'No link - Show version / debugging info'
75         assert page.has_link?('Report a problem'), 'No link - Report a problem'
76
77         # check show version info link
78         click_link 'Show version / debugging info'
79       end
80     end
81
82     within '.modal-content' do
83       assert page.has_text?('Version / debugging info'), 'No text - Version / debugging info'
84       assert page.has_no_text?('Report a problem'), 'Found text - Report a problem'
85       assert page.has_text?('Server version'), 'No text - Server version'
86       assert page.has_text?('Server restarted at'), 'No text - Server restarted at'
87       assert page.has_text?('Workbench version'), 'No text - Workbench version'
88       assert page.has_text?('Arvados base'), 'No text - Arvados base'
89       assert page.has_text?('Additional info'), 'No text - Additional info'
90       assert page.has_no_text?('Found a problem?'), 'Found text - Found a problem'
91       assert page.has_button?('Close'), 'No button - Close'
92       assert page.has_no_button?('Report issue'), 'Found button - Report issue'
93       click_button 'Close'
94     end
95
96     # check report issue link
97     within('.navbar-fixed-top') do
98       page.find("#arv-help").click
99       within('.dropdown-menu') do
100         click_link 'Report a problem'
101       end
102     end
103
104     within '.modal-content' do
105       assert page.has_text?('Report a problem'), 'No text - Report a problem'
106       assert page.has_no_text?('Version / debugging info'), 'Found text - Version / debugging info'
107       assert page.has_text?('Server version'), 'No text - Server version'
108       assert page.has_text?('Server restarted at'), 'No text - Server restarted at'
109       assert page.has_text?('Workbench version'), 'No text - Workbench version'
110       assert page.has_text?('Arvados base'), 'No text - Arvados base'
111       assert page.has_text?('Additional info'), 'No text - Additional info'
112       assert page.has_text?('Found a problem?'), 'No text - Found a problem'
113       assert page.has_no_button?('Close'), 'Found button - Close'
114       assert page.has_button?('Report issue'), 'No button - Report issue'
115       assert page.has_button?('Cancel'), 'No button - Cancel'
116
117       # enter a report text and click on report
118       page.find_field('report_issue_text').set 'my test report text'
119       click_button 'Report issue'
120
121       # ajax success updated button texts and added footer message
122       assert page.has_no_button?('Report issue'), 'Found button - Report issue'
123       assert page.has_no_button?('Cancel'), 'Found button - Cancel'
124       assert page.has_text?('Report sent'), 'No text - Report sent'
125       assert page.has_button?('Close'), 'No text - Close'
126       assert page.has_text?('Thanks for reporting this issue'), 'No text - Thanks for reporting this issue'
127
128       click_button 'Close'
129     end
130   end
131
132   def verify_system_menu user
133     if user && user['is_active']
134       look_for_add_new = nil
135       within('.navbar-fixed-top') do
136         page.find("#system-menu").click
137         if user['is_admin']
138           within('.dropdown-menu') do
139             assert page.has_text?('Groups'), 'No text - Groups'
140             assert page.has_link?('Repositories'), 'No link - Repositories'
141             assert page.has_link?('Virtual machines'), 'No link - Virtual machines'
142             assert page.has_link?('SSH keys'), 'No link - SSH keys'
143             assert page.has_link?('API tokens'), 'No link - API tokens'
144             find('a', text: 'Users').click
145             look_for_add_new = 'Add a new user'
146           end
147         else
148           within('.dropdown-menu') do
149             assert page.has_no_text?('Users'), 'Found text - Users'
150             assert page.has_no_link?('Repositories'), 'Found link - Repositories'
151             assert page.has_no_link?('Virtual machines'), 'Found link - Virtual machines'
152             assert page.has_no_link?('SSH keys'), 'Found link - SSH keys'
153             assert page.has_no_link?('API tokens'), 'Found link - API tokens'
154
155             find('a', text: 'Groups').click
156             look_for_add_new = 'Add a new group'
157           end
158         end
159       end
160       if look_for_add_new
161         assert page.has_text? look_for_add_new
162       end
163     else
164       assert page.has_no_link?('#system-menu'), 'Found link - system menu'
165     end
166   end
167
168   # test manage_account page
169   def verify_manage_account user
170     if user && user['is_active']
171       within('.navbar-fixed-top') do
172         find('a', text: "#{user['email']}").click
173         within('.dropdown-menu') do
174           find('a', text: 'Manage account').click
175         end
176       end
177
178       # now in manage account page
179       assert page.has_text?('Virtual Machines'), 'No text - Virtual Machines'
180       assert page.has_text?('Repositories'), 'No text - Repositories'
181       assert page.has_text?('SSH Keys'), 'No text - SSH Keys'
182       assert page.has_text?('Current Token'), 'No text - Current Token'
183
184       assert page.has_text?('The Arvados API token is a secret key that enables the Arvados SDKs to access Arvados'), 'No text - Arvados API token'
185
186       click_link 'Add new SSH key'
187
188       within '.modal-content' do
189         assert page.has_text?('Public Key'), 'No text - Public Key'
190         assert page.has_button?('Cancel'), 'No button - Cancel'
191         assert page.has_button?('Submit'), 'No button - Submit'
192
193         page.find_field('public_key').set 'first test with an incorrect ssh key value'
194         click_button 'Submit'
195         assert page.has_text?('Public key does not appear to be a valid ssh-rsa or dsa public key'), 'No text - Public key does not appear to be a valid'
196
197         public_key_str = api_fixture('authorized_keys')['active']['public_key']
198         page.find_field('public_key').set public_key_str
199         page.find_field('name').set 'added_in_test'
200         click_button 'Submit'
201         assert page.has_text?('Public key already exists in the database, use a different key.'), 'No text - Public key already exists'
202
203         new_key = SSHKey.generate
204         page.find_field('public_key').set new_key.ssh_public_key
205         page.find_field('name').set 'added_in_test'
206         click_button 'Submit'
207       end
208
209       # key must be added. look for it in the refreshed page
210       assert page.has_text?('added_in_test'), 'No text - added_in_test'
211     end
212   end
213
214   # Check manage profile page and add missing profile to the user
215   def add_profile user
216     assert page.has_no_text?('My projects'), 'Found text - My projects'
217     assert page.has_no_text?('Projects shared with me'), 'Found text - Projects shared with me'
218
219     assert page.has_text?('Profile'), 'No text - Profile'
220     assert page.has_text?('First name'), 'No text - First name'
221     assert page.has_text?('Last name'), 'No text - Last name'
222     assert page.has_text?('Identity URL'), 'No text - Identity URL'
223     assert page.has_text?('Email'), 'No text - Email'
224     assert page.has_text?(user['email']), 'No text - user email'
225
226     # Using the default profile which has message and one required field
227
228     # Save profile without filling in the required field. Expect to be back in this profile page again
229     click_button "Save profile"
230     assert page.has_text?('Profile'), 'No text - Profile'
231     assert page.has_text?('First name'), 'No text - First name'
232     assert page.has_text?('Last name'), 'No text - Last name'
233     assert page.has_text?('Save profile'), 'No text - Save profile'
234
235     # This time fill in required field and then save. Expect to go to requested page after that.
236     profile_message = Rails.configuration.user_profile_form_message
237     required_field_title = ''
238     required_field_key = ''
239     profile_config = Rails.configuration.user_profile_form_fields
240     profile_config.andand.each do |entry|
241       if entry['required']
242         required_field_key = entry['key']
243         required_field_title = entry['form_field_title']
244       end
245     end
246
247     assert page.has_text?(profile_message[0,25]), 'No text - configured profile message'
248     assert page.has_text?(required_field_title), 'No text - configured required field title'
249     page.find_field('user[prefs][:profile][:'+required_field_key+']').set 'value to fill required field'
250
251     click_button "Save profile"
252     # profile saved and in profile page now with success
253     assert page.has_text?('Thank you for filling in your profile'), 'No text - Thank you for filling'
254     click_button 'Access Arvados Workbench'
255
256     # profile saved and in home page now
257     assert page.has_text?('My projects'), 'No text - My projects'
258     assert page.has_text?('Projects shared with me'), 'No text - Projects shared with me'
259   end
260
261   # test the search box
262   def verify_search_box user
263     if user && user['is_active']
264       # let's search for a valid uuid
265       within('.navbar-fixed-top') do
266         page.find_field('search').set user['uuid']
267         page.find('.glyphicon-search').click
268       end
269
270       # we should now be in the user's page as a result of search
271       assert page.has_text?(user['first_name']), 'No text - user first name'
272
273       # let's search again for an invalid valid uuid
274       within('.navbar-fixed-top') do
275         search_for = String.new user['uuid']
276         search_for[0]='1'
277         page.find_field('search').set search_for
278         page.find('.glyphicon-search').click
279       end
280
281       # we should see 'not found' error page
282       assert page.has_text?('Not Found'), 'No text - Not Found'
283       assert page.has_link?('Report problem'), 'No text - Report problem'
284       click_link 'Report problem'
285       within '.modal-content' do
286         assert page.has_text?('Report a problem'), 'No text - Report a problem'
287         assert page.has_no_text?('Version / debugging info'), 'No text - Version / debugging info'
288         assert page.has_text?('Server version'), 'No text - Server version'
289         assert page.has_text?('Server restarted at'), 'No text - Server restarted at'
290         assert page.has_text?('Found a problem?'), 'No text - Found a problem'
291         assert page.has_button?('Report issue'), 'No button - Report issue'
292         assert page.has_button?('Cancel'), 'No button - Cancel'
293
294         # enter a report text and click on report
295         page.find_field('report_issue_text').set 'my test report text'
296         click_button 'Report issue'
297
298         # ajax success updated button texts and added footer message
299         assert page.has_no_button?('Report issue'), 'Found button - Report issue'
300         assert page.has_no_button?('Cancel'), 'Found button - Cancel'
301         assert page.has_text?('Report sent'), 'No text - Report sent'
302         assert page.has_button?('Close'), 'No text - Close'
303         assert page.has_text?('Thanks for reporting this issue'), 'No text - Thanks for reporting this issue'
304
305         click_button 'Close'
306       end
307
308       # let's search for the anonymously accessible project
309       publicly_accessible_project = api_fixture('groups')['anonymously_accessible_project']
310
311       within('.navbar-fixed-top') do
312         # search again for the anonymously accessible project
313         page.find_field('search').set publicly_accessible_project['name'][0,10]
314         page.find('.glyphicon-search').click
315       end
316
317       within '.modal-content' do
318         assert page.has_text?('All projects'), 'No text - All projects'
319         assert page.has_text?('Search'), 'No text - Search'
320         assert page.has_text?('Cancel'), 'No text - Cancel'
321         assert_selector('div', text: publicly_accessible_project['name'])
322         find(:xpath, '//div[./span[contains(.,publicly_accessible_project["uuid"])]]').click
323
324         click_button 'Show'
325       end
326
327       # seeing "Unrestricted public data" now
328       assert page.has_text?(publicly_accessible_project['name']), 'No text - publicly accessible project name'
329       assert page.has_text?(publicly_accessible_project['description']), 'No text - publicly accessible project description'
330     end
331   end
332
333   [
334     [nil, nil, false, false],
335     ['inactive', api_fixture('users')['inactive'], true, false],
336     ['inactive_uninvited', api_fixture('users')['inactive_uninvited'], false, false],
337     ['active', api_fixture('users')['active'], true, true],
338     ['admin', api_fixture('users')['admin'], true, true],
339     ['active_no_prefs', api_fixture('users')['active_no_prefs'], true, false],
340     ['active_no_prefs_profile', api_fixture('users')['active_no_prefs_profile'], true, false],
341   ].each do |token, user, invited, has_profile|
342
343     test "visit home page when profile is configured for user #{token}" do
344       # Our test config enabled profile by default. So, no need to update config
345       if !token
346         visit ('/')
347       else
348         visit page_with_token(token)
349       end
350
351       verify_homepage_with_profile user, invited, has_profile
352     end
353
354     test "visit home page when profile not configured for user #{token}" do
355       Rails.configuration.user_profile_form_fields = false
356
357       if !token
358         visit ('/')
359       else
360         visit page_with_token(token)
361       end
362
363       verify_homepage_with_profile user, invited, has_profile
364     end
365
366     test "check help for user #{token}" do
367       if !token
368         visit ('/')
369       else
370         visit page_with_token(token)
371       end
372
373       check_help_menu
374     end
375
376   end
377
378   [
379     ['active', api_fixture('users')['active'], true, true],
380     ['admin', api_fixture('users')['admin'], true, true],
381   ].each do |token, user|
382
383     test "test system menu for user #{token}" do
384       visit page_with_token(token)
385       verify_system_menu user
386     end
387
388     test "test manage account for user #{token}" do
389       visit page_with_token(token)
390       verify_manage_account user
391     end
392
393     test "test search for user #{token}" do
394       visit page_with_token(token)
395       verify_search_box user
396     end
397
398   end
399
400 end