blob: dc7d1fc20bcdcc1bb66e76b745b7bdefe454e3f8 [file] [log] [blame]
Patrick Williamsac13d5f2023-11-24 18:59:46 -06001#! /usr/bin/env python3
2# BitBake Toaster UI tests implementation
3#
4# Copyright (C) 2023 Savoir-faire Linux
5#
6# SPDX-License-Identifier: GPL-2.0-only
7#
8
9import re
10import pytest
11from django.urls import reverse
12from selenium.webdriver.support.select import Select
13from tests.functional.functional_helpers import SeleniumFunctionalTestCase
14from orm.models import Project
15from selenium.webdriver.common.by import By
16
17
18@pytest.mark.django_db
19class TestCreateNewProject(SeleniumFunctionalTestCase):
20
21 def _create_test_new_project(
22 self,
23 project_name,
24 release,
25 release_title,
26 merge_toaster_settings,
27 ):
28 """ Create/Test new project using:
29 - Project Name: Any string
30 - Release: Any string
31 - Merge Toaster settings: True or False
32 """
33 self.get(reverse('newproject'))
34 self.driver.find_element(By.ID,
35 "new-project-name").send_keys(project_name)
36
37 select = Select(self.find('#projectversion'))
38 select.select_by_value(release)
39
40 # check merge toaster settings
41 checkbox = self.find('.checkbox-mergeattr')
42 if merge_toaster_settings:
43 if not checkbox.is_selected():
44 checkbox.click()
45 else:
46 if checkbox.is_selected():
47 checkbox.click()
48
49 self.driver.find_element(By.ID, "create-project-button").click()
50
51 element = self.wait_until_visible('#project-created-notification')
52 self.assertTrue(
53 self.element_exists('#project-created-notification'),
54 f"Project:{project_name} creation notification not shown"
55 )
56 self.assertTrue(
57 project_name in element.text,
58 f"New project name:{project_name} not in new project notification"
59 )
60 self.assertTrue(
61 Project.objects.filter(name=project_name).count(),
62 f"New project:{project_name} not found in database"
63 )
64
65 # check release
66 self.assertTrue(re.search(
67 release_title,
68 self.driver.find_element(By.XPATH,
69 "//span[@id='project-release-title']"
70 ).text),
71 'The project release is not defined')
72
73 def test_create_new_project_master(self):
74 """ Test create new project using:
75 - Project Name: Any string
76 - Release: Yocto Project master (option value: 3)
77 - Merge Toaster settings: False
78 """
79 release = '3'
80 release_title = 'Yocto Project master'
81 project_name = 'projectmaster'
82 self._create_test_new_project(
83 project_name,
84 release,
85 release_title,
86 False,
87 )
88
89 def test_create_new_project_kirkstone(self):
90 """ Test create new project using:
91 - Project Name: Any string
92 - Release: Yocto Project 4.0 "Kirkstone" (option value: 1)
93 - Merge Toaster settings: True
94 """
95 release = '1'
96 release_title = 'Yocto Project 4.0 "Kirkstone"'
97 project_name = 'projectkirkstone'
98 self._create_test_new_project(
99 project_name,
100 release,
101 release_title,
102 True,
103 )
104
105 def test_create_new_project_dunfell(self):
106 """ Test create new project using:
107 - Project Name: Any string
108 - Release: Yocto Project 3.1 "Dunfell" (option value: 5)
109 - Merge Toaster settings: False
110 """
111 release = '5'
112 release_title = 'Yocto Project 3.1 "Dunfell"'
113 project_name = 'projectdunfull'
114 self._create_test_new_project(
115 project_name,
116 release,
117 release_title,
118 False,
119 )
120
121 def test_create_new_project_local(self):
122 """ Test create new project using:
123 - Project Name: Any string
124 - Release: Local Yocto Project (option value: 2)
125 - Merge Toaster settings: True
126 """
127 release = '2'
128 release_title = 'Local Yocto Project'
129 project_name = 'projectlocal'
130 self._create_test_new_project(
131 project_name,
132 release,
133 release_title,
134 True,
135 )
136
137 def test_create_new_project_without_name(self):
138 """ Test create new project without project name """
139 self.get(reverse('newproject'))
140
141 select = Select(self.find('#projectversion'))
142 select.select_by_value(str(3))
143
144 # Check input name has required attribute
145 input_name = self.driver.find_element(By.ID, "new-project-name")
146 self.assertIsNotNone(input_name.get_attribute('required'),
147 'Input name has not required attribute')
148
149 # Check create button is disabled
150 create_btn = self.driver.find_element(By.ID, "create-project-button")
151 self.assertIsNotNone(create_btn.get_attribute('disabled'),
152 'Create button is not disabled')
153
154 def test_import_new_project(self):
155 """ Test import new project using:
156 - Project Name: Any string
157 - Project type: select (Import command line project)
158 - Import existing project directory: Wrong Path
159 """
160 project_name = 'projectimport'
161 self.get(reverse('newproject'))
162 self.driver.find_element(By.ID,
163 "new-project-name").send_keys(project_name)
164 # select import project
165 self.find('#type-import').click()
166
167 # set wrong path
168 wrong_path = '/wrongpath'
169 self.driver.find_element(By.ID,
170 "import-project-dir").send_keys(wrong_path)
171 self.driver.find_element(By.ID, "create-project-button").click()
172
173 # check error message
174 self.assertTrue(self.element_exists('.alert-danger'),
175 'Allert message not shown')
176 self.assertTrue(wrong_path in self.find('.alert-danger').text,
177 "Wrong path not in alert message")