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 | Approve | ||
Review via email:
|
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 | BranchMergeProposalNeedsReviewEvent, |
7 | ReviewerNominatedEvent, |
8 | ) |
9 | +from lp.code.interfaces.branch import IBranch |
10 | from lp.code.interfaces.branchmergeproposal import ( |
11 | BRANCH_MERGE_PROPOSAL_FINAL_STATES as FINAL_STATES, |
12 | BRANCH_MERGE_PROPOSAL_OBSOLETE_STATES as OBSOLETE_STATES, |
13 | @@ -110,6 +111,49 @@ from lp.testing.layers import ( |
14 | ) |
15 | |
16 | |
17 | +class WithVCSScenarios(WithScenarios): |
18 | + |
19 | + scenarios = [ |
20 | + ("bzr", {"git": False}), |
21 | + ("git", {"git": True}), |
22 | + ] |
23 | + |
24 | + def makeBranch(self, same_target_as=None, product=None, stacked_on=None, |
25 | + information_type=None, owner=None): |
26 | + # Create the product pillar and its access policy if information |
27 | + # type is "PROPRIETARY". |
28 | + if product is None and same_target_as is None: |
29 | + product = self.factory.makeProduct() |
30 | + if information_type == InformationType.PROPRIETARY: |
31 | + self.factory.makeAccessPolicy(product) |
32 | + elif product is None: |
33 | + same_target_as = removeSecurityProxy(same_target_as) |
34 | + product = (same_target_as.target if self.git else |
35 | + same_target_as.product) |
36 | + |
37 | + kwargs = { |
38 | + "information_type": information_type, |
39 | + "owner": owner} |
40 | + if self.git: |
41 | + kwargs["target"] = product |
42 | + return self.factory.makeGitRefs(**kwargs)[0] |
43 | + else: |
44 | + kwargs["product"] = product |
45 | + kwargs["stacked_on"] = stacked_on |
46 | + return self.factory.makeProductBranch(**kwargs) |
47 | + |
48 | + def makeBranchMergeProposal(self, source=None, target=None, |
49 | + prerequisite=None, **kwargs): |
50 | + if self.git: |
51 | + return self.factory.makeBranchMergeProposalForGit( |
52 | + target_ref=target, source_ref=source, |
53 | + prerequisite_ref=prerequisite, **kwargs) |
54 | + else: |
55 | + return self.factory.makeBranchMergeProposal( |
56 | + source_branch=source, target_branch=target, |
57 | + prerequisite_branch=prerequisite, **kwargs) |
58 | + |
59 | + |
60 | class TestBranchMergeProposalInterface(TestCaseWithFactory): |
61 | """Ensure that BranchMergeProposal implements its interface.""" |
62 | |
63 | @@ -121,26 +165,16 @@ class TestBranchMergeProposalInterface(TestCaseWithFactory): |
64 | verifyObject(IBranchMergeProposal, bmp) |
65 | |
66 | |
67 | -class TestBranchMergeProposalCanonicalUrl(WithScenarios, TestCaseWithFactory): |
68 | +class TestBranchMergeProposalCanonicalUrl( |
69 | + WithVCSScenarios, TestCaseWithFactory): |
70 | """Tests canonical_url for merge proposals.""" |
71 | |
72 | layer = DatabaseFunctionalLayer |
73 | |
74 | - scenarios = [ |
75 | - ("bzr", {"git": False}), |
76 | - ("git", {"git": True}), |
77 | - ] |
78 | - |
79 | - def _makeBranchMergeProposal(self): |
80 | - if self.git: |
81 | - return self.factory.makeBranchMergeProposalForGit() |
82 | - else: |
83 | - return self.factory.makeBranchMergeProposal() |
84 | - |
85 | def test_BranchMergeProposal_canonical_url_base(self): |
86 | # The URL for a merge proposal starts with the parent (source branch |
87 | # or source Git repository). |
88 | - bmp = self._makeBranchMergeProposal() |
89 | + bmp = self.makeBranchMergeProposal() |
90 | url = canonical_url(bmp) |
91 | parent_url = canonical_url(bmp.parent) |
92 | self.assertTrue(url.startswith(parent_url)) |
93 | @@ -148,7 +182,7 @@ class TestBranchMergeProposalCanonicalUrl(WithScenarios, TestCaseWithFactory): |
94 | def test_BranchMergeProposal_canonical_url_rest(self): |
95 | # The rest of the URL for a merge proposal is +merge followed by the |
96 | # db id. |
97 | - bmp = self._makeBranchMergeProposal() |
98 | + bmp = self.makeBranchMergeProposal() |
99 | url = canonical_url(bmp) |
100 | parent_url = canonical_url(bmp.parent) |
101 | rest = url[len(parent_url):] |
102 | @@ -719,45 +753,14 @@ class TestMergeProposalGetPreviewDiff(TestCaseWithFactory): |
103 | self.mp_two.getPreviewDiff, self.preview_diff.id) |
104 | |
105 | |
106 | -class TestMergeProposalNotification(WithScenarios, TestCaseWithFactory): |
107 | +class TestMergeProposalNotification(WithVCSScenarios, TestCaseWithFactory): |
108 | """Test that events are created when merge proposals are manipulated""" |
109 | |
110 | layer = DatabaseFunctionalLayer |
111 | |
112 | - scenarios = [ |
113 | - ("bzr", {"git": False}), |
114 | - ("git", {"git": True}), |
115 | - ] |
116 | - |
117 | def setUp(self): |
118 | TestCaseWithFactory.setUp(self, user='test@canonical.com') |
119 | |
120 | - def makeBranch(self, same_target_as=None, target=None, **kwargs): |
121 | - kwargs = dict(kwargs) |
122 | - if self.git: |
123 | - if same_target_as is not None: |
124 | - kwargs["target"] = same_target_as.target |
125 | - elif target is not None: |
126 | - kwargs["target"] = target |
127 | - return self.factory.makeGitRefs(**kwargs)[0] |
128 | - else: |
129 | - if same_target_as is not None: |
130 | - kwargs["product"] = same_target_as.product |
131 | - elif target is not None: |
132 | - kwargs["product"] = target |
133 | - return self.factory.makeProductBranch(**kwargs) |
134 | - |
135 | - def makeBranchMergeProposal(self, source=None, target=None, |
136 | - prerequisite=None, **kwargs): |
137 | - if self.git: |
138 | - return self.factory.makeBranchMergeProposalForGit( |
139 | - source_ref=source, target_ref=target, |
140 | - prerequisite_ref=prerequisite, **kwargs) |
141 | - else: |
142 | - return self.factory.makeBranchMergeProposal( |
143 | - source_branch=source, target_branch=target, |
144 | - prerequisite_branch=prerequisite, **kwargs) |
145 | - |
146 | def test_notifyOnCreate_needs_review(self): |
147 | # When a merge proposal is created needing review, the |
148 | # BranchMergeProposalNeedsReviewEvent is raised as well as the usual |
149 | @@ -989,8 +992,8 @@ class TestMergeProposalNotification(WithScenarios, TestCaseWithFactory): |
150 | # they do not get email about the proposal. |
151 | owner = self.factory.makePerson() |
152 | product = self.factory.makeProduct() |
153 | - source = self.makeBranch(owner=owner, target=product) |
154 | - target = self.makeBranch(owner=owner, target=product) |
155 | + source = self.makeBranch(owner=owner, product=product) |
156 | + target = self.makeBranch(owner=owner, product=product) |
157 | bmp = self.makeBranchMergeProposal(source=source, target=target) |
158 | # Subscribe eric to the source branch only. |
159 | eric = self.factory.makePerson() |
160 | @@ -1022,40 +1025,15 @@ class TestMergeProposalNotification(WithScenarios, TestCaseWithFactory): |
161 | self.assertIn(charlie, recipients) |
162 | |
163 | |
164 | -class TestMergeProposalWebhooks(WithScenarios, TestCaseWithFactory): |
165 | +class TestMergeProposalWebhooks(WithVCSScenarios, TestCaseWithFactory): |
166 | |
167 | layer = DatabaseFunctionalLayer |
168 | |
169 | - scenarios = [ |
170 | - ("bzr", {"git": False}), |
171 | - ("git", {"git": True}), |
172 | - ] |
173 | - |
174 | def setUp(self): |
175 | super(TestMergeProposalWebhooks, self).setUp() |
176 | self.useFixture(FeatureFixture( |
177 | {BRANCH_MERGE_PROPOSAL_WEBHOOKS_FEATURE_FLAG: "on"})) |
178 | |
179 | - def makeBranch(self, same_target_as=None, information_type=None): |
180 | - # Create the product pillar and its access policy if information |
181 | - # type is "PROPRIETARY". |
182 | - if same_target_as is None: |
183 | - product = self.factory.makeProduct() |
184 | - if information_type == InformationType.PROPRIETARY: |
185 | - self.factory.makeAccessPolicy(product) |
186 | - else: |
187 | - same_target_as = removeSecurityProxy(same_target_as) |
188 | - product = (same_target_as.target if self.git else |
189 | - same_target_as.product) |
190 | - |
191 | - kwargs = {"information_type": information_type} |
192 | - if self.git: |
193 | - kwargs["target"] = product |
194 | - return self.factory.makeGitRefs(**kwargs)[0] |
195 | - else: |
196 | - kwargs["product"] = product |
197 | - return self.factory.makeProductBranch(**kwargs) |
198 | - |
199 | def getWebhookTarget(self, branch): |
200 | if self.git: |
201 | return branch.repository |
202 | @@ -1529,15 +1507,10 @@ class TestBranchMergeProposalDeletion(TestCaseWithFactory): |
203 | SQLObjectNotFound, BranchMergeProposalJob.get, job_id) |
204 | |
205 | |
206 | -class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
207 | +class TestBranchMergeProposalBugs(WithVCSScenarios, TestCaseWithFactory): |
208 | |
209 | layer = DatabaseFunctionalLayer |
210 | |
211 | - scenarios = [ |
212 | - ("bzr", {"git": False}), |
213 | - ("git", {"git": True}), |
214 | - ] |
215 | - |
216 | def setUp(self): |
217 | super(TestBranchMergeProposalBugs, self).setUp() |
218 | self.user = self.factory.makePerson() |
219 | @@ -1545,15 +1518,9 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
220 | if self.git: |
221 | self.hosting_fixture = self.useFixture(GitHostingFixture()) |
222 | |
223 | - def _makeBranchMergeProposal(self): |
224 | - if self.git: |
225 | - return self.factory.makeBranchMergeProposalForGit() |
226 | - else: |
227 | - return self.factory.makeBranchMergeProposal() |
228 | - |
229 | def test_bugs(self): |
230 | # bugs includes all linked bugs. |
231 | - bmp = self._makeBranchMergeProposal() |
232 | + bmp = self.makeBranchMergeProposal() |
233 | self.assertEqual([], bmp.bugs) |
234 | bugs = [self.factory.makeBug() for _ in range(2)] |
235 | bmp.linkBug(bugs[0], bmp.registrant) |
236 | @@ -1568,7 +1535,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
237 | def test_related_bugtasks_includes_source_bugtasks(self): |
238 | # related_bugtasks includes bugtasks linked to the source branch in |
239 | # the Bazaar case, or directly to the MP in the Git case. |
240 | - bmp = self._makeBranchMergeProposal() |
241 | + bmp = self.makeBranchMergeProposal() |
242 | bug = self.factory.makeBug() |
243 | bmp.linkBug(bug, bmp.registrant) |
244 | self.assertEqual( |
245 | @@ -1576,7 +1543,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
246 | |
247 | def test_related_bugtasks_excludes_private_bugs(self): |
248 | # related_bugtasks ignores private bugs for non-authorised users. |
249 | - bmp = self._makeBranchMergeProposal() |
250 | + bmp = self.makeBranchMergeProposal() |
251 | bug = self.factory.makeBug() |
252 | bmp.linkBug(bug, bmp.registrant) |
253 | person = self.factory.makePerson() |
254 | @@ -1596,7 +1563,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
255 | # related_bugtasks ignores bugs linked to the target branch. |
256 | if self.git: |
257 | self.skipTest("Only relevant for Bazaar.") |
258 | - bmp = self._makeBranchMergeProposal() |
259 | + bmp = self.makeBranchMergeProposal() |
260 | bug = self.factory.makeBug() |
261 | bmp.target_branch.linkBug(bug, bmp.registrant) |
262 | self.assertEqual([], list(bmp.getRelatedBugTasks(self.user))) |
263 | @@ -1605,7 +1572,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
264 | # related_bugtasks ignores bugs linked to both branches. |
265 | if self.git: |
266 | self.skipTest("Only relevant for Bazaar.") |
267 | - bmp = self._makeBranchMergeProposal() |
268 | + bmp = self.makeBranchMergeProposal() |
269 | bug = self.factory.makeBug() |
270 | bmp.source_branch.linkBug(bug, bmp.registrant) |
271 | bmp.target_branch.linkBug(bug, bmp.registrant) |
272 | @@ -1617,7 +1584,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
273 | if not self.git: |
274 | self.skipTest("Only relevant for Git.") |
275 | bugs = [self.factory.makeBug() for _ in range(3)] |
276 | - bmp = self._makeBranchMergeProposal() |
277 | + bmp = self.makeBranchMergeProposal() |
278 | self.hosting_fixture.getLog.result = [ |
279 | { |
280 | "sha1": bmp.source_git_commit_sha1, |
281 | @@ -1664,7 +1631,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
282 | # bugs in either the database or the source branch. |
283 | if not self.git: |
284 | self.skipTest("Only relevant for Git.") |
285 | - bmp = self._makeBranchMergeProposal() |
286 | + bmp = self.makeBranchMergeProposal() |
287 | self._setUpLog([]) |
288 | bmp.updateRelatedBugsFromSource() |
289 | self.assertEqual([], bmp.bugs) |
290 | @@ -1675,7 +1642,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
291 | if not self.git: |
292 | self.skipTest("Only relevant for Git.") |
293 | bugs = [self.factory.makeBug() for _ in range(3)] |
294 | - bmp = self._makeBranchMergeProposal() |
295 | + bmp = self.makeBranchMergeProposal() |
296 | self._setUpLog([bugs[0]]) |
297 | bmp.updateRelatedBugsFromSource() |
298 | self.assertEqual([bugs[0]], bmp.bugs) |
299 | @@ -1689,7 +1656,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
300 | if not self.git: |
301 | self.skipTest("Only relevant for Git.") |
302 | bug = self.factory.makeBug() |
303 | - bmp = self._makeBranchMergeProposal() |
304 | + bmp = self.makeBranchMergeProposal() |
305 | self._setUpLog([bug]) |
306 | bmp.updateRelatedBugsFromSource() |
307 | self.assertEqual([bug], bmp.bugs) |
308 | @@ -1704,7 +1671,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
309 | if not self.git: |
310 | self.skipTest("Only relevant for Git.") |
311 | bug = self.factory.makeBug() |
312 | - bmp = self._makeBranchMergeProposal() |
313 | + bmp = self.makeBranchMergeProposal() |
314 | self._setUpLog([bug]) |
315 | bmp.updateRelatedBugsFromSource() |
316 | self.assertEqual([bug], bmp.bugs) |
317 | @@ -1719,7 +1686,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
318 | if not self.git: |
319 | self.skipTest("Only relevant for Git.") |
320 | bug = self.factory.makeBug() |
321 | - bmp = self._makeBranchMergeProposal() |
322 | + bmp = self.makeBranchMergeProposal() |
323 | bmp.linkBug(bug) |
324 | self._setUpLog([]) |
325 | bmp.updateRelatedBugsFromSource() |
326 | @@ -1744,7 +1711,7 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
327 | self.skipTest("Only relevant for Git.") |
328 | self.pushConfig("codehosting", related_bugs_from_source_limit=3) |
329 | bugs = [self.factory.makeBug() for _ in range(5)] |
330 | - bmp = self._makeBranchMergeProposal() |
331 | + bmp = self.makeBranchMergeProposal() |
332 | self._setUpLog([bugs[0]]) |
333 | bmp.updateRelatedBugsFromSource() |
334 | self.assertEqual([bugs[0]], bmp.bugs) |
335 | @@ -1756,45 +1723,48 @@ class TestBranchMergeProposalBugs(WithScenarios, TestCaseWithFactory): |
336 | self.assertEqual("TooManyRelatedBugs", self.oopses[0]["type"]) |
337 | |
338 | |
339 | -class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
340 | +class TestBranchMergeProposalNominateReviewer( |
341 | + WithVCSScenarios, TestCaseWithFactory): |
342 | """Test that the appropriate vote references get created.""" |
343 | |
344 | layer = DatabaseFunctionalLayer |
345 | |
346 | def setUp(self): |
347 | TestCaseWithFactory.setUp(self, user='test@canonical.com') |
348 | + if self.git: |
349 | + self.hosting_fixture = self.useFixture(GitHostingFixture()) |
350 | |
351 | def test_notify_on_nominate(self): |
352 | # Ensure that a notification is emitted on nomination. |
353 | - merge_proposal = self.factory.makeBranchMergeProposal() |
354 | - login_person(merge_proposal.source_branch.owner) |
355 | + merge_proposal = self.makeBranchMergeProposal() |
356 | + login_person(merge_proposal.merge_source.owner) |
357 | reviewer = self.factory.makePerson() |
358 | result, events = self.assertNotifies( |
359 | ReviewerNominatedEvent, False, |
360 | merge_proposal.nominateReviewer, |
361 | reviewer=reviewer, |
362 | - registrant=merge_proposal.source_branch.owner) |
363 | + registrant=merge_proposal.merge_source.owner) |
364 | self.assertEqual(result, events[0].object) |
365 | |
366 | def test_notify_on_nominate_suppressed_if_requested(self): |
367 | # Ensure that a notification is suppressed if notify listeners is set |
368 | # to False. |
369 | - merge_proposal = self.factory.makeBranchMergeProposal() |
370 | - login_person(merge_proposal.source_branch.owner) |
371 | + merge_proposal = self.makeBranchMergeProposal() |
372 | + login_person(merge_proposal.merge_source.owner) |
373 | reviewer = self.factory.makePerson() |
374 | self.assertNoNotification( |
375 | merge_proposal.nominateReviewer, |
376 | reviewer=reviewer, |
377 | - registrant=merge_proposal.source_branch.owner, |
378 | + registrant=merge_proposal.merge_source.owner, |
379 | _notify_listeners=False) |
380 | |
381 | def test_one_initial_votes(self): |
382 | """A new merge proposal has one vote of the default reviewer.""" |
383 | - merge_proposal = self.factory.makeBranchMergeProposal() |
384 | + merge_proposal = self.makeBranchMergeProposal() |
385 | self.assertEqual(1, len(list(merge_proposal.votes))) |
386 | [vote] = list(merge_proposal.votes) |
387 | self.assertEqual( |
388 | - merge_proposal.target_branch.owner, vote.reviewer) |
389 | + merge_proposal.merge_target.owner, vote.reviewer) |
390 | |
391 | def makeProposalWithReviewer(self, reviewer=None, review_type=None, |
392 | registrant=None, **kwargs): |
393 | @@ -1807,8 +1777,9 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
394 | if registrant is None: |
395 | registrant = self.factory.makePerson() |
396 | merge_proposal = make_merge_proposal_without_reviewers( |
397 | - factory=self.factory, registrant=registrant, **kwargs) |
398 | - login_person(merge_proposal.source_branch.owner) |
399 | + factory=self.factory, for_git=self.git, registrant=registrant, |
400 | + **kwargs) |
401 | + login_person(merge_proposal.merge_source.owner) |
402 | merge_proposal.nominateReviewer( |
403 | reviewer=reviewer, registrant=registrant, review_type=review_type) |
404 | return merge_proposal, reviewer |
405 | @@ -1914,15 +1885,15 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
406 | |
407 | def test_nominate_updates_reference(self): |
408 | """The existing reference is updated on re-nomination.""" |
409 | - merge_proposal = self.factory.makeBranchMergeProposal() |
410 | - login_person(merge_proposal.source_branch.owner) |
411 | + merge_proposal = self.makeBranchMergeProposal() |
412 | + login_person(merge_proposal.merge_source.owner) |
413 | reviewer = self.factory.makePerson() |
414 | reference = merge_proposal.nominateReviewer( |
415 | - reviewer=reviewer, registrant=merge_proposal.source_branch.owner, |
416 | + reviewer=reviewer, registrant=merge_proposal.merge_source.owner, |
417 | review_type='General') |
418 | self.assertEqual('general', reference.review_type) |
419 | merge_proposal.nominateReviewer( |
420 | - reviewer=reviewer, registrant=merge_proposal.source_branch.owner, |
421 | + reviewer=reviewer, registrant=merge_proposal.merge_source.owner, |
422 | review_type='Specific') |
423 | # Note we're using the reference from the first call |
424 | self.assertEqual('specific', reference.review_type) |
425 | @@ -1939,31 +1910,37 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
426 | CodeReviewNotificationLevel.FULL, sub.review_level) |
427 | # The reviewer can see the branch. |
428 | self.assertTrue(branch.visibleByUser(reviewer)) |
429 | - if branch.stacked_on is not None: |
430 | + if IBranch.providedBy(branch) and branch.stacked_on is not None: |
431 | self._check_mp_branch_visibility(branch.stacked_on, reviewer) |
432 | |
433 | def _test_nominate_grants_visibility(self, reviewer): |
434 | """Nominated reviewers can see the source and target branches.""" |
435 | owner = self.factory.makePerson() |
436 | product = self.factory.makeProduct() |
437 | - # We make a source branch stacked on a private one. |
438 | - base_branch = self.factory.makeBranch( |
439 | + # For bzr, we make a source branch stacked on a private one. |
440 | + # For git, we make the gitref itself private. |
441 | + if self.git: |
442 | + source_branch = self.makeBranch( |
443 | + product=product, owner=owner, |
444 | + information_type=InformationType.USERDATA) |
445 | + else: |
446 | + base_branch = self.makeBranch( |
447 | + owner=owner, product=product, |
448 | + information_type=InformationType.USERDATA) |
449 | + source_branch = self.makeBranch( |
450 | + stacked_on=base_branch, product=product, owner=owner) |
451 | + target_branch = self.makeBranch( |
452 | owner=owner, product=product, |
453 | information_type=InformationType.USERDATA) |
454 | - source_branch = self.factory.makeBranch( |
455 | - stacked_on=base_branch, product=product, owner=owner) |
456 | - target_branch = self.factory.makeBranch(owner=owner, product=product) |
457 | login_person(owner) |
458 | - merge_proposal = self.factory.makeBranchMergeProposal( |
459 | - source_branch=source_branch, |
460 | - target_branch=target_branch) |
461 | - target_branch.setPrivate(True, owner) |
462 | + merge_proposal = self.makeBranchMergeProposal( |
463 | + source=source_branch, target=target_branch) |
464 | # The reviewer can't see the source or target branches. |
465 | self.assertFalse(source_branch.visibleByUser(reviewer)) |
466 | self.assertFalse(target_branch.visibleByUser(reviewer)) |
467 | merge_proposal.nominateReviewer( |
468 | reviewer=reviewer, |
469 | - registrant=merge_proposal.source_branch.owner) |
470 | + registrant=merge_proposal.merge_source.owner) |
471 | for branch in [source_branch, target_branch]: |
472 | self._check_mp_branch_visibility(branch, reviewer) |
473 | |
474 | @@ -1987,7 +1964,7 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
475 | def test_comment_with_vote_creates_reference(self): |
476 | """A comment with a vote creates a vote reference.""" |
477 | reviewer = self.factory.makePerson() |
478 | - merge_proposal = self.factory.makeBranchMergeProposal( |
479 | + merge_proposal = self.makeBranchMergeProposal( |
480 | reviewer=reviewer, registrant=reviewer) |
481 | comment = merge_proposal.createComment( |
482 | reviewer, 'Message subject', 'Message content', |
483 | @@ -1998,7 +1975,8 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
484 | def test_comment_without_a_vote_does_not_create_reference(self): |
485 | """A comment with a vote creates a vote reference.""" |
486 | reviewer = self.factory.makePerson() |
487 | - merge_proposal = make_merge_proposal_without_reviewers(self.factory) |
488 | + merge_proposal = make_merge_proposal_without_reviewers( |
489 | + self.factory, for_git=self.git) |
490 | merge_proposal.createComment( |
491 | reviewer, 'Message subject', 'Message content') |
492 | self.assertEqual([], list(merge_proposal.votes)) |
493 | @@ -2006,7 +1984,7 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
494 | def test_second_vote_by_person_just_alters_reference(self): |
495 | """A second vote changes the comment reference only.""" |
496 | reviewer = self.factory.makePerson() |
497 | - merge_proposal = self.factory.makeBranchMergeProposal( |
498 | + merge_proposal = self.makeBranchMergeProposal( |
499 | reviewer=reviewer, registrant=reviewer) |
500 | merge_proposal.createComment( |
501 | reviewer, 'Message subject', 'Message content', |
502 | @@ -2022,7 +2000,7 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
503 | reviewer = self.factory.makePerson() |
504 | merge_proposal, ignore = self.makeProposalWithReviewer( |
505 | reviewer=reviewer, review_type='general') |
506 | - login(merge_proposal.source_branch.owner.preferredemail.email) |
507 | + login(merge_proposal.merge_source.owner.preferredemail.email) |
508 | comment = merge_proposal.createComment( |
509 | reviewer, 'Message subject', 'Message content', |
510 | vote=CodeReviewVote.APPROVE, review_type='general') |
511 | @@ -2042,7 +2020,7 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
512 | team = self.factory.makeTeam(owner=reviewer) |
513 | merge_proposal, ignore = self.makeProposalWithReviewer( |
514 | reviewer=team, review_type='general') |
515 | - login(merge_proposal.source_branch.owner.preferredemail.email) |
516 | + login(merge_proposal.merge_source.owner.preferredemail.email) |
517 | [vote] = list(merge_proposal.votes) |
518 | self.assertEqual(team, vote.reviewer) |
519 | comment = merge_proposal.createComment( |
520 | @@ -2059,8 +2037,8 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
521 | # one. |
522 | reviewer = self.factory.makePerson() |
523 | team = self.factory.makeTeam(owner=reviewer) |
524 | - merge_proposal = self.factory.makeBranchMergeProposal(reviewer=team) |
525 | - login(merge_proposal.source_branch.owner.preferredemail.email) |
526 | + merge_proposal = self.makeBranchMergeProposal(reviewer=team) |
527 | + login(merge_proposal.merge_source.owner.preferredemail.email) |
528 | [vote] = list(merge_proposal.votes) |
529 | self.assertEqual(team, vote.reviewer) |
530 | comment = merge_proposal.createComment( |
531 | @@ -2078,8 +2056,8 @@ class TestBranchMergeProposalNominateReviewer(TestCaseWithFactory): |
532 | merge_proposal_1, reviewer_1 = self.makeProposalWithReviewer( |
533 | set_state=BranchMergeProposalStatus.MERGED) |
534 | merge_proposal_2, _ = self.makeProposalWithReviewer( |
535 | - target_branch=merge_proposal_1.target_branch, |
536 | - source_branch=merge_proposal_1.source_branch) |
537 | + target=merge_proposal_1.merge_target, |
538 | + source=merge_proposal_1.merge_source) |
539 | merge_proposal_2.nominateReviewer( |
540 | reviewer=reviewer_1, registrant=merge_proposal_2.registrant) |
541 | 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 @@ |
547 | -# Copyright 2009-2018 Canonical Ltd. This software is licensed under the |
548 | +# Copyright 2009-2020 Canonical Ltd. This software is licensed under the |
549 | # GNU Affero General Public License version 3 (see the file LICENSE). |
550 | |
551 | """Helper functions for code testing live here.""" |
552 | @@ -49,8 +49,8 @@ from lp.code.model.seriessourcepackagebranch import ( |
553 | from lp.registry.interfaces.pocket import PackagePublishingPocket |
554 | from lp.registry.interfaces.series import SeriesStatus |
555 | from lp.services.database.sqlbase import cursor |
556 | -from lp.services.propertycache import get_property_cache |
557 | from lp.services.memcache.testing import MemcacheFixture |
558 | +from lp.services.propertycache import get_property_cache |
559 | from lp.testing import ( |
560 | run_with_login, |
561 | time_counter, |
562 | @@ -271,9 +271,18 @@ def recipe_parser_newest_version(version): |
563 | RecipeParser.NEWEST_VERSION = old_version |
564 | |
565 | |
566 | -def make_merge_proposal_without_reviewers(factory, **kwargs): |
567 | +def make_merge_proposal_without_reviewers( |
568 | + factory, for_git=False, source=None, target=None, **kwargs): |
569 | """Make a merge proposal and strip of any review votes.""" |
570 | - proposal = factory.makeBranchMergeProposal(**kwargs) |
571 | + kwargs = dict(kwargs) |
572 | + if for_git: |
573 | + kwargs["source_ref"] = source |
574 | + kwargs["target_ref"] = target |
575 | + proposal = factory.makeBranchMergeProposalForGit(**kwargs) |
576 | + else: |
577 | + kwargs["source_branch"] = source |
578 | + kwargs["target_branch"] = target |
579 | + proposal = factory.makeBranchMergeProposal(**kwargs) |
580 | for vote in proposal.votes: |
581 | removeSecurityProxy(vote).destroySelf() |
582 | del get_property_cache(proposal).votes |