~launchpad-pqm/launchpad/devel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# Copyright 2009-2011 Canonical Ltd.  This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).

"""Functional tests for branch-related components"""

from lazr.lifecycle.event import ObjectModifiedEvent

from lp.testing import login
from lp.testing.layers import LaunchpadFunctionalLayer
from lp.code.adapters.branch import BranchMergeProposalDelta
from lp.code.enums import BranchMergeProposalStatus
from lp.testing import (
    EventRecorder,
    TestCase,
    )
from lp.testing.factory import LaunchpadObjectFactory


class TestBranchMergeProposalDelta(TestCase):

    layer = LaunchpadFunctionalLayer

    def setUp(self):
        TestCase.setUp(self)
        login('foo.bar@canonical.com')
        self.factory = LaunchpadObjectFactory()

    def test_snapshot(self):
        """Test that the snapshot method produces a reasonable snapshot"""
        merge_proposal = self.factory.makeBranchMergeProposal()
        merge_proposal.commit_message = 'foo'
        merge_proposal.whiteboard = 'bar'
        snapshot = BranchMergeProposalDelta.snapshot(merge_proposal)
        self.assertEqual('foo', snapshot.commit_message)
        self.assertEqual('bar', snapshot.whiteboard)

    def test_noModification(self):
        """When there are no modifications, no delta should be returned."""
        merge_proposal = self.factory.makeBranchMergeProposal()
        old_merge_proposal = BranchMergeProposalDelta.snapshot(merge_proposal)
        delta = BranchMergeProposalDelta.construct(
            old_merge_proposal, merge_proposal)
        assert delta is None

    def test_Modification(self):
        """When there are modifications, the delta reflects them."""
        registrant = self.factory.makePerson(
            displayname='Baz Qux', email='baz.qux@example.com',
            password='test')
        merge_proposal = self.factory.makeBranchMergeProposal(
            registrant=registrant)
        old_merge_proposal = BranchMergeProposalDelta.snapshot(merge_proposal)
        merge_proposal.commit_message = 'Change foo into bar.'
        merge_proposal.description = 'Set the description.'
        merge_proposal.markAsMerged()
        delta = BranchMergeProposalDelta.construct(
            old_merge_proposal, merge_proposal)
        assert delta is not None
        self.assertEqual('Change foo into bar.', delta.commit_message)
        self.assertEqual('Set the description.', delta.description)
        self.assertEqual(
            {'old': BranchMergeProposalStatus.WORK_IN_PROGRESS,
            'new': BranchMergeProposalStatus.MERGED},
            delta.queue_status)

    def test_monitor(self):
        """\
        `monitor` observes changes to a given merge proposal and issues
        `ObjectModifiedEvent` events if there are any.
        """
        merge_proposal = self.factory.makeBranchMergeProposal()
        with EventRecorder() as event_recorder:
            # No event is issued when nothing is changed.
            with BranchMergeProposalDelta.monitor(merge_proposal):
                pass  # Don't make changes.
            self.assertEqual(0, len(event_recorder.events))
            # When one or more properties (of interest to
            # BranchMergeProposalDelta) are changed, a single event is issued.
            with BranchMergeProposalDelta.monitor(merge_proposal):
                merge_proposal.commit_message = "foo"
                merge_proposal.whiteboard = "bar"
            self.assertEqual(1, len(event_recorder.events))
            [event] = event_recorder.events
            self.assertIsInstance(event, ObjectModifiedEvent)
            self.assertEqual(merge_proposal, event.object)
            self.assertContentEqual(
                ["commit_message", "whiteboard"],
                event.edited_fields)