Merge lp:~jtv/launchpad/recife-karmarecorder-fix into lp:~launchpad/launchpad/recife

Proposed by Jeroen T. Vermeulen
Status: Merged
Merged at revision: 9155
Proposed branch: lp:~jtv/launchpad/recife-karmarecorder-fix
Merge into: lp:~launchpad/launchpad/recife
Diff against target: 163 lines (+133/-1)
2 files modified
lib/lp/testing/karma.py (+3/-1)
lib/lp/testing/tests/test_karma.py (+130/-0)
To merge this branch: bzr merge lp:~jtv/launchpad/recife-karmarecorder-fix
Reviewer Review Type Date Requested Status
Henning Eggers (community) code Approve
Review via email: mp+32756@code.launchpad.net

Commit message

KarmaRecorder test & fix.

Description of the change

= KarmaRecorder test and fix =

In the Recife feature branch we use a new test helper class, the KarmaRecorder, to keep track of what karma is assigned. It turns out that this class was slightly broken (filtering by person simply wasn't implemented) and entirely untested.

Here I fix that. To test,
{{{
./bin/test -vvc -m lp.testing.tests.test_karma
}}}

No lint.

Jeroen

To post a comment you must log in.
Revision history for this message
Henning Eggers (henninge) wrote :

Thank you for fixing this so quickly!

Cheers,
Henning

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/testing/karma.py'
--- lib/lp/testing/karma.py 2010-03-25 15:27:52 +0000
+++ lib/lp/testing/karma.py 2010-08-16 13:01:05 +0000
@@ -53,6 +53,7 @@
53 def filter(self, karma):53 def filter(self, karma):
54 """Does `karma` match our filters?"""54 """Does `karma` match our filters?"""
55 return (55 return (
56 self._filterFor(self.person, karma.person) and
56 self._filterFor(self.action_name, karma.action.name) and57 self._filterFor(self.action_name, karma.action.name) and
57 self._filterFor(self.product, karma.product) and58 self._filterFor(self.product, karma.product) and
58 self._filterFor(self.distribution, karma.distribution) and59 self._filterFor(self.distribution, karma.distribution) and
@@ -69,7 +70,7 @@
6970
70 def receive(self, obj, event):71 def receive(self, obj, event):
71 """Process a karma event.72 """Process a karma event.
72 73
73 Runs `filter` on the event and if it passes, `record`s it.74 Runs `filter` on the event and if it passes, `record`s it.
74 """75 """
75 if self.filter(event.karma):76 if self.filter(event.karma):
@@ -106,6 +107,7 @@
106 A set of KarmaAction objects assigned since the register_listener()107 A set of KarmaAction objects assigned since the register_listener()
107 method was called is available in the added_listener_actions property.108 method was called is available in the added_listener_actions property.
108 """109 """
110
109 def __init__(self, show_person=False):111 def __init__(self, show_person=False):
110 super(KarmaAssignedEventListener, self).__init__()112 super(KarmaAssignedEventListener, self).__init__()
111 self.added_karma_actions = set()113 self.added_karma_actions = set()
112114
=== added file 'lib/lp/testing/tests/test_karma.py'
--- lib/lp/testing/tests/test_karma.py 1970-01-01 00:00:00 +0000
+++ lib/lp/testing/tests/test_karma.py 2010-08-16 13:01:05 +0000
@@ -0,0 +1,130 @@
1# Copyright 2010 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).
3
4"""Test the KarmaRecorder."""
5
6__metaclass__ = type
7
8from canonical.testing import DatabaseFunctionalLayer
9from lp.testing import TestCaseWithFactory
10from lp.testing.fakemethod import FakeMethod
11
12
13class TestKarmaRecorder(TestCaseWithFactory):
14 layer = DatabaseFunctionalLayer
15
16 def test_record(self):
17 # The KarmaRecorder records karma events.
18 person = self.factory.makePerson()
19 product = self.factory.makeProduct()
20
21 recorder = self.installKarmaRecorder()
22 person.assignKarma('bugcreated', product=product)
23
24 self.assertEqual(1, len(recorder.karma_events))
25 karma = recorder.karma_events[0]
26 self.assertEqual(person, karma.person)
27 self.assertEqual(product, karma.product)
28
29 def test_record_person(self):
30 # The KarmaRecorder can filter for a specific Person.
31 person = self.factory.makePerson()
32 unrelated_person = self.factory.makePerson()
33 product = self.factory.makeProduct()
34
35 recorder = self.installKarmaRecorder(person=person)
36 person.assignKarma('bugfixed', product=product)
37 unrelated_person.assignKarma('bugfixed', product=product)
38
39 self.assertEqual(1, len(recorder.karma_events))
40 karma = recorder.karma_events[0]
41 self.assertEqual(person, karma.person)
42
43 def test_record_action_name(self):
44 # The KarmaRecorder can filter for a specific, named action.
45 person = self.factory.makePerson()
46 product = self.factory.makeProduct()
47
48 recorder = self.installKarmaRecorder(action_name='bugrejected')
49 person.assignKarma('bugrejected', product=product)
50 person.assignKarma('bugaccepted', product=product)
51
52 self.assertEqual(1, len(recorder.karma_events))
53 karma = recorder.karma_events[0]
54 self.assertEqual('bugrejected', karma.action.name)
55
56 def test_record_product(self):
57 # The KarmaRecorder can filter for a specific Product.
58 person = self.factory.makePerson()
59 product = self.factory.makeProduct()
60 other_product = self.factory.makeProduct()
61 package = self.factory.makeDistributionSourcePackage()
62
63 recorder = self.installKarmaRecorder(product=product)
64 person.assignKarma('faqcreated', product=other_product)
65 person.assignKarma('faqcreated', product=product)
66 person.assignKarma(
67 'faqcreated', sourcepackagename=package.sourcepackagename,
68 distribution=package.distribution)
69
70 self.assertEqual(1, len(recorder.karma_events))
71 karma = recorder.karma_events[0]
72 self.assertEqual(product, karma.product)
73
74 def test_record_distribution(self):
75 # The KarmaRecorder can filter for a specific Distribution.
76 person = self.factory.makePerson()
77 product = self.factory.makeProduct()
78 package = self.factory.makeDistributionSourcePackage()
79 distro = package.distribution
80 other_distro = self.factory.makeDistribution()
81
82 recorder = self.installKarmaRecorder(distribution=distro)
83 person.assignKarma(
84 'faqcreated', distribution=distro,
85 sourcepackagename=package.sourcepackagename)
86 person.assignKarma(
87 'faqcreated', distribution=other_distro,
88 sourcepackagename=package.sourcepackagename)
89 person.assignKarma('faqcreated', product=product)
90
91 self.assertEqual(1, len(recorder.karma_events))
92 karma = recorder.karma_events[0]
93 self.assertEqual(distro, karma.distribution)
94
95 def test_record_sourcepackagename(self):
96 # The KarmaRecorder can filter for a specific SourcePackageName.
97 person = self.factory.makePerson()
98 product = self.factory.makeProduct()
99 package = self.factory.makeDistributionSourcePackage()
100 packagename = package.sourcepackagename
101 other_packagename = self.factory.makeSourcePackageName()
102
103 recorder = self.installKarmaRecorder(sourcepackagename=packagename)
104 person.assignKarma(
105 'faqcreated', distribution=package.distribution,
106 sourcepackagename=packagename)
107 person.assignKarma(
108 'faqcreated', distribution=package.distribution,
109 sourcepackagename=other_packagename)
110 person.assignKarma('faqcreated', product=product)
111
112 self.assertEqual(1, len(recorder.karma_events))
113 karma = recorder.karma_events[0]
114 self.assertEqual(packagename, karma.sourcepackagename)
115
116 def test_record_can_be_replaced(self):
117 # KarmaRecorder.record can be overridden for other uses. In
118 # this case we use a FakeMethod.
119 person = self.factory.makePerson()
120 product = self.factory.makeProduct()
121
122 recorder = self.installKarmaRecorder()
123 recorder.record = FakeMethod()
124
125 person.assignKarma('faqedited', product=product)
126 self.assertEqual(1, recorder.record.call_count)
127 call_args, call_kwargs = recorder.record.calls[0]
128 self.assertEqual(1, len(call_args))
129 self.assertEqual({}, call_kwargs)
130 self.assertEqual('faqedited', call_args[0].action.name)

Subscribers

People subscribed via source and target branches