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

Subscribers

People subscribed via source and target branches