| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # BitBake Toaster UI tests implementation |
| # |
| # Copyright (C) 2023 Savoir-faire Linux Inc |
| # |
| # SPDX-License-Identifier: GPL-2.0-only |
| |
| import pytest |
| from django.urls import reverse |
| from selenium.webdriver.support.ui import Select |
| from tests.browser.selenium_helpers import SeleniumTestCase |
| from orm.models import BitbakeVersion, Project, Release |
| from selenium.webdriver.common.by import By |
| |
| class TestDeleteProject(SeleniumTestCase): |
| |
| def setUp(self): |
| bitbake, _ = BitbakeVersion.objects.get_or_create( |
| name="master", |
| giturl="git://master", |
| branch="master", |
| dirpath="master") |
| |
| self.release, _ = Release.objects.get_or_create( |
| name="master", |
| description="Yocto Project master", |
| branch_name="master", |
| helptext="latest", |
| bitbake_version=bitbake) |
| |
| Release.objects.get_or_create( |
| name="foo", |
| description="Yocto Project foo", |
| branch_name="foo", |
| helptext="latest", |
| bitbake_version=bitbake) |
| |
| @pytest.mark.django_db |
| def test_delete_project(self): |
| """ Test delete a project |
| - Check delete modal is visible |
| - Check delete modal has right text |
| - Confirm delete |
| - Check project is deleted |
| """ |
| project_name = "project_to_delete" |
| url = reverse('newproject') |
| self.get(url) |
| self.enter_text('#new-project-name', project_name) |
| select = Select(self.find('#projectversion')) |
| select.select_by_value(str(self.release.pk)) |
| self.click("#create-project-button") |
| # We should get redirected to the new project's page with the |
| # notification at the top |
| element = self.wait_until_visible('#project-created-notification') |
| self.assertTrue(project_name in element.text, |
| "New project name not in new project notification") |
| self.assertTrue(Project.objects.filter(name=project_name).count(), |
| "New project not found in database") |
| |
| # Delete project |
| delete_project_link = self.driver.find_element( |
| By.XPATH, '//a[@href="#delete-project-modal"]') |
| delete_project_link.click() |
| |
| # Check delete modal is visible |
| self.wait_until_visible('#delete-project-modal') |
| |
| # Check delete modal has right text |
| modal_header_text = self.find('#delete-project-modal .modal-header').text |
| self.assertTrue( |
| "Are you sure you want to delete this project?" in modal_header_text, |
| "Delete project modal header text is wrong") |
| |
| modal_body_text = self.find('#delete-project-modal .modal-body').text |
| self.assertTrue( |
| "Cancel its builds currently in progress" in modal_body_text, |
| "Modal body doesn't contain: Cancel its builds currently in progress") |
| self.assertTrue( |
| "Remove its configuration information" in modal_body_text, |
| "Modal body doesn't contain: Remove its configuration information") |
| self.assertTrue( |
| "Remove its imported layers" in modal_body_text, |
| "Modal body doesn't contain: Remove its imported layers") |
| self.assertTrue( |
| "Remove its custom images" in modal_body_text, |
| "Modal body doesn't contain: Remove its custom images") |
| self.assertTrue( |
| "Remove all its build information" in modal_body_text, |
| "Modal body doesn't contain: Remove all its build information") |
| |
| # Confirm delete |
| delete_btn = self.find('#delete-project-confirmed') |
| delete_btn.click() |
| |
| # Check project is deleted |
| self.wait_until_visible('#change-notification') |
| delete_notification = self.find('#change-notification-msg') |
| self.assertTrue("You have deleted 1 project:" in delete_notification.text) |
| self.assertTrue(project_name in delete_notification.text) |
| self.assertFalse(Project.objects.filter(name=project_name).exists(), |
| "Project not deleted from database") |