Merge ~pappacena/launchpad:vcs-scenarios-for-bmp into launchpad: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)
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 TestBranchMergeProposalNominateReviewer

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
1diff --git a/lib/lp/code/model/tests/test_branchmergeproposal.py b/lib/lp/code/model/tests/test_branchmergeproposal.py
2index 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)
542diff --git a/lib/lp/code/tests/helpers.py b/lib/lp/code/tests/helpers.py
543index 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