Passed
Push — master ( fdd007...c06fae )
by Alexander
02:28
created

TestGitHubIntegration.test_auto_update_bugtracker()   B

Complexity

Conditions 5

Size

Total Lines 48
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 32
dl 0
loc 48
rs 8.6453
c 0
b 0
f 0
cc 5
nop 1
1
# pylint: disable=attribute-defined-outside-init
2
3
import os
4
import time
5
import unittest
6
7
from django.utils import timezone
8
9
from tcms.core.contrib.linkreference.models import LinkReference
10
from tcms.issuetracker.types import GitHub
11
from tcms.rpc.tests.utils import APITestCase
12
from tcms.testcases.models import BugSystem
13
14
from tcms.tests.factories import ComponentFactory
15
from tcms.tests.factories import TestExecutionFactory
16
17
18
@unittest.skipUnless(os.getenv('TEST_BUGTRACKER_INTEGRATION'),
19
                     'Bug tracker integration testing not enabled')
20
class TestGitHubIntegration(APITestCase):
21
    existing_bug_id = 1
22
    existing_bug_url = 'https://github.com/kiwitcms/test-github-integration/issues/1'
23
24
    def _fixture_setup(self):
25
        super()._fixture_setup()
26
27
        self.execution_1 = TestExecutionFactory()
28
        self.execution_1.case.summary = "Tested at " + timezone.now().isoformat()
29
        self.execution_1.case.text = "Given-When-Then"
30
        self.execution_1.case.save()  # will generate history object
31
        self.execution_1.run.summary = "Automated TR for GitHub integration on " + \
32
                                       timezone.now().isoformat()
33
        self.execution_1.run.save()
34
35
        self.component = ComponentFactory(name='GitHub integration',
36
                                          product=self.execution_1.run.plan.product)
37
        self.execution_1.case.add_component(self.component)
38
39
        bug_system = BugSystem.objects.create(  # nosec:B106:hardcoded_password_funcarg
40
            name='GitHub for kiwitcms/test-github-integration',
41
            tracker_type='GitHub',
42
            base_url='https://github.com/kiwitcms/test-github-integration',
43
            api_password=os.getenv('GH_BUGTRACKER_INTEGRATION_TEST_API_TOKEN'),
44
        )
45
        self.integration = GitHub(bug_system)
46
47
    def test_bug_id_from_url(self):
48
        result = self.integration.bug_id_from_url(self.existing_bug_url)
49
        self.assertEqual(self.existing_bug_id, result)
50
51
    def test_details_for_public_url(self):
52
        result = self.integration.details(self.existing_bug_url)
53
54
        self.assertEqual('Hello GitHub', result['title'])
55
        self.assertEqual(
56
            "This issue is used in automated tests that verify Kiwi TCMS - GitHub "
57
            "bug tracking integration!",
58
            result['description'])
59
60
    def test_details_for_private_url(self):
61
        bug_system = BugSystem.objects.create(  # nosec:B106:hardcoded_password_funcarg
62
            name='Private GitHub for kiwitcms/private-test-github-integration',
63
            tracker_type='GitHub',
64
            base_url='https://github.com/kiwitcms/private-test-github-integration',
65
            api_password=os.getenv('GH_BUGTRACKER_INTEGRATION_TEST_API_TOKEN'),
66
        )
67
        integration = GitHub(bug_system)
68
69
        result = integration.details(
70
            'https://github.com/kiwitcms/private-test-github-integration/issues/1')
71
72
        self.assertEqual('Hello Private GitHub', result['title'])
73
        self.assertEqual(
74
            "This issue is used in automated tests that verify "
75
            "Kiwi TCMS - GitHub bug tracking integration!",
76
            result['description'])
77
78
    def test_auto_update_bugtracker(self):
79
        repo_id = self.integration.it_class.repo_id(self.integration.bug_system)
80
        repo = self.integration.rpc.get_repo(repo_id)
81
        issue = repo.get_issue(self.existing_bug_id)
82
83
        # make sure there are no comments to confuse the test
84
        initial_comments_count = 0
85
        for comment in issue.get_comments():
86
            initial_comments_count += 1
87
            self.assertNotIn(self.execution_1.run.summary, comment.body)
88
89
        # simulate user adding a new bug URL to a TE and clicking
90
        # 'Automatically update bug tracker'
91
        result = self.rpc_client.TestExecution.add_link({
92
            'execution_id': self.execution_1.pk,
93
            'is_defect': True,
94
            'url': self.existing_bug_url,
95
        }, True)
96
97
        # making sure RPC above returned the same URL
98
        self.assertEqual(self.existing_bug_url, result['url'])
99
100
        # wait until comments have been refreshed b/c this seem to happen async
101
        retries = 0
102
        last_comment = None
103
        current_comment_count = 0
104
        while current_comment_count <= initial_comments_count:
105
            current_comment_count = 0
106
            # .get_comments() returns an iterator
107
            for comment in issue.get_comments():
108
                current_comment_count += 1
109
                last_comment = comment
110
111
            time.sleep(1)
112
            retries += 1
113
            self.assertLess(retries, 20)
114
115
        # assert that a comment has been added as the last one
116
        # and also verify its text
117
        for expected_string in [
118
                'Confirmed via test execution',
119
                "TR-%d: %s" % (self.execution_1.run_id, self.execution_1.run.summary),
120
                self.execution_1.run.get_full_url(),
121
                "TE-%d: %s" % (self.execution_1.pk, self.execution_1.case.summary)]:
122
            self.assertIn(expected_string, last_comment.body)
123
124
        # clean up after ourselves in case everything above looks good
125
        last_comment.delete()
126
127 View Code Duplication
    def test_report_issue_from_test_execution_1click_works(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
128
        # simulate user clicking the 'Report bug' button in TE widget, TR page
129
        result = self.rpc_client.Bug.report(self.execution_1.pk, self.integration.bug_system.pk)
130
        self.assertEqual(result['rc'], 0)
131
        self.assertIn(self.integration.bug_system.base_url, result['response'])
132
        self.assertIn('/issues/', result['response'])
133
134
        new_issue_id = self.integration.bug_id_from_url(result['response'])
135
        repo_id = self.integration.it_class.repo_id(self.integration.bug_system)
136
        repo = self.integration.rpc.get_repo(repo_id)
137
        issue = repo.get_issue(new_issue_id)
138
139
        self.assertEqual("Failed test: %s" % self.execution_1.case.summary, issue.title)
140
        for expected_string in [
141
                "Filed from execution %s" % self.execution_1.get_full_url(),
142
                self.execution_1.run.plan.product.name,
143
                self.component.name,
144
                "Steps to reproduce",
145
                self.execution_1.case.text]:
146
            self.assertIn(expected_string, issue.body)
147
148
        # verify that LR has been added to TE
149
        self.assertTrue(LinkReference.objects.filter(
150
            execution=self.execution_1,
151
            url=result['response'],
152
            is_defect=True,
153
        ).exists())
154
155
        # close issue after we're done
156
        issue.edit(state='closed')
157