Issues (87)

tcms/issuetracker/tests/test_gitlab_ee.py (1 issue)

1
# pylint: disable=attribute-defined-outside-init
2
3
import os
4
import time
5
import unittest
6
7
from tcms.core.contrib.linkreference.models import LinkReference
8
from tcms.issuetracker.types import Gitlab
9
from tcms.rpc.tests.utils import APITestCase
10
from tcms.testcases.models import BugSystem
11
from tcms.tests.factories import ComponentFactory, TestExecutionFactory
12
13
14 View Code Duplication
@unittest.skipUnless(
0 ignored issues
show
This code seems to be duplicated in your project.
Loading history...
15
    os.getenv("TEST_BUGTRACKER_INTEGRATION"),
16
    "Bug tracker integration testing not enabled",
17
)
18
class TestGitlabIntegration(APITestCase):
19
    existing_bug_id = 1
20
    existing_bug_url = "http://bugtracker.kiwitcms.org/root/kiwitcms/issues/1"
21
22
    def _fixture_setup(self):
23
        super()._fixture_setup()
24
25
        self.execution_1 = TestExecutionFactory()
26
        self.execution_1.case.text = "Given-When-Then"
27
        self.execution_1.case.save()  # will generate history object
28
29
        self.component = ComponentFactory(
30
            name="Gitlab integration", product=self.execution_1.run.plan.product
31
        )
32
        self.execution_1.case.add_component(self.component)
33
34
        bug_system = BugSystem.objects.create(  # nosec:B106:hardcoded_password_funcarg
35
            name="GitLab-EE for root/kiwitcms",
36
            tracker_type="tcms.issuetracker.types.Gitlab",
37
            base_url="http://bugtracker.kiwitcms.org/root/kiwitcms/",
38
            api_url="http://bugtracker.kiwitcms.org",
39
            api_password="ypCa3Dzb23o5nvsixwPA",
40
        )
41
        self.integration = Gitlab(bug_system, None)
42
43
    def test_bug_id_from_url(self):
44
        result = self.integration.bug_id_from_url(self.existing_bug_url)
45
        self.assertEqual(self.existing_bug_id, result)
46
47
        # this is an alternative URL, with a dash
48
        result = self.integration.bug_id_from_url(
49
            "http://bugtracker.kiwitcms.org/root/kiwitcms/-/issues/1"
50
        )
51
        self.assertEqual(self.existing_bug_id, result)
52
53
    def test_details_for_public_url(self):
54
        result = self.integration.details(self.existing_bug_url)
55
56
        self.assertEqual("Hello GitLab", result["title"])
57
        self.assertEqual("Created via CLI", result["description"])
58
59
    def test_details_for_private_url(self):
60
        bug_system = BugSystem.objects.create(  # nosec:B106:hardcoded_password_funcarg
61
            name="Private GitLab for root/katinar",
62
            tracker_type="tcms.issuetracker.types.Gitlab",
63
            base_url="http://bugtracker.kiwitcms.org/root/katinar/",
64
            api_url="http://bugtracker.kiwitcms.org",
65
            api_password="ypCa3Dzb23o5nvsixwPA",
66
        )
67
        integration = Gitlab(bug_system, None)
68
69
        result = integration.details(
70
            "http://bugtracker.kiwitcms.org/root/katinar/-/issues/1"
71
        )
72
73
        self.assertEqual("Hello Private Issue", result["title"])
74
        self.assertEqual("Created in secret via CLI", result["description"])
75
76
    def test_auto_update_bugtracker(self):
77
        repo_id = self.integration.it_class.repo_id(self.integration.bug_system)
78
        gl_project = self.integration.rpc.projects.get(repo_id)
79
        gl_issue = gl_project.issues.get(self.existing_bug_id)
80
81
        # make sure there are no comments to confuse the test
82
        initial_comment_count = 0
83
        for comment in gl_issue.notes.list():
84
            initial_comment_count += 1
85
            self.assertNotIn("Confirmed via test execution", comment.body)
86
87
        # simulate user adding a new bug URL to a TE and clicking
88
        # 'Automatically update bug tracker'
89
        result = self.rpc_client.TestExecution.add_link(
90
            {
91
                "execution_id": self.execution_1.pk,
92
                "is_defect": True,
93
                "url": self.existing_bug_url,
94
            },
95
            True,
96
        )
97
98
        # making sure RPC above returned the same URL
99
        self.assertEqual(self.existing_bug_url, result["url"])
100
101
        # wait until comments have been refreshed b/c this seem to happen async
102
        retries = 0
103
        while len(gl_issue.notes.list()) <= initial_comment_count:
104
            time.sleep(1)
105
            retries += 1
106
            self.assertLess(retries, 20)
107
108
        # sort by id b/c the gitlab library returns newest comments first but
109
        # that may be depending on configuration !
110
        last_comment = sorted(gl_issue.notes.list(), key=lambda x: x.id)[-1]
111
112
        # assert that a comment has been added as the last one
113
        # and also verify its text
114
        for expected_string in [
115
            "Confirmed via test execution",
116
            f"TR-{self.execution_1.run_id}: {self.execution_1.run.summary}",
117
            self.execution_1.run.get_full_url(),
118
            f"TE-{self.execution_1.pk}: {self.execution_1.case.summary}",
119
        ]:
120
            self.assertIn(expected_string, last_comment.body)
121
122
    def test_report_issue_from_test_execution_1click_works(self):
123
        # simulate user clicking the 'Report bug' button in TE widget, TR page
124
        result = self.rpc_client.Bug.report(
125
            self.execution_1.pk, self.integration.bug_system.pk
126
        )
127
        self.assertEqual(result["rc"], 0)
128
        self.assertIn(self.integration.bug_system.base_url, result["response"])
129
        self.assertIn("/-/issues/", result["response"])
130
131
        # assert that the result looks like valid URL parameters
132
        new_issue_id = self.integration.bug_id_from_url(result["response"])
133
        repo_id = self.integration.it_class.repo_id(self.integration.bug_system)
134
        gl_project = self.integration.rpc.projects.get(repo_id)
135
        issue = gl_project.issues.get(new_issue_id)
136
137
        self.assertEqual(f"Failed test: {self.execution_1.case.summary}", issue.title)
138
        for expected_string in [
139
            f"Filed from execution {self.execution_1.get_full_url()}",
140
            self.execution_1.run.plan.product.name,
141
            self.component.name,
142
            "Steps to reproduce",
143
            self.execution_1.case.text,
144
        ]:
145
            self.assertIn(expected_string, issue.description)
146
147
        # verify that LR has been added to TE
148
        self.assertTrue(
149
            LinkReference.objects.filter(
150
                execution=self.execution_1,
151
                url=result["response"],
152
                is_defect=True,
153
            ).exists()
154
        )
155