1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3# BitBake Toaster UI tests implementation 4# 5# Copyright (C) 2023 Savoir-faire Linux Inc 6# 7# SPDX-License-Identifier: GPL-2.0-only 8 9import pytest 10from django.urls import reverse 11from selenium.webdriver.support.ui import Select 12from tests.browser.selenium_helpers import SeleniumTestCase 13from orm.models import BitbakeVersion, Project, Release 14from selenium.webdriver.common.by import By 15 16class TestDeleteProject(SeleniumTestCase): 17 18 def setUp(self): 19 bitbake, _ = BitbakeVersion.objects.get_or_create( 20 name="master", 21 giturl="git://master", 22 branch="master", 23 dirpath="master") 24 25 self.release, _ = Release.objects.get_or_create( 26 name="master", 27 description="Yocto Project master", 28 branch_name="master", 29 helptext="latest", 30 bitbake_version=bitbake) 31 32 Release.objects.get_or_create( 33 name="foo", 34 description="Yocto Project foo", 35 branch_name="foo", 36 helptext="latest", 37 bitbake_version=bitbake) 38 39 @pytest.mark.django_db 40 def test_delete_project(self): 41 """ Test delete a project 42 - Check delete modal is visible 43 - Check delete modal has right text 44 - Confirm delete 45 - Check project is deleted 46 """ 47 project_name = "project_to_delete" 48 url = reverse('newproject') 49 self.get(url) 50 self.enter_text('#new-project-name', project_name) 51 select = Select(self.find('#projectversion')) 52 select.select_by_value(str(self.release.pk)) 53 self.click("#create-project-button") 54 # We should get redirected to the new project's page with the 55 # notification at the top 56 element = self.wait_until_visible('#project-created-notification') 57 self.assertTrue(project_name in element.text, 58 "New project name not in new project notification") 59 self.assertTrue(Project.objects.filter(name=project_name).count(), 60 "New project not found in database") 61 62 # Delete project 63 delete_project_link = self.driver.find_element( 64 By.XPATH, '//a[@href="#delete-project-modal"]') 65 delete_project_link.click() 66 67 # Check delete modal is visible 68 self.wait_until_visible('#delete-project-modal') 69 70 # Check delete modal has right text 71 modal_header_text = self.find('#delete-project-modal .modal-header').text 72 self.assertTrue( 73 "Are you sure you want to delete this project?" in modal_header_text, 74 "Delete project modal header text is wrong") 75 76 modal_body_text = self.find('#delete-project-modal .modal-body').text 77 self.assertTrue( 78 "Cancel its builds currently in progress" in modal_body_text, 79 "Modal body doesn't contain: Cancel its builds currently in progress") 80 self.assertTrue( 81 "Remove its configuration information" in modal_body_text, 82 "Modal body doesn't contain: Remove its configuration information") 83 self.assertTrue( 84 "Remove its imported layers" in modal_body_text, 85 "Modal body doesn't contain: Remove its imported layers") 86 self.assertTrue( 87 "Remove its custom images" in modal_body_text, 88 "Modal body doesn't contain: Remove its custom images") 89 self.assertTrue( 90 "Remove all its build information" in modal_body_text, 91 "Modal body doesn't contain: Remove all its build information") 92 93 # Confirm delete 94 delete_btn = self.find('#delete-project-confirmed') 95 delete_btn.click() 96 97 # Check project is deleted 98 self.wait_until_visible('#change-notification') 99 delete_notification = self.find('#change-notification-msg') 100 self.assertTrue("You have deleted 1 project:" in delete_notification.text) 101 self.assertTrue(project_name in delete_notification.text) 102 self.assertFalse(Project.objects.filter(name=project_name).exists(), 103 "Project not deleted from database") 104