xref: /openbmc/openbmc/poky/bitbake/lib/toaster/tests/browser/test_delete_project.py (revision ac13d5f36a6bd845f1709b7f41c02bd3b412ad15)
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