| #! /usr/bin/env python3 |
| # |
| # BitBake Toaster Implementation |
| # |
| # SPDX-License-Identifier: GPL-2.0-only |
| # |
| # Copyright (C) 2013-2016 Intel Corporation |
| # |
| |
| from django.urls import reverse |
| from django.utils import timezone |
| from tests.browser.selenium_helpers import SeleniumTestCase |
| from selenium.webdriver.common.by import By |
| |
| from orm.models import Layer, Layer_Version, Project, Build |
| |
| |
| class TestLandingPage(SeleniumTestCase): |
| """ Tests for redirects on the landing page """ |
| |
| PROJECT_NAME = 'test project' |
| LANDING_PAGE_TITLE = 'This is Toaster' |
| CLI_BUILDS_PROJECT_NAME = 'command line builds' |
| |
| def setUp(self): |
| """ Add default project manually """ |
| self.project = Project.objects.create_project( |
| self.CLI_BUILDS_PROJECT_NAME, |
| None |
| ) |
| self.project.is_default = True |
| self.project.save() |
| |
| def test_icon_info_visible_and_clickable(self): |
| """ Test that the information icon is visible and clickable """ |
| self.get(reverse('landing')) |
| info_sign = self.find('#toaster-version-info-sign') |
| |
| # check that the info sign is visible |
| self.assertTrue(info_sign.is_displayed()) |
| |
| # check that the info sign is clickable |
| # and info modal is appearing when clicking on the info sign |
| info_sign.click() # click on the info sign make attribute 'aria-describedby' visible |
| info_model_id = info_sign.get_attribute('aria-describedby') |
| info_modal = self.find(f'#{info_model_id}') |
| self.assertTrue(info_modal.is_displayed()) |
| self.assertTrue("Toaster version information" in info_modal.text) |
| |
| def test_documentation_link_displayed(self): |
| """ Test that the documentation link is displayed """ |
| self.get(reverse('landing')) |
| documentation_link = self.find('#navbar-docs > a') |
| |
| # check that the documentation link is visible |
| self.assertTrue(documentation_link.is_displayed()) |
| |
| # check browser open new tab toaster manual when clicking on the documentation link |
| self.assertEqual(documentation_link.get_attribute('target'), '_blank') |
| self.assertEqual( |
| documentation_link.get_attribute('href'), |
| 'http://docs.yoctoproject.org/toaster-manual/index.html#toaster-user-manual') |
| self.assertTrue("Documentation" in documentation_link.text) |
| |
| def test_openembedded_jumbotron_link_visible_and_clickable(self): |
| """ Test OpenEmbedded link jumbotron is visible and clickable: """ |
| self.get(reverse('landing')) |
| jumbotron = self.find('.jumbotron') |
| |
| # check OpenEmbedded |
| openembedded = jumbotron.find_element(By.LINK_TEXT, 'OpenEmbedded') |
| self.assertTrue(openembedded.is_displayed()) |
| openembedded.click() |
| self.assertTrue("openembedded.org" in self.driver.current_url) |
| |
| def test_bitbake_jumbotron_link_visible_and_clickable(self): |
| """ Test BitBake link jumbotron is visible and clickable: """ |
| self.get(reverse('landing')) |
| jumbotron = self.find('.jumbotron') |
| |
| # check BitBake |
| bitbake = jumbotron.find_element(By.LINK_TEXT, 'BitBake') |
| self.assertTrue(bitbake.is_displayed()) |
| bitbake.click() |
| self.assertTrue( |
| "docs.yoctoproject.org/bitbake.html" in self.driver.current_url) |
| |
| def test_yoctoproject_jumbotron_link_visible_and_clickable(self): |
| """ Test Yocto Project link jumbotron is visible and clickable: """ |
| self.get(reverse('landing')) |
| jumbotron = self.find('.jumbotron') |
| |
| # check Yocto Project |
| yoctoproject = jumbotron.find_element(By.LINK_TEXT, 'Yocto Project') |
| self.assertTrue(yoctoproject.is_displayed()) |
| yoctoproject.click() |
| self.assertTrue("yoctoproject.org" in self.driver.current_url) |
| |
| def test_link_setup_using_toaster_visible_and_clickable(self): |
| """ Test big magenta button setting up and using toaster link in jumbotron |
| if visible and clickable |
| """ |
| self.get(reverse('landing')) |
| jumbotron = self.find('.jumbotron') |
| |
| # check Big magenta button |
| big_magenta_button = jumbotron.find_element(By.LINK_TEXT, |
| 'Toaster is ready to capture your command line builds' |
| ) |
| self.assertTrue(big_magenta_button.is_displayed()) |
| big_magenta_button.click() |
| self.assertTrue( |
| "docs.yoctoproject.org/toaster-manual/setup-and-use.html#setting-up-and-using-toaster" in self.driver.current_url) |
| |
| def test_link_create_new_project_in_jumbotron_visible_and_clickable(self): |
| """ Test big blue button create new project jumbotron if visible and clickable """ |
| # Create a layer and a layer version to make visible the big blue button |
| layer = Layer.objects.create(name='bar') |
| Layer_Version.objects.create(layer=layer) |
| |
| self.get(reverse('landing')) |
| jumbotron = self.find('.jumbotron') |
| |
| # check Big Blue button |
| big_blue_button = jumbotron.find_element(By.LINK_TEXT, |
| 'Create your first Toaster project to run manage builds' |
| ) |
| self.assertTrue(big_blue_button.is_displayed()) |
| big_blue_button.click() |
| self.assertTrue("toastergui/newproject/" in self.driver.current_url) |
| |
| def test_toaster_manual_link_visible_and_clickable(self): |
| """ Test Read the Toaster manual link jumbotron is visible and clickable: """ |
| self.get(reverse('landing')) |
| jumbotron = self.find('.jumbotron') |
| |
| # check Read the Toaster manual |
| toaster_manual = jumbotron.find_element( |
| By.LINK_TEXT, 'Read the Toaster manual') |
| self.assertTrue(toaster_manual.is_displayed()) |
| toaster_manual.click() |
| self.assertTrue( |
| "https://docs.yoctoproject.org/toaster-manual/index.html#toaster-user-manual" in self.driver.current_url) |
| |
| def test_contrib_to_toaster_link_visible_and_clickable(self): |
| """ Test Contribute to Toaster link jumbotron is visible and clickable: """ |
| self.get(reverse('landing')) |
| jumbotron = self.find('.jumbotron') |
| |
| # check Contribute to Toaster |
| contribute_to_toaster = jumbotron.find_element( |
| By.LINK_TEXT, 'Contribute to Toaster') |
| self.assertTrue(contribute_to_toaster.is_displayed()) |
| contribute_to_toaster.click() |
| self.assertTrue( |
| "wiki.yoctoproject.org/wiki/contribute_to_toaster" in str(self.driver.current_url).lower()) |
| |
| def test_only_default_project(self): |
| """ |
| No projects except default |
| => should see the landing page |
| """ |
| self.get(reverse('landing')) |
| self.assertTrue(self.LANDING_PAGE_TITLE in self.get_page_source()) |
| |
| def test_default_project_has_build(self): |
| """ |
| Default project has a build, no other projects |
| => should see the builds page |
| """ |
| now = timezone.now() |
| build = Build.objects.create(project=self.project, |
| started_on=now, |
| completed_on=now) |
| build.save() |
| |
| self.get(reverse('landing')) |
| |
| elements = self.find_all('#allbuildstable') |
| self.assertEqual(len(elements), 1, 'should redirect to builds') |
| content = self.get_page_source() |
| self.assertFalse(self.PROJECT_NAME in content, |
| 'should not show builds for project %s' % self.PROJECT_NAME) |
| self.assertTrue(self.CLI_BUILDS_PROJECT_NAME in content, |
| 'should show builds for cli project') |
| |
| def test_user_project_exists(self): |
| """ |
| User has added a project (without builds) |
| => should see the projects page |
| """ |
| user_project = Project.objects.create_project('foo', None) |
| user_project.save() |
| |
| self.get(reverse('landing')) |
| |
| elements = self.find_all('#projectstable') |
| self.assertEqual(len(elements), 1, 'should redirect to projects') |
| |
| def test_user_project_has_build(self): |
| """ |
| User has added a project (with builds), command line builds doesn't |
| => should see the builds page |
| """ |
| user_project = Project.objects.create_project(self.PROJECT_NAME, None) |
| user_project.save() |
| |
| now = timezone.now() |
| build = Build.objects.create(project=user_project, |
| started_on=now, |
| completed_on=now) |
| build.save() |
| |
| self.get(reverse('landing')) |
| |
| self.wait_until_visible("#latest-builds", poll=3) |
| elements = self.find_all('#allbuildstable') |
| self.assertEqual(len(elements), 1, 'should redirect to builds') |
| content = self.get_page_source() |
| self.assertTrue(self.PROJECT_NAME in content, |
| 'should show builds for project %s' % self.PROJECT_NAME) |