diff options
Diffstat (limited to 'bitbake/lib/toaster/tests/browser/test_all_projects_page.py')
-rw-r--r-- | bitbake/lib/toaster/tests/browser/test_all_projects_page.py | 162 |
1 files changed, 147 insertions, 15 deletions
diff --git a/bitbake/lib/toaster/tests/browser/test_all_projects_page.py b/bitbake/lib/toaster/tests/browser/test_all_projects_page.py index 15b03400f9..9ed1901cc9 100644 --- a/bitbake/lib/toaster/tests/browser/test_all_projects_page.py +++ b/bitbake/lib/toaster/tests/browser/test_all_projects_page.py | |||
@@ -7,15 +7,20 @@ | |||
7 | # SPDX-License-Identifier: GPL-2.0-only | 7 | # SPDX-License-Identifier: GPL-2.0-only |
8 | # | 8 | # |
9 | 9 | ||
10 | import os | ||
10 | import re | 11 | import re |
11 | 12 | ||
12 | from django.urls import reverse | 13 | from django.urls import reverse |
13 | from django.utils import timezone | 14 | from django.utils import timezone |
15 | from selenium.webdriver.support.select import Select | ||
14 | from tests.browser.selenium_helpers import SeleniumTestCase | 16 | from tests.browser.selenium_helpers import SeleniumTestCase |
15 | 17 | ||
16 | from orm.models import BitbakeVersion, Release, Project, Build | 18 | from orm.models import BitbakeVersion, Release, Project, Build |
17 | from orm.models import ProjectVariable | 19 | from orm.models import ProjectVariable |
18 | 20 | ||
21 | from selenium.webdriver.common.by import By | ||
22 | |||
23 | |||
19 | class TestAllProjectsPage(SeleniumTestCase): | 24 | class TestAllProjectsPage(SeleniumTestCase): |
20 | """ Browser tests for projects page /projects/ """ | 25 | """ Browser tests for projects page /projects/ """ |
21 | 26 | ||
@@ -25,7 +30,8 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
25 | 30 | ||
26 | def setUp(self): | 31 | def setUp(self): |
27 | """ Add default project manually """ | 32 | """ Add default project manually """ |
28 | project = Project.objects.create_project(self.CLI_BUILDS_PROJECT_NAME, None) | 33 | project = Project.objects.create_project( |
34 | self.CLI_BUILDS_PROJECT_NAME, None) | ||
29 | self.default_project = project | 35 | self.default_project = project |
30 | self.default_project.is_default = True | 36 | self.default_project.is_default = True |
31 | self.default_project.save() | 37 | self.default_project.save() |
@@ -35,6 +41,17 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
35 | 41 | ||
36 | self.release = None | 42 | self.release = None |
37 | 43 | ||
44 | def _create_projects(self, nb_project=10): | ||
45 | projects = [] | ||
46 | for i in range(1, nb_project + 1): | ||
47 | projects.append( | ||
48 | Project( | ||
49 | name='test project {}'.format(i), | ||
50 | release=self.release, | ||
51 | ) | ||
52 | ) | ||
53 | Project.objects.bulk_create(projects) | ||
54 | |||
38 | def _add_build_to_default_project(self): | 55 | def _add_build_to_default_project(self): |
39 | """ Add a build to the default project (not used in all tests) """ | 56 | """ Add a build to the default project (not used in all tests) """ |
40 | now = timezone.now() | 57 | now = timezone.now() |
@@ -45,12 +62,14 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
45 | 62 | ||
46 | def _add_non_default_project(self): | 63 | def _add_non_default_project(self): |
47 | """ Add another project """ | 64 | """ Add another project """ |
48 | bbv = BitbakeVersion.objects.create(name='test bbv', giturl='/tmp/', | 65 | builldir = os.environ.get('BUILDDIR', './') |
66 | bbv = BitbakeVersion.objects.create(name='test bbv', giturl=f'{builldir}/', | ||
49 | branch='master', dirpath='') | 67 | branch='master', dirpath='') |
50 | self.release = Release.objects.create(name='test release', | 68 | self.release = Release.objects.create(name='test release', |
51 | branch_name='master', | 69 | branch_name='master', |
52 | bitbake_version=bbv) | 70 | bitbake_version=bbv) |
53 | self.project = Project.objects.create_project(self.PROJECT_NAME, self.release) | 71 | self.project = Project.objects.create_project( |
72 | self.PROJECT_NAME, self.release) | ||
54 | self.project.is_default = False | 73 | self.project.is_default = False |
55 | self.project.save() | 74 | self.project.save() |
56 | 75 | ||
@@ -62,7 +81,7 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
62 | 81 | ||
63 | def _get_row_for_project(self, project_name): | 82 | def _get_row_for_project(self, project_name): |
64 | """ Get the HTML row for a project, or None if not found """ | 83 | """ Get the HTML row for a project, or None if not found """ |
65 | self.wait_until_present('#projectstable tbody tr') | 84 | self.wait_until_visible('#projectstable tbody tr', poll=3) |
66 | rows = self.find_all('#projectstable tbody tr') | 85 | rows = self.find_all('#projectstable tbody tr') |
67 | 86 | ||
68 | # find the row with a project name matching the one supplied | 87 | # find the row with a project name matching the one supplied |
@@ -93,7 +112,8 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
93 | url = reverse('all-projects') | 112 | url = reverse('all-projects') |
94 | self.get(url) | 113 | self.get(url) |
95 | 114 | ||
96 | default_project_row = self._get_row_for_project(self.default_project.name) | 115 | default_project_row = self._get_row_for_project( |
116 | self.default_project.name) | ||
97 | 117 | ||
98 | self.assertNotEqual(default_project_row, None, | 118 | self.assertNotEqual(default_project_row, None, |
99 | 'default project "cli builds" should be in page') | 119 | 'default project "cli builds" should be in page') |
@@ -113,11 +133,12 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
113 | self.wait_until_visible("#projectstable tr") | 133 | self.wait_until_visible("#projectstable tr") |
114 | 134 | ||
115 | # find the row for the default project | 135 | # find the row for the default project |
116 | default_project_row = self._get_row_for_project(self.default_project.name) | 136 | default_project_row = self._get_row_for_project( |
137 | self.default_project.name) | ||
117 | 138 | ||
118 | # check the release text for the default project | 139 | # check the release text for the default project |
119 | selector = 'span[data-project-field="release"] span.text-muted' | 140 | selector = 'span[data-project-field="release"] span.text-muted' |
120 | element = default_project_row.find_element_by_css_selector(selector) | 141 | element = default_project_row.find_element(By.CSS_SELECTOR, selector) |
121 | text = element.text.strip() | 142 | text = element.text.strip() |
122 | self.assertEqual(text, 'Not applicable', | 143 | self.assertEqual(text, 'Not applicable', |
123 | 'release should be "not applicable" for default project') | 144 | 'release should be "not applicable" for default project') |
@@ -127,7 +148,7 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
127 | 148 | ||
128 | # check the link in the release cell for the other project | 149 | # check the link in the release cell for the other project |
129 | selector = 'span[data-project-field="release"]' | 150 | selector = 'span[data-project-field="release"]' |
130 | element = other_project_row.find_element_by_css_selector(selector) | 151 | element = other_project_row.find_element(By.CSS_SELECTOR, selector) |
131 | text = element.text.strip() | 152 | text = element.text.strip() |
132 | self.assertEqual(text, self.release.name, | 153 | self.assertEqual(text, self.release.name, |
133 | 'release name should be shown for non-default project') | 154 | 'release name should be shown for non-default project') |
@@ -148,11 +169,12 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
148 | self.wait_until_visible("#projectstable tr") | 169 | self.wait_until_visible("#projectstable tr") |
149 | 170 | ||
150 | # find the row for the default project | 171 | # find the row for the default project |
151 | default_project_row = self._get_row_for_project(self.default_project.name) | 172 | default_project_row = self._get_row_for_project( |
173 | self.default_project.name) | ||
152 | 174 | ||
153 | # check the machine cell for the default project | 175 | # check the machine cell for the default project |
154 | selector = 'span[data-project-field="machine"] span.text-muted' | 176 | selector = 'span[data-project-field="machine"] span.text-muted' |
155 | element = default_project_row.find_element_by_css_selector(selector) | 177 | element = default_project_row.find_element(By.CSS_SELECTOR, selector) |
156 | text = element.text.strip() | 178 | text = element.text.strip() |
157 | self.assertEqual(text, 'Not applicable', | 179 | self.assertEqual(text, 'Not applicable', |
158 | 'machine should be not applicable for default project') | 180 | 'machine should be not applicable for default project') |
@@ -162,7 +184,7 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
162 | 184 | ||
163 | # check the link in the machine cell for the other project | 185 | # check the link in the machine cell for the other project |
164 | selector = 'span[data-project-field="machine"]' | 186 | selector = 'span[data-project-field="machine"]' |
165 | element = other_project_row.find_element_by_css_selector(selector) | 187 | element = other_project_row.find_element(By.CSS_SELECTOR, selector) |
166 | text = element.text.strip() | 188 | text = element.text.strip() |
167 | self.assertEqual(text, self.MACHINE_NAME, | 189 | self.assertEqual(text, self.MACHINE_NAME, |
168 | 'machine name should be shown for non-default project') | 190 | 'machine name should be shown for non-default project') |
@@ -183,13 +205,15 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
183 | self.get(reverse('all-projects')) | 205 | self.get(reverse('all-projects')) |
184 | 206 | ||
185 | # find the row for the default project | 207 | # find the row for the default project |
186 | default_project_row = self._get_row_for_project(self.default_project.name) | 208 | default_project_row = self._get_row_for_project( |
209 | self.default_project.name) | ||
187 | 210 | ||
188 | # check the link on the name field | 211 | # check the link on the name field |
189 | selector = 'span[data-project-field="name"] a' | 212 | selector = 'span[data-project-field="name"] a' |
190 | element = default_project_row.find_element_by_css_selector(selector) | 213 | element = default_project_row.find_element(By.CSS_SELECTOR, selector) |
191 | link_url = element.get_attribute('href').strip() | 214 | link_url = element.get_attribute('href').strip() |
192 | expected_url = reverse('projectbuilds', args=(self.default_project.id,)) | 215 | expected_url = reverse( |
216 | 'projectbuilds', args=(self.default_project.id,)) | ||
193 | msg = 'link on default project name should point to builds but was %s' % link_url | 217 | msg = 'link on default project name should point to builds but was %s' % link_url |
194 | self.assertTrue(link_url.endswith(expected_url), msg) | 218 | self.assertTrue(link_url.endswith(expected_url), msg) |
195 | 219 | ||
@@ -198,8 +222,116 @@ class TestAllProjectsPage(SeleniumTestCase): | |||
198 | 222 | ||
199 | # check the link for the other project | 223 | # check the link for the other project |
200 | selector = 'span[data-project-field="name"] a' | 224 | selector = 'span[data-project-field="name"] a' |
201 | element = other_project_row.find_element_by_css_selector(selector) | 225 | element = other_project_row.find_element(By.CSS_SELECTOR, selector) |
202 | link_url = element.get_attribute('href').strip() | 226 | link_url = element.get_attribute('href').strip() |
203 | expected_url = reverse('project', args=(self.project.id,)) | 227 | expected_url = reverse('project', args=(self.project.id,)) |
204 | msg = 'link on project name should point to configuration but was %s' % link_url | 228 | msg = 'link on project name should point to configuration but was %s' % link_url |
205 | self.assertTrue(link_url.endswith(expected_url), msg) | 229 | self.assertTrue(link_url.endswith(expected_url), msg) |
230 | |||
231 | def test_allProject_table_search_box(self): | ||
232 | """ Test the search box in the all project table on the all projects page """ | ||
233 | self._create_projects() | ||
234 | |||
235 | url = reverse('all-projects') | ||
236 | self.get(url) | ||
237 | |||
238 | # Chseck search box is present and works | ||
239 | self.wait_until_visible('#projectstable tbody tr', poll=3) | ||
240 | search_box = self.find('#search-input-projectstable') | ||
241 | self.assertTrue(search_box.is_displayed()) | ||
242 | |||
243 | # Check that we can search for a project by project name | ||
244 | search_box.send_keys('test project 10') | ||
245 | search_btn = self.find('#search-submit-projectstable') | ||
246 | search_btn.click() | ||
247 | self.wait_until_visible('#projectstable tbody tr', poll=3) | ||
248 | rows = self.find_all('#projectstable tbody tr') | ||
249 | self.assertTrue(len(rows) == 1) | ||
250 | |||
251 | def test_allProject_table_editColumn(self): | ||
252 | """ Test the edit column feature in the projects table on the all projects page """ | ||
253 | self._create_projects() | ||
254 | |||
255 | def test_edit_column(check_box_id): | ||
256 | # Check that we can hide/show table column | ||
257 | check_box = self.find(f'#{check_box_id}') | ||
258 | th_class = str(check_box_id).replace('checkbox-', '') | ||
259 | if check_box.is_selected(): | ||
260 | # check if column is visible in table | ||
261 | self.assertTrue( | ||
262 | self.find( | ||
263 | f'#projectstable thead th.{th_class}' | ||
264 | ).is_displayed(), | ||
265 | f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table" | ||
266 | ) | ||
267 | check_box.click() | ||
268 | # check if column is hidden in table | ||
269 | self.assertFalse( | ||
270 | self.find( | ||
271 | f'#projectstable thead th.{th_class}' | ||
272 | ).is_displayed(), | ||
273 | f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table" | ||
274 | ) | ||
275 | else: | ||
276 | # check if column is hidden in table | ||
277 | self.assertFalse( | ||
278 | self.find( | ||
279 | f'#projectstable thead th.{th_class}' | ||
280 | ).is_displayed(), | ||
281 | f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table" | ||
282 | ) | ||
283 | check_box.click() | ||
284 | # check if column is visible in table | ||
285 | self.assertTrue( | ||
286 | self.find( | ||
287 | f'#projectstable thead th.{th_class}' | ||
288 | ).is_displayed(), | ||
289 | f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table" | ||
290 | ) | ||
291 | url = reverse('all-projects') | ||
292 | self.get(url) | ||
293 | self.wait_until_visible('#projectstable tbody tr', poll=3) | ||
294 | |||
295 | # Check edit column | ||
296 | edit_column = self.find('#edit-columns-button') | ||
297 | self.assertTrue(edit_column.is_displayed()) | ||
298 | edit_column.click() | ||
299 | # Check dropdown is visible | ||
300 | self.wait_until_visible('ul.dropdown-menu.editcol') | ||
301 | |||
302 | # Check that we can hide the edit column | ||
303 | test_edit_column('checkbox-errors') | ||
304 | test_edit_column('checkbox-image_files') | ||
305 | test_edit_column('checkbox-last_build_outcome') | ||
306 | test_edit_column('checkbox-recipe_name') | ||
307 | test_edit_column('checkbox-warnings') | ||
308 | |||
309 | def test_allProject_table_show_rows(self): | ||
310 | """ Test the show rows feature in the projects table on the all projects page """ | ||
311 | self._create_projects(nb_project=200) | ||
312 | |||
313 | def test_show_rows(row_to_show, show_row_link): | ||
314 | # Check that we can show rows == row_to_show | ||
315 | show_row_link.select_by_value(str(row_to_show)) | ||
316 | self.wait_until_visible('#projectstable tbody tr', poll=3) | ||
317 | # check at least some rows are visible | ||
318 | self.assertTrue( | ||
319 | len(self.find_all('#projectstable tbody tr')) > 0 | ||
320 | ) | ||
321 | |||
322 | url = reverse('all-projects') | ||
323 | self.get(url) | ||
324 | self.wait_until_visible('#projectstable tbody tr', poll=3) | ||
325 | |||
326 | show_rows = self.driver.find_elements( | ||
327 | By.XPATH, | ||
328 | '//select[@class="form-control pagesize-projectstable"]' | ||
329 | ) | ||
330 | # Check show rows | ||
331 | for show_row_link in show_rows: | ||
332 | show_row_link = Select(show_row_link) | ||
333 | test_show_rows(10, show_row_link) | ||
334 | test_show_rows(25, show_row_link) | ||
335 | test_show_rows(50, show_row_link) | ||
336 | test_show_rows(100, show_row_link) | ||
337 | test_show_rows(150, show_row_link) | ||