Merge ~pappacena/launchpad:vcs-scenarios-for-bmp into launchpad:master
- Git
- lp:~pappacena/launchpad
- vcs-scenarios-for-bmp
- Merge into master
Proposed by
Thiago F. Pappacena
Status: | Merged |
---|---|
Approved by: | Thiago F. Pappacena |
Approved revision: | 04850f499a3fda3adeacdd816d91baab3d0c965e |
Merge reported by: | Otto Co-Pilot |
Merged at revision: | not available |
Proposed branch: | ~pappacena/launchpad:vcs-scenarios-for-bmp |
Merge into: | launchpad:master |
Prerequisite: | ~pappacena/launchpad:bugfix-private-mp-webhook-trigger |
Diff against target: |
582 lines (+124/-137) 2 files modified
lib/lp/code/model/tests/test_branchmergeproposal.py (+111/-133) lib/lp/code/tests/helpers.py (+13/-4) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Colin Watson (community) | Approve | ||
Review via email: mp+387878@code.launchpad.net |
Commit message
Refactoring BMP test cases to extend scenarios on TestBranchMerge
Description of the change
To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/lib/lp/code/model/tests/test_branchmergeproposal.py b/lib/lp/code/model/tests/test_branchmergeproposal.py | |||
2 | index 7e380a3..0d2457d 100644 | |||
3 | --- a/lib/lp/code/model/tests/test_branchmergeproposal.py | |||
4 | +++ b/lib/lp/code/model/tests/test_branchmergeproposal.py | |||
5 | @@ -57,6 +57,7 @@ from lp.code.event.branchmergeproposal import ( | |||
6 | 57 | BranchMergeProposalNeedsReviewEvent, | 57 | BranchMergeProposalNeedsReviewEvent, |
7 | 58 | ReviewerNominatedEvent, | 58 | ReviewerNominatedEvent, |
8 | 59 | ) | 59 | ) |
9 | 60 | from lp.code.interfaces.branch import IBranch | ||
10 | 60 | from lp.code.interfaces.branchmergeproposal import ( | 61 | from lp.code.interfaces.branchmergeproposal import ( |
11 | 61 | BRANCH_MERGE_PROPOSAL_FINAL_STATES as FINAL_STATES, | 62 | BRANCH_MERGE_PROPOSAL_FINAL_STATES as FINAL_STATES, |
12 | 62 | BRANCH_MERGE_PROPOSAL_OBSOLETE_STATES as OBSOLETE_STATES, | 63 | BRANCH_MERGE_PROPOSAL_OBSOLETE_STATES as OBSOLETE_STATES, |
13 | @@ -110,6 +111,49 @@ from lp.testing.layers import ( | |||
14 | 110 | ) | 111 | ) |
15 | 111 | 112 | ||
16 | 112 | 113 | ||
17 | 114 | class WithVCSScenarios(WithScenarios): | ||
18 | 115 | |||
19 | 116 | scenarios = [ | ||
20 | 117 | ("bzr", {"git": False}), | ||
21 | 118 | ("git", {"git": True}), | ||
22 | 119 | ] | ||
23 | 120 | |||
24 | 121 | def makeBranch(self, same_target_as=None, product=None, stacked_on=None, | ||
25 | 122 | information_type=None, owner=None): | ||
26 | 123 | # Create the product pillar and its access policy if information | ||
27 | 124 | # type is "PROPRIETARY". | ||
28 | 125 | if product is None and same_target_as is None: | ||
29 | 126 | product = self.factory.makeProduct() | ||
30 | 127 | if information_type == InformationType.PROPRIETARY: | ||
31 | 128 | self.factory.makeAccessPolicy(product) | ||
32 | 129 | elif product is None: | ||
33 | 130 | same_target_as = removeSecurityProxy(same_target_as) | ||
34 | 131 | product = (same_target_as.target if self.git else | ||
35 | 132 | same_target_as.product) | ||
36 | 133 | |||
37 | 134 | kwargs = { | ||
38 | 135 | "information_type": information_type, | ||
39 | 136 | "owner": owner} | ||
40 | 137 | if self.git: | ||
41 | 138 | kwargs["target"] = product | ||
42 | 139 | return self.factory.makeGitRefs(**kwargs)[0] | ||
43 | 140 | else: | ||
44 | 141 | kwargs["product"] = product | ||
45 | 142 | kwargs["stacked_on"] = stacked_on | ||
46 | 143 | return self.factory.makeProductBranch(**kwargs) | ||
47 | 144 | |||
48 | 145 | def makeBranchMergeProposal(self, source=None, target=None, | ||
49 | 146 | prerequisite=None, **kwargs): | ||
50 | 147 | if self.git: | ||
51 | 148 | return self.factory.makeBranchMergeProposalForGit( | ||
52 | 149 | target_ref=target, source_ref=source, | ||
53 | 150 | prerequisite_ref=prerequisite, **kwargs) | ||
54 | 151 | else: | ||
55 | 152 | return self.factory.makeBranchMergeProposal( | ||
56 | 153 | source_branch=source, target_branch=target, | ||
57 | 154 | prerequisite_branch=prerequisite, **kwargs) | ||
58 | 155 | |||
59 | 156 | |||
60 | 113 | class TestBranchMergeProposalInterface(TestCaseWithFactory): | 157 | class TestBranchMergeProposalInterface(TestCaseWithFactory): |
61 | 114 | """Ensure that BranchMergeProposal implements its interface.""" | 158 | """Ensure that BranchMergeProposal implements its interface.""" |
62 | 115 | 159 | ||
63 | @@ -121,26 +165,16 @@ class TestBranchMergeProposalInterface(TestCaseWithFactory): | |||
64 | 121 | verifyObject(IBranchMergeProposal, bmp) | 165 | verifyObject(IBranchMergeProposal, bmp) |
65 | 122 | 166 | ||
66 | 123 | 167 | ||
68 | 124 | class TestBranchMergeProposalCanonicalUrl(WithScenarios, TestCaseWithFactory): | 168 | class TestBranchMergeProposalCanonicalUrl( |
69 | 169 | WithVCSScenarios, TestCaseWithFactory): | ||
70 | 125 | """Tests canonical_url for merge proposals.""" | 170 | """Tests canonical_url for merge proposals.""" |
71 | 126 | 171 | ||
72 | 127 | layer = DatabaseFunctionalLayer | 172 | layer = DatabaseFunctionalLayer |
73 | 128 | 173 | ||
74 | 129 | scenarios = [ | ||
75 | 130 | ("bzr", {"git": False}), | ||
76 | 131 | ("git", {"git": True}), | ||
77 | 132 | ] | ||
78 | 133 | |||
79 | 134 | def _makeBranchMergeProposal(self): | ||
80 | 135 | if self.git: | ||
81 | 136 | return self.factory.makeBranchMergeProposalForGit() | ||
82 | 137 | else: | ||
83 | 138 | return self.factory.makeBranchMergeProposal() | ||
84 | 139 | |||
85 | 140 | def test_BranchMergeProposal_canonical_url_base(self): | 174 | def test_BranchMergeProposal_canonical_url_base(self): |
86 | 141 | # The URL for a merge proposal starts with the parent (source branch | 175 | # The URL for a merge proposal starts with the parent (source branch |
87 | 142 | # or source Git repository). | 176 | # or source Git repository). |
89 | 143 | bmp = self._makeBranchMergeProposal() | 177 | bmp = self.makeBranchMergeProposal() |
90 | 144 | url = canonical_url(bmp) | 178 | url = canonical_url(bmp) |
91 | 145 | parent_url = canonical_url(bmp.parent) | 179 | parent_url = canonical_url(bmp.parent) |
92 | 146 | self.assertTrue(url.startswith(parent_url)) | 180 | self.assertTrue(url.startswith(parent_url)) |
93 | @@ -148,7 +182,7 @@ class TestBranchMergeProposalCanonicalUrl(WithScenarios, TestCaseWithFactory): | |||
94 | 148 | def test_BranchMergeProposal_canonical_url_rest(self): | 182 | def test_BranchMergeProposal_canonical_url_rest(self): |
95 | 149 | # The rest of the URL for a merge proposal is +merge followed by the | 183 | # The rest of the URL for a merge proposal is +merge followed by the |
96 | 150 | # db id. | 184 | # db id. |
98 | 151 | bmp = self._makeBranchMergeProposal() | 185 | bmp = self.makeBranchMergeProposal() |
99 | 152 | url = canonical_url(bmp) | 186 | url = canonical_url(bmp) |
100 | 153 | parent_url = canonical_url(bmp.parent) | 187 | parent_url = canonical_url(bmp.parent) |
101 | 154 | rest = url[len(parent_url):] | 188 | rest = url[len(parent_url):] |
102 | @@ -719,45 +753,14 @@ class TestMergeProposalGetPreviewDiff(TestCaseWithFactory): | |||
103 | 719 | self.mp_two.getPreviewDiff, self.preview_diff.id) | 753 | self.mp_two.getPreviewDiff, self.preview_diff.id) |
104 | 720 | 754 | ||
105 | 721 | 755 | ||
107 | 722 | class TestMergeProposalNotification(WithScenarios, TestCaseWithFactory): | 756 | class TestMergeProposalNotification(WithVCSScenarios, TestCaseWithFactory): |
108 | 723 | """Test that events are created when merge proposals are manipulated""" | 757 | """Test that events are created when merge proposals are manipulated""" |
109 | 724 | 758 | ||
110 | 725 | layer = DatabaseFunctionalLayer | 759 | layer = DatabaseFunctionalLayer |
111 | 726 | 760 | ||
112 | 727 | scenarios = [ | ||
113 | 728 | ("bzr", {"git": False}), | ||
114 | 729 | ("git", {"git": True}), | ||
115 | 730 | ] | ||
116 | 731 | |||
117 | 732 | def setUp(self): | 761 | def setUp(self): |
118 | 733 | TestCaseWithFactory.setUp(self, user='test@canonical.com') | 762 | TestCaseWithFactory.setUp(self, user='test@canonical.com') |
119 | 734 | 763 | ||
120 | 735 | def makeBranch(self, same_target_as=None, target=None, **kwargs): | ||
121 | 736 | kwargs = dict(kwargs) | ||
122 | 737 | if self.git: | ||
123 | 738 | if same_target_as is not None: | ||
124 | 739 | kwargs["target"] = same_target_as.target | ||
125 | 740 | elif target is not None: | ||
126 | 741 | kwargs["target"] = target | ||
127 | 742 | return self.factory.makeGitRefs(**kwargs)[0] | ||
128 | 743 | else: | ||
129 | 744 | if same_target_as is not None: | ||
130 | 745 | kwargs["product"] = same_target_as.product | ||
131 | 746 | elif target is not None: | ||
132 | 747 | kwargs["product"] = target | ||
133 | 748 | return self.factory.makeProductBranch(**kwargs) | ||
134 | 749 | |||
135 | 750 | def makeBranchMergeProposal(self, source=None, target=None, | ||
136 | 751 | prerequisite=None, **kwargs): | ||
137 | 752 | if self.git: | ||
138 | 753 | return self.factory.makeBranchMergeProposalForGit( | ||
139 | 754 | source_ref=source, target_ref=target, | ||
140 | 755 | prerequisite_ref=prerequisite, **kwargs) | ||
141 | 756 | else: | ||
142 | 757 | return self.factory.makeBranchMergeProposal( | ||
143 | 758 | source_branch=source, target_branch=target, | ||
144 | 759 | prerequisite_branch=prerequisite, **kwargs) | ||
145 | 760 | |||
146 | 761 | def test_notifyOnCreate_needs_review(self): | 764 | def test_notifyOnCreate_needs_review(self): |
147 | 762 | # When a merge proposal is created needing review, the | 765 | # When a merge proposal is created needing review, the |
148 | 763 | # BranchMergeProposalNeedsReviewEvent is raised as well as the usual | 766 | # BranchMergeProposalNeedsReviewEvent is raised as well as the usual |
149 | @@ -989,8 +992,8 @@ class TestMergeProposalNotification(WithScenarios, TestCaseWithFactory): | |||
150 | 989 | # they do not get email about the proposal. | 992 | # they do not get email about the proposal. |
151 | 990 | owner = self.factory.makePerson() | 993 | owner = self.factory.makePerson() |
152 | 991 | product = self.factory.makeProduct() | 994 | product = self.factory.makeProduct() |
155 | 992 | source = self.makeBranch(owner=owner, target=product) | 995 | source = self.makeBranch(owner=owner, product=product) |
156 | 993 | target = self.makeBranch(owner=owner, target=product) | 996 | target = self.makeBranch(owner=owner, product=product) |
157 | 994 | bmp = self.makeBranchMergeProposal(source=source, target=target) | 997 | bmp = self.makeBranchMergeProposal(source=source, target=target) |
158 | 995 | # Subscribe eric to the source branch only. | 998 | # Subscribe eric to the source branch only. |
159 | 996 | eric = self.factory.makePerson() | 999 | eric = self.factory.makePerson() |
160 | @@ -1022,40 +1025,15 @@ class TestMergeProposalNotification(WithScenarios, TestCaseWithFactory): | |||
161 | 1022 | self.assertIn(charlie, recipients) | 1025 | self.assertIn(charlie, recipients) |
162 | 1023 | 1026 | ||
163 | 1024 | 1027 | ||
165 | 1025 | class TestMergeProposalWebhooks(WithScenarios, TestCaseWithFactory): | 1028 | class TestMergeProposalWebhooks(WithVCSScenarios, TestCaseWithFactory): |
166 | 1026 | 1029 | ||
167 | 1027 | layer = DatabaseFunctionalLayer | 1030 | layer = DatabaseFunctionalLayer |
168 | 1028 | 1031 | ||
169 | 1029 | scenarios = [ | ||
170 | 1030 | ("bzr", {"git": False}), | ||
171 | 1031 | ("git", {"git": True}), | ||
172 | 1032 | ] | ||
173 | 1033 | |||
174 | 1034 | def setUp(self): | 1032 | def setUp(self): |
175 | 1035 | super(TestMergeProposalWebhooks, self).setUp() | 1033 | super(TestMergeProposalWebhooks, self).setUp() |
176 | 1036 | self.useFixture(FeatureFixture( | 1034 | self.useFixture(FeatureFixture( |
177 | 1037 | {BRANCH_MERGE_PROPOSAL_WEBHOOKS_FEATURE_FLAG: "on"})) | 1035 | {BRANCH_MERGE_PROPOSAL_WEBHOOKS_FEATURE_FLAG: "on"})) |
178 | 1038 | 1036 | ||
179 | 1039 | def makeBranch(self, same_target_as=None, information_type=None): | ||
180 | 1040 | # Create the product pillar and its access policy if information | ||
181 | 1041 | # type is "PROPRIETARY". | ||
182 | 1042 | if same_target_as is None: | ||
183 | 1043 | product = self.factory.makeProduct() | ||
184 | 1044 | if information_type == InformationType.PROPRIETARY: | ||
185 | 1045 | self.factory.makeAccessPolicy(product) | ||
186 | 1046 | else: | ||
187 | 1047 | same_target_as = removeSecurityProxy(same_target_as) | ||
188 | 1048 | product = (same_target_as.target if self.git else | ||
189 | 1049 | same_target_as.product) | ||
190 | 1050 | |||
191 | 1051 | kwargs = {"information_type": information_type} | ||
192 | 1052 | if self.git: | ||
193 | 1053 | kwargs["target"] = product | ||
194 | 1054 | return self.factory.makeGitRefs(**kwargs)[0] | ||
195 | 1055 | else: | ||
196 | 1056 | kwargs["product"] = product | ||
197 | 1057 | return self.factory.makeProductBranch(**kwargs) | ||
198 | 1058 | |||
199 | 1059 | def getWebhookTarget(self, branch): | 1037 | def getWebhookTarget(self, branch): |
200 | 1060 | if self.git: | 1038 | if self.git: |
201 | 1061 | return branch.repository | 1039 | return branch.repository |
202 | @@ -1529,15 +1507,10 @@ class TestBranchMergeProposalDeletion(TestCaseWithFactory): | |||
203 | 1529 | SQLObjectNotFound, BranchMergeProposalJob.get, job_id) | 1507 | SQLObjectNotFound, BranchMergeProposalJob.get, job_id) |
204 | 1530 | 1508 | ||
205 | 1531 | 1509 | ||
207 | 1532 | class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | 1510 | class TestBranchMergeProposalBugs(WithVCSScenarios, TestCaseWithFactory): |
208 | 1533 | 1511 | ||
209 | 1534 | layer = DatabaseFunctionalLayer | 1512 | layer = DatabaseFunctionalLayer |
210 | 1535 | 1513 | ||
211 | 1536 | scenarios = [ | ||
212 | 1537 | ("bzr", {"git": False}), | ||
213 | 1538 | ("git", {"git": True}), | ||
214 | 1539 | ] | ||
215 | 1540 | |||
216 | 1541 | def setUp(self): | 1514 | def setUp(self): |
217 | 1542 | super(TestBranchMergeProposalBugs, self).setUp() | 1515 | super(TestBranchMergeProposalBugs, self).setUp() |
218 | 1543 | self.user = self.factory.makePerson() | 1516 | self.user = self.factory.makePerson() |
219 | @@ -1545,15 +1518,9 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
220 | 1545 | if self.git: | 1518 | if self.git: |
221 | 1546 | self.hosting_fixture = self.useFixture(GitHostingFixture()) | 1519 | self.hosting_fixture = self.useFixture(GitHostingFixture()) |
222 | 1547 | 1520 | ||
223 | 1548 | def _makeBranchMergeProposal(self): | ||
224 | 1549 | if self.git: | ||
225 | 1550 | return self.factory.makeBranchMergeProposalForGit() | ||
226 | 1551 | else: | ||
227 | 1552 | return self.factory.makeBranchMergeProposal() | ||
228 | 1553 | |||
229 | 1554 | def test_bugs(self): | 1521 | def test_bugs(self): |
230 | 1555 | # bugs includes all linked bugs. | 1522 | # bugs includes all linked bugs. |
232 | 1556 | bmp = self._makeBranchMergeProposal() | 1523 | bmp = self.makeBranchMergeProposal() |
233 | 1557 | self.assertEqual([], bmp.bugs) | 1524 | self.assertEqual([], bmp.bugs) |
234 | 1558 | bugs = [self.factory.makeBug() for _ in range(2)] | 1525 | bugs = [self.factory.makeBug() for _ in range(2)] |
235 | 1559 | bmp.linkBug(bugs[0], bmp.registrant) | 1526 | bmp.linkBug(bugs[0], bmp.registrant) |
236 | @@ -1568,7 +1535,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
237 | 1568 | def test_related_bugtasks_includes_source_bugtasks(self): | 1535 | def test_related_bugtasks_includes_source_bugtasks(self): |
238 | 1569 | # related_bugtasks includes bugtasks linked to the source branch in | 1536 | # related_bugtasks includes bugtasks linked to the source branch in |
239 | 1570 | # the Bazaar case, or directly to the MP in the Git case. | 1537 | # the Bazaar case, or directly to the MP in the Git case. |
241 | 1571 | bmp = self._makeBranchMergeProposal() | 1538 | bmp = self.makeBranchMergeProposal() |
242 | 1572 | bug = self.factory.makeBug() | 1539 | bug = self.factory.makeBug() |
243 | 1573 | bmp.linkBug(bug, bmp.registrant) | 1540 | bmp.linkBug(bug, bmp.registrant) |
244 | 1574 | self.assertEqual( | 1541 | self.assertEqual( |
245 | @@ -1576,7 +1543,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
246 | 1576 | 1543 | ||
247 | 1577 | def test_related_bugtasks_excludes_private_bugs(self): | 1544 | def test_related_bugtasks_excludes_private_bugs(self): |
248 | 1578 | # related_bugtasks ignores private bugs for non-authorised users. | 1545 | # related_bugtasks ignores private bugs for non-authorised users. |
250 | 1579 | bmp = self._makeBranchMergeProposal() | 1546 | bmp = self.makeBranchMergeProposal() |
251 | 1580 | bug = self.factory.makeBug() | 1547 | bug = self.factory.makeBug() |
252 | 1581 | bmp.linkBug(bug, bmp.registrant) | 1548 | bmp.linkBug(bug, bmp.registrant) |
253 | 1582 | person = self.factory.makePerson() | 1549 | person = self.factory.makePerson() |
254 | @@ -1596,7 +1563,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
255 | 1596 | # related_bugtasks ignores bugs linked to the target branch. | 1563 | # related_bugtasks ignores bugs linked to the target branch. |
256 | 1597 | if self.git: | 1564 | if self.git: |
257 | 1598 | self.skipTest("Only relevant for Bazaar.") | 1565 | self.skipTest("Only relevant for Bazaar.") |
259 | 1599 | bmp = self._makeBranchMergeProposal() | 1566 | bmp = self.makeBranchMergeProposal() |
260 | 1600 | bug = self.factory.makeBug() | 1567 | bug = self.factory.makeBug() |
261 | 1601 | bmp.target_branch.linkBug(bug, bmp.registrant) | 1568 | bmp.target_branch.linkBug(bug, bmp.registrant) |
262 | 1602 | self.assertEqual([], list(bmp.getRelatedBugTasks(self.user))) | 1569 | self.assertEqual([], list(bmp.getRelatedBugTasks(self.user))) |
263 | @@ -1605,7 +1572,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
264 | 1605 | # related_bugtasks ignores bugs linked to both branches. | 1572 | # related_bugtasks ignores bugs linked to both branches. |
265 | 1606 | if self.git: | 1573 | if self.git: |
266 | 1607 | self.skipTest("Only relevant for Bazaar.") | 1574 | self.skipTest("Only relevant for Bazaar.") |
268 | 1608 | bmp = self._makeBranchMergeProposal() | 1575 | bmp = self.makeBranchMergeProposal() |
269 | 1609 | bug = self.factory.makeBug() | 1576 | bug = self.factory.makeBug() |
270 | 1610 | bmp.source_branch.linkBug(bug, bmp.registrant) | 1577 | bmp.source_branch.linkBug(bug, bmp.registrant) |
271 | 1611 | bmp.target_branch.linkBug(bug, bmp.registrant) | 1578 | bmp.target_branch.linkBug(bug, bmp.registrant) |
272 | @@ -1617,7 +1584,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
273 | 1617 | if not self.git: | 1584 | if not self.git: |
274 | 1618 | self.skipTest("Only relevant for Git.") | 1585 | self.skipTest("Only relevant for Git.") |
275 | 1619 | bugs = [self.factory.makeBug() for _ in range(3)] | 1586 | bugs = [self.factory.makeBug() for _ in range(3)] |
277 | 1620 | bmp = self._makeBranchMergeProposal() | 1587 | bmp = self.makeBranchMergeProposal() |
278 | 1621 | self.hosting_fixture.getLog.result = [ | 1588 | self.hosting_fixture.getLog.result = [ |
279 | 1622 | { | 1589 | { |
280 | 1623 | "sha1": bmp.source_git_commit_sha1, | 1590 | "sha1": bmp.source_git_commit_sha1, |
281 | @@ -1664,7 +1631,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
282 | 1664 | # bugs in either the database or the source branch. | 1631 | # bugs in either the database or the source branch. |
283 | 1665 | if not self.git: | 1632 | if not self.git: |
284 | 1666 | self.skipTest("Only relevant for Git.") | 1633 | self.skipTest("Only relevant for Git.") |
286 | 1667 | bmp = self._makeBranchMergeProposal() | 1634 | bmp = self.makeBranchMergeProposal() |
287 | 1668 | self._setUpLog([]) | 1635 | self._setUpLog([]) |
288 | 1669 | bmp.updateRelatedBugsFromSource() | 1636 | bmp.updateRelatedBugsFromSource() |
289 | 1670 | self.assertEqual([], bmp.bugs) | 1637 | self.assertEqual([], bmp.bugs) |
290 | @@ -1675,7 +1642,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
291 | 1675 | if not self.git: | 1642 | if not self.git: |
292 | 1676 | self.skipTest("Only relevant for Git.") | 1643 | self.skipTest("Only relevant for Git.") |
293 | 1677 | bugs = [self.factory.makeBug() for _ in range(3)] | 1644 | bugs = [self.factory.makeBug() for _ in range(3)] |
295 | 1678 | bmp = self._makeBranchMergeProposal() | 1645 | bmp = self.makeBranchMergeProposal() |
296 | 1679 | self._setUpLog([bugs[0]]) | 1646 | self._setUpLog([bugs[0]]) |
297 | 1680 | bmp.updateRelatedBugsFromSource() | 1647 | bmp.updateRelatedBugsFromSource() |
298 | 1681 | self.assertEqual([bugs[0]], bmp.bugs) | 1648 | self.assertEqual([bugs[0]], bmp.bugs) |
299 | @@ -1689,7 +1656,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
300 | 1689 | if not self.git: | 1656 | if not self.git: |
301 | 1690 | self.skipTest("Only relevant for Git.") | 1657 | self.skipTest("Only relevant for Git.") |
302 | 1691 | bug = self.factory.makeBug() | 1658 | bug = self.factory.makeBug() |
304 | 1692 | bmp = self._makeBranchMergeProposal() | 1659 | bmp = self.makeBranchMergeProposal() |
305 | 1693 | self._setUpLog([bug]) | 1660 | self._setUpLog([bug]) |
306 | 1694 | bmp.updateRelatedBugsFromSource() | 1661 | bmp.updateRelatedBugsFromSource() |
307 | 1695 | self.assertEqual([bug], bmp.bugs) | 1662 | self.assertEqual([bug], bmp.bugs) |
308 | @@ -1704,7 +1671,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
309 | 1704 | if not self.git: | 1671 | if not self.git: |
310 | 1705 | self.skipTest("Only relevant for Git.") | 1672 | self.skipTest("Only relevant for Git.") |
311 | 1706 | bug = self.factory.makeBug() | 1673 | bug = self.factory.makeBug() |
313 | 1707 | bmp = self._makeBranchMergeProposal() | 1674 | bmp = self.makeBranchMergeProposal() |
314 | 1708 | self._setUpLog([bug]) | 1675 | self._setUpLog([bug]) |
315 | 1709 | bmp.updateRelatedBugsFromSource() | 1676 | bmp.updateRelatedBugsFromSource() |
316 | 1710 | self.assertEqual([bug], bmp.bugs) | 1677 | self.assertEqual([bug], bmp.bugs) |
317 | @@ -1719,7 +1686,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
318 | 1719 | if not self.git: | 1686 | if not self.git: |
319 | 1720 | self.skipTest("Only relevant for Git.") | 1687 | self.skipTest("Only relevant for Git.") |
320 | 1721 | bug = self.factory.makeBug() | 1688 | bug = self.factory.makeBug() |
322 | 1722 | bmp = self._makeBranchMergeProposal() | 1689 | bmp = self.makeBranchMergeProposal() |
323 | 1723 | bmp.linkBug(bug) | 1690 | bmp.linkBug(bug) |
324 | 1724 | self._setUpLog([]) | 1691 | self._setUpLog([]) |
325 | 1725 | bmp.updateRelatedBugsFromSource() | 1692 | bmp.updateRelatedBugsFromSource() |
326 | @@ -1744,7 +1711,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
327 | 1744 | self.skipTest("Only relevant for Git.") | 1711 | self.skipTest("Only relevant for Git.") |
328 | 1745 | self.pushConfig("codehosting", related_bugs_from_source_limit=3) | 1712 | self.pushConfig("codehosting", related_bugs_from_source_limit=3) |
329 | 1746 | bugs = [self.factory.makeBug() for _ in range(5)] | 1713 | bugs = [self.factory.makeBug() for _ in range(5)] |
331 | 1747 | bmp = self._makeBranchMergeProposal() | 1714 | bmp = self.makeBranchMergeProposal() |
332 | 1748 | self._setUpLog([bugs[0]]) | 1715 | self._setUpLog([bugs[0]]) |
333 | 1749 | bmp.updateRelatedBugsFromSource() | 1716 | bmp.updateRelatedBugsFromSource() |
334 | 1750 | self.assertEqual([bugs[0]], bmp.bugs) | 1717 | self.assertEqual([bugs[0]], bmp.bugs) |
335 | @@ -1756,45 +1723,48 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): | |||
336 | 1756 | self.assertEqual("TooManyRelatedBugs", self.oopses[0]["type"]) | 1723 | self.assertEqual("TooManyRelatedBugs", self.oopses[0]["type"]) |
337 | 1757 | 1724 | ||
338 | 1758 | 1725 | ||
340 | 1759 | class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | 1726 | class TestBranchMergeProposalNominateReviewer( |
341 | 1727 | WithVCSScenarios, TestCaseWithFactory): | ||
342 | 1760 | """Test that the appropriate vote references get created.""" | 1728 | """Test that the appropriate vote references get created.""" |
343 | 1761 | 1729 | ||
344 | 1762 | layer = DatabaseFunctionalLayer | 1730 | layer = DatabaseFunctionalLayer |
345 | 1763 | 1731 | ||
346 | 1764 | def setUp(self): | 1732 | def setUp(self): |
347 | 1765 | TestCaseWithFactory.setUp(self, user='test@canonical.com') | 1733 | TestCaseWithFactory.setUp(self, user='test@canonical.com') |
348 | 1734 | if self.git: | ||
349 | 1735 | self.hosting_fixture = self.useFixture(GitHostingFixture()) | ||
350 | 1766 | 1736 | ||
351 | 1767 | def test_notify_on_nominate(self): | 1737 | def test_notify_on_nominate(self): |
352 | 1768 | # Ensure that a notification is emitted on nomination. | 1738 | # Ensure that a notification is emitted on nomination. |
355 | 1769 | merge_proposal = self.factory.makeBranchMergeProposal() | 1739 | merge_proposal = self.makeBranchMergeProposal() |
356 | 1770 | login_person(merge_proposal.source_branch.owner) | 1740 | login_person(merge_proposal.merge_source.owner) |
357 | 1771 | reviewer = self.factory.makePerson() | 1741 | reviewer = self.factory.makePerson() |
358 | 1772 | result, events = self.assertNotifies( | 1742 | result, events = self.assertNotifies( |
359 | 1773 | ReviewerNominatedEvent, False, | 1743 | ReviewerNominatedEvent, False, |
360 | 1774 | merge_proposal.nominateReviewer, | 1744 | merge_proposal.nominateReviewer, |
361 | 1775 | reviewer=reviewer, | 1745 | reviewer=reviewer, |
363 | 1776 | registrant=merge_proposal.source_branch.owner) | 1746 | registrant=merge_proposal.merge_source.owner) |
364 | 1777 | self.assertEqual(result, events[0].object) | 1747 | self.assertEqual(result, events[0].object) |
365 | 1778 | 1748 | ||
366 | 1779 | def test_notify_on_nominate_suppressed_if_requested(self): | 1749 | def test_notify_on_nominate_suppressed_if_requested(self): |
367 | 1780 | # Ensure that a notification is suppressed if notify listeners is set | 1750 | # Ensure that a notification is suppressed if notify listeners is set |
368 | 1781 | # to False. | 1751 | # to False. |
371 | 1782 | merge_proposal = self.factory.makeBranchMergeProposal() | 1752 | merge_proposal = self.makeBranchMergeProposal() |
372 | 1783 | login_person(merge_proposal.source_branch.owner) | 1753 | login_person(merge_proposal.merge_source.owner) |
373 | 1784 | reviewer = self.factory.makePerson() | 1754 | reviewer = self.factory.makePerson() |
374 | 1785 | self.assertNoNotification( | 1755 | self.assertNoNotification( |
375 | 1786 | merge_proposal.nominateReviewer, | 1756 | merge_proposal.nominateReviewer, |
376 | 1787 | reviewer=reviewer, | 1757 | reviewer=reviewer, |
378 | 1788 | registrant=merge_proposal.source_branch.owner, | 1758 | registrant=merge_proposal.merge_source.owner, |
379 | 1789 | _notify_listeners=False) | 1759 | _notify_listeners=False) |
380 | 1790 | 1760 | ||
381 | 1791 | def test_one_initial_votes(self): | 1761 | def test_one_initial_votes(self): |
382 | 1792 | """A new merge proposal has one vote of the default reviewer.""" | 1762 | """A new merge proposal has one vote of the default reviewer.""" |
384 | 1793 | merge_proposal = self.factory.makeBranchMergeProposal() | 1763 | merge_proposal = self.makeBranchMergeProposal() |
385 | 1794 | self.assertEqual(1, len(list(merge_proposal.votes))) | 1764 | self.assertEqual(1, len(list(merge_proposal.votes))) |
386 | 1795 | [vote] = list(merge_proposal.votes) | 1765 | [vote] = list(merge_proposal.votes) |
387 | 1796 | self.assertEqual( | 1766 | self.assertEqual( |
389 | 1797 | merge_proposal.target_branch.owner, vote.reviewer) | 1767 | merge_proposal.merge_target.owner, vote.reviewer) |
390 | 1798 | 1768 | ||
391 | 1799 | def makeProposalWithReviewer(self, reviewer=None, review_type=None, | 1769 | def makeProposalWithReviewer(self, reviewer=None, review_type=None, |
392 | 1800 | registrant=None, **kwargs): | 1770 | registrant=None, **kwargs): |
393 | @@ -1807,8 +1777,9 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
394 | 1807 | if registrant is None: | 1777 | if registrant is None: |
395 | 1808 | registrant = self.factory.makePerson() | 1778 | registrant = self.factory.makePerson() |
396 | 1809 | merge_proposal = make_merge_proposal_without_reviewers( | 1779 | merge_proposal = make_merge_proposal_without_reviewers( |
399 | 1810 | factory=self.factory, registrant=registrant, **kwargs) | 1780 | factory=self.factory, for_git=self.git, registrant=registrant, |
400 | 1811 | login_person(merge_proposal.source_branch.owner) | 1781 | **kwargs) |
401 | 1782 | login_person(merge_proposal.merge_source.owner) | ||
402 | 1812 | merge_proposal.nominateReviewer( | 1783 | merge_proposal.nominateReviewer( |
403 | 1813 | reviewer=reviewer, registrant=registrant, review_type=review_type) | 1784 | reviewer=reviewer, registrant=registrant, review_type=review_type) |
404 | 1814 | return merge_proposal, reviewer | 1785 | return merge_proposal, reviewer |
405 | @@ -1914,15 +1885,15 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
406 | 1914 | 1885 | ||
407 | 1915 | def test_nominate_updates_reference(self): | 1886 | def test_nominate_updates_reference(self): |
408 | 1916 | """The existing reference is updated on re-nomination.""" | 1887 | """The existing reference is updated on re-nomination.""" |
411 | 1917 | merge_proposal = self.factory.makeBranchMergeProposal() | 1888 | merge_proposal = self.makeBranchMergeProposal() |
412 | 1918 | login_person(merge_proposal.source_branch.owner) | 1889 | login_person(merge_proposal.merge_source.owner) |
413 | 1919 | reviewer = self.factory.makePerson() | 1890 | reviewer = self.factory.makePerson() |
414 | 1920 | reference = merge_proposal.nominateReviewer( | 1891 | reference = merge_proposal.nominateReviewer( |
416 | 1921 | reviewer=reviewer, registrant=merge_proposal.source_branch.owner, | 1892 | reviewer=reviewer, registrant=merge_proposal.merge_source.owner, |
417 | 1922 | review_type='General') | 1893 | review_type='General') |
418 | 1923 | self.assertEqual('general', reference.review_type) | 1894 | self.assertEqual('general', reference.review_type) |
419 | 1924 | merge_proposal.nominateReviewer( | 1895 | merge_proposal.nominateReviewer( |
421 | 1925 | reviewer=reviewer, registrant=merge_proposal.source_branch.owner, | 1896 | reviewer=reviewer, registrant=merge_proposal.merge_source.owner, |
422 | 1926 | review_type='Specific') | 1897 | review_type='Specific') |
423 | 1927 | # Note we're using the reference from the first call | 1898 | # Note we're using the reference from the first call |
424 | 1928 | self.assertEqual('specific', reference.review_type) | 1899 | self.assertEqual('specific', reference.review_type) |
425 | @@ -1939,31 +1910,37 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
426 | 1939 | CodeReviewNotificationLevel.FULL, sub.review_level) | 1910 | CodeReviewNotificationLevel.FULL, sub.review_level) |
427 | 1940 | # The reviewer can see the branch. | 1911 | # The reviewer can see the branch. |
428 | 1941 | self.assertTrue(branch.visibleByUser(reviewer)) | 1912 | self.assertTrue(branch.visibleByUser(reviewer)) |
430 | 1942 | if branch.stacked_on is not None: | 1913 | if IBranch.providedBy(branch) and branch.stacked_on is not None: |
431 | 1943 | self._check_mp_branch_visibility(branch.stacked_on, reviewer) | 1914 | self._check_mp_branch_visibility(branch.stacked_on, reviewer) |
432 | 1944 | 1915 | ||
433 | 1945 | def _test_nominate_grants_visibility(self, reviewer): | 1916 | def _test_nominate_grants_visibility(self, reviewer): |
434 | 1946 | """Nominated reviewers can see the source and target branches.""" | 1917 | """Nominated reviewers can see the source and target branches.""" |
435 | 1947 | owner = self.factory.makePerson() | 1918 | owner = self.factory.makePerson() |
436 | 1948 | product = self.factory.makeProduct() | 1919 | product = self.factory.makeProduct() |
439 | 1949 | # We make a source branch stacked on a private one. | 1920 | # For bzr, we make a source branch stacked on a private one. |
440 | 1950 | base_branch = self.factory.makeBranch( | 1921 | # For git, we make the gitref itself private. |
441 | 1922 | if self.git: | ||
442 | 1923 | source_branch = self.makeBranch( | ||
443 | 1924 | product=product, owner=owner, | ||
444 | 1925 | information_type=InformationType.USERDATA) | ||
445 | 1926 | else: | ||
446 | 1927 | base_branch = self.makeBranch( | ||
447 | 1928 | owner=owner, product=product, | ||
448 | 1929 | information_type=InformationType.USERDATA) | ||
449 | 1930 | source_branch = self.makeBranch( | ||
450 | 1931 | stacked_on=base_branch, product=product, owner=owner) | ||
451 | 1932 | target_branch = self.makeBranch( | ||
452 | 1951 | owner=owner, product=product, | 1933 | owner=owner, product=product, |
453 | 1952 | information_type=InformationType.USERDATA) | 1934 | information_type=InformationType.USERDATA) |
454 | 1953 | source_branch = self.factory.makeBranch( | ||
455 | 1954 | stacked_on=base_branch, product=product, owner=owner) | ||
456 | 1955 | target_branch = self.factory.makeBranch(owner=owner, product=product) | ||
457 | 1956 | login_person(owner) | 1935 | login_person(owner) |
462 | 1957 | merge_proposal = self.factory.makeBranchMergeProposal( | 1936 | merge_proposal = self.makeBranchMergeProposal( |
463 | 1958 | source_branch=source_branch, | 1937 | source=source_branch, target=target_branch) |
460 | 1959 | target_branch=target_branch) | ||
461 | 1960 | target_branch.setPrivate(True, owner) | ||
464 | 1961 | # The reviewer can't see the source or target branches. | 1938 | # The reviewer can't see the source or target branches. |
465 | 1962 | self.assertFalse(source_branch.visibleByUser(reviewer)) | 1939 | self.assertFalse(source_branch.visibleByUser(reviewer)) |
466 | 1963 | self.assertFalse(target_branch.visibleByUser(reviewer)) | 1940 | self.assertFalse(target_branch.visibleByUser(reviewer)) |
467 | 1964 | merge_proposal.nominateReviewer( | 1941 | merge_proposal.nominateReviewer( |
468 | 1965 | reviewer=reviewer, | 1942 | reviewer=reviewer, |
470 | 1966 | registrant=merge_proposal.source_branch.owner) | 1943 | registrant=merge_proposal.merge_source.owner) |
471 | 1967 | for branch in [source_branch, target_branch]: | 1944 | for branch in [source_branch, target_branch]: |
472 | 1968 | self._check_mp_branch_visibility(branch, reviewer) | 1945 | self._check_mp_branch_visibility(branch, reviewer) |
473 | 1969 | 1946 | ||
474 | @@ -1987,7 +1964,7 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
475 | 1987 | def test_comment_with_vote_creates_reference(self): | 1964 | def test_comment_with_vote_creates_reference(self): |
476 | 1988 | """A comment with a vote creates a vote reference.""" | 1965 | """A comment with a vote creates a vote reference.""" |
477 | 1989 | reviewer = self.factory.makePerson() | 1966 | reviewer = self.factory.makePerson() |
479 | 1990 | merge_proposal = self.factory.makeBranchMergeProposal( | 1967 | merge_proposal = self.makeBranchMergeProposal( |
480 | 1991 | reviewer=reviewer, registrant=reviewer) | 1968 | reviewer=reviewer, registrant=reviewer) |
481 | 1992 | comment = merge_proposal.createComment( | 1969 | comment = merge_proposal.createComment( |
482 | 1993 | reviewer, 'Message subject', 'Message content', | 1970 | reviewer, 'Message subject', 'Message content', |
483 | @@ -1998,7 +1975,8 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
484 | 1998 | def test_comment_without_a_vote_does_not_create_reference(self): | 1975 | def test_comment_without_a_vote_does_not_create_reference(self): |
485 | 1999 | """A comment with a vote creates a vote reference.""" | 1976 | """A comment with a vote creates a vote reference.""" |
486 | 2000 | reviewer = self.factory.makePerson() | 1977 | reviewer = self.factory.makePerson() |
488 | 2001 | merge_proposal = make_merge_proposal_without_reviewers(self.factory) | 1978 | merge_proposal = make_merge_proposal_without_reviewers( |
489 | 1979 | self.factory, for_git=self.git) | ||
490 | 2002 | merge_proposal.createComment( | 1980 | merge_proposal.createComment( |
491 | 2003 | reviewer, 'Message subject', 'Message content') | 1981 | reviewer, 'Message subject', 'Message content') |
492 | 2004 | self.assertEqual([], list(merge_proposal.votes)) | 1982 | self.assertEqual([], list(merge_proposal.votes)) |
493 | @@ -2006,7 +1984,7 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
494 | 2006 | def test_second_vote_by_person_just_alters_reference(self): | 1984 | def test_second_vote_by_person_just_alters_reference(self): |
495 | 2007 | """A second vote changes the comment reference only.""" | 1985 | """A second vote changes the comment reference only.""" |
496 | 2008 | reviewer = self.factory.makePerson() | 1986 | reviewer = self.factory.makePerson() |
498 | 2009 | merge_proposal = self.factory.makeBranchMergeProposal( | 1987 | merge_proposal = self.makeBranchMergeProposal( |
499 | 2010 | reviewer=reviewer, registrant=reviewer) | 1988 | reviewer=reviewer, registrant=reviewer) |
500 | 2011 | merge_proposal.createComment( | 1989 | merge_proposal.createComment( |
501 | 2012 | reviewer, 'Message subject', 'Message content', | 1990 | reviewer, 'Message subject', 'Message content', |
502 | @@ -2022,7 +2000,7 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
503 | 2022 | reviewer = self.factory.makePerson() | 2000 | reviewer = self.factory.makePerson() |
504 | 2023 | merge_proposal, ignore = self.makeProposalWithReviewer( | 2001 | merge_proposal, ignore = self.makeProposalWithReviewer( |
505 | 2024 | reviewer=reviewer, review_type='general') | 2002 | reviewer=reviewer, review_type='general') |
507 | 2025 | login(merge_proposal.source_branch.owner.preferredemail.email) | 2003 | login(merge_proposal.merge_source.owner.preferredemail.email) |
508 | 2026 | comment = merge_proposal.createComment( | 2004 | comment = merge_proposal.createComment( |
509 | 2027 | reviewer, 'Message subject', 'Message content', | 2005 | reviewer, 'Message subject', 'Message content', |
510 | 2028 | vote=CodeReviewVote.APPROVE, review_type='general') | 2006 | vote=CodeReviewVote.APPROVE, review_type='general') |
511 | @@ -2042,7 +2020,7 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
512 | 2042 | team = self.factory.makeTeam(owner=reviewer) | 2020 | team = self.factory.makeTeam(owner=reviewer) |
513 | 2043 | merge_proposal, ignore = self.makeProposalWithReviewer( | 2021 | merge_proposal, ignore = self.makeProposalWithReviewer( |
514 | 2044 | reviewer=team, review_type='general') | 2022 | reviewer=team, review_type='general') |
516 | 2045 | login(merge_proposal.source_branch.owner.preferredemail.email) | 2023 | login(merge_proposal.merge_source.owner.preferredemail.email) |
517 | 2046 | [vote] = list(merge_proposal.votes) | 2024 | [vote] = list(merge_proposal.votes) |
518 | 2047 | self.assertEqual(team, vote.reviewer) | 2025 | self.assertEqual(team, vote.reviewer) |
519 | 2048 | comment = merge_proposal.createComment( | 2026 | comment = merge_proposal.createComment( |
520 | @@ -2059,8 +2037,8 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
521 | 2059 | # one. | 2037 | # one. |
522 | 2060 | reviewer = self.factory.makePerson() | 2038 | reviewer = self.factory.makePerson() |
523 | 2061 | team = self.factory.makeTeam(owner=reviewer) | 2039 | team = self.factory.makeTeam(owner=reviewer) |
526 | 2062 | merge_proposal = self.factory.makeBranchMergeProposal(reviewer=team) | 2040 | merge_proposal = self.makeBranchMergeProposal(reviewer=team) |
527 | 2063 | login(merge_proposal.source_branch.owner.preferredemail.email) | 2041 | login(merge_proposal.merge_source.owner.preferredemail.email) |
528 | 2064 | [vote] = list(merge_proposal.votes) | 2042 | [vote] = list(merge_proposal.votes) |
529 | 2065 | self.assertEqual(team, vote.reviewer) | 2043 | self.assertEqual(team, vote.reviewer) |
530 | 2066 | comment = merge_proposal.createComment( | 2044 | comment = merge_proposal.createComment( |
531 | @@ -2078,8 +2056,8 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): | |||
532 | 2078 | merge_proposal_1, reviewer_1 = self.makeProposalWithReviewer( | 2056 | merge_proposal_1, reviewer_1 = self.makeProposalWithReviewer( |
533 | 2079 | set_state=BranchMergeProposalStatus.MERGED) | 2057 | set_state=BranchMergeProposalStatus.MERGED) |
534 | 2080 | merge_proposal_2, _ = self.makeProposalWithReviewer( | 2058 | merge_proposal_2, _ = self.makeProposalWithReviewer( |
537 | 2081 | target_branch=merge_proposal_1.target_branch, | 2059 | target=merge_proposal_1.merge_target, |
538 | 2082 | source_branch=merge_proposal_1.source_branch) | 2060 | source=merge_proposal_1.merge_source) |
539 | 2083 | merge_proposal_2.nominateReviewer( | 2061 | merge_proposal_2.nominateReviewer( |
540 | 2084 | reviewer=reviewer_1, registrant=merge_proposal_2.registrant) | 2062 | reviewer=reviewer_1, registrant=merge_proposal_2.registrant) |
541 | 2085 | votes_1 = list(merge_proposal_1.votes) | 2063 | votes_1 = list(merge_proposal_1.votes) |
542 | diff --git a/lib/lp/code/tests/helpers.py b/lib/lp/code/tests/helpers.py | |||
543 | index 46f12ed..0e784f0 100644 | |||
544 | --- a/lib/lp/code/tests/helpers.py | |||
545 | +++ b/lib/lp/code/tests/helpers.py | |||
546 | @@ -1,4 +1,4 @@ | |||
548 | 1 | # Copyright 2009-2018 Canonical Ltd. This software is licensed under the | 1 | # Copyright 2009-2020 Canonical Ltd. This software is licensed under the |
549 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). |
550 | 3 | 3 | ||
551 | 4 | """Helper functions for code testing live here.""" | 4 | """Helper functions for code testing live here.""" |
552 | @@ -49,8 +49,8 @@ from lp.code.model.seriessourcepackagebranch import ( | |||
553 | 49 | from lp.registry.interfaces.pocket import PackagePublishingPocket | 49 | from lp.registry.interfaces.pocket import PackagePublishingPocket |
554 | 50 | from lp.registry.interfaces.series import SeriesStatus | 50 | from lp.registry.interfaces.series import SeriesStatus |
555 | 51 | from lp.services.database.sqlbase import cursor | 51 | from lp.services.database.sqlbase import cursor |
556 | 52 | from lp.services.propertycache import get_property_cache | ||
557 | 53 | from lp.services.memcache.testing import MemcacheFixture | 52 | from lp.services.memcache.testing import MemcacheFixture |
558 | 53 | from lp.services.propertycache import get_property_cache | ||
559 | 54 | from lp.testing import ( | 54 | from lp.testing import ( |
560 | 55 | run_with_login, | 55 | run_with_login, |
561 | 56 | time_counter, | 56 | time_counter, |
562 | @@ -271,9 +271,18 @@ def recipe_parser_newest_version(version): | |||
563 | 271 | RecipeParser.NEWEST_VERSION = old_version | 271 | RecipeParser.NEWEST_VERSION = old_version |
564 | 272 | 272 | ||
565 | 273 | 273 | ||
567 | 274 | def make_merge_proposal_without_reviewers(factory, **kwargs): | 274 | def make_merge_proposal_without_reviewers( |
568 | 275 | factory, for_git=False, source=None, target=None, **kwargs): | ||
569 | 275 | """Make a merge proposal and strip of any review votes.""" | 276 | """Make a merge proposal and strip of any review votes.""" |
571 | 276 | proposal = factory.makeBranchMergeProposal(**kwargs) | 277 | kwargs = dict(kwargs) |
572 | 278 | if for_git: | ||
573 | 279 | kwargs["source_ref"] = source | ||
574 | 280 | kwargs["target_ref"] = target | ||
575 | 281 | proposal = factory.makeBranchMergeProposalForGit(**kwargs) | ||
576 | 282 | else: | ||
577 | 283 | kwargs["source_branch"] = source | ||
578 | 284 | kwargs["target_branch"] = target | ||
579 | 285 | proposal = factory.makeBranchMergeProposal(**kwargs) | ||
580 | 277 | for vote in proposal.votes: | 286 | for vote in proposal.votes: |
581 | 278 | removeSecurityProxy(vote).destroySelf() | 287 | removeSecurityProxy(vote).destroySelf() |
582 | 279 | del get_property_cache(proposal).votes | 288 | del get_property_cache(proposal).votes |