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