summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/tests/browser/test_landing_page.py
blob: 8fe5fea467e18d55db701e3e609f410da2bc0257 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#! /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)