Merge lp:~bac/launchpad/904335-export-tags into lp:launchpad

Proposed by Brad Crittenden
Status: Merged
Approved by: j.c.sackett
Approved revision: no longer in the source branch.
Merged at revision: 14677
Proposed branch: lp:~bac/launchpad/904335-export-tags
Merge into: lp:launchpad
Prerequisite: lp:~frankban/launchpad/view-904335
Diff against target: 166 lines (+63/-7)
3 files modified
lib/lp/registry/interfaces/milestone.py (+14/-0)
lib/lp/registry/model/milestone.py (+2/-2)
lib/lp/registry/tests/test_milestonetag.py (+47/-5)
To merge this branch: bzr merge lp:~bac/launchpad/904335-export-tags
Reviewer Review Type Date Requested Status
j.c.sackett (community) Approve
Review via email: mp+87664@code.launchpad.net

Description of the change

Export the getTags and setTags methods to the API.

Tests:
bin/test -vv lp.registry.tests.test_milestonetag MilestoneTagWebserviceTest

No real lint.

To post a comment you must log in.
Revision history for this message
j.c.sackett (jcsackett) wrote :

This looks good; you could change the webservice test case to use the WebServiceTestCase. That may save you some setup, but it's not actually necessary.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/registry/interfaces/milestone.py'
2--- lib/lp/registry/interfaces/milestone.py 2012-01-10 14:38:32 +0000
3+++ lib/lp/registry/interfaces/milestone.py 2012-01-10 14:38:32 +0000
4@@ -25,6 +25,7 @@
5 export_factory_operation,
6 export_operation_as,
7 export_read_operation,
8+ export_write_operation,
9 exported,
10 operation_for_version,
11 operation_parameters,
12@@ -44,6 +45,7 @@
13 Bool,
14 Choice,
15 Int,
16+ List,
17 TextLine,
18 )
19
20@@ -228,6 +230,16 @@
21
22 export_as_webservice_entry()
23
24+ @operation_parameters(
25+ tags=List(
26+ title=_("Tags for this milestone"),
27+ description=_("Space-separated keywords for classifying "
28+ "this milestone."),
29+ value_type=TextLine()))
30+
31+ @call_with(user=REQUEST_USER)
32+ @export_write_operation()
33+ @operation_for_version('devel')
34 def setTags(tags, user):
35 """Set the milestone tags.
36
37@@ -246,6 +258,8 @@
38 why this is not a property.
39 """
40
41+ @export_read_operation()
42+ @operation_for_version('devel')
43 def getTags():
44 """Return the milestone tags in alphabetical order.
45
46
47=== modified file 'lib/lp/registry/model/milestone.py'
48--- lib/lp/registry/model/milestone.py 2012-01-10 14:38:32 +0000
49+++ lib/lp/registry/model/milestone.py 2012-01-10 14:38:32 +0000
50@@ -308,9 +308,9 @@
51 # Prevent circular references.
52 from lp.registry.model.milestonetag import MilestoneTag
53 store = Store.of(self)
54- return store.find(
55+ return list(store.find(
56 MilestoneTag, MilestoneTag.milestone_id == self.id
57- ).order_by(MilestoneTag.tag)
58+ ).order_by(MilestoneTag.tag))
59
60 def getTags(self):
61 """See IMilestone."""
62
63=== modified file 'lib/lp/registry/tests/test_milestonetag.py'
64--- lib/lp/registry/tests/test_milestonetag.py 2012-01-10 14:38:32 +0000
65+++ lib/lp/registry/tests/test_milestonetag.py 2012-01-10 14:38:32 +0000
66@@ -1,13 +1,15 @@
67-# Copyright 2011 Canonical Ltd. This software is licensed under the
68+# Copyright 2011-2012 Canonical Ltd. This software is licensed under the
69 # GNU Affero General Public License version 3 (see the file LICENSE).
70
71 """Milestone related test helper."""
72
73 __metaclass__ = type
74
75+import transaction
76 import datetime
77
78 from lp.testing.layers import (
79+ AppServerLayer,
80 DatabaseFunctionalLayer,
81 )
82 from lp.registry.model.milestonetag import (
83@@ -17,6 +19,8 @@
84 from lp.testing import (
85 person_logged_in,
86 TestCaseWithFactory,
87+ WebServiceTestCase,
88+ ws_object,
89 )
90
91
92@@ -33,13 +37,13 @@
93
94 def test_no_tags(self):
95 # Ensure a newly created milestone does not have associated tags.
96- self.assertEquals([], list(self.milestone.getTags()))
97+ self.assertEquals([], self.milestone.getTags())
98
99 def test_tags_setting_and_retrieval(self):
100 # Ensure tags are correctly saved and retrieved from the db.
101 with person_logged_in(self.person):
102 self.milestone.setTags(self.tags, self.person)
103- self.assertEqual(sorted(self.tags), list(self.milestone.getTags()))
104+ self.assertEqual(sorted(self.tags), self.milestone.getTags())
105
106 def test_tags_override(self):
107 # Ensure you can override tags already associated with the milestone.
108@@ -47,14 +51,14 @@
109 self.milestone.setTags(self.tags, self.person)
110 new_tags = [u'tag2', u'tag4', u'tag3']
111 self.milestone.setTags(new_tags, self.person)
112- self.assertEqual(sorted(new_tags), list(self.milestone.getTags()))
113+ self.assertEqual(sorted(new_tags), self.milestone.getTags())
114
115 def test_tags_deletion(self):
116 # Ensure passing an empty sequence of tags deletes them all.
117 with person_logged_in(self.person):
118 self.milestone.setTags(self.tags, self.person)
119 self.milestone.setTags([], self.person)
120- self.assertEquals([], list(self.milestone.getTags()))
121+ self.assertEquals([], self.milestone.getTags())
122
123 def test_user_metadata(self):
124 # Ensure the correct user metadata is created when tags are added.
125@@ -200,3 +204,41 @@
126 specs, milestonetag = self._create_items_for_multiple_tags(
127 self._create_specifications)
128 self.assertContentEqual(specs, milestonetag.specifications)
129+
130+
131+class MilestoneTagWebServiceTest(WebServiceTestCase):
132+ """Test the getter and setter for milestonetags."""
133+
134+ layer = AppServerLayer
135+
136+ def setUp(self):
137+ super(MilestoneTagWebServiceTest, self).setUp()
138+ self.owner = self.factory.makePerson()
139+ self.product = self.factory.makeProduct(owner=self.owner)
140+ self.milestone = self.factory.makeMilestone(product=self.product)
141+ transaction.commit()
142+ self.ws_milestone = self.wsObject(self.milestone, self.owner)
143+
144+ def test_get_tags_none(self):
145+ self.assertEqual([], self.ws_milestone.getTags())
146+
147+ def test_get_tags(self):
148+ tags = [u'zeta', u'alpha', u'beta']
149+ self.milestone.setTags(tags, self.owner)
150+ self.assertEqual(sorted(tags), self.ws_milestone.getTags())
151+
152+ def test_set_tags_initial(self):
153+ tags = [u'zeta', u'alpha', u'beta']
154+ self.ws_milestone.setTags(tags=tags)
155+ self.ws_milestone.lp_save()
156+ transaction.begin()
157+ self.assertEqual(sorted(tags), self.milestone.getTags())
158+
159+ def test_set_tags_replace(self):
160+ tags1 = [u'zeta', u'alpha', u'beta']
161+ self.milestone.setTags(tags1, self.owner)
162+ tags2 = [u'delta', u'alpha', u'gamma']
163+ self.ws_milestone.setTags(tags=tags2)
164+ self.ws_milestone.lp_save()
165+ transaction.begin()
166+ self.assertEqual(sorted(tags2), self.milestone.getTags())