6588: Formatted tests and changed others to be more efficient.
[arvados.git] / apps / workbench / test / integration / application_layout_test.rb
1 require 'integration_helper'
2
3 class ApplicationLayoutTest < ActionDispatch::IntegrationTest
4   # These tests don't do state-changing API calls. Save some time by
5   # skipping the database reset.
6   reset_api_fixtures :after_each_test, false
7   reset_api_fixtures :after_suite, true
8
9   setup do
10     need_javascript
11   end
12
13   def verify_homepage user, invited, has_profile
14     profile_config = Rails.configuration.user_profile_form_fields
15
16     if !user
17       assert page.has_text?('Please log in'), 'Not found text - Please log in'
18       assert page.has_text?('The "Log in" button below will show you a Google sign-in page'), 'Not found text - google sign in page'
19       assert page.has_no_text?('My projects'), 'Found text - My projects'
20       assert page.has_link?("Log in to #{Rails.configuration.site_name}"), 'Not found text - log in to'
21     elsif user['is_active']
22       if profile_config && !has_profile
23         assert page.has_text?('Save profile'), 'No text - Save profile'
24       else
25         assert page.has_link?("Projects"), 'Not found link - Projects'
26         page.find("#projects-menu").click
27         assert_selector 'a', text: 'Add a new project'
28         assert_no_selector 'a', text: 'Browse public projects'
29         assert page.has_text?('Projects shared with me'), 'Not found text - Project shared with me'
30       end
31     elsif invited
32       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 . . .'
33     else
34       assert page.has_text?('Your account is inactive'), 'Not found text - Your account is inactive'
35     end
36
37     within('.navbar-fixed-top') do
38       if !user
39         assert_text Rails.configuration.site_name.downcase
40         assert_no_selector 'a', text: Rails.configuration.site_name.downcase
41         assert page.has_link?('Log in'), 'Not found link - Log in'
42       else
43         # my account menu
44         assert_selector 'a', text: Rails.configuration.site_name.downcase
45         assert(page.has_link?("notifications-menu"), 'no user menu')
46         page.find("#notifications-menu").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_selector "a[href=\"/projects/#{user['uuid']}\"]", text: 'Home project'
53             assert_selector "a[href=\"/users/#{user['uuid']}/virtual_machines\"]", text: 'Virtual machines'
54             assert_selector "a[href=\"/users/#{user['uuid']}/repositories\"]", text: 'Repositories'
55             assert_selector "a[href=\"/current_token\"]", text: 'Current token'
56             assert_selector "a[href=\"/users/#{user['uuid']}/ssh_keys\"]", text: 'SSH keys'
57             assert_selector "a[href=\"/users/#{user['uuid']}/manage_account\"]", text: 'Manage account'
58
59             if profile_config
60               assert_selector "a[href=\"/users/#{user['uuid']}/profile\"]", text: 'Manage profile'
61             else
62               assert_no_selector "a[href=\"/users/#{user['uuid']}/profile\"]", text: 'Manage profile'
63             end
64           else
65             assert_no_selector 'a', text: 'Home project'
66             assert page.has_no_link?('Virtual machines'), 'Found link - Virtual machines'
67             assert page.has_no_link?('Repositories'), 'Found link - Repositories'
68             assert page.has_no_link?('Current token'), 'Found link - Current token'
69             assert page.has_no_link?('SSH keys'), 'Found link - SSH keys'
70             assert page.has_no_link?('Manage account'), 'Found link - Manage account'
71             assert page.has_no_link?('Manage profile'), 'Found link - Manage profile'
72           end
73           assert page.has_link?('Log out'), 'No link - Log out'
74         end
75       end
76     end
77   end
78
79   # test the help menu
80   def check_help_menu
81     within('.navbar-fixed-top') do
82       page.find("#arv-help").click
83       within('.dropdown-menu') do
84         assert_selector 'a', text:'Getting Started ...'
85         assert_selector 'a', text:'Public Pipelines and Data sets'
86         assert page.has_link?('Tutorials and User guide'), 'No link - Tutorials and User guide'
87         assert page.has_link?('API Reference'), 'No link - API Reference'
88         assert page.has_link?('SDK Reference'), 'No link - SDK Reference'
89         assert page.has_link?('Show version / debugging info ...'), 'No link - Show version / debugging info'
90         assert page.has_link?('Report a problem ...'), 'No link - Report a problem'
91         # Version info and Report a problem are tested in "report_issue_test.rb"
92       end
93     end
94   end
95
96   def verify_system_menu user
97     if user && user['is_admin']
98       assert page.has_link?('system-menu'), 'No link - system menu'
99       within('.navbar-fixed-top') do
100         page.find("#system-menu").click
101         within('.dropdown-menu') do
102           assert page.has_text?('Groups'), 'No text - Groups'
103           assert page.has_link?('Repositories'), 'No link - Repositories'
104           assert page.has_link?('Virtual machines'), 'No link - Virtual machines'
105           assert page.has_link?('SSH keys'), 'No link - SSH keys'
106           assert page.has_link?('API tokens'), 'No link - API tokens'
107           find('a', text: 'Users').click
108         end
109       end
110       assert page.has_text? 'Add a new user'
111     else
112       assert page.has_no_link?('system-menu'), 'Found link - system menu'
113     end
114   end
115
116   [
117     [nil, nil, false, false],
118     ['inactive', api_fixture('users')['inactive'], true, false],
119     ['inactive_uninvited', api_fixture('users')['inactive_uninvited'], false, false],
120     ['active', api_fixture('users')['active'], true, true],
121     ['admin', api_fixture('users')['admin'], true, true],
122     ['active_no_prefs', api_fixture('users')['active_no_prefs'], true, false],
123     ['active_no_prefs_profile_no_getting_started_shown',
124         api_fixture('users')['active_no_prefs_profile_no_getting_started_shown'], true, false],
125   ].each do |token, user, invited, has_profile|
126
127     test "visit home page for user #{token}" do
128       if !token
129         visit ('/')
130       else
131         visit page_with_token(token)
132       end
133
134       verify_homepage user, invited, has_profile
135     end
136
137     test "check help for user #{token}" do
138       if !token
139         visit ('/')
140       else
141         visit page_with_token(token)
142       end
143
144       check_help_menu
145     end
146
147     test "test system menu for user #{token}" do
148       if !token
149         visit ('/')
150       else
151         visit page_with_token(token)
152       end
153
154       verify_system_menu user
155     end
156   end
157
158   test "test getting started help menu item" do
159     visit page_with_token('active')
160     within '.navbar-fixed-top' do
161       find('.help-menu > a').click
162       find('.help-menu .dropdown-menu a', text: 'Getting Started ...').click
163     end
164
165     within '.modal-content' do
166       assert_text 'Getting Started'
167       assert_selector 'button:not([disabled])', text: 'Next'
168       assert_no_selector 'button:not([disabled])', text: 'Prev'
169
170       # Use Next button to enable Prev button
171       click_button 'Next'
172       assert_selector 'button:not([disabled])', text: 'Prev'  # Prev button is now enabled
173       click_button 'Prev'
174       assert_no_selector 'button:not([disabled])', text: 'Prev'  # Prev button is again disabled
175
176       # Click Next until last page is reached and verify that it is disabled
177       (0..20).each do |i|   # currently we only have 4 pages, and don't expect to have more than 20 in future
178         click_button 'Next'
179         begin
180           find('button:not([disabled])', text: 'Next')
181         rescue => e
182           break
183         end
184       end
185       assert_no_selector 'button:not([disabled])', text: 'Next'  # Next button is disabled
186       assert_selector 'button:not([disabled])', text: 'Prev'     # Prev button is enabled
187       click_button 'Prev'
188       assert_selector 'button:not([disabled])', text: 'Next'     # Next button is now enabled
189
190       first('button', text: 'x').click
191     end
192     assert_text 'Active pipelines' # seeing dashboard now
193   end
194
195   test "test arvados_public_data_doc_url config unset" do
196     Rails.configuration.arvados_public_data_doc_url = false
197
198     visit page_with_token('active')
199     within '.navbar-fixed-top' do
200       find('.help-menu > a').click
201
202       assert_no_selector 'a', text:'Public Pipelines and Data sets'
203
204       assert_selector 'a', text:'Getting Started ...'
205       assert page.has_link?('Tutorials and User guide'), 'No link - Tutorials and User guide'
206       assert page.has_link?('API Reference'), 'No link - API Reference'
207       assert page.has_link?('SDK Reference'), 'No link - SDK Reference'
208       assert page.has_link?('Show version / debugging info ...'), 'No link - Show version / debugging info'
209       assert page.has_link?('Report a problem ...'), 'No link - Report a problem'
210     end
211   end
212
213   test "no SSH public key notification when shell_in_a_box_url is configured" do
214     Rails.configuration.shell_in_a_box_url = 'example.com'
215     visit page_with_token('job_reader')
216     click_link 'notifications-menu'
217     assert_no_selector 'a', text:'Click here to set up an SSH public key for use with Arvados.'
218     assert_selector 'a', text:'Click here to learn how to run an Arvados Crunch pipeline'
219   end
220
221    [
222     ['Repositories','repository','Attributes'],
223     ['Virtual machines','virtual machine','current_user_logins'],
224     ['SSH keys','authorized key','public_key'],
225     ['Links','link','link_class'],
226     ['Groups','group','group_class'],
227     ['Compute nodes','node','info[ping_secret'],
228     ['Keep services','keep service','service_ssl_flag'],
229     ['Keep disks', 'keep disk','bytes_free'],
230   ].each do |page_name, add_button_text, look_for|
231     test "test system menu #{page_name} link" do
232       skip 'Skip repositories test until #6652 is fixed.' if page_name == 'Repositories'
233
234       visit page_with_token('admin')
235       within('.navbar-fixed-top') do
236         page.find("#system-menu").click
237         within('.dropdown-menu') do
238           assert_selector 'a', text: page_name
239           find('a', text: page_name).click
240         end
241       end
242
243       # click the add button
244       assert_selector 'button', text: "Add a new #{add_button_text}"
245       find('button', text: "Add a new #{add_button_text}").click
246
247       # look for unique property in the created object page
248       assert page.has_text? look_for
249     end
250   end
251 end