Merge lp:~nataliabidart/ubuntu-webcatalog/law-and-order.3 into lp:ubuntu-webcatalog

Proposed by Natalia Bidart
Status: Merged
Approved by: Natalia Bidart
Approved revision: 136
Merged at revision: 136
Proposed branch: lp:~nataliabidart/ubuntu-webcatalog/law-and-order.3
Merge into: lp:ubuntu-webcatalog
Prerequisite: lp:~nataliabidart/ubuntu-webcatalog/law-and-order.2
Diff against target: 2711 lines (+567/-540)
16 files modified
src/webcatalog/tests/factory.py (+24/-20)
src/webcatalog/tests/helpers.py (+2/-2)
src/webcatalog/tests/test_api.py (+32/-31)
src/webcatalog/tests/test_commands.py (+109/-97)
src/webcatalog/tests/test_context_processors.py (+1/-1)
src/webcatalog/tests/test_department_filters.py (+3/-3)
src/webcatalog/tests/test_forms.py (+42/-43)
src/webcatalog/tests/test_handlers.py (+9/-10)
src/webcatalog/tests/test_managers.py (+9/-9)
src/webcatalog/tests/test_models.py (+75/-65)
src/webcatalog/tests/test_pep8.py (+14/-16)
src/webcatalog/tests/test_preflight.py (+3/-3)
src/webcatalog/tests/test_templatetags.py (+26/-35)
src/webcatalog/tests/test_utilities.py (+27/-28)
src/webcatalog/tests/test_views.py (+189/-175)
src/webcatalog/views.py (+2/-2)
To merge this branch: bzr merge lp:~nataliabidart/ubuntu-webcatalog/law-and-order.3
Reviewer Review Type Date Requested Status
Anthony Lenton (community) Approve
Review via email: mp+109008@code.launchpad.net

Commit message

- Fixing pep8 issues (part 3 of LP: #1007626).

To post a comment you must log in.
Revision history for this message
Anthony Lenton (elachuni) wrote :

woo!

review: Approve
Revision history for this message
ISD Branch Mangler (isd-branches-mangler) wrote :

The prerequisite lp:~nataliabidart/ubuntu-webcatalog/law-and-order.2 has not yet been merged into lp:ubuntu-webcatalog.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/webcatalog/tests/factory.py'
--- src/webcatalog/tests/factory.py 2012-05-03 12:13:00 +0000
+++ src/webcatalog/tests/factory.py 2012-06-06 18:03:20 +0000
@@ -20,7 +20,7 @@
20from __future__ import (20from __future__ import (
21 absolute_import,21 absolute_import,
22 with_statement,22 with_statement,
23 )23)
24import os24import os
25from datetime import (25from datetime import (
26 datetime,26 datetime,
@@ -42,14 +42,14 @@
42 Machine,42 Machine,
43 Nonce,43 Nonce,
44 Token,44 Token,
45 )45)
46from webcatalog.utilities import full_claimed_id46from webcatalog.utilities import full_claimed_id
4747
48__metaclass__ = type48__metaclass__ = type
49__all__ = [49__all__ = [
50 'TestCaseWithFactory',50 'TestCaseWithFactory',
51 'WebCatalogObjectFactory',51 'WebCatalogObjectFactory',
52 ]52]
5353
5454
55class WebCatalogObjectFactory(object):55class WebCatalogObjectFactory(object):
@@ -66,7 +66,8 @@
66 return prefix + str(self.get_unique_integer())66 return prefix + str(self.get_unique_integer())
6767
68 def make_user(self, username=None, email=None, password='test',68 def make_user(self, username=None, email=None, password='test',
69 first_name=None, last_name=None, open_id=None, is_admin=False):69 first_name=None, last_name=None, open_id=None,
70 is_admin=False):
70 if username is None:71 if username is None:
71 username = self.get_unique_string(prefix='username')72 username = self.get_unique_string(prefix='username')
72 if email is None:73 if email is None:
@@ -97,11 +98,12 @@
97 return user98 return user
9899
99 def make_application(self, package_name=None, name=None,100 def make_application(self, package_name=None, name=None,
100 comment=None, description=None, icon_name='', icon=None,101 comment=None, description=None, icon_name='',
101 distroseries=None, arch='i686', ratings_average=None,102 icon=None, distroseries=None, arch='i686',
102 ratings_total=None, ratings_histogram='', screenshot_url='',103 ratings_average=None, ratings_total=None,
103 archive_id=None, version='', is_latest=False, wilson_score=0.0,104 ratings_histogram='', screenshot_url='',
104 debtags=[], application_id=None):105 archive_id=None, version='', is_latest=False,
106 wilson_score=0.0, debtags=[], application_id=None):
105 if name is None:107 if name is None:
106 name = self.get_unique_string(prefix='Readable Name')108 name = self.get_unique_string(prefix='Readable Name')
107 if package_name is None:109 if package_name is None:
@@ -136,7 +138,7 @@
136 return Department.objects.create(name=name, parent=parent, slug=slug)138 return Department.objects.create(name=name, parent=parent, slug=slug)
137139
138 def make_exhibit(self, package_names=None, published=True, display=None,140 def make_exhibit(self, package_names=None, published=True, display=None,
139 distroseries=None, weight=0):141 distroseries=None, weight=0):
140 sca_id = self.get_unique_integer()142 sca_id = self.get_unique_integer()
141 if package_names is None:143 if package_names is None:
142 package_names = self.get_unique_string(prefix='package-')144 package_names = self.get_unique_string(prefix='package-')
@@ -144,9 +146,9 @@
144 html = self.get_unique_string(prefix='html-')146 html = self.get_unique_string(prefix='html-')
145 if distroseries is None:147 if distroseries is None:
146 distroseries = self.make_distroseries()148 distroseries = self.make_distroseries()
147 xibit = Exhibit.objects.create(sca_id=sca_id,149 xibit = Exhibit.objects.create(
148 package_names=package_names, banner_url=banner_url, html=html,150 sca_id=sca_id, package_names=package_names, banner_url=banner_url,
149 published=published, display=display, weight=weight)151 html=html, published=published, display=display, weight=weight)
150 xibit.distroseries.add(distroseries)152 xibit.distroseries.add(distroseries)
151 return xibit153 return xibit
152154
@@ -164,7 +166,7 @@
164 os.path.dirname(__file__), 'test_data', file_name)166 os.path.dirname(__file__), 'test_data', file_name)
165167
166 def make_machine(self, owner=None, uuid=None, hostname=None,168 def make_machine(self, owner=None, uuid=None, hostname=None,
167 package_list=None):169 package_list=None):
168 if owner is None:170 if owner is None:
169 owner = self.make_user()171 owner = self.make_user()
170 if hostname is None:172 if hostname is None:
@@ -176,7 +178,8 @@
176 packages_checksum = self.get_unique_string(prefix='package-checksum-')178 packages_checksum = self.get_unique_string(prefix='package-checksum-')
177 logo_checksum = self.get_unique_string(prefix='logo-checksum-')179 logo_checksum = self.get_unique_string(prefix='logo-checksum-')
178180
179 return Machine.objects.create(owner=owner, hostname=hostname,181 return Machine.objects.create(
182 owner=owner, hostname=hostname,
180 uuid=uuid, packages_checksum=packages_checksum,183 uuid=uuid, packages_checksum=packages_checksum,
181 package_list=package_list, logo_checksum=logo_checksum)184 package_list=package_list, logo_checksum=logo_checksum)
182185
@@ -188,14 +191,14 @@
188 consumer_key = user.useropenid_set.get().claimed_id.split('/')[-1]191 consumer_key = user.useropenid_set.get().claimed_id.split('/')[-1]
189 consumer_secret = self.get_unique_string(prefix='consumer-secret-')192 consumer_secret = self.get_unique_string(prefix='consumer-secret-')
190 consumer = Consumer(user=user, key=consumer_key,193 consumer = Consumer(user=user, key=consumer_key,
191 secret=consumer_secret)194 secret=consumer_secret)
192 if save:195 if save:
193 consumer.save()196 consumer.save()
194 token_string = self.get_unique_string(prefix='token-')197 token_string = self.get_unique_string(prefix='token-')
195 token_secret = self.get_unique_string(prefix='token-secret-')198 token_secret = self.get_unique_string(prefix='token-secret-')
196 token_name = self.get_unique_string(prefix='token-name-')199 token_name = self.get_unique_string(prefix='token-name-')
197 token = Token(consumer=consumer, token=token_string,200 token = Token(consumer=consumer, token=token_string,
198 token_secret=token_secret, name=token_name)201 token_secret=token_secret, name=token_name)
199 if save:202 if save:
200 token.save()203 token.save()
201 return token, consumer204 return token, consumer
@@ -204,7 +207,8 @@
204 if token is None or consumer is None:207 if token is None or consumer is None:
205 assert token is None and consumer is None208 assert token is None and consumer is None
206 token, consumer = self.make_oauth_token_and_consumer()209 token, consumer = self.make_oauth_token_and_consumer()
207 nonce = Nonce.objects.create(token=token, consumer=consumer,210 nonce = Nonce.objects.create(
211 token=token, consumer=consumer,
208 nonce=self.get_unique_string(prefix='nonce-'))212 nonce=self.get_unique_string(prefix='nonce-'))
209 if created_at:213 if created_at:
210 nonce.created_at = created_at214 nonce.created_at = created_at
@@ -213,8 +217,8 @@
213217
214 def make_session(self, expire_date=None):218 def make_session(self, expire_date=None):
215 if expire_date is None:219 if expire_date is None:
216 expire_date = datetime.now() + timedelta(220 secs = self.get_unique_integer()
217 seconds=self.get_unique_integer())221 expire_date = datetime.now() + timedelta(seconds=secs)
218 return Session.objects.create(222 return Session.objects.create(
219 session_key=self.get_unique_string(prefix='key-'),223 session_key=self.get_unique_string(prefix='key-'),
220 session_data=self.get_unique_string(prefix='session-data-'),224 session_data=self.get_unique_string(prefix='session-data-'),
221225
=== modified file 'src/webcatalog/tests/helpers.py'
--- src/webcatalog/tests/helpers.py 2011-09-12 13:37:24 +0000
+++ src/webcatalog/tests/helpers.py 2012-06-06 18:03:20 +0000
@@ -20,13 +20,13 @@
20from __future__ import (20from __future__ import (
21 absolute_import,21 absolute_import,
22 with_statement,22 with_statement,
23 )23)
2424
25__metaclass__ = type25__metaclass__ = type
26__all__ = [26__all__ = [
27 'patch_settings',27 'patch_settings',
28 'SettingDoesNotExist',28 'SettingDoesNotExist',
29 ]29]
3030
31from contextlib import contextmanager31from contextlib import contextmanager
32from django.conf import settings32from django.conf import settings
3333
=== modified file 'src/webcatalog/tests/test_api.py'
--- src/webcatalog/tests/test_api.py 2012-01-06 17:54:47 +0000
+++ src/webcatalog/tests/test_api.py 2012-06-06 18:03:20 +0000
@@ -28,7 +28,7 @@
28 'ServerStatusTestCase',28 'ServerStatusTestCase',
29 'UpdateMachineTestCase',29 'UpdateMachineTestCase',
30 'UpdatePackageListTestCase',30 'UpdatePackageListTestCase',
31 ]31]
3232
33from django.utils import simplejson33from django.utils import simplejson
3434
@@ -38,7 +38,7 @@
38 OAuthConsumer,38 OAuthConsumer,
39 OAuthToken,39 OAuthToken,
40 OAuthSignatureMethod_PLAINTEXT,40 OAuthSignatureMethod_PLAINTEXT,
41 )41)
4242
43from .factory import TestCaseWithFactory43from .factory import TestCaseWithFactory
44from webcatalog.models import Machine44from webcatalog.models import Machine
@@ -57,8 +57,8 @@
57 oatoken = OAuthToken(token.token, token.token_secret)57 oatoken = OAuthToken(token.token, token.token_secret)
58 oarequest = OAuthRequest.from_consumer_and_token(58 oarequest = OAuthRequest.from_consumer_and_token(
59 oaconsumer, oatoken, http_url=url)59 oaconsumer, oatoken, http_url=url)
60 oarequest.sign_request(OAuthSignatureMethod_PLAINTEXT(),60 oarequest.sign_request(
61 oaconsumer, oatoken)61 OAuthSignatureMethod_PLAINTEXT(), oaconsumer, oatoken)
62 header = oarequest.to_header(realm)62 header = oarequest.to_header(realm)
63 return {'HTTP_AUTHORIZATION': header['Authorization']}63 return {'HTTP_AUTHORIZATION': header['Authorization']}
6464
@@ -72,16 +72,16 @@
7272
73 def test_read_no_machines(self):73 def test_read_no_machines(self):
74 user = self.factory.make_user()74 user = self.factory.make_user()
75 response = self.client.get(self.url,75 response = self.client.get(
76 **self.auth_header_for_user(self.url, user=user))76 self.url, **self.auth_header_for_user(self.url, user=user))
77 self.assertEqual('[]', response.content)77 self.assertEqual('[]', response.content)
7878
79 def test_read_multiple_machines(self):79 def test_read_multiple_machines(self):
80 user = self.factory.make_user()80 user = self.factory.make_user()
81 machine1 = self.factory.make_machine(owner=user)81 machine1 = self.factory.make_machine(owner=user)
82 machine2 = self.factory.make_machine(owner=user)82 machine2 = self.factory.make_machine(owner=user)
83 response = self.client.get(self.url,83 response = self.client.get(
84 **self.auth_header_for_user(self.url, user=user))84 self.url, **self.auth_header_for_user(self.url, user=user))
85 data = simplejson.loads(response.content)85 data = simplejson.loads(response.content)
86 self.assertEqual(2, len(data))86 self.assertEqual(2, len(data))
87 expected = set([machine1.uuid, machine2.uuid])87 expected = set([machine1.uuid, machine2.uuid])
@@ -90,7 +90,8 @@
90 def test_only_returns_machines_for_the_authenticated_user(self):90 def test_only_returns_machines_for_the_authenticated_user(self):
91 mymachine = self.factory.make_machine()91 mymachine = self.factory.make_machine()
92 othermachine = self.factory.make_machine()92 othermachine = self.factory.make_machine()
93 response = self.client.get(self.url,93 response = self.client.get(
94 self.url,
94 **self.auth_header_for_user(self.url, user=mymachine.owner))95 **self.auth_header_for_user(self.url, user=mymachine.owner))
95 data = simplejson.loads(response.content)96 data = simplejson.loads(response.content)
9697
@@ -111,8 +112,8 @@
111 data = simplejson.dumps({'hostname': machine.hostname + '-updated'})112 data = simplejson.dumps({'hostname': machine.hostname + '-updated'})
112 url = self.url % machine.uuid113 url = self.url % machine.uuid
113114
114 response = self.client.post(url, data=data,115 response = self.client.post(
115 content_type='application/json',116 url, data=data, content_type='application/json',
116 **self.auth_header_for_user(url, user=machine.owner))117 **self.auth_header_for_user(url, user=machine.owner))
117118
118 data = simplejson.loads(response.content)119 data = simplejson.loads(response.content)
@@ -124,8 +125,8 @@
124 data = simplejson.dumps({'hostname': machine.hostname + '-updated'})125 data = simplejson.dumps({'hostname': machine.hostname + '-updated'})
125 url = self.url % machine.uuid126 url = self.url % machine.uuid
126127
127 response = self.client.post(url, data=data,128 response = self.client.post(
128 content_type='application/json',129 url, data=data, content_type='application/json',
129 **self.auth_header_for_user(url, user=otheruser))130 **self.auth_header_for_user(url, user=otheruser))
130131
131 data = simplejson.loads(response.content)132 data = simplejson.loads(response.content)
@@ -144,20 +145,20 @@
144 machine = self.factory.make_machine()145 machine = self.factory.make_machine()
145 url = self.url % machine.uuid146 url = self.url % machine.uuid
146147
147 response = self.client.delete(url,148 response = self.client.delete(
148 **self.auth_header_for_user(url, user=machine.owner))149 url, **self.auth_header_for_user(url, user=machine.owner))
149150
150 self.assertEqual(204, response.status_code)151 self.assertEqual(204, response.status_code)
151 self.assertRaises(Machine.DoesNotExist, Machine.objects.get,152 self.assertRaises(Machine.DoesNotExist, Machine.objects.get,
152 uuid=machine.uuid, owner=machine.owner)153 uuid=machine.uuid, owner=machine.owner)
153154
154 def test_delete_other_users_machine_fails(self):155 def test_delete_other_users_machine_fails(self):
155 machine = self.factory.make_machine()156 machine = self.factory.make_machine()
156 otheruser = self.factory.make_user()157 otheruser = self.factory.make_user()
157 url = self.url % machine.uuid158 url = self.url % machine.uuid
158159
159 response = self.client.delete(url,160 response = self.client.delete(
160 **self.auth_header_for_user(url, user=otheruser))161 url, **self.auth_header_for_user(url, user=otheruser))
161162
162 self.assertEqual(404, response.status_code)163 self.assertEqual(404, response.status_code)
163164
@@ -174,8 +175,8 @@
174 machine = self.factory.make_machine()175 machine = self.factory.make_machine()
175 url = self.url % machine.uuid176 url = self.url % machine.uuid
176177
177 response = self.client.get(url,178 response = self.client.get(
178 **self.auth_header_for_user(url, user=machine.owner))179 url, **self.auth_header_for_user(url, user=machine.owner))
179180
180 data = simplejson.loads(response.content)181 data = simplejson.loads(response.content)
181 self.assertEqual(machine.hostname, data['hostname'])182 self.assertEqual(machine.hostname, data['hostname'])
@@ -186,8 +187,8 @@
186 otheruser = self.factory.make_user()187 otheruser = self.factory.make_user()
187 url = self.url % machine.uuid188 url = self.url % machine.uuid
188189
189 response = self.client.get(url,190 response = self.client.get(
190 **self.auth_header_for_user(url, user=otheruser))191 url, **self.auth_header_for_user(url, user=otheruser))
191192
192 self.assertEqual(404, response.status_code)193 self.assertEqual(404, response.status_code)
193194
@@ -205,8 +206,8 @@
205 machine = self.factory.make_machine(package_list=expected)206 machine = self.factory.make_machine(package_list=expected)
206 url = self.url % machine.uuid207 url = self.url % machine.uuid
207208
208 response = self.client.get(url,209 response = self.client.get(
209 **self.auth_header_for_user(url, user=machine.owner))210 url, **self.auth_header_for_user(url, user=machine.owner))
210211
211 data = simplejson.loads(response.content)212 data = simplejson.loads(response.content)
212 self.assertEqual(expected, data)213 self.assertEqual(expected, data)
@@ -216,8 +217,8 @@
216 otheruser = self.factory.make_user()217 otheruser = self.factory.make_user()
217 url = self.url % machine.uuid218 url = self.url % machine.uuid
218219
219 response = self.client.get(url,220 response = self.client.get(
220 **self.auth_header_for_user(url, user=otheruser))221 url, **self.auth_header_for_user(url, user=otheruser))
221222
222 self.assertEqual(404, response.status_code)223 self.assertEqual(404, response.status_code)
223224
@@ -235,10 +236,10 @@
235 machine = self.factory.make_machine(package_list=expected)236 machine = self.factory.make_machine(package_list=expected)
236 url = self.url % machine.uuid237 url = self.url % machine.uuid
237 data = simplejson.dumps({'package_list': expected,238 data = simplejson.dumps({'package_list': expected,
238 'packages_checksum': 'foo'})239 'packages_checksum': 'foo'})
239240
240 response = self.client.post(url, data=data,241 response = self.client.post(
241 content_type='application/json',242 url, data=data, content_type='application/json',
242 **self.auth_header_for_user(url, user=machine.owner))243 **self.auth_header_for_user(url, user=machine.owner))
243244
244 self.assertContains(response, 'Success')245 self.assertContains(response, 'Success')
@@ -250,8 +251,8 @@
250 otheruser = self.factory.make_user()251 otheruser = self.factory.make_user()
251 url = self.url % machine.uuid252 url = self.url % machine.uuid
252253
253 response = self.client.post(url, data='"foo"',254 response = self.client.post(
254 content_type='application/json',255 url, data='"foo"', content_type='application/json',
255 **self.auth_header_for_user(url, user=otheruser))256 **self.auth_header_for_user(url, user=otheruser))
256257
257 self.assertEqual(404, response.status_code)258 self.assertEqual(404, response.status_code)
258259
=== modified file 'src/webcatalog/tests/test_commands.py'
--- src/webcatalog/tests/test_commands.py 2012-05-09 08:43:11 +0000
+++ src/webcatalog/tests/test_commands.py 2012-06-06 18:03:20 +0000
@@ -20,7 +20,7 @@
20from __future__ import (20from __future__ import (
21 absolute_import,21 absolute_import,
22 with_statement,22 with_statement,
23 )23)
24import apt24import apt
25import json25import json
26import os26import os
@@ -29,7 +29,7 @@
29from datetime import (29from datetime import (
30 datetime,30 datetime,
31 timedelta,31 timedelta,
32 )32)
33from decimal import Decimal33from decimal import Decimal
3434
35from django.conf import settings35from django.conf import settings
@@ -43,7 +43,7 @@
43 patch,43 patch,
44 MagicMock,44 MagicMock,
45 Mock,45 Mock,
46 )46)
47from rnrclient import ReviewsStats47from rnrclient import ReviewsStats
4848
49from webcatalog.models import (49from webcatalog.models import (
@@ -52,7 +52,7 @@
52 Exhibit,52 Exhibit,
53 Nonce,53 Nonce,
54 ReviewStatsImport,54 ReviewStatsImport,
55 )55)
56from webcatalog.management.commands import (56from webcatalog.management.commands import (
57 import_app_install_data,57 import_app_install_data,
58 import_ratings_stats,58 import_ratings_stats,
@@ -71,7 +71,7 @@
71 'ImportExhibitsTestCase',71 'ImportExhibitsTestCase',
72 'ImportForPurchaseAppsTestCase',72 'ImportForPurchaseAppsTestCase',
73 'ImportRatingsTestCase',73 'ImportRatingsTestCase',
74 ]74]
7575
7676
77class ImportAppInstallTestCase(TestCaseWithFactory):77class ImportAppInstallTestCase(TestCaseWithFactory):
@@ -80,7 +80,8 @@
80 u'Firefox delivers safe, easy web browsing. A familiar user '80 u'Firefox delivers safe, easy web browsing. A familiar user '
81 u'interface, enhanced security features including protection '81 u'interface, enhanced security features including protection '
82 u'from online identity theft, and integrated search let you '82 u'from online identity theft, and integrated search let you '
83 u'get the most out of the web.')83 u'get the most out of the web.'
84 )
8485
85 # If you want to run these tests against the real apt cache (which86 # If you want to run these tests against the real apt cache (which
86 # is slower, but the real deal) you can update the following87 # is slower, but the real deal) you can update the following
@@ -90,7 +91,7 @@
90 use_mock_apt_cache = True91 use_mock_apt_cache = True
9192
92 def make_mock_apt_package(self, name, description, uri='', summary='',93 def make_mock_apt_package(self, name, description, uri='', summary='',
93 screenshot_url=''):94 screenshot_url=''):
94 """Helper to DRY up creating a mock apt package."""95 """Helper to DRY up creating a mock apt package."""
95 mock_package = Mock(spec=apt.package.Package)96 mock_package = Mock(spec=apt.package.Package)
96 mock_package.candidate.description = description97 mock_package.candidate.description = description
@@ -111,23 +112,23 @@
111 And keeping the setUp readable.112 And keeping the setUp readable.
112 """113 """
113 mock_cache = MagicMock()114 mock_cache = MagicMock()
114 mock_apt_firefox = self.make_mock_apt_package('firefox',115 mock_apt_firefox = self.make_mock_apt_package(
115 description=self.FIREFOX_DESCRIPTION)116 'firefox', description=self.FIREFOX_DESCRIPTION)
116 mock_apt_scribus = self.make_mock_apt_package('scribus',117 mock_apt_scribus = self.make_mock_apt_package(
117 description="Scribus description")118 'scribus', description="Scribus description")
118 mock_other_app = self.make_mock_apt_package('otherapp',119 mock_other_app = self.make_mock_apt_package(
119 description="Otherapp description",120 'otherapp', description="Otherapp description",
120 summary="Otherapp the Internet\nA tagline for Otherapp",121 summary="Otherapp the Internet\nA tagline for Otherapp",
121 screenshot_url="http://example.com/screenshot_for_otherapp.png")122 screenshot_url="http://example.com/screenshot_for_otherapp.png")
122 mock_app_install_data = self.make_mock_apt_package('app-install-data',123 mock_app_install_data = self.make_mock_apt_package(
123 description="App install desc.",124 'app-install-data', description="App install desc.",
124 uri='http://example.com/app-install-1.01.deb')125 uri='http://example.com/app-install-1.01.deb')
125 cache_dict = {126 cache_dict = {
126 'firefox': mock_apt_firefox,127 'firefox': mock_apt_firefox,
127 'scribus': mock_apt_scribus,128 'scribus': mock_apt_scribus,
128 'otherapp': mock_other_app,129 'otherapp': mock_other_app,
129 'app-install-data': mock_app_install_data,130 'app-install-data': mock_app_install_data,
130 }131 }
131132
132 def getitem(self, key):133 def getitem(self, key):
133 return cache_dict.get(key, None)134 return cache_dict.get(key, None)
@@ -151,8 +152,8 @@
151 # We use a temporary on-disk cache location for our152 # We use a temporary on-disk cache location for our
152 # tests.153 # tests.
153 self.tmp_apt_cache = tempfile.mkdtemp()154 self.tmp_apt_cache = tempfile.mkdtemp()
154 self.patch_cache_setting = patch.object(settings,155 self.patch_cache_setting = patch.object(
155 'DISK_APT_CACHE_LOCATION', self.tmp_apt_cache)156 settings, 'DISK_APT_CACHE_LOCATION', self.tmp_apt_cache)
156 self.patch_cache_setting.start()157 self.patch_cache_setting.start()
157158
158 if self.use_mock_apt_cache:159 if self.use_mock_apt_cache:
@@ -180,10 +181,10 @@
180 call_command('import_app_install_data', 'onion', verbosity=0)181 call_command('import_app_install_data', 'onion', verbosity=0)
181182
182 self.assertEqual(2, mock_get_data_fn.call_count)183 self.assertEqual(2, mock_get_data_fn.call_count)
183 for call_args, package_name in zip(mock_get_data_fn.call_args_list,184 calls = ('app-install-data', 'app-install-data-partner')
184 ('app-install-data', 'app-install-data-partner')):185 for call_args, pkgname in zip(mock_get_data_fn.call_args_list, calls):
185 args = call_args[0]186 args = call_args[0]
186 self.assertEqual(package_name, args[0])187 self.assertEqual(pkgname, args[0])
187 self.assertEqual('onion', args[1])188 self.assertEqual('onion', args[1])
188 self.assertTrue(args[2].startswith('/tmp/tmp'))189 self.assertTrue(args[2].startswith('/tmp/tmp'))
189190
@@ -206,7 +207,8 @@
206 def test_local_app_install_data(self):207 def test_local_app_install_data(self):
207 # We don't hit the network when provided a local app-install deb.208 # We don't hit the network when provided a local app-install deb.
208 with patch('urllib.urlretrieve') as mock_urlretrieve:209 with patch('urllib.urlretrieve') as mock_urlretrieve:
209 call_command('import_app_install_data', 'natty',210 call_command(
211 'import_app_install_data', 'natty',
210 local_app_install_data=self.deb_location,212 local_app_install_data=self.deb_location,
211 local_app_install_data_partner=self.deb_location,213 local_app_install_data_partner=self.deb_location,
212 verbosity=0)214 verbosity=0)
@@ -232,8 +234,8 @@
232 def test_applications_updated(self):234 def test_applications_updated(self):
233 # If applications already exist for the same series, it is235 # If applications already exist for the same series, it is
234 # updated.236 # updated.
235 app = self.factory.make_application(package_name='scribus',237 app = self.factory.make_application(
236 comment='old comment',238 package_name='scribus', comment='old comment',
237 distroseries=self.factory.make_distroseries(code_name='natty'))239 distroseries=self.factory.make_distroseries(code_name='natty'))
238240
239 call_command(241 call_command(
@@ -250,8 +252,8 @@
250 def test_same_app_different_distroseries(self):252 def test_same_app_different_distroseries(self):
251 # Importing the same app (package_name) as an existing app, but253 # Importing the same app (package_name) as an existing app, but
252 # for a different distroseries creates a new record.254 # for a different distroseries creates a new record.
253 app = self.factory.make_application(package_name='scribus',255 app = self.factory.make_application(
254 comment='old comment',256 package_name='scribus', comment='old comment',
255 distroseries=self.factory.make_distroseries(code_name='natty'))257 distroseries=self.factory.make_distroseries(code_name='natty'))
256258
257 call_command(259 call_command(
@@ -330,7 +332,8 @@
330 self.assertEqual("Browse the World Wide Web", firefox.comment)332 self.assertEqual("Browse the World Wide Web", firefox.comment)
331333
332 def test_description_updated_in_app(self):334 def test_description_updated_in_app(self):
333 app = self.factory.make_application(package_name='scribus',335 app = self.factory.make_application(
336 package_name='scribus',
334 distroseries=self.factory.make_distroseries(code_name='natty'))337 distroseries=self.factory.make_distroseries(code_name='natty'))
335338
336 call_command(339 call_command(
@@ -355,18 +358,19 @@
355358
356 natty_cache = os.path.join(self.tmp_apt_cache, 'natty')359 natty_cache = os.path.join(self.tmp_apt_cache, 'natty')
357 sources_list_path = os.path.join(natty_cache, 'etc', 'apt',360 sources_list_path = os.path.join(natty_cache, 'etc', 'apt',
358 'sources.list')361 'sources.list')
359 self.assertTrue(os.path.exists(os.path.join(sources_list_path)))362 self.assertTrue(os.path.exists(os.path.join(sources_list_path)))
360 with open(sources_list_path) as content:363 with open(sources_list_path) as content:
361 sources_list_content = content.read()364 sources_list_content = content.read()
362 self.assertEqual("""365 sources = [
363deb http://archive.ubuntu.com/ubuntu natty main universe366 '', # empty line
364deb http://archive.ubuntu.com/ubuntu natty-updates main universe367 'http://archive.ubuntu.com/ubuntu natty main universe',
365deb http://archive.ubuntu.com/ubuntu natty-backports main universe368 'http://archive.ubuntu.com/ubuntu natty-updates main universe',
366deb http://archive.canonical.com/ubuntu natty partner369 'http://archive.ubuntu.com/ubuntu natty-backports main universe',
367deb http://extras.ubuntu.com/ubuntu natty main370 'http://archive.canonical.com/ubuntu natty partner',
368""",371 'http://extras.ubuntu.com/ubuntu natty main',
369 sources_list_content)372 ]
373 self.assertEqual('\ndeb '.join(sources) + '\n', sources_list_content)
370 if self.use_mock_apt_cache:374 if self.use_mock_apt_cache:
371 self.mock_cache_class.assert_called_with(rootdir=natty_cache)375 self.mock_cache_class.assert_called_with(rootdir=natty_cache)
372 self.assertEqual(1, self.mock_cache.update.call_count)376 self.assertEqual(1, self.mock_cache.update.call_count)
@@ -512,20 +516,19 @@
512516
513 def mock_urlopen_fn(url):517 def mock_urlopen_fn(url):
514 """Return predetermined test_data content for given urls."""518 """Return predetermined test_data content for given urls."""
515 available_apps_url = '%sapplications/any/ubuntu/any/any/' % (519 available_apps_url = (settings.SCA_API_URL +
516 settings.SCA_API_URL)520 'applications/any/ubuntu/any/any/')
517 icon_arb_url = ('http://sc.staging.ubuntu.com/'521 icon_arb_url = ('http://sc.staging.ubuntu.com/'
518 'site_media/appmedia/2012/04/ktip.png')522 'site_media/appmedia/2012/04/ktip.png')
519 icon_hello_url = ('http://localhost:8000/'523 icon_hello_url = ('http://localhost:8000/'
520 'site_media/icons/2011/06/eg_64x64.png')524 'site_media/icons/2011/06/eg_64x64.png')
521 filenames = {525 filenames = {
522 available_apps_url: 'sca_apps.txt',526 available_apps_url: 'sca_apps.txt',
523 icon_arb_url: 'ubuntu-cof.png',527 icon_arb_url: 'ubuntu-cof.png',
524 icon_hello_url: 'ubuntu-cof.png',528 icon_hello_url: 'ubuntu-cof.png',
525 }529 }
526 curdir = os.path.dirname(__file__)530 curdir = os.path.dirname(__file__)
527 sca_apps_file = os.path.join(curdir, 'test_data',531 sca_apps_file = os.path.join(curdir, 'test_data', filenames[url])
528 filenames[url])
529 with open(sca_apps_file) as content:532 with open(sca_apps_file) as content:
530 self.response_content = content.read()533 self.response_content = content.read()
531 mock_response = Mock()534 mock_response = Mock()
@@ -543,7 +546,7 @@
543 call_command('import_for_purchase_apps')546 call_command('import_for_purchase_apps')
544547
545 app_for_purchase = Application.objects.get(name='MyApp',548 app_for_purchase = Application.objects.get(name='MyApp',
546 distroseries=self.natty)549 distroseries=self.natty)
547 self.assertEqual(True, app_for_purchase.for_purchase)550 self.assertEqual(True, app_for_purchase.for_purchase)
548 self.assertTrue(app_for_purchase.description.find('hello') > -1)551 self.assertTrue(app_for_purchase.description.find('hello') > -1)
549552
@@ -551,30 +554,31 @@
551 call_command('import_for_purchase_apps')554 call_command('import_for_purchase_apps')
552555
553 app = Application.objects.get(name='MyApp',556 app = Application.objects.get(name='MyApp',
554 distroseries=self.natty)557 distroseries=self.natty)
555 self.assertEqual(2, len(app.available_distroseries()))558 self.assertEqual(2, len(app.available_distroseries()))
556559
557 def test_app_gets_price(self):560 def test_app_gets_price(self):
558 call_command('import_for_purchase_apps')561 call_command('import_for_purchase_apps')
559562
560 app = Application.objects.get(name='MyApp',563 app = Application.objects.get(name='MyApp',
561 distroseries=self.natty)564 distroseries=self.natty)
562 self.assertEqual(Decimal('2.50'), app.price)565 self.assertEqual(Decimal('2.50'), app.price)
563566
564 def test_existing_app_gets_updated_by_archive_id(self):567 def test_existing_app_gets_updated_by_archive_id(self):
565 self.factory.make_application(archive_id='launchpad_zematynnad2/myppa',568 self.factory.make_application(
569 archive_id='launchpad_zematynnad2/myppa',
566 package_name='somethingelse', distroseries=self.maverick)570 package_name='somethingelse', distroseries=self.maverick)
567 self.factory.make_application(archive_id='launchpad_zematynnad2/myppa',571 self.factory.make_application(
568 package_name='somethingelse',572 archive_id='launchpad_zematynnad2/myppa',
569 distroseries=self.natty)573 package_name='somethingelse', distroseries=self.natty)
570 self.assertEqual(2,574 apps = Application.objects.filter(
571 Application.objects.filter(575 distroseries__in=(self.natty, self.maverick)).count()
572 distroseries__in=(self.natty, self.maverick)).count())576 self.assertEqual(2, apps)
573577
574 call_command('import_for_purchase_apps')578 call_command('import_for_purchase_apps')
575579
576 actual_apps = Application.objects.filter(580 actual_apps = Application.objects.filter(
577 distroseries__in=(self.natty, self.maverick))581 distroseries__in=(self.natty, self.maverick))
578 self.assertEqual(2, actual_apps.count())582 self.assertEqual(2, actual_apps.count())
579 for app in actual_apps:583 for app in actual_apps:
580 self.assertEqual('launchpad_zematynnad2/myppa', app.archive_id)584 self.assertEqual('launchpad_zematynnad2/myppa', app.archive_id)
@@ -587,7 +591,7 @@
587 'http://sc.staging.ubuntu.com/'591 'http://sc.staging.ubuntu.com/'
588 'site_media/appmedia/2012/04/ktip.png')592 'site_media/appmedia/2012/04/ktip.png')
589 app = Application.objects.get(name='MyApp',593 app = Application.objects.get(name='MyApp',
590 distroseries=self.natty)594 distroseries=self.natty)
591 # The urlopen double returns the test_data/ubuntu-cof.png which has595 # The urlopen double returns the test_data/ubuntu-cof.png which has
592 # a size of 2438.596 # a size of 2438.
593 self.assertEqual(2438, app.icon.size)597 self.assertEqual(2438, app.icon.size)
@@ -596,21 +600,21 @@
596 call_command('import_for_purchase_apps')600 call_command('import_for_purchase_apps')
597601
598 app = Application.objects.get(package_name='hello',602 app = Application.objects.get(package_name='hello',
599 distroseries=self.natty)603 distroseries=self.natty)
600 self.assertEqual('1.2.3', app.version)604 self.assertEqual('1.2.3', app.version)
601605
602 def test_checks_latest(self):606 def test_checks_latest(self):
603 call_command('import_for_purchase_apps')607 call_command('import_for_purchase_apps')
604608
605 app = Application.objects.get(package_name='hello',609 app = Application.objects.get(package_name='hello',
606 distroseries=self.natty)610 distroseries=self.natty)
607 self.assertTrue(app.is_latest)611 self.assertTrue(app.is_latest)
608612
609 def test_app_gets_screenshots(self):613 def test_app_gets_screenshots(self):
610 call_command('import_for_purchase_apps')614 call_command('import_for_purchase_apps')
611615
612 app = Application.objects.get(package_name='hello',616 app = Application.objects.get(package_name='hello',
613 distroseries=self.natty)617 distroseries=self.natty)
614 qs = app.applicationmedia_set.filter(media_type='screenshot')618 qs = app.applicationmedia_set.filter(media_type='screenshot')
615 self.assertEqual(2, qs.count())619 self.assertEqual(2, qs.count())
616620
@@ -648,13 +652,13 @@
648652
649 def test_creates_last_import_record(self):653 def test_creates_last_import_record(self):
650 onion = self.factory.make_distroseries(code_name='onion')654 onion = self.factory.make_distroseries(code_name='onion')
651 self.assertEqual(0,655 self.assertEqual(
652 ReviewStatsImport.objects.filter(distroseries=onion).count())656 0, ReviewStatsImport.objects.filter(distroseries=onion).count())
653657
654 call_command('import_ratings_stats', 'onion')658 call_command('import_ratings_stats', 'onion')
655659
656 self.assertEqual(1,660 self.assertEqual(
657 ReviewStatsImport.objects.filter(distroseries=onion).count())661 1, ReviewStatsImport.objects.filter(distroseries=onion).count())
658662
659 def test_updates_last_import_record(self):663 def test_updates_last_import_record(self):
660 onion = self.factory.make_distroseries(code_name='onion')664 onion = self.factory.make_distroseries(code_name='onion')
@@ -696,13 +700,13 @@
696 # apps in the db.700 # apps in the db.
697 natty = self.factory.make_distroseries(code_name='natty')701 natty = self.factory.make_distroseries(code_name='natty')
698 scribus = self.factory.make_application(package_name='scribus',702 scribus = self.factory.make_application(package_name='scribus',
699 distroseries=natty)703 distroseries=natty)
700 otherapp = self.factory.make_application(package_name='otherapp',704 otherapp = self.factory.make_application(package_name='otherapp',
701 distroseries=natty)705 distroseries=natty)
702706
703 scribus_stats = ReviewsStats.from_dict(dict(package_name='scribus',707 d = dict(package_name='scribus', ratings_average='4.00',
704 ratings_average='4.00', ratings_total=4,708 ratings_total=4, histogram='[0, 1, 0, 1, 2]')
705 histogram='[0, 1, 0, 1, 2]'))709 scribus_stats = ReviewsStats.from_dict(d)
706 self.mock_review_stats.return_value = [scribus_stats]710 self.mock_review_stats.return_value = [scribus_stats]
707 call_command('import_ratings_stats', 'natty')711 call_command('import_ratings_stats', 'natty')
708712
@@ -717,10 +721,12 @@
717 def test_update_works_with_many_stats(self):721 def test_update_works_with_many_stats(self):
718 """Ensure update_apps_with_stats doesn't fail with many ratings."""722 """Ensure update_apps_with_stats doesn't fail with many ratings."""
719 natty = self.factory.make_distroseries(code_name='natty')723 natty = self.factory.make_distroseries(code_name='natty')
720 stats = [ReviewsStats.from_dict(dict(724 d = dict(
721 package_name=self.factory.get_unique_string(prefix='package-'),725 package_name=self.factory.get_unique_string(prefix='package-'),
722 ratings_average='5.00', ratings_total=1,726 ratings_average='5.00', ratings_total=1,
723 histogram='[0, 0, 0, 0, 1]')) for x in range(3000)]727 histogram='[0, 0, 0, 0, 1]',
728 )
729 stats = [ReviewsStats.from_dict(d.copy()) for x in range(3000)]
724 command = import_ratings_stats.Command()730 command = import_ratings_stats.Command()
725731
726 # update_apps_with_stats returns None on success:732 # update_apps_with_stats returns None on success:
@@ -730,11 +736,12 @@
730 """Ensure update_apps_with_stats works with null histogram data"""736 """Ensure update_apps_with_stats works with null histogram data"""
731 app = self.factory.make_application()737 app = self.factory.make_application()
732 stats = [ReviewsStats.from_dict(dict(package_name=app.package_name,738 stats = [ReviewsStats.from_dict(dict(package_name=app.package_name,
733 ratings_average='5.00', ratings_total=1, histogram=None))]739 ratings_average='5.00',
740 ratings_total=1, histogram=None))]
734 command = import_ratings_stats.Command()741 command = import_ratings_stats.Command()
735742
736 self.assertIsNone(command.update_apps_with_stats(app.distroseries,743 result = command.update_apps_with_stats(app.distroseries, stats)
737 stats))744 self.assertIsNone(result)
738745
739746
740class ImportExhibitsTestCase(TestCaseWithFactory):747class ImportExhibitsTestCase(TestCaseWithFactory):
@@ -744,20 +751,22 @@
744 data = []751 data = []
745 for exhibit in exhibits:752 for exhibit in exhibits:
746 ds = exhibit.distroseries.get()753 ds = exhibit.distroseries.get()
747 data.append({'package_names': exhibit.package_names,754 data.append({
755 'package_names': exhibit.package_names,
748 'banner_url': exhibit.banner_url,756 'banner_url': exhibit.banner_url,
749 'version': ds.version,757 'version': ds.version,
750 'code_name': ds.code_name,758 'code_name': ds.code_name,
751 'html': exhibit.html,759 'html': exhibit.html,
752 'date_created': str(exhibit.date_created),760 'date_created': str(exhibit.date_created),
753 'weight': str(exhibit.weight),761 'weight': str(exhibit.weight),
754 'id': exhibit.sca_id})762 'id': exhibit.sca_id,
763 })
755 if changes:764 if changes:
756 for atts, change in zip(data, changes):765 for atts, change in zip(data, changes):
757 atts.update(change)766 atts.update(change)
758 for xibit in data:767 for xibit in data:
759 xibit['distroseries'] = [{'code_name': xibit.pop('code_name'),768 xibit['distroseries'] = [{'code_name': xibit.pop('code_name'),
760 'version': xibit.pop('version')}]769 'version': xibit.pop('version')}]
761 return_value = json.dumps(data)770 return_value = json.dumps(data)
762 response.read.return_value = return_value771 response.read.return_value = return_value
763 return response772 return response
@@ -778,10 +787,10 @@
778 new_package_names = self.factory.get_unique_string(prefix='new-')787 new_package_names = self.factory.get_unique_string(prefix='new-')
779 new_banner_url = self.factory.get_unique_string(prefix='new-')788 new_banner_url = self.factory.get_unique_string(prefix='new-')
780 new_html = self.factory.get_unique_string(prefix='new-')789 new_html = self.factory.get_unique_string(prefix='new-')
781 mock_urlopen.return_value = self.mock_response([xibit], changes=[790 mock_urlopen.return_value = self.mock_response(
782 {'package_names': new_package_names, 'banner_url': new_banner_url,791 [xibit], changes=[{'package_names': new_package_names,
783 'html': new_html, 'weight': 3}])792 'banner_url': new_banner_url,
784793 'html': new_html, 'weight': 3}])
785 call_command('import_exhibits')794 call_command('import_exhibits')
786795
787 retrieved = Exhibit.objects.get()796 retrieved = Exhibit.objects.get()
@@ -795,8 +804,8 @@
795 def test_creates_exhibit_if_scaid_does_not_match(self, mock_urlopen):804 def test_creates_exhibit_if_scaid_does_not_match(self, mock_urlopen):
796 xibit = self.factory.make_exhibit(published=False)805 xibit = self.factory.make_exhibit(published=False)
797 new_id = xibit.sca_id + 20806 new_id = xibit.sca_id + 20
798 mock_urlopen.return_value = self.mock_response([xibit], changes=[807 mock_urlopen.return_value = self.mock_response(
799 {'id': new_id}])808 [xibit], changes=[{'id': new_id}])
800809
801 call_command('import_exhibits')810 call_command('import_exhibits')
802811
@@ -807,7 +816,7 @@
807 @patch('urllib.urlopen')816 @patch('urllib.urlopen')
808 def test_display_is_left_untouched(self, mock_urlopen):817 def test_display_is_left_untouched(self, mock_urlopen):
809 xibits = [self.factory.make_exhibit(display=d)818 xibits = [self.factory.make_exhibit(display=d)
810 for d in [False, True, None]]819 for d in [False, True, None]]
811820
812 mock_urlopen.return_value = self.mock_response(xibits)821 mock_urlopen.return_value = self.mock_response(xibits)
813822
@@ -826,8 +835,8 @@
826 banner_url = 'http://example.com/foo/bar/baz.png'835 banner_url = 'http://example.com/foo/bar/baz.png'
827 expected = '<img src="http://example.com/foo/bar/baz.png">'836 expected = '<img src="http://example.com/foo/bar/baz.png">'
828837
829 mock_urlopen.return_value = self.mock_response([xibit],838 mock_urlopen.return_value = self.mock_response(
830 changes=[{'banner_url': banner_url, 'html': html}])839 [xibit], changes=[{'banner_url': banner_url, 'html': html}])
831840
832 call_command('import_exhibits')841 call_command('import_exhibits')
833842
@@ -838,13 +847,13 @@
838class CheckAllLatestTestCase(TestCaseWithFactory):847class CheckAllLatestTestCase(TestCaseWithFactory):
839 def test_updates_all(self):848 def test_updates_all(self):
840 natty = self.factory.make_distroseries(code_name='natty',849 natty = self.factory.make_distroseries(code_name='natty',
841 version='11.04')850 version='11.04')
842 oneiric = self.factory.make_distroseries(code_name='oneiric',851 oneiric = self.factory.make_distroseries(code_name='oneiric',
843 version='11.10')852 version='11.10')
844 self.factory.make_application(package_name='foo', distroseries=natty)853 self.factory.make_application(package_name='foo', distroseries=natty)
845 self.factory.make_application(package_name='foo', distroseries=oneiric)854 self.factory.make_application(package_name='foo', distroseries=oneiric)
846 self.factory.make_application(package_name='bar', distroseries=natty,855 self.factory.make_application(package_name='bar', distroseries=natty,
847 is_latest=True)856 is_latest=True)
848 self.factory.make_application(package_name='baz', distroseries=oneiric)857 self.factory.make_application(package_name='baz', distroseries=oneiric)
849858
850 call_command('check_all_latest')859 call_command('check_all_latest')
@@ -857,13 +866,14 @@
857866
858867
859class CleanupTestCase(TestCaseWithFactory):868class CleanupTestCase(TestCaseWithFactory):
869
860 @patch('webcatalog.management.commands.cleanup.connection')870 @patch('webcatalog.management.commands.cleanup.connection')
861 @patch('sys.stdout')871 @patch('sys.stdout')
862 def run_and_check_output_and_sql(self, func, output, sql, mock_stdout,872 def run_and_check_output_and_sql(self, func, output, sql, mock_stdout,
863 mock_connection):873 mock_connection):
864 func()874 func()
865 actual_output = ''.join(str(call[0][0])875 actual_output = ''.join(str(call[0][0])
866 for call in mock_stdout.write.call_args_list)876 for call in mock_stdout.write.call_args_list)
867 self.assertEqual(output, actual_output.split('\n'))877 self.assertEqual(output, actual_output.split('\n'))
868 call_list = mock_connection.cursor.return_value.execute.call_args_list878 call_list = mock_connection.cursor.return_value.execute.call_args_list
869 for expected, call in zip(sql, call_list):879 for expected, call in zip(sql, call_list):
@@ -875,15 +885,16 @@
875 def cleanup():885 def cleanup():
876 call_command('cleanup', 'webcatalog_nonce')886 call_command('cleanup', 'webcatalog_nonce')
877 output = ['Opening cursor',887 output = ['Opening cursor',
878 'Removed 0 rows (0 total removed). Batch size 1',888 'Removed 0 rows (0 total removed). Batch size 1',
879 'All done.', '']889 'All done.', '']
880 sql = [890 sql = [
881 ('CLOSE ALL',),891 ('CLOSE ALL',),
882 ('DECLARE _oauth_nonce_clean NO SCROLL CURSOR WITH HOLD FOR '892 ('DECLARE _oauth_nonce_clean NO SCROLL CURSOR WITH HOLD FOR '
883 'SELECT id FROM webcatalog_nonce '893 'SELECT id FROM webcatalog_nonce '
884 "WHERE created_at < (CURRENT_TIMESTAMP - INTERVAL '5' HOUR) "894 "WHERE created_at < (CURRENT_TIMESTAMP - INTERVAL '5' HOUR) "
885 'ORDER BY created_at',),895 'ORDER BY created_at',),
886 ('FETCH %s FROM _oauth_nonce_clean', [1])]896 ('FETCH %s FROM _oauth_nonce_clean', [1]),
897 ]
887 self.run_and_check_output_and_sql(cleanup, output, sql)898 self.run_and_check_output_and_sql(cleanup, output, sql)
888899
889 @skipUnless(connection.vendor == 'postgresql', "Requires postgresql")900 @skipUnless(connection.vendor == 'postgresql', "Requires postgresql")
@@ -891,14 +902,15 @@
891 def cleanup():902 def cleanup():
892 call_command('cleanup', 'django_session')903 call_command('cleanup', 'django_session')
893 output = ['Opening cursor',904 output = ['Opening cursor',
894 'Removed 0 rows (0 total removed). Batch size 1',905 'Removed 0 rows (0 total removed). Batch size 1',
895 'All done.', '']906 'All done.', '']
896 sql = [907 sql = [
897 ('CLOSE ALL',),908 ('CLOSE ALL',),
898 ('DECLARE _django_session_clean NO SCROLL CURSOR WITH HOLD FOR '909 ('DECLARE _django_session_clean NO SCROLL CURSOR WITH HOLD FOR '
899 'SELECT session_key FROM django_session WHERE expire_date < '910 'SELECT session_key FROM django_session WHERE expire_date < '
900 'CURRENT_TIMESTAMP ORDER BY expire_date',),911 'CURRENT_TIMESTAMP ORDER BY expire_date',),
901 ('FETCH %s FROM _django_session_clean', [1])]912 ('FETCH %s FROM _django_session_clean', [1]),
913 ]
902 self.run_and_check_output_and_sql(cleanup, output, sql)914 self.run_and_check_output_and_sql(cleanup, output, sql)
903915
904916
@@ -917,8 +929,8 @@
917Removed 0 rows (4 total removed). Batch size 4929Removed 0 rows (4 total removed). Batch size 4
918All done.930All done.
919'''931'''
920 actual_output = ''.join(str(call[0][0])932 actual_output = ''.join(
921 for call in self.mock_stdout.write.call_args_list)933 str(call[0][0]) for call in self.mock_stdout.write.call_args_list)
922 self.assertEqual(expected_output, actual_output)934 self.assertEqual(expected_output, actual_output)
923935
924 @skipUnless(connection.vendor == 'postgresql', "Requires postgresql")936 @skipUnless(connection.vendor == 'postgresql', "Requires postgresql")
925937
=== modified file 'src/webcatalog/tests/test_context_processors.py'
--- src/webcatalog/tests/test_context_processors.py 2012-01-06 14:24:49 +0000
+++ src/webcatalog/tests/test_context_processors.py 2012-06-06 18:03:20 +0000
@@ -22,7 +22,7 @@
22__metaclass__ = type22__metaclass__ = type
23__all__ = [23__all__ = [
24 'GoogleAnalyticsTestCase',24 'GoogleAnalyticsTestCase',
25 ]25]
2626
27from django.core.urlresolvers import reverse27from django.core.urlresolvers import reverse
28from django.test import TestCase28from django.test import TestCase
2929
=== modified file 'src/webcatalog/tests/test_department_filters.py'
--- src/webcatalog/tests/test_department_filters.py 2011-09-12 13:37:24 +0000
+++ src/webcatalog/tests/test_department_filters.py 2012-06-06 18:03:20 +0000
@@ -20,7 +20,7 @@
20from __future__ import (20from __future__ import (
21 absolute_import,21 absolute_import,
22 with_statement,22 with_statement,
23 )23)
2424
2525
26from webcatalog.tests.factory import TestCaseWithFactory26from webcatalog.tests.factory import TestCaseWithFactory
@@ -28,12 +28,12 @@
28 category_filter,28 category_filter,
29 package_name_filter,29 package_name_filter,
30 section_filter30 section_filter
31 )31)
3232
33__metaclass__ = type33__metaclass__ = type
34__all__ = [34__all__ = [
35 'DepartmentFilterTestCase',35 'DepartmentFilterTestCase',
36 ]36]
3737
3838
39class DepartmentFilterTestCase(TestCaseWithFactory):39class DepartmentFilterTestCase(TestCaseWithFactory):
4040
=== modified file 'src/webcatalog/tests/test_forms.py'
--- src/webcatalog/tests/test_forms.py 2012-05-03 13:06:53 +0000
+++ src/webcatalog/tests/test_forms.py 2012-06-06 18:03:20 +0000
@@ -20,7 +20,7 @@
20from __future__ import (20from __future__ import (
21 absolute_import,21 absolute_import,
22 with_statement,22 with_statement,
23 )23)
2424
25from django.forms import ValidationError25from django.forms import ValidationError
26from django.test import TestCase26from django.test import TestCase
@@ -32,7 +32,7 @@
32 desktop_field_mappings,32 desktop_field_mappings,
33 ForPurchaseApplicationForm,33 ForPurchaseApplicationForm,
34 MultiURLField,34 MultiURLField,
35 )35)
36from webcatalog.models import Application, ApplicationMedia36from webcatalog.models import Application, ApplicationMedia
37from webcatalog.tests.factory import TestCaseWithFactory37from webcatalog.tests.factory import TestCaseWithFactory
3838
@@ -41,15 +41,14 @@
41 'ApplicationFormTestCase',41 'ApplicationFormTestCase',
42 'ForPurchaseApplicationFormTestCase',42 'ForPurchaseApplicationFormTestCase',
43 'MultiURLFieldTestCase',43 'MultiURLFieldTestCase',
44 ]44]
4545
4646
47class ApplicationFormTestCase(TestCaseWithFactory):47class ApplicationFormTestCase(TestCaseWithFactory):
4848
49 def get_desktop_data(self, overrides):49 def get_desktop_data(self, overrides):
50 data = {50 data = {
51 'Name': self.factory.get_unique_string(51 'Name': self.factory.get_unique_string(prefix='App Name'),
52 prefix='App Name'),
53 'X-AppInstall-Package': self.factory.get_unique_string(52 'X-AppInstall-Package': self.factory.get_unique_string(
54 prefix='pkg_name'),53 prefix='pkg_name'),
55 'X-AppInstall-Popcon': self.factory.get_unique_integer(),54 'X-AppInstall-Popcon': self.factory.get_unique_integer(),
@@ -57,7 +56,7 @@
57 prefix='section'),56 prefix='section'),
58 'Type': 'Application',57 'Type': 'Application',
59 'Categories': 'cat1;cat2',58 'Categories': 'cat1;cat2',
60 }59 }
61 data.update(overrides)60 data.update(overrides)
62 return data61 return data
6362
@@ -85,11 +84,11 @@
85 data = {84 data = {
86 'Name': 'My Package',85 'Name': 'My Package',
87 'X-AppInstall-Package': 'mypkg',86 'X-AppInstall-Package': 'mypkg',
88 }87 }
89 desktop_entry = self.get_desktop_entry(self.get_desktop_data(data))88 desktop_entry = self.get_desktop_entry(self.get_desktop_data(data))
9089
91 form = ApplicationForm.get_form_from_desktop_data(desktop_entry,90 form = ApplicationForm.get_form_from_desktop_data(
92 distroseries=self.factory.make_distroseries())91 desktop_entry, distroseries=self.factory.make_distroseries())
9392
94 self.assertTrue(form.is_valid())93 self.assertTrue(form.is_valid())
95 self.assertEqual('My Package', form.cleaned_data['name'])94 self.assertEqual('My Package', form.cleaned_data['name'])
@@ -99,15 +98,15 @@
99 # If the desktop data contains some blanks, then the initial98 # If the desktop data contains some blanks, then the initial
100 # data from any existing instance should be used instead.99 # data from any existing instance should be used instead.
101 app = self.factory.make_application(package_name='mypkg',100 app = self.factory.make_application(package_name='mypkg',
102 description='MyPkg description')101 description='MyPkg description')
103 data = {102 data = {
104 'Name': 'My Package',103 'Name': 'My Package',
105 'X-AppInstall-Package': 'mypkg',104 'X-AppInstall-Package': 'mypkg',
106 }105 }
107 desktop_entry = self.get_desktop_entry(self.get_desktop_data(data))106 desktop_entry = self.get_desktop_entry(self.get_desktop_data(data))
108107
109 form = ApplicationForm.get_form_from_desktop_data(desktop_entry,108 form = ApplicationForm.get_form_from_desktop_data(
110 distroseries=app.distroseries)109 desktop_entry, distroseries=app.distroseries)
111110
112 self.assertTrue(form.is_valid())111 self.assertTrue(form.is_valid())
113 self.assertEqual('MyPkg description', form.cleaned_data['description'])112 self.assertEqual('MyPkg description', form.cleaned_data['description'])
@@ -126,12 +125,12 @@
126 'X-AppInstall-Keywords': 'jazz,rock,country',125 'X-AppInstall-Keywords': 'jazz,rock,country',
127 'Categories': 'Graphics;Jazz;Publishing',126 'Categories': 'Graphics;Jazz;Publishing',
128 'MimeType': 'application/vnd.scribus;text/javascript;'127 'MimeType': 'application/vnd.scribus;text/javascript;'
129 }128 }
130 desktop_entry = self.get_desktop_entry(self.get_desktop_data(129 info = self.get_desktop_data(extra_desktop_info)
131 extra_desktop_info))130 desktop_entry = self.get_desktop_entry(info)
132131
133 form = ApplicationForm.get_form_from_desktop_data(desktop_entry,132 form = ApplicationForm.get_form_from_desktop_data(
134 distroseries=self.factory.make_distroseries())133 desktop_entry, distroseries=self.factory.make_distroseries())
135134
136 self.assertTrue(form.is_valid())135 self.assertTrue(form.is_valid())
137 for key, value in extra_desktop_info.items():136 for key, value in extra_desktop_info.items():
@@ -144,12 +143,12 @@
144 extra_desktop_info = {143 extra_desktop_info = {
145 'X-AppInstall-Screenshot-Url': 'http://example.com/screenshot',144 'X-AppInstall-Screenshot-Url': 'http://example.com/screenshot',
146 'X-AppInstall-Package': app.package_name,145 'X-AppInstall-Package': app.package_name,
147 }146 }
148 desktop_entry = self.get_desktop_entry(self.get_desktop_data(147 info = self.get_desktop_data(extra_desktop_info)
149 extra_desktop_info))148 desktop_entry = self.get_desktop_entry(info)
150149
151 form = ApplicationForm.get_form_from_desktop_data(desktop_entry,150 form = ApplicationForm.get_form_from_desktop_data(
152 distroseries=app.distroseries)151 desktop_entry, distroseries=app.distroseries)
153 form.save()152 form.save()
154153
155 app = Application.objects.get(pk=app.pk)154 app = Application.objects.get(pk=app.pk)
@@ -166,9 +165,10 @@
166 # - It doesn't provide a real benefit as 99% of the time the field165 # - It doesn't provide a real benefit as 99% of the time the field
167 # is populated by a script that doesn't have typo issues.166 # is populated by a script that doesn't have typo issues.
168 distroseries = self.factory.make_distroseries()167 distroseries = self.factory.make_distroseries()
169 form = ApplicationForm(dict(screenshot_url='http://foo.com:42/broken',168 d = dict(screenshot_url='http://foo.com:42/broken',
170 section='required', name='required', package_name='required',169 section='required', name='required', package_name='required',
171 distroseries=distroseries.id))170 distroseries=distroseries.id)
171 form = ApplicationForm(d)
172 self.assertTrue(form.is_valid())172 self.assertTrue(form.is_valid())
173173
174174
@@ -190,29 +190,32 @@
190 'screenshot_urls': [190 'screenshot_urls': [
191 'http://example.com/screenshot1.png',191 'http://example.com/screenshot1.png',
192 'http://example.com/screenshot2.png',192 'http://example.com/screenshot2.png',
193 ],193 ],
194 'video_embedded_html_urls': [194 'video_embedded_html_urls': [
195 'http://example.com/video1.mp4',195 'http://example.com/video1.mp4',
196 ],196 ],
197 'archive_id': app.archive_id,197 'archive_id': app.archive_id,
198 'package_name': app.package_name,198 'package_name': app.package_name,
199 'name': app.name,199 'name': app.name,
200 }200 }
201201
202 form = ForPurchaseApplicationForm.from_api_data(data,202 form = ForPurchaseApplicationForm.from_api_data(data,
203 app.distroseries)203 app.distroseries)
204 self.assertTrue(form.is_valid())204 self.assertTrue(form.is_valid())
205 form.save_media_urls()205 form.save_media_urls()
206206
207 self.assertEqual(3, app.applicationmedia_set.count())207 self.assertEqual(3, app.applicationmedia_set.count())
208 actual_urls = [media.url for media in app.applicationmedia_set.all()]208 actual_urls = [media.url for media in
209 self.assertEqual([209 app.applicationmedia_set.all().order_by('url')]
210 expected = [
210 'http://example.com/screenshot1.png',211 'http://example.com/screenshot1.png',
211 'http://example.com/screenshot2.png',212 'http://example.com/screenshot2.png',
212 'http://example.com/video1.mp4',213 'http://example.com/video1.mp4',
213 ], actual_urls)214 ]
215 self.assertEqual(expected, actual_urls)
214216
215 def make_valid_data(self, **kwargs):217 def make_valid_data(self, **kwargs):
218 media_url = u'http://sc.staging.ubuntu.com/site_media/appmedia/'
216 data = {219 data = {
217 u'status': u'Published',220 u'status': u'Published',
218 u'signing_key_id': u'',221 u'signing_key_id': u'',
@@ -222,34 +225,30 @@
222 u'series': {225 u'series': {
223 u'precise': [u'amd64', u'i386'],226 u'precise': [u'amd64', u'i386'],
224 u'oneiric': [u'i386', u'amd64']227 u'oneiric': [u'i386', u'amd64']
225 },228 },
226 u'price': u'0.00',229 u'price': u'0.00',
227 u'debtags': '["mouse"]',230 u'debtags': '["mouse"]',
228 u'date_published': u'2012-04-30 19:34:08.011454',231 u'date_published': u'2012-04-30 19:34:08.011454',
229 u'video_urls': [],232 u'video_urls': [],
230 u'screenshot_url': u'http://sc.staging.ubuntu.com/'233 u'screenshot_url': media_url + u'2012/04/IMG_20120401_144332.jpg',
231 'site_media/appmedia/2012/04/'
232 'IMG_20120401_144332.jpg',
233 u'id': 595,234 u'id': 595,
234 u'categories': u'Utility',235 u'categories': u'Utility',
235 u'archive_id': self.factory.get_unique_string(prefix='archid/'),236 u'archive_id': self.factory.get_unique_string(prefix='archid/'),
236 u'name': u'Test App',237 u'name': u'Test App',
237 u'license': u'GNU GPL v3',238 u'license': u'GNU GPL v3',
238 u'support_url': u'http://example.com/foo',239 u'support_url': u'http://example.com/foo',
239 u'icon_url': u'http://sc.staging.ubuntu.com/'240 u'icon_url': media_url + u'2012/04/ktip.png',
240 'site_media/appmedia/2012/04/ktip.png',
241 u'comment': u'This is a test app',241 u'comment': u'This is a test app',
242 u'version': u'1.2',242 u'version': u'1.2',
243 u'screenshot_urls': [243 u'screenshot_urls': [
244 u'http://sc.staging.ubuntu.com/'244 media_url + u'2012/04/IMG_20120401_144332.jpg',
245 'site_media/appmedia/2012/04/IMG_20120401_144332.jpg',245 ],
246 ],
247 u'demo': None,246 u'demo': None,
248 u'department': [u'Accessories'],247 u'department': [u'Accessories'],
249 u'archive_root': u'http://extras.ubuntu.com/',248 u'archive_root': u'http://extras.ubuntu.com/',
250 u'tos_url': u'',249 u'tos_url': u'',
251 u'channel': u'Independent',250 u'channel': u'Independent',
252 }251 }
253 data.update(**kwargs)252 data.update(**kwargs)
254 return data253 return data
255254
256255
=== modified file 'src/webcatalog/tests/test_handlers.py'
--- src/webcatalog/tests/test_handlers.py 2011-09-12 13:37:24 +0000
+++ src/webcatalog/tests/test_handlers.py 2012-06-06 18:03:20 +0000
@@ -25,8 +25,7 @@
25 'MachineHandlerTestCase',25 'MachineHandlerTestCase',
26 'PackagesHandlerTestCase',26 'PackagesHandlerTestCase',
27 'ServerStatusHandlerTestCase',27 'ServerStatusHandlerTestCase',
28 ]28]
29
3029
31from django.http import HttpRequest30from django.http import HttpRequest
32from django.test import TestCase31from django.test import TestCase
@@ -108,15 +107,15 @@
108 handler = MachineHandler()107 handler = MachineHandler()
109 response = handler.create(request, uuid='foo')108 response = handler.create(request, uuid='foo')
110 self.assertContains(response, "Unable to deserialize request",109 self.assertContains(response, "Unable to deserialize request",
111 status_code=400)110 status_code=400)
112111
113 def test_create_missing_hostname(self):112 def test_create_missing_hostname(self):
114 request = HttpRequest()113 request = HttpRequest()
115 request.data = {'logo_checksum': 'bar'}114 request.data = {'logo_checksum': 'bar'}
116 handler = MachineHandler()115 handler = MachineHandler()
117 response = handler.create(request, 'uuid')116 response = handler.create(request, 'uuid')
118 expected = {'status': 'error', 'errors':117 expected = {'status': 'error',
119 {'hostname': [u'This field is required.']}}118 'errors': {'hostname': [u'This field is required.']}}
120 self.assertEqual(expected, response)119 self.assertEqual(expected, response)
121120
122 def test_create_blank_logo_checksum(self):121 def test_create_blank_logo_checksum(self):
@@ -149,7 +148,7 @@
149 def test_delete_invalid_uuid_returns_404(self):148 def test_delete_invalid_uuid_returns_404(self):
150 handler = MachineHandler()149 handler = MachineHandler()
151 response = handler.delete(self.request,150 response = handler.delete(self.request,
152 self.factory.get_unique_string())151 self.factory.get_unique_string())
153 self.assertEqual(404, response.status_code)152 self.assertEqual(404, response.status_code)
154153
155 def test_delete(self):154 def test_delete(self):
@@ -161,7 +160,7 @@
161 self.assertEqual(204, response.status_code)160 self.assertEqual(204, response.status_code)
162 self.assertEqual('', response.content)161 self.assertEqual('', response.content)
163 self.assertRaises(Machine.DoesNotExist, Machine.objects.get,162 self.assertRaises(Machine.DoesNotExist, Machine.objects.get,
164 uuid=machine.uuid)163 uuid=machine.uuid)
165164
166165
167class PackagesHandlerTestCase(HandlerTestCase):166class PackagesHandlerTestCase(HandlerTestCase):
@@ -173,7 +172,7 @@
173 def test_read(self):172 def test_read(self):
174 expected = 'some-package-list'173 expected = 'some-package-list'
175 machine = self.factory.make_machine(owner=self.user,174 machine = self.factory.make_machine(owner=self.user,
176 package_list=expected)175 package_list=expected)
177 handler = PackagesHandler()176 handler = PackagesHandler()
178177
179 response = handler.read(self.request, machine.uuid)178 response = handler.read(self.request, machine.uuid)
@@ -182,7 +181,7 @@
182 def test_create_invalid_uuid_returns_404(self):181 def test_create_invalid_uuid_returns_404(self):
183 handler = PackagesHandler()182 handler = PackagesHandler()
184 response = handler.create(self.request,183 response = handler.create(self.request,
185 self.factory.get_unique_string())184 self.factory.get_unique_string())
186 self.assertEqual(404, response.status_code)185 self.assertEqual(404, response.status_code)
187186
188 def test_create_missing_data(self):187 def test_create_missing_data(self):
@@ -221,4 +220,4 @@
221 handler = PackagesHandler()220 handler = PackagesHandler()
222 response = handler.create(request, uuid=machine.uuid)221 response = handler.create(request, uuid=machine.uuid)
223 self.assertContains(response, "Unable to deserialize request",222 self.assertContains(response, "Unable to deserialize request",
224 status_code=400)223 status_code=400)
225224
=== modified file 'src/webcatalog/tests/test_managers.py'
--- src/webcatalog/tests/test_managers.py 2012-03-16 01:42:36 +0000
+++ src/webcatalog/tests/test_managers.py 2012-06-06 18:03:20 +0000
@@ -20,8 +20,7 @@
20from __future__ import (20from __future__ import (
21 absolute_import,21 absolute_import,
22 with_statement,22 with_statement,
23 )23)
24
2524
26from webcatalog.tests.factory import TestCaseWithFactory25from webcatalog.tests.factory import TestCaseWithFactory
27from webcatalog.models import Application26from webcatalog.models import Application
@@ -29,10 +28,11 @@
29__metaclass__ = type28__metaclass__ = type
30__all__ = [29__all__ = [
31 'ApplicationManagerTestCase',30 'ApplicationManagerTestCase',
32 ]31]
3332
3433
35class ApplicationManagerTestCase(TestCaseWithFactory):34class ApplicationManagerTestCase(TestCaseWithFactory):
35
36 def test_find_best_returns_none(self):36 def test_find_best_returns_none(self):
37 self.assertIsNone(Application.objects.find_best(package_name='foo'))37 self.assertIsNone(Application.objects.find_best(package_name='foo'))
3838
@@ -41,8 +41,8 @@
41 older = self.factory.make_distroseries(version='14.04')41 older = self.factory.make_distroseries(version='14.04')
4242
43 expected = self.factory.make_application(distroseries=latest)43 expected = self.factory.make_application(distroseries=latest)
44 self.factory.make_application(package_name=expected.package_name,44 self.factory.make_application(
45 distroseries=older)45 package_name=expected.package_name, distroseries=older)
4646
47 retrieved = Application.objects.find_best(47 retrieved = Application.objects.find_best(
48 package_name=expected.package_name)48 package_name=expected.package_name)
@@ -52,12 +52,12 @@
52 def test_check_latest(self):52 def test_check_latest(self):
53 for code_name in ['lucid', 'maverick', 'natty', 'oneiric']:53 for code_name in ['lucid', 'maverick', 'natty', 'oneiric']:
54 dseries = self.factory.make_distroseries(code_name=code_name)54 dseries = self.factory.make_distroseries(code_name=code_name)
55 self.factory.make_application(package_name='foobar',55 self.factory.make_application(
56 distroseries=dseries)56 package_name='foobar', distroseries=dseries)
5757
58 Application.objects.check_latest('foobar')58 Application.objects.check_latest('foobar')
5959
60 retrieved = Application.objects.filter(package_name='foobar').order_by(60 retrieved = Application.objects.filter(package_name='foobar').order_by(
61 '-distroseries__code_name')61 '-distroseries__code_name')
62 self.assertEqual([True, False, False, False], [app.is_latest62 self.assertEqual([True, False, False, False],
63 for app in retrieved])63 [app.is_latest for app in retrieved])
6464
=== modified file 'src/webcatalog/tests/test_models.py'
--- src/webcatalog/tests/test_models.py 2012-05-07 15:49:12 +0000
+++ src/webcatalog/tests/test_models.py 2012-06-06 18:03:20 +0000
@@ -20,7 +20,7 @@
20from __future__ import (20from __future__ import (
21 absolute_import,21 absolute_import,
22 with_statement,22 with_statement,
23 )23)
2424
25from django.core.urlresolvers import reverse25from django.core.urlresolvers import reverse
26from django.core.files.images import ImageFile26from django.core.files.images import ImageFile
@@ -33,7 +33,7 @@
33 'ApplicationTestCase',33 'ApplicationTestCase',
34 'DepartmentTestCase',34 'DepartmentTestCase',
35 'ExhibitTestCase',35 'ExhibitTestCase',
36 ]36]
3737
3838
39class ApplicationTestCase(TestCaseWithFactory):39class ApplicationTestCase(TestCaseWithFactory):
@@ -65,43 +65,52 @@
6565
66 def test_crumbs_no_department(self):66 def test_crumbs_no_department(self):
67 app = self.factory.make_application()67 app = self.factory.make_application()
68 self.assertEquals([], list(app.departments.all()))68 app_url = reverse('wc-package-detail',
69 expected = [{'name': 'All Apps', 'url': reverse('wc-index')},69 args=[app.distroseries.code_name, app.package_name])
70 {'name': app.name, 'url': reverse('wc-package-detail',70 self.assertEqual([], list(app.departments.all()))
71 args=[app.distroseries.code_name, app.package_name])}]71 expected = [
7272 {'name': 'All Apps', 'url': reverse('wc-index')},
73 self.assertEquals(expected, app.crumbs())73 {'name': app.name, 'url': app_url},
74 ]
75 self.assertEqual(expected, app.crumbs())
7476
75 def test_crumbs_department_without_parent(self):77 def test_crumbs_department_without_parent(self):
76 app = self.factory.make_application()78 app = self.factory.make_application()
77 app.categories = 'Game;'79 app.categories = 'Game;'
78 app.update_departments()80 app.update_departments()
79 dept = app.departments.get()81 dept = app.departments.get()
80 expected = [{'name': 'All Apps', 'url': reverse('wc-index')},82 app_url = reverse('wc-package-detail',
81 {'name': dept.name, 'url': reverse('wc-department',83 args=[app.distroseries.code_name, app.package_name])
82 kwargs={'distro': app.distroseries.code_name,84 dept_url = reverse('wc-department',
83 'dept_slug_or_id': dept.slug})},85 kwargs={'distro': app.distroseries.code_name,
84 {'name': app.name, 'url': reverse('wc-package-detail',86 'dept_slug_or_id': dept.slug})
85 args=[app.distroseries.code_name, app.package_name])}]87 expected = [
8688 {'name': 'All Apps', 'url': reverse('wc-index')},
87 self.assertEquals(expected, app.crumbs())89 {'name': dept.name, 'url': dept_url},
90 {'name': app.name, 'url': app_url},
91 ]
92 self.assertEqual(expected, app.crumbs())
8893
89 def test_crumbs_department_with_parent(self):94 def test_crumbs_department_with_parent(self):
90 app = self.factory.make_application()95 app = self.factory.make_application()
91 app.categories = 'RolePlaying;'96 app.categories = 'RolePlaying;'
92 app.update_departments()97 app.update_departments()
93 dept = app.departments.get()98 dept = app.departments.get()
94 expected = [{'name': 'All Apps', 'url': reverse('wc-index')},99 app_url = reverse('wc-package-detail',
95 {'name': dept.parent.name, 'url': reverse('wc-department',100 args=[app.distroseries.code_name, app.package_name])
96 kwargs={'distro': app.distroseries.code_name,101 dept_url = reverse('wc-department',
97 'dept_slug_or_id': dept.parent.slug})},102 kwargs={'distro': app.distroseries.code_name,
98 {'name': dept.name, 'url': reverse('wc-department',103 'dept_slug_or_id': dept.slug})
99 kwargs={'distro': app.distroseries.code_name,104 parent_url = reverse('wc-department',
100 'dept_slug_or_id': dept.slug})},105 kwargs={'distro': app.distroseries.code_name,
101 {'name': app.name, 'url': reverse('wc-package-detail',106 'dept_slug_or_id': dept.parent.slug})
102 args=[app.distroseries.code_name, app.package_name])}]107 expected = [
103108 {'name': 'All Apps', 'url': reverse('wc-index')},
104 self.assertEquals(expected, app.crumbs())109 {'name': dept.parent.name, 'url': parent_url},
110 {'name': dept.name, 'url': dept_url},
111 {'name': app.name, 'url': app_url},
112 ]
113 self.assertEqual(expected, app.crumbs())
105114
106 def test_icon_url_or_default_no_icon(self):115 def test_icon_url_or_default_no_icon(self):
107 app = self.factory.make_application()116 app = self.factory.make_application()
@@ -134,12 +143,11 @@
134 url='http://example.com/video.m4v')143 url='http://example.com/video.m4v')
135144
136 urls = app.screenshots145 urls = app.screenshots
137146 expected = [
138 self.assertEqual([
139 'http://example.com/screenshot1.png',147 'http://example.com/screenshot1.png',
140 'http://example.com/screenshot2.png',148 'http://example.com/screenshot2.png',
141 ],149 ]
142 urls)150 self.assertEqual(expected, urls)
143151
144 def test_screenshots_cached(self):152 def test_screenshots_cached(self):
145 # The db isn't hit if _screenshots is already153 # The db isn't hit if _screenshots is already
@@ -153,9 +161,8 @@
153 media_type='screenshot',161 media_type='screenshot',
154 url='http://example.com/screenshot2.png')162 url='http://example.com/screenshot2.png')
155163
156 self.assertEqual([164 self.assertEqual(['http://example.com/screenshot1.png'],
157 'http://example.com/screenshot1.png',165 app.screenshots)
158 ], app.screenshots)
159166
160 def test_video_iframes_urls(self):167 def test_video_iframes_urls(self):
161 app = self.factory.make_application()168 app = self.factory.make_application()
@@ -170,12 +177,11 @@
170 url='http://example.com/screenshot.png')177 url='http://example.com/screenshot.png')
171178
172 urls = app.video_iframe_urls179 urls = app.video_iframe_urls
173180 expected = [
174 self.assertEqual([
175 'http://example.com/video1.m4v',181 'http://example.com/video1.m4v',
176 'http://example.com/video2.m4v',182 'http://example.com/video2.m4v',
177 ],183 ]
178 urls)184 self.assertEqual(expected, urls)
179185
180 def test_video_iframes_urls_cached(self):186 def test_video_iframes_urls_cached(self):
181 app = self.factory.make_application()187 app = self.factory.make_application()
@@ -189,44 +195,49 @@
189195
190 urls = app.video_iframe_urls196 urls = app.video_iframe_urls
191197
192 self.assertEqual([198 self.assertEqual(['http://example.com/video1.m4v'], urls)
193 'http://example.com/video1.m4v',
194 ],
195 urls)
196199
197200
198class DepartmentTestCase(TestCaseWithFactory):201class DepartmentTestCase(TestCaseWithFactory):
199 def test_crumbs_no_parent(self):202 def test_crumbs_no_parent(self):
200 dept = self.factory.make_department('Foo')203 dept = self.factory.make_department('Foo')
201 expected = [{'name': 'All Apps', 'url': reverse('wc-index')},204 expected = [
202 {'name': dept.name, 'url': reverse('wc-department',205 {'name': 'All Apps', 'url': reverse('wc-index')},
203 kwargs={'dept_slug_or_id': dept.slug})}]206 {'name': dept.name,
204207 'url': reverse('wc-department',
205 self.assertEquals(expected, dept.crumbs())208 kwargs={'dept_slug_or_id': dept.slug})}
209 ]
210 self.assertEqual(expected, dept.crumbs())
206211
207 def test_crumbs_with_parent(self):212 def test_crumbs_with_parent(self):
208 parent = self.factory.make_department('Foo')213 parent = self.factory.make_department('Foo')
209 dept = self.factory.make_department('Bar', parent=parent)214 dept = self.factory.make_department('Bar', parent=parent)
210 expected = [{'name': 'All Apps', 'url': reverse('wc-index')},215 expected = [
211 {'name': dept.parent.name, 'url': reverse('wc-department',216 {'name': 'All Apps', 'url': reverse('wc-index')},
212 kwargs={'dept_slug_or_id': dept.parent.slug})},217 {'name': dept.parent.name,
213 {'name': dept.name, 'url': reverse('wc-department',218 'url': reverse('wc-department',
214 kwargs={'dept_slug_or_id': dept.slug})}]219 kwargs={'dept_slug_or_id': dept.parent.slug})},
215220 {'name': dept.name,
216 self.assertEquals(expected, dept.crumbs())221 'url': reverse('wc-department',
222 kwargs={'dept_slug_or_id': dept.slug})}
223 ]
224 self.assertEqual(expected, dept.crumbs())
217225
218 def test_crumbs_with_distroseries(self):226 def test_crumbs_with_distroseries(self):
219 parent = self.factory.make_department('Foo')227 parent = self.factory.make_department('Foo')
220 dept = self.factory.make_department('Bar', parent=parent)228 dept = self.factory.make_department('Bar', parent=parent)
221 expected = [{'name': 'All Apps', 'url': reverse('wc-index')},229 parent_url = reverse('wc-department',
222 {'name': dept.parent.name, 'url': reverse('wc-department',230 kwargs={'distro': 'frobbly',
223 kwargs={'distro': 'frobbly',231 'dept_slug_or_id': parent.slug})
224 'dept_slug_or_id': dept.parent.slug})},232 dept_url = reverse('wc-department',
225 {'name': dept.name, 'url': reverse('wc-department',233 kwargs={'distro': 'frobbly',
226 kwargs={'distro': 'frobbly',234 'dept_slug_or_id': dept.slug})
227 'dept_slug_or_id': dept.slug})}]235 expected = [
228236 {'name': 'All Apps', 'url': reverse('wc-index')},
229 self.assertEquals(expected, dept.crumbs(distro='frobbly'))237 {'name': dept.parent.name, 'url': parent_url},
238 {'name': dept.name, 'url': dept_url}
239 ]
240 self.assertEqual(expected, dept.crumbs(distro='frobbly'))
230241
231242
232class ExhibitTestCase(TestCaseWithFactory):243class ExhibitTestCase(TestCaseWithFactory):
@@ -237,8 +248,7 @@
237248
238 def test_destination_url_multiple_packages(self):249 def test_destination_url_multiple_packages(self):
239 exhibit = self.factory.make_exhibit(package_names='foobar,baz')250 exhibit = self.factory.make_exhibit(package_names='foobar,baz')
240 expected = reverse('wc-package-list') + (251 expected = reverse('wc-package-list') + '?pkg_name=foobar&pkg_name=baz'
241 '?pkg_name=foobar&pkg_name=baz')
242 self.assertEqual(expected, exhibit.destination_url())252 self.assertEqual(expected, exhibit.destination_url())
243253
244 def test_destination_url_blank_packages(self):254 def test_destination_url_blank_packages(self):
245255
=== modified file 'src/webcatalog/tests/test_pep8.py'
--- src/webcatalog/tests/test_pep8.py 2012-03-27 15:46:44 +0000
+++ src/webcatalog/tests/test_pep8.py 2012-06-06 18:03:20 +0000
@@ -22,7 +22,7 @@
22__metaclass__ = type22__metaclass__ = type
23__all__ = [23__all__ = [
24 'WebCatalogPep8TestCase',24 'WebCatalogPep8TestCase',
25 ]25]
2626
27import os27import os
28import pep828import pep8
@@ -37,36 +37,34 @@
37 packages = []37 packages = []
38 exclude = ['migrations']38 exclude = ['migrations']
3939
40 def message(self, text):
41 self.errors.append(text)
42
43 def setUp(self):40 def setUp(self):
44 self.errors = []41 self.errors = {}
4542
46 class Options(object):43 class Options(object):
44 counters = defaultdict(int)
45 doctest = ''
47 exclude = self.exclude46 exclude = self.exclude
48 filename = ['*.py']47 filename = ['*.py']
49 testsuite = ''48 ignore = []
50 doctest = ''49 messages = self.errors
51 counters = defaultdict(int)
52 messages = {}
53 verbose = 0
54 quiet = 0
55 repeat = True50 repeat = True
51 select = []
52 show_pep8 = False
56 show_source = False53 show_source = False
57 show_pep8 = False
58 select = []
59 ignore = []
60 max_line_length = 7954 max_line_length = 79
55 quiet = 0
56 statistics = False
57 testsuite = ''
58 verbose = 0
59
61 pep8.options = Options()60 pep8.options = Options()
62 pep8.message = self.message
63 Options.physical_checks = pep8.find_checks('physical_line')61 Options.physical_checks = pep8.find_checks('physical_line')
64 Options.logical_checks = pep8.find_checks('logical_line')62 Options.logical_checks = pep8.find_checks('logical_line')
6563
66 def test_all_code(self):64 def test_all_code(self):
67 for package in self.packages:65 for package in self.packages:
68 pep8.input_dir(os.path.dirname(package.__file__))66 pep8.input_dir(os.path.dirname(package.__file__))
69 self.assertEqual([], self.errors)67 self.assertEqual(self.errors, {})
7068
7169
72class WebCatalogPep8TestCase(PackagePep8TestCase):70class WebCatalogPep8TestCase(PackagePep8TestCase):
7371
=== modified file 'src/webcatalog/tests/test_preflight.py'
--- src/webcatalog/tests/test_preflight.py 2012-05-30 22:39:39 +0000
+++ src/webcatalog/tests/test_preflight.py 2012-06-06 18:03:20 +0000
@@ -18,7 +18,7 @@
18from django.contrib.auth.models import (18from django.contrib.auth.models import (
19 Group,19 Group,
20 User,20 User,
21 )21)
22from mock import patch22from mock import patch
2323
24from webcatalog.tests.factory import TestCaseWithFactory24from webcatalog.tests.factory import TestCaseWithFactory
@@ -93,7 +93,7 @@
93 'piston',93 'piston',
94 'Django',94 'Django',
95 'preflight',95 'preflight',
96 ])96 ])
97 expected_checks = set([97 expected_checks = set([
98 ('validate_config', True),98 ('validate_config', True),
99 ('database', True),99 ('database', True),
@@ -102,6 +102,6 @@
102 ('recommender_available', True),102 ('recommender_available', True),
103 ('rnr_available', True),103 ('rnr_available', True),
104 ('screenshots_available', True),104 ('screenshots_available', True),
105 ])105 ])
106 self.assertEqual(expected_libs, libs)106 self.assertEqual(expected_libs, libs)
107 self.assertEqual(expected_checks, checks)107 self.assertEqual(expected_checks, checks)
108108
=== modified file 'src/webcatalog/tests/test_templatetags.py'
--- src/webcatalog/tests/test_templatetags.py 2012-06-04 10:54:02 +0000
+++ src/webcatalog/tests/test_templatetags.py 2012-06-06 18:03:20 +0000
@@ -20,7 +20,7 @@
20from __future__ import (20from __future__ import (
21 absolute_import,21 absolute_import,
22 with_statement,22 with_statement,
23 )23)
2424
25import unittest25import unittest
26from decimal import Decimal26from decimal import Decimal
@@ -34,7 +34,7 @@
34 install_options,34 install_options,
35 rating_summary,35 rating_summary,
36 visible_page_range,36 visible_page_range,
37 )37)
38from webcatalog.tests.factory import TestCaseWithFactory38from webcatalog.tests.factory import TestCaseWithFactory
39from webcatalog.tests.helpers import patch_settings39from webcatalog.tests.helpers import patch_settings
4040
@@ -44,7 +44,7 @@
44 'HtmlizePackageDescriptionTestCase',44 'HtmlizePackageDescriptionTestCase',
45 'RatingSummaryTestCase',45 'RatingSummaryTestCase',
46 'VisiblePageRangeTestCase',46 'VisiblePageRangeTestCase',
47 ]47]
4848
4949
50class InstallOptionsTestCase(TestCaseWithFactory):50class InstallOptionsTestCase(TestCaseWithFactory):
@@ -52,9 +52,9 @@
52 def setUp(self):52 def setUp(self):
53 super(InstallOptionsTestCase, self).setUp()53 super(InstallOptionsTestCase, self).setUp()
54 self.natty = self.factory.make_distroseries(code_name='natty',54 self.natty = self.factory.make_distroseries(code_name='natty',
55 version='11.04')55 version='11.04')
56 self.lucid = self.factory.make_distroseries(code_name='lucid',56 self.lucid = self.factory.make_distroseries(code_name='lucid',
57 version='10.04')57 version='10.04')
5858
59 def make_useragent(self, linux=True, arch='x86_64', ubuntu_version=None):59 def make_useragent(self, linux=True, arch='x86_64', ubuntu_version=None):
60 os = 'X11; Linux' if linux else 'Windows NT 5.1'60 os = 'X11; Linux' if linux else 'Windows NT 5.1'
@@ -78,12 +78,11 @@
78 application = self.factory.make_application(78 application = self.factory.make_application(
79 package_name='pkgfoo', distroseries=self.natty,79 package_name='pkgfoo', distroseries=self.natty,
80 arch='amd64')80 arch='amd64')
81 context = Context(81 user_agent = self.make_useragent(ubuntu_version='11.04', arch='x86_64')
82 dict(user_agent=self.make_useragent(82 context = Context(dict(user_agent=user_agent))
83 ubuntu_version='11.04', arch='x86_64')))
8483
85 expected = dict(application=application, display_install_button=True,84 expected = dict(application=application, display_install_button=True,
86 message_text='', display_ubuntu_download=False)85 message_text='', display_ubuntu_download=False)
87 self.assert_context_values(context, application, expected)86 self.assert_context_values(context, application, expected)
8887
89 def test_matching_series_arch_not_supported(self):88 def test_matching_series_arch_not_supported(self):
@@ -92,14 +91,13 @@
92 application = self.factory.make_application(91 application = self.factory.make_application(
93 name="Package Foo", package_name='pkgfoo',92 name="Package Foo", package_name='pkgfoo',
94 distroseries=self.natty, arch='i686')93 distroseries=self.natty, arch='i686')
95 context = Context(94 user_agent = self.make_useragent(ubuntu_version='11.04',
96 dict(user_agent=self.make_useragent(95 arch='solaris')
97 ubuntu_version='11.04', arch='solaris')))96 context = Context(dict(user_agent=user_agent))
9897
99 expected = dict(application=application, display_install_button=False,98 expected = dict(application=application, display_install_button=False,
100 message_text='Package Foo is not available for your '99 message_text='Package Foo is not available for your '
101 'computer.',100 'computer.', display_ubuntu_download=False)
102 display_ubuntu_download=False)
103 self.assert_context_values(context, application, expected)101 self.assert_context_values(context, application, expected)
104102
105 def test_different_series_with_available(self):103 def test_different_series_with_available(self):
@@ -107,21 +105,19 @@
107 # available for their series, then we display a link to the app105 # available for their series, then we display a link to the app
108 # for their series.106 # for their series.
109 natty_application = self.factory.make_application(107 natty_application = self.factory.make_application(
110 name="Package Foo", package_name='pkgfoo',108 name="Package Foo", package_name='pkgfoo', distroseries=self.natty)
111 distroseries=self.natty)
112 self.factory.make_application(109 self.factory.make_application(
113 name="Package Foo", package_name='pkgfoo',110 name="Package Foo", package_name='pkgfoo', distroseries=self.lucid)
114 distroseries=self.lucid)
115 context = Context(111 context = Context(
116 dict(user_agent=self.make_useragent(ubuntu_version='10.04')))112 dict(user_agent=self.make_useragent(ubuntu_version='10.04')))
117113
118 lucid_app_url = reverse('wc-package-detail', args=['lucid', 'pkgfoo'])114 lucid_app_url = reverse('wc-package-detail', args=['lucid', 'pkgfoo'])
115 msg = ('Package Foo is also available for '
116 '<a href="{lucid_app_url}">your version of Ubuntu'
117 '</a>.'.format(lucid_app_url=lucid_app_url))
119 expected = dict(application=natty_application,118 expected = dict(application=natty_application,
120 display_install_button=False,119 display_install_button=False,
121 message_text='Package Foo is also available for '120 message_text=msg, display_ubuntu_download=False)
122 '<a href="{lucid_app_url}">your version of Ubuntu'
123 '</a>.'.format(lucid_app_url=lucid_app_url),
124 display_ubuntu_download=False)
125 self.assert_context_values(context, natty_application, expected)121 self.assert_context_values(context, natty_application, expected)
126122
127 def test_different_series_without_available(self):123 def test_different_series_without_available(self):
@@ -136,8 +132,7 @@
136 expected = dict(application=natty_application,132 expected = dict(application=natty_application,
137 display_install_button=False,133 display_install_button=False,
138 message_text='Package Foo is not available for your '134 message_text='Package Foo is not available for your '
139 'version of Ubuntu.',135 'version of Ubuntu.', display_ubuntu_download=False)
140 display_ubuntu_download=False)
141 self.assert_context_values(context, natty_application, expected)136 self.assert_context_values(context, natty_application, expected)
142137
143 def test_linux_only_displays_install_button(self):138 def test_linux_only_displays_install_button(self):
@@ -152,31 +147,27 @@
152 user_agent=self.make_useragent(ubuntu_version='')))147 user_agent=self.make_useragent(ubuntu_version='')))
153148
154 expected = dict(application=application, display_install_button=True,149 expected = dict(application=application, display_install_button=True,
155 message_text='', display_ubuntu_download=False)150 message_text='', display_ubuntu_download=False)
156 self.assert_context_values(context, application, expected)151 self.assert_context_values(context, application, expected)
157152
158 def test_non_linux_displays_download_ubuntu(self):153 def test_non_linux_displays_download_ubuntu(self):
159 # A non-linux client is provided a link to download ubuntu.154 # A non-linux client is provided a link to download ubuntu.
160 application = self.factory.make_application(155 application = self.factory.make_application(
161 package_name='pkgfoo', name="Package Foo")156 package_name='pkgfoo', name="Package Foo")
162 context = Context(dict(157 user_agent = self.make_useragent(linux=False)
163 user_agent=self.make_useragent(linux=False)))158 context = Context(dict(user_agent=user_agent))
164159
165 expected = dict(application=application, display_install_button=False,160 expected = dict(application=application, display_install_button=False,
166 message_text='',161 message_text='', display_ubuntu_download=True)
167 display_ubuntu_download=True)
168 self.assert_context_values(context, application, expected)162 self.assert_context_values(context, application, expected)
169163
170 def test_template_tag_uses_config_for_ubuntu_versions(self):164 def test_template_tag_uses_config_for_ubuntu_versions(self):
171 application = self.factory.make_application(165 application = self.factory.make_application(
172 name="Fame", distroseries=self.natty, arch='amd64')166 name="Fame", distroseries=self.natty, arch='amd64')
173 context = Context(167 user_agent = self.make_useragent(ubuntu_version='20.04', arch='x86_64')
174 dict(user_agent=self.make_useragent(168 context = Context(dict(user_agent=user_agent))
175 ubuntu_version='20.04', arch='x86_64')))
176169
177 with patch_settings(UBUNTU_SERIES_FOR_VERSIONS={170 with patch_settings(UBUNTU_SERIES_FOR_VERSIONS={'20.04': 'fancy'}):
178 '20.04': 'fancy',
179 }):
180 install_options(context, application)171 install_options(context, application)
181172
182 self.assertFalse(context['display_install_button'])173 self.assertFalse(context['display_install_button'])
183174
=== modified file 'src/webcatalog/tests/test_utilities.py'
--- src/webcatalog/tests/test_utilities.py 2012-04-20 19:15:00 +0000
+++ src/webcatalog/tests/test_utilities.py 2012-06-06 18:03:20 +0000
@@ -22,7 +22,7 @@
22 'IdentityProviderTestCase',22 'IdentityProviderTestCase',
23 'ScreenshotGetterTestCase',23 'ScreenshotGetterTestCase',
24 'WebServicesRecommenderTestCase',24 'WebServicesRecommenderTestCase',
25 ]25]
2626
27import json27import json
28import os28import os
@@ -31,7 +31,7 @@
31from webcatalog.utilities import (31from webcatalog.utilities import (
32 create_png_from_file,32 create_png_from_file,
33 WebServices,33 WebServices,
34 )34)
3535
36from django.conf import settings36from django.conf import settings
37from django.core.cache import cache37from django.core.cache import cache
@@ -49,13 +49,10 @@
49 self.factory.get_test_path('access.svg'), # SVG file49 self.factory.get_test_path('access.svg'), # SVG file
50 ]50 ]
51 pngpath = 'test_file_DELETEME.png'51 pngpath = 'test_file_DELETEME.png'
52 self.addCleanup(lambda: os.path.exists(pngpath) and os.unlink(pngpath))
52 for f in filenames:53 for f in filenames:
53 try:54 self.assertTrue(create_png_from_file(pngpath, f, 32, 32))
54 self.assertTrue(create_png_from_file(pngpath, f, 32, 32))55 self.assertTrue(os.path.exists(pngpath))
55 self.assertTrue(os.path.exists(pngpath))
56 finally:
57 if os.path.exists(pngpath):
58 os.unlink(pngpath)
5956
60 def test_invalid_files(self):57 def test_invalid_files(self):
61 filenames = [58 filenames = [
@@ -64,13 +61,10 @@
64 self.factory.get_test_path('junk.svg'),61 self.factory.get_test_path('junk.svg'),
65 ]62 ]
66 pngpath = 'test_file_DELETEME.png'63 pngpath = 'test_file_DELETEME.png'
64 self.addCleanup(lambda: os.path.exists(pngpath) and os.unlink(pngpath))
67 for f in filenames:65 for f in filenames:
68 try:66 self.assertFalse(create_png_from_file(pngpath, f, 32, 32))
69 self.assertFalse(create_png_from_file(pngpath, f, 32, 32))67 self.assertFalse(os.path.exists(pngpath))
70 self.assertFalse(os.path.exists(pngpath))
71 finally:
72 if os.path.exists(pngpath):
73 os.unlink(pngpath)
7468
7569
76class IdentityProviderTestCase(TestCase):70class IdentityProviderTestCase(TestCase):
@@ -83,8 +77,9 @@
83 self.assertTrue(url.startswith(self.service_root))77 self.assertTrue(url.startswith(self.service_root))
84 if 'ws.op=validate_token' in url:78 if 'ws.op=validate_token' in url:
85 body = ('{"consumer_secret": "foobarconsumersecret", '79 body = ('{"consumer_secret": "foobarconsumersecret", '
86 '"token": "foo", "consumer_key": "foobar", '80 '"token": "foo", "consumer_key": "foobar", '
87 '"name": "test-token", "token_secret": "foobartokensecret"}')81 '"name": "test-token", '
82 '"token_secret": "foobartokensecret"}')
88 elif 'ws.op=me' in url:83 elif 'ws.op=me' in url:
89 body = ('{"username": "username", "preferred_email": null, '84 body = ('{"username": "username", "preferred_email": null, '
90 '"displayname": "Foo", "unverified_emails": ["f@o.com"], '85 '"displayname": "Foo", "unverified_emails": ["f@o.com"], '
@@ -113,7 +108,8 @@
113 mock_request.side_effect = ServerNotFoundError108 mock_request.side_effect = ServerNotFoundError
114 settings.SSO_AUTH_MODE_NO_UBUNTU_SSO_PLAINTEXT_ONLY = False109 settings.SSO_AUTH_MODE_NO_UBUNTU_SSO_PLAINTEXT_ONLY = False
115110
116 self.assertRaises(ServerNotFoundError,111 self.assertRaises(
112 ServerNotFoundError,
117 WebServices().get_data_for_account, 'eg_token', 'eg_ident')113 WebServices().get_data_for_account, 'eg_token', 'eg_ident')
118114
119 @patch('httplib2.Http.request')115 @patch('httplib2.Http.request')
@@ -125,10 +121,12 @@
125121
126 data = web_services.get_data_for_account('eg_token', 'eg_ident')122 data = web_services.get_data_for_account('eg_token', 'eg_ident')
127123
128 self.assertEquals(set([u'username', u'preferred_email',124 expected = [
129 u'displayname', u'name', u'unverified_emails', u'verified_emails',125 u'username', u'preferred_email', u'displayname', u'name',
130 u'consumer_secret', u'token', u'openid_identifier',126 u'unverified_emails', u'verified_emails', u'consumer_secret',
131 u'consumer_key', u'token_secret']), set(data))127 u'token', u'openid_identifier', u'consumer_key', u'token_secret',
128 ]
129 self.assertEqual(set(expected), set(data))
132130
133131
134class WebServicesRecommenderTestCase(TestCaseWithFactory):132class WebServicesRecommenderTestCase(TestCaseWithFactory):
@@ -147,10 +145,10 @@
147 {u'rating': 4.0, u'package_name': u'tribaltrouble2'},145 {u'rating': 4.0, u'package_name': u'tribaltrouble2'},
148 {u'rating': 4.0, u'package_name': u'acm'},146 {u'rating': 4.0, u'package_name': u'acm'},
149 {u'rating': 4.0, u'package_name': u'zgv'},147 {u'rating': 4.0, u'package_name': u'zgv'},
150 {u'rating': 3.0, u'package_name': u'nautilus-wallpaper'}148 {u'rating': 3.0, u'package_name': u'nautilus-wallpaper'},
151 ],149 ],
152 u'app': u'firefox',150 u'app': u'firefox',
153 }151 }
154 self.mock_recommend_app.return_value = self.eg_recommends152 self.mock_recommend_app.return_value = self.eg_recommends
155 cache.clear()153 cache.clear()
156154
@@ -188,15 +186,16 @@
188class ScreenshotGetterTestCase(TestCase):186class ScreenshotGetterTestCase(TestCase):
189 @patch('webcatalog.utilities.urllib.urlopen')187 @patch('webcatalog.utilities.urllib.urlopen')
190 def test_valid_response_returns_list_of_urls(self, mock_urlopen):188 def test_valid_response_returns_list_of_urls(self, mock_urlopen):
191 response = json.dumps({'package': 'digikam', 'screenshots': [189 shots = [
192 {'version': '1.0', 'large_image_url': 'http://example.com/foo'},190 {'version': '1.0', 'large_image_url': 'http://example.com/foo'},
193 {'version': '1.1', 'large_image_url': 'http://example.com/bar'},191 {'version': '1.1', 'large_image_url': 'http://example.com/bar'},
194 ]})192 ]
193 response = json.dumps({'package': 'digikam', 'screenshots': shots})
195 mock_urlopen.return_value.getcode.return_value = 200194 mock_urlopen.return_value.getcode.return_value = 200
196 mock_urlopen.return_value.read.return_value = response195 mock_urlopen.return_value.read.return_value = response
197 expected = ['http://example.com/foo', 'http://example.com/bar']196 expected = ['http://example.com/foo', 'http://example.com/bar']
198 self.assertEqual(expected,197 self.assertEqual(
199 WebServices().get_screenshots_for_package('digikam'))198 expected, WebServices().get_screenshots_for_package('digikam'))
200199
201 @patch('webcatalog.utilities.urllib.urlopen')200 @patch('webcatalog.utilities.urllib.urlopen')
202 def test_not_found_response_returns_empty_list(self, mock_urlopen):201 def test_not_found_response_returns_empty_list(self, mock_urlopen):
203202
=== modified file 'src/webcatalog/tests/test_views.py'
--- src/webcatalog/tests/test_views.py 2012-06-06 13:03:45 +0000
+++ src/webcatalog/tests/test_views.py 2012-06-06 18:03:20 +0000
@@ -20,7 +20,7 @@
20from __future__ import (20from __future__ import (
21 absolute_import,21 absolute_import,
22 with_statement,22 with_statement,
23 )23)
2424
25import json25import json
26import re26import re
@@ -40,7 +40,7 @@
40from webcatalog.models import (40from webcatalog.models import (
41 Department,41 Department,
42 DistroSeries,42 DistroSeries,
43 )43)
44from webcatalog.tests.factory import TestCaseWithFactory44from webcatalog.tests.factory import TestCaseWithFactory
45from webcatalog.tests.helpers import patch_settings45from webcatalog.tests.helpers import patch_settings
4646
@@ -57,11 +57,11 @@
57 'OverviewTestCase',57 'OverviewTestCase',
58 'SearchTestCase',58 'SearchTestCase',
59 'ComboViewTestCase',59 'ComboViewTestCase',
60 ]60]
6161
6262
63WINDOWS_USERAGENT = ('Mozilla/5.0 (Windows NT 5.1; rv:2.0) '63WINDOWS_USERAGENT = ('Mozilla/5.0 (Windows NT 5.1; rv:2.0) '
64 'Gecko/20100101 Firefox/4.0')64 'Gecko/20100101 Firefox/4.0')
6565
66UBUNTU_USERAGENT = ('Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) '66UBUNTU_USERAGENT = ('Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) '
67 'Gecko/20100101 Firefox/4.0.1')67 'Gecko/20100101 Firefox/4.0.1')
@@ -96,8 +96,8 @@
96 if not detail_package:96 if not detail_package:
97 detail_package = app.package_name97 detail_package = app.package_name
9898
99 url = reverse('wc-package-detail', args=[detail_distro,99 url = reverse('wc-package-detail',
100 detail_package])100 args=[detail_distro, detail_package])
101101
102 if useragent:102 if useragent:
103 response = self.client.get(url, HTTP_USER_AGENT=useragent)103 response = self.client.get(url, HTTP_USER_AGENT=useragent)
@@ -112,9 +112,9 @@
112112
113 def test_includes_application_details(self):113 def test_includes_application_details(self):
114 # The details of an application are included in the rendered html.114 # The details of an application are included in the rendered html.
115 response, app = self.get_app_and_response(name='My app foo',115 response, app = self.get_app_and_response(
116 comment='The best app eva.',116 name='My app foo', comment='The best app eva.',
117 description='A long description.')117 description='A long description.')
118118
119 self.assertContains(response, "My app foo")119 self.assertContains(response, "My app foo")
120 self.assertContains(response, "The best app eva.")120 self.assertContains(response, "The best app eva.")
@@ -142,20 +142,16 @@
142 def test_link_to_package_reviews(self):142 def test_link_to_package_reviews(self):
143 response, app = self.get_app_and_response()143 response, app = self.get_app_and_response()
144144
145 self.assertContains(response, '<a href="{0}"'.format(145 url = reverse('wc-package-reviews',
146 reverse('wc-package-reviews', args=[146 args=[app.distroseries.code_name, app.package_name])
147 app.distroseries.code_name,147 self.assertContains(response, '<a href="{0}"'.format(url))
148 app.package_name,
149 ])))
150148
151 def test_link_to_reviews_snippet(self):149 def test_link_to_reviews_snippet(self):
152 response, app = self.get_app_and_response()150 response, app = self.get_app_and_response()
153151
154 self.assertContains(response, 'var reviews_uri = "{0}"'.format(152 url = reverse('wc-package-reviews-ajax',
155 reverse('wc-package-reviews-ajax', args=[153 args=[app.distroseries.code_name, app.package_name])
156 app.distroseries.code_name,154 self.assertContains(response, 'var reviews_uri = "{0}"'.format(url))
157 app.package_name,
158 ])))
159155
160 def test_link_to_recommended_apps_not_present(self):156 def test_link_to_recommended_apps_not_present(self):
161 with patch_settings(NUM_RECOMMENDED_APPS=0):157 with patch_settings(NUM_RECOMMENDED_APPS=0):
@@ -211,8 +207,8 @@
211 def test_twitter_link_does_not_contain_none(self):207 def test_twitter_link_does_not_contain_none(self):
212 app = self.factory.make_application()208 app = self.factory.make_application()
213209
214 response = self.client.get(210 response = self.client.get(reverse('wc-package-detail',
215 reverse('wc-package-detail', args=[app.package_name]))211 args=[app.package_name]))
216212
217 self.assertContains(213 self.assertContains(
218 response,214 response,
@@ -234,28 +230,29 @@
234 # available for their series, then we display a link to the app230 # available for their series, then we display a link to the app
235 # for their series.231 # for their series.
236 lucid = self.factory.make_distroseries(code_name='lucid',232 lucid = self.factory.make_distroseries(code_name='lucid',
237 version='10.04')233 version='10.04')
238 lucid_app = self.factory.make_application(package_name='pkgfoo',234 lucid_app = self.factory.make_application(package_name='pkgfoo',
239 distroseries=lucid)235 distroseries=lucid)
240236
241 response, app = self.get_app_and_response(name="<a>Escape me",237 response, app = self.get_app_and_response(
242 useragent="blah Ubuntu/10.04 blah")238 name="<a>Escape me", useragent="blah Ubuntu/10.04 blah")
243239
244 lucid_app_url = reverse('wc-package-detail', args=['lucid', 'pkgfoo'])240 lucid_app_url = reverse('wc-package-detail', args=['lucid', 'pkgfoo'])
245 self.assertContains(response,241 self.assertContains(
242 response,
246 '&lt;a&gt;Escape me is also available for '243 '&lt;a&gt;Escape me is also available for '
247 '<a href="{lucid_app_url}">your version of Ubuntu</a>.'.format(244 '<a href="{lucid_app_url}">your version of Ubuntu</a>.'.format(
248 lucid_app_url=lucid_app_url))245 lucid_app_url=lucid_app_url))
249246
250 def test_includes_right_navigation(self):247 def test_includes_right_navigation(self):
251 lucid = self.factory.make_distroseries(code_name='lucid',248 lucid = self.factory.make_distroseries(code_name='lucid',
252 version='10.04')249 version='10.04')
253 maverick = self.factory.make_distroseries(code_name='maverick',250 maverick = self.factory.make_distroseries(code_name='maverick',
254 version='10.10')251 version='10.10')
255 lucid_app = self.factory.make_application(package_name='pkgfoo',252 lucid_app = self.factory.make_application(package_name='pkgfoo',
256 distroseries=lucid)253 distroseries=lucid)
257 maverick_app = self.factory.make_application(package_name='pkgfoo',254 maverick_app = self.factory.make_application(package_name='pkgfoo',
258 distroseries=maverick)255 distroseries=maverick)
259256
260 response, app = self.get_app_and_response(name="Foobar")257 response, app = self.get_app_and_response(name="Foobar")
261258
@@ -276,7 +273,8 @@
276273
277 def test_response_includes_rating_summary(self):274 def test_response_includes_rating_summary(self):
278 distro = self.factory.make_distroseries(code_name='lucid')275 distro = self.factory.make_distroseries(code_name='lucid')
279 self.factory.make_application(package_name='foo', distroseries=distro,276 self.factory.make_application(
277 package_name='foo', distroseries=distro,
280 ratings_average=Decimal('3.5'), ratings_total=23)278 ratings_average=Decimal('3.5'), ratings_total=23)
281279
282 url = reverse('wc-package-detail', args=['lucid', 'foo'])280 url = reverse('wc-package-detail', args=['lucid', 'foo'])
@@ -297,7 +295,7 @@
297295
298 self.client.post(url, data=data, follow=True)296 self.client.post(url, data=data, follow=True)
299297
300 self.assertEquals(1, len(mail.outbox))298 self.assertEqual(1, len(mail.outbox))
301 email = mail.outbox[0]299 email = mail.outbox[0]
302 self.assertIn(app.name, email.body)300 self.assertIn(app.name, email.body)
303 self.assertIn(url, email.body)301 self.assertIn(url, email.body)
@@ -319,8 +317,8 @@
319317
320 response = self.client.post(url, data=data, follow=True)318 response = self.client.post(url, data=data, follow=True)
321319
322 self.assertNotContains(response, 'Success. Your download link '320 self.assertNotContains(response,
323 'has been sent.')321 'Success. Your download link has been sent.')
324 self.assertContains(response, 'This field is required.')322 self.assertContains(response, 'This field is required.')
325323
326 def test_email_error_bogus(self):324 def test_email_error_bogus(self):
@@ -330,13 +328,13 @@
330328
331 response = self.client.post(url, data=data, follow=True)329 response = self.client.post(url, data=data, follow=True)
332330
333 self.assertNotContains(response, 'Success. Your download link '331 self.assertNotContains(response,
334 'has been sent.')332 'Success. Your download link has been sent.')
335 self.assertContains(response, 'Enter a valid e-mail address.')333 self.assertContains(response, 'Enter a valid e-mail address.')
336334
337 def test_version_and_label_displayed(self):335 def test_version_and_label_displayed(self):
338 app = self.factory.make_application(version='1.2.3',336 app = self.factory.make_application(
339 distroseries=self.factory.make_distroseries())337 version='1.2.3', distroseries=self.factory.make_distroseries())
340338
341 response = self.client.get(self.get_app_details_url(app))339 response = self.client.get(self.get_app_details_url(app))
342340
@@ -344,8 +342,8 @@
344 self.assertContains(response, '<td>1.2.3</td>')342 self.assertContains(response, '<td>1.2.3</td>')
345343
346 def test_version_label_not_displayed(self):344 def test_version_label_not_displayed(self):
347 app = self.factory.make_application(version='',345 app = self.factory.make_application(
348 distroseries=self.factory.make_distroseries())346 version='', distroseries=self.factory.make_distroseries())
349347
350 response = self.client.get(self.get_app_details_url(app))348 response = self.client.get(self.get_app_details_url(app))
351349
@@ -374,7 +372,8 @@
374372
375 response = self.client.get(self.get_app_details_url(app))373 response = self.client.get(self.get_app_details_url(app))
376374
377 self.assertContains(response,375 self.assertContains(
376 response,
378 '<iframe src="http://example.com/video_iframe.html"')377 '<iframe src="http://example.com/video_iframe.html"')
379378
380 def test_double_entry_in_the_db_is_displayed_sainely(self):379 def test_double_entry_in_the_db_is_displayed_sainely(self):
@@ -408,12 +407,12 @@
408 # If a distroseries is not included in the url, we always render the407 # If a distroseries is not included in the url, we always render the
409 # latest available app408 # latest available app
410 natty = self.factory.make_distroseries(code_name='natty',409 natty = self.factory.make_distroseries(code_name='natty',
411 version='11.04')410 version='11.04')
412 lucid = self.factory.make_distroseries(code_name='lucid',411 lucid = self.factory.make_distroseries(code_name='lucid',
413 version='10.04')412 version='10.04')
414 for dseries in [natty, lucid]:413 for dseries in [natty, lucid]:
415 self.factory.make_application(package_name='pkgfoo',414 self.factory.make_application(package_name='pkgfoo',
416 distroseries=dseries)415 distroseries=dseries)
417416
418 url = reverse('wc-package-detail', args=['pkgfoo'])417 url = reverse('wc-package-detail', args=['pkgfoo'])
419 response = self.client.get(url)418 response = self.client.get(url)
@@ -434,11 +433,10 @@
434 self.factory.make_application(),433 self.factory.make_application(),
435 self.factory.make_application(),434 self.factory.make_application(),
436 self.factory.make_application(),435 self.factory.make_application(),
437 ]436 ]
438437
439 response = self.client.get(438 pkgs = "&".join('pkg_name=%s' % app.package_name for app in apps)
440 reverse('wc-package-list') + '?' + "&".join(439 response = self.client.get(reverse('wc-package-list') + '?' + pkgs)
441 ['pkg_name=%s' % app.package_name for app in apps]))
442440
443 self.assertEqual(200, response.status_code)441 self.assertEqual(200, response.status_code)
444 self.assertEqual(apps, response.context['applications'])442 self.assertEqual(apps, response.context['applications'])
@@ -446,8 +444,8 @@
446 def test_includes_depts_in_context(self):444 def test_includes_depts_in_context(self):
447 depts = Department.objects.filter(parent=None).order_by('name')445 depts = Department.objects.filter(parent=None).order_by('name')
448446
449 response = self.client.get(447 pkgs = 'pkg_name=firefox'
450 reverse('wc-package-list') + '?pkg_name=firefox')448 response = self.client.get(reverse('wc-package-list') + '?' + pkgs)
451449
452 self.assertEqual(200, response.status_code)450 self.assertEqual(200, response.status_code)
453 self.assertEqual(list(depts), list(response.context['depts']))451 self.assertEqual(list(depts), list(response.context['depts']))
@@ -467,53 +465,50 @@
467465
468 response = self.client.get(url, data=data)466 response = self.client.get(url, data=data)
469467
470 self.assertEquals(response.context['page'].object_list, [])468 self.assertEqual(response.context['page'].object_list, [])
471 self.assertContains(response, "You didn't search for anything")469 self.assertContains(response, "You didn't search for anything")
472470
473 def test_search_searches_package_name(self):471 def test_search_searches_package_name(self):
474 distro = self.factory.make_distroseries(code_name='lucid')472 distro = self.factory.make_distroseries(code_name='lucid')
475 app1 = self.factory.make_application(package_name='foo',473 app1 = self.factory.make_application(package_name='foo',
476 distroseries=distro)474 distroseries=distro)
477 app2 = self.factory.make_application(package_name='bar',475 app2 = self.factory.make_application(package_name='bar',
478 distroseries=distro)476 distroseries=distro)
479 app3 = self.factory.make_application(package_name='foobar',477 app3 = self.factory.make_application(package_name='foobar',
480 distroseries=distro)478 distroseries=distro)
481 url = reverse('wc-search', args=[distro.code_name])479 url = reverse('wc-search', args=[distro.code_name])
482 expected = {'foo': set([app1, app3]), 'bar': set([app2, app3])}480 expected = {'foo': set([app1, app3]), 'bar': set([app2, app3])}
483 for q in expected:481 for q in expected:
484
485 response = self.client.get(url, data={'q': q})482 response = self.client.get(url, data={'q': q})
486483 self.assertEqual(
487 self.assertEquals(
488 expected[q], set(response.context['page'].object_list))484 expected[q], set(response.context['page'].object_list))
489485
490 def test_search_searches_name(self):486 def test_search_searches_name(self):
491 distro = self.factory.make_distroseries(code_name='lucid')487 distro = self.factory.make_distroseries(code_name='lucid')
492 app1 = self.factory.make_application(name='foo',488 app1 = self.factory.make_application(name='foo',
493 distroseries=distro)489 distroseries=distro)
494 app2 = self.factory.make_application(name='bar',490 app2 = self.factory.make_application(name='bar',
495 distroseries=distro)491 distroseries=distro)
496 app3 = self.factory.make_application(name='foobar',492 app3 = self.factory.make_application(name='foobar',
497 distroseries=distro)493 distroseries=distro)
498 url = reverse('wc-search', args=[distro.code_name])494 url = reverse('wc-search', args=[distro.code_name])
499 expected = {'foo': set([app1, app3]), 'bar': set([app2, app3])}495 expected = {'foo': set([app1, app3]), 'bar': set([app2, app3])}
500 for q in expected:496 for q in expected:
501
502 response = self.client.get(url, data={'q': q})497 response = self.client.get(url, data={'q': q})
503498 self.assertEqual(
504 self.assertEquals(
505 expected[q], set(response.context['page'].object_list))499 expected[q], set(response.context['page'].object_list))
506500
507 def test_search_includes_link_to_app(self):501 def test_search_includes_link_to_app(self):
508 distro = self.factory.make_distroseries(code_name='lucid')502 distro = self.factory.make_distroseries(code_name='lucid')
509 app = self.factory.make_application(name='foo',503 app = self.factory.make_application(name='foo',
510 distroseries=distro)504 distroseries=distro)
511 url = reverse('wc-search', args=[distro.code_name])505 url = reverse('wc-search', args=[distro.code_name])
512506
513 response = self.client.get(url, data={'q': 'foo'})507 response = self.client.get(url, data={'q': 'foo'})
514508
515 self.assertContains(response, reverse('wc-package-detail',509 url = reverse('wc-package-detail',
516 args=[app.distroseries.code_name, app.package_name]), count=2)510 args=[app.distroseries.code_name, app.package_name])
511 self.assertContains(response, url, count=2)
517512
518 def test_search_includes_link_to_app_without_distro(self):513 def test_search_includes_link_to_app_without_distro(self):
519 app = self.factory.make_application(name='foo', is_latest=True)514 app = self.factory.make_application(name='foo', is_latest=True)
@@ -521,8 +516,8 @@
521516
522 response = self.client.get(url, data={'q': 'foo'})517 response = self.client.get(url, data={'q': 'foo'})
523518
524 self.assertContains(response, reverse('wc-package-detail',519 url = reverse('wc-package-detail', args=[app.package_name])
525 args=[app.package_name]), count=2)520 self.assertContains(response, url, count=2)
526521
527 def test_search_no_apps_found_says_so(self):522 def test_search_no_apps_found_says_so(self):
528 distro = self.factory.make_distroseries(code_name='lucid')523 distro = self.factory.make_distroseries(code_name='lucid')
@@ -554,7 +549,8 @@
554 def test_response_includes_rating_summary(self):549 def test_response_includes_rating_summary(self):
555 distro = self.factory.make_distroseries(code_name='lucid')550 distro = self.factory.make_distroseries(code_name='lucid')
556 query = 'someimprobablequery'551 query = 'someimprobablequery'
557 self.factory.make_application(package_name=query, distroseries=distro,552 self.factory.make_application(
553 package_name=query, distroseries=distro,
558 ratings_average=Decimal('3.5'), ratings_total=23)554 ratings_average=Decimal('3.5'), ratings_total=23)
559555
560 url = reverse('wc-search', args=[distro.code_name])556 url = reverse('wc-search', args=[distro.code_name])
@@ -566,10 +562,10 @@
566562
567 def test_response_shows_number_of_apps_found(self):563 def test_response_shows_number_of_apps_found(self):
568 distro = self.factory.make_distroseries(code_name='lucid')564 distro = self.factory.make_distroseries(code_name='lucid')
569 self.factory.make_application(package_name='foo',565 self.factory.make_application(
570 distroseries=distro)566 package_name='foo', distroseries=distro)
571 self.factory.make_application(package_name='foobar',567 self.factory.make_application(
572 distroseries=distro)568 package_name='foobar', distroseries=distro)
573 url = reverse('wc-search', args=[distro.code_name])569 url = reverse('wc-search', args=[distro.code_name])
574570
575 response = self.client.get(url, data={'q': 'foo'})571 response = self.client.get(url, data={'q': 'foo'})
@@ -578,12 +574,12 @@
578574
579 def test_response_shows_paginated_results(self):575 def test_response_shows_paginated_results(self):
580 distro = self.factory.make_distroseries(code_name='lucid')576 distro = self.factory.make_distroseries(code_name='lucid')
581 app1 = self.factory.make_application(name='foo',577 app1 = self.factory.make_application(
582 distroseries=distro)578 name='foo', distroseries=distro)
583 app2 = self.factory.make_application(name='fobar',579 app2 = self.factory.make_application(
584 distroseries=distro)580 name='fobar', distroseries=distro)
585 app3 = self.factory.make_application(name='foobar',581 app3 = self.factory.make_application(
586 distroseries=distro)582 name='foobar', distroseries=distro)
587 url = reverse('wc-search', args=[distro.code_name])583 url = reverse('wc-search', args=[distro.code_name])
588584
589 with patch_settings(PAGE_BATCH_SIZE=2):585 with patch_settings(PAGE_BATCH_SIZE=2):
@@ -637,8 +633,8 @@
637633
638 response = self.client.get(reverse('wc-index'))634 response = self.client.get(reverse('wc-index'))
639635
640 self.assertContains(response, reverse('wc-department',636 url = reverse('wc-department', kwargs={'dept_slug_or_id': dept.slug})
641 kwargs={'dept_slug_or_id': dept.slug}))637 self.assertContains(response, url)
642638
643 def test_exhibits_widget_doesnt_display_if_no_exhibits_published(self):639 def test_exhibits_widget_doesnt_display_if_no_exhibits_published(self):
644 self.factory.make_exhibit(published=False)640 self.factory.make_exhibit(published=False)
@@ -698,7 +694,8 @@
698 def test_link_to_dev_site(self):694 def test_link_to_dev_site(self):
699 response = self.client.get(reverse('wc-index'))695 response = self.client.get(reverse('wc-index'))
700696
701 self.assertContains(response,697 self.assertContains(
698 response,
702 '<a href="http://developer.ubuntu.com">'699 '<a href="http://developer.ubuntu.com">'
703 'Add your own application</a>')700 'Add your own application</a>')
704701
@@ -713,22 +710,22 @@
713 "https://launchpad.net/ubuntu-webcatalog",710 "https://launchpad.net/ubuntu-webcatalog",
714 "http://www.ubuntu.com",711 "http://www.ubuntu.com",
715 "http://www.canonical.com",712 "http://www.canonical.com",
716 ]713 ]
717 response = self.client.get(reverse('wc-index'))714 response = self.client.get(reverse('wc-index'))
718 for link in links:715 for link in links:
719 self.assertContains(response, link)716 self.assertContains(response, link)
720717
721 def make_high_medium_and_low_apps(self, score_high=5.0, score_mid=4.0,718 def make_high_medium_and_low_apps(self, score_high=5.0, score_mid=4.0,
722 score_low=1.0):719 score_low=1.0):
723 high = self.factory.make_application(package_name='high',720 high = self.factory.make_application(
724 wilson_score=score_high, ratings_average=5,721 package_name='high', wilson_score=score_high, ratings_average=5,
725 ratings_total=500)722 ratings_total=500)
726 mid = self.factory.make_application(package_name='mid',723 mid = self.factory.make_application(
727 wilson_score=score_mid, ratings_average=4,724 package_name='mid', wilson_score=score_mid, ratings_average=4,
728 ratings_total=400)725 ratings_total=400)
729 low = self.factory.make_application(package_name='low',726 low = self.factory.make_application(
730 wilson_score=score_low, ratings_average=1,727 package_name='low', wilson_score=score_low, ratings_average=1,
731 ratings_total=100)728 ratings_total=100)
732 return (high, mid, low)729 return (high, mid, low)
733730
734 def test_top_rated_apps_in_response(self):731 def test_top_rated_apps_in_response(self):
@@ -821,47 +818,54 @@
821 response = self.client.get(reverse('wc-department', kwargs={818 response = self.client.get(reverse('wc-department', kwargs={
822 'distro': 'lucid', 'dept_slug_or_id': dept.id}))819 'distro': 'lucid', 'dept_slug_or_id': dept.id}))
823820
824 self.assertContains(response, reverse('wc-department',821 url = reverse('wc-department',
825 kwargs={'dept_slug_or_id': subdept.slug}))822 kwargs={'dept_slug_or_id': subdept.slug})
823 self.assertContains(response, url)
826824
827 def test_department_contains_links_to_subdepartments_no_distro(self):825 def test_department_contains_links_to_subdepartments_no_distro(self):
828 dept = self.factory.make_department('foo')826 dept = self.factory.make_department('foo')
829 subdept = self.factory.make_department('bar', parent=dept)827 subdept = self.factory.make_department('bar', parent=dept)
830828
831 response = self.client.get(reverse('wc-department',829 url = reverse('wc-department',
832 kwargs={'dept_slug_or_id': dept.id}))830 kwargs={'dept_slug_or_id': dept.id})
831 response = self.client.get(url)
833832
834 self.assertContains(response, reverse('wc-department',833 url = reverse('wc-department',
835 kwargs={'dept_slug_or_id': subdept.slug}))834 kwargs={'dept_slug_or_id': subdept.slug})
835 self.assertContains(response, url)
836836
837 def test_department_contains_links_to_apps(self):837 def test_department_contains_links_to_apps(self):
838 app = self.factory.make_application(package_name='foo')838 app = self.factory.make_application(package_name='foo')
839 dept = self.factory.make_department('bar')839 dept = self.factory.make_department('bar')
840 app.departments.add(dept)840 app.departments.add(dept)
841841
842 response = self.client.get(reverse('wc-department', kwargs={842 url = reverse('wc-department',
843 'distro': app.distroseries.code_name, 'dept_slug_or_id': dept.id}))843 kwargs={'distro': app.distroseries.code_name,
844 'dept_slug_or_id': dept.id})
845 response = self.client.get(url)
844846
845 self.assertContains(response, reverse('wc-package-detail',847 url = reverse('wc-package-detail',
846 args=[app.distroseries.code_name, app.package_name]), count=2)848 args=[app.distroseries.code_name, app.package_name])
849 self.assertContains(response, url, count=2)
847850
848 def test_department_contains_links_to_apps_with_no_distro(self):851 def test_department_contains_links_to_apps_with_no_distro(self):
849 app = self.factory.make_application(package_name='foo', is_latest=True)852 app = self.factory.make_application(package_name='foo', is_latest=True)
850 dept = self.factory.make_department('bar')853 dept = self.factory.make_department('bar')
851 app.departments.add(dept)854 app.departments.add(dept)
852855
853 response = self.client.get(reverse('wc-department',856 url = reverse('wc-department', kwargs={'dept_slug_or_id': dept.id})
854 kwargs={'dept_slug_or_id': dept.id}))857 response = self.client.get(url)
855858
856 self.assertContains(response, reverse('wc-package-detail',859 url = reverse('wc-package-detail', args=[app.package_name])
857 args=[app.package_name]), count=2)860 self.assertContains(response, url, count=2)
858861
859 def test_department_with_no_subdepts_doesnt_contain_header(self):862 def test_department_with_no_subdepts_doesnt_contain_header(self):
860 dept = self.factory.make_department('bar')863 dept = self.factory.make_department('bar')
861 distro = self.factory.make_distroseries(code_name='lucid')864 distro = self.factory.make_distroseries(code_name='lucid')
862865
863 response = self.client.get(reverse('wc-department', kwargs={866 url = reverse('wc-department',
864 'distro': 'lucid', 'dept_slug_or_id': dept.id}))867 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.id})
868 response = self.client.get(url)
865869
866 self.assertNotContains(response, 'Subsections')870 self.assertNotContains(response, 'Subsections')
867871
@@ -873,7 +877,7 @@
873 app.departments.add(dept)877 app.departments.add(dept)
874878
875 url = reverse('wc-department',879 url = reverse('wc-department',
876 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.id})880 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.id})
877 with patch_settings(PAGE_BATCH_SIZE=2):881 with patch_settings(PAGE_BATCH_SIZE=2):
878 response = self.client.get(url)882 response = self.client.get(url)
879883
@@ -891,7 +895,7 @@
891 dept = self.factory.make_department('bar')895 dept = self.factory.make_department('bar')
892 distro = self.factory.make_distroseries(code_name='lucid')896 distro = self.factory.make_distroseries(code_name='lucid')
893 url = reverse('wc-department',897 url = reverse('wc-department',
894 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.id})898 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.id})
895 response = self.client.get(url, data={'page': 'aef8'})899 response = self.client.get(url, data={'page': 'aef8'})
896 page = response.context['page']900 page = response.context['page']
897 self.assertEqual(1, page.number)901 self.assertEqual(1, page.number)
@@ -908,31 +912,31 @@
908 dept = self.factory.make_department('bar')912 dept = self.factory.make_department('bar')
909 default = self.factory.make_distroseries(913 default = self.factory.make_distroseries(
910 code_name=settings.DEFAULT_DISTRO, version='11.04')914 code_name=settings.DEFAULT_DISTRO, version='11.04')
911 lucid = self.factory.make_distroseries(code_name='lucid',915 lucid = self.factory.make_distroseries(
912 version='10.04')916 code_name='lucid', version='10.04')
913 maverick = self.factory.make_distroseries(code_name='maverick',917 maverick = self.factory.make_distroseries(
914 version='10.10')918 code_name='maverick', version='10.10')
915919
916 response = self.client.get(reverse('wc-department',920 url = reverse('wc-department',
917 kwargs={921 kwargs={'distro': settings.DEFAULT_DISTRO,
918 'distro': settings.DEFAULT_DISTRO,922 'dept_slug_or_id': dept.id})
919 'dept_slug_or_id': dept.id923 response = self.client.get(url)
920 }))
921924
922 for ds in ['lucid', 'maverick']:925 for ds in ['lucid', 'maverick']:
923 url = reverse('wc-department',926 url = reverse('wc-department',
924 kwargs={'distro': ds, 'dept_slug_or_id': dept.slug})927 kwargs={'distro': ds, 'dept_slug_or_id': dept.slug})
925 self.assertContains(response, '<a href="{0}">Ubuntu'.format(url))928 self.assertContains(response, '<a href="{0}">Ubuntu'.format(url))
926929
927 def test_department_includes_rating_summary(self):930 def test_department_includes_rating_summary(self):
928 dept = self.factory.make_department('bar')931 dept = self.factory.make_department('bar')
929 lucid = self.factory.make_distroseries(code_name='lucid')932 lucid = self.factory.make_distroseries(code_name='lucid')
930 app = self.factory.make_application(distroseries=lucid,933 app = self.factory.make_application(
931 ratings_average=Decimal('3.5'), ratings_total=23)934 distroseries=lucid, ratings_average=Decimal('3.5'),
935 ratings_total=23)
932 app.departments.add(dept)936 app.departments.add(dept)
933937
934 url = reverse('wc-department',938 url = reverse('wc-department',
935 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.id})939 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.id})
936 response = self.client.get(url)940 response = self.client.get(url)
937941
938 self.assertContains(response, 'images/star-small-1.png', 3)942 self.assertContains(response, 'images/star-small-1.png', 3)
@@ -941,8 +945,10 @@
941 def test_invalid_distroseries_returns_404(self):945 def test_invalid_distroseries_returns_404(self):
942 dept = self.factory.make_department('bar')946 dept = self.factory.make_department('bar')
943947
944 response = self.client.get(reverse('wc-department',948 url = reverse('wc-department',
945 kwargs={'distro': 'amnesiac', 'dept_slug_or_id': dept.id}))949 kwargs={'distro': 'amnesiac',
950 'dept_slug_or_id': dept.id})
951 response = self.client.get(url)
946952
947 self.assertEqual(404, response.status_code)953 self.assertEqual(404, response.status_code)
948954
@@ -951,21 +957,21 @@
951 default = self.factory.make_distroseries(957 default = self.factory.make_distroseries(
952 code_name=settings.DEFAULT_DISTRO, version='11.04')958 code_name=settings.DEFAULT_DISTRO, version='11.04')
953 lucid = self.factory.make_distroseries(code_name='lucid',959 lucid = self.factory.make_distroseries(code_name='lucid',
954 version='10.04')960 version='10.04')
955 maverick = self.factory.make_distroseries(code_name='maverick',961 maverick = self.factory.make_distroseries(code_name='maverick',
956 version='10.10')962 version='10.10')
957963
958 response = self.client.get(reverse('wc-department',964 url = reverse('wc-department',
959 kwargs={965 kwargs={'distro': settings.DEFAULT_DISTRO,
960 'distro': settings.DEFAULT_DISTRO,966 'dept_slug_or_id': dept.id})
961 'dept_slug_or_id': dept.id967 response = self.client.get(url)
962 }))968
963969 url = reverse('wc-department',
964 url = reverse('wc-department',970 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.slug})
965 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.slug})
966 lucid_pos = response.content.find('<a href="{0}">Ubuntu'.format(url))971 lucid_pos = response.content.find('<a href="{0}">Ubuntu'.format(url))
967 url = reverse('wc-department',972 url = reverse('wc-department',
968 kwargs={'distro': 'maverick', 'dept_slug_or_id': dept.slug})973 kwargs={'distro': 'maverick',
974 'dept_slug_or_id': dept.slug})
969 maver_pos = response.content.find('<a href="{0}">Ubuntu'.format(url))975 maver_pos = response.content.find('<a href="{0}">Ubuntu'.format(url))
970 self.assertTrue(lucid_pos > maver_pos)976 self.assertTrue(lucid_pos > maver_pos)
971977
@@ -973,16 +979,17 @@
973 dept = self.factory.make_department('bar')979 dept = self.factory.make_department('bar')
974 self.factory.make_distroseries(code_name='lucid')980 self.factory.make_distroseries(code_name='lucid')
975981
976 response = self.client.get(reverse('wc-department', kwargs={982 url = reverse('wc-department',
977 'distro': 'lucid', 'dept_slug_or_id': dept.slug}))983 kwargs={'distro': 'lucid', 'dept_slug_or_id': dept.slug})
984 response = self.client.get(url)
978985
979 self.assertEqual(200, response.status_code)986 self.assertEqual(200, response.status_code)
980987
981 def test_no_distroseries_does_not_redirect(self):988 def test_no_distroseries_does_not_redirect(self):
982 dept = self.factory.make_department('bar')989 dept = self.factory.make_department('bar')
983990
984 response = self.client.get(reverse('wc-department',991 url = reverse('wc-department', kwargs={'dept_slug_or_id': dept.slug})
985 kwargs={'dept_slug_or_id': dept.slug}))992 response = self.client.get(url)
986993
987 self.assertEqual(200, response.status_code)994 self.assertEqual(200, response.status_code)
988995
@@ -1006,29 +1013,31 @@
10061013
1007 def test_only_valid_apps(self):1014 def test_only_valid_apps(self):
1008 response = self.client.get(reverse('wc-package-reviews',1015 response = self.client.get(reverse('wc-package-reviews',
1009 args=['jaunty', 'doesntexist']))1016 args=['jaunty', 'doesntexist']))
10101017
1011 self.assertEqual(404, response.status_code)1018 self.assertEqual(404, response.status_code)
10121019
1013 def test_uncached_calls_to_rnr_api(self):1020 def test_uncached_calls_to_rnr_api(self):
1014 app = self.factory.make_application()1021 app = self.factory.make_application()
10151022
1016 response = self.client.get(reverse('wc-package-reviews',1023 url = reverse('wc-package-reviews',
1017 args=[app.distroseries.code_name, app.package_name]))1024 args=[app.distroseries.code_name, app.package_name])
1025 response = self.client.get(url)
10181026
1019 self.assertEqual(1, self.mock_get_reviews.call_count)1027 self.assertEqual(1, self.mock_get_reviews.call_count)
10201028
1021 def test_second_call_cached(self):1029 def test_second_call_cached(self):
1022 app = self.factory.make_application()1030 app = self.factory.make_application()
10231031
1032 url = reverse('wc-package-reviews',
1033 args=[app.distroseries.code_name, app.package_name])
1024 for count in range(2):1034 for count in range(2):
1025 response = self.client.get(reverse('wc-package-reviews',1035 response = self.client.get(url)
1026 args=[app.distroseries.code_name, app.package_name]))
10271036
1028 self.assertEqual(1, self.mock_get_reviews.call_count)1037 self.assertEqual(1, self.mock_get_reviews.call_count)
10291038
1030 def make_review_details(self, package_name=None, summary=None,1039 def make_review_details(self, package_name=None, summary=None,
1031 rating='3.5'):1040 rating='3.5'):
1032 if package_name is None:1041 if package_name is None:
1033 package_name = self.factory.get_unique_string(prefix='pkg-')1042 package_name = self.factory.get_unique_string(prefix='pkg-')
1034 if summary is None:1043 if summary is None:
@@ -1042,10 +1051,11 @@
1042 self.mock_get_reviews.return_value = [1051 self.mock_get_reviews.return_value = [
1043 self.make_review_details(summary='review_summary1'),1052 self.make_review_details(summary='review_summary1'),
1044 self.make_review_details(summary='review_summary2'),1053 self.make_review_details(summary='review_summary2'),
1045 ]1054 ]
10461055
1047 response = self.client.get(reverse('wc-package-reviews',1056 url = reverse('wc-package-reviews',
1048 args=[app.distroseries.code_name, app.package_name]))1057 args=[app.distroseries.code_name, app.package_name])
1058 response = self.client.get(url)
10491059
1050 self.assertTemplateUsed(1060 self.assertTemplateUsed(
1051 response, 'webcatalog/application_review_list.html')1061 response, 'webcatalog/application_review_list.html')
@@ -1059,10 +1069,11 @@
1059 self.mock_get_reviews.return_value = [1069 self.mock_get_reviews.return_value = [
1060 self.make_review_details(summary='review_summary1'),1070 self.make_review_details(summary='review_summary1'),
1061 self.make_review_details(summary='review_summary2'),1071 self.make_review_details(summary='review_summary2'),
1062 ]1072 ]
10631073
1064 response = self.client.get(reverse('wc-package-reviews-ajax',1074 url = reverse('wc-package-reviews-ajax',
1065 args=[app.distroseries.code_name, app.package_name]))1075 args=[app.distroseries.code_name, app.package_name])
1076 response = self.client.get(url)
10661077
1067 self.assertTemplateNotUsed(1078 self.assertTemplateNotUsed(
1068 response, 'webcatalog/application_review_list.html')1079 response, 'webcatalog/application_review_list.html')
@@ -1076,8 +1087,9 @@
1076 del self.get_reviews_patcher1087 del self.get_reviews_patcher
1077 app = self.factory.make_application(package_name='invalid:name')1088 app = self.factory.make_application(package_name='invalid:name')
10781089
1079 response = self.client.get(reverse('wc-package-reviews',1090 url = reverse('wc-package-reviews',
1080 args=[app.distroseries.code_name, app.package_name]))1091 args=[app.distroseries.code_name, app.package_name])
1092 response = self.client.get(url)
10811093
1082 self.assertEqual(200, response.status_code)1094 self.assertEqual(200, response.status_code)
10831095
@@ -1087,7 +1099,7 @@
1087 self.factory.make_application(package_name='skype', distroseries=ds)1099 self.factory.make_application(package_name='skype', distroseries=ds)
10881100
1089 response = self.client.get(reverse('wc-package-reviews',1101 response = self.client.get(reverse('wc-package-reviews',
1090 args=[ds.code_name, 'skype']))1102 args=[ds.code_name, 'skype']))
10911103
1092 self.assertEqual(200, response.status_code)1104 self.assertEqual(200, response.status_code)
10931105
@@ -1095,8 +1107,9 @@
1095 app = self.factory.make_application()1107 app = self.factory.make_application()
1096 self.mock_get_reviews.side_effect = APIError('500', 'error')1108 self.mock_get_reviews.side_effect = APIError('500', 'error')
10971109
1098 response = self.client.get(reverse('wc-package-reviews',1110 url = reverse('wc-package-reviews',
1099 args=[app.distroseries.code_name, app.package_name]))1111 args=[app.distroseries.code_name, app.package_name])
1112 response = self.client.get(url)
11001113
1101 self.assertEqual(200, response.status_code)1114 self.assertEqual(200, response.status_code)
11021115
@@ -1109,14 +1122,14 @@
11091122
1110 def test_only_valid_apps(self):1123 def test_only_valid_apps(self):
1111 response = self.client.get(reverse('wc-package-screenshots',1124 response = self.client.get(reverse('wc-package-screenshots',
1112 args=['doesntexist']))1125 args=['doesntexist']))
11131126
1114 self.assertEqual(404, response.status_code)1127 self.assertEqual(404, response.status_code)
11151128
1116 @patch('webcatalog.utilities.urllib.urlopen')1129 @patch('webcatalog.utilities.urllib.urlopen')
1117 def test_uncached_calls_to_rnr_api(self, mock_urlopen):1130 def test_uncached_calls_to_rnr_api(self, mock_urlopen):
1118 self.client.get(reverse('wc-package-screenshots',1131 self.client.get(reverse('wc-package-screenshots',
1119 args=[self.app.package_name]))1132 args=[self.app.package_name]))
11201133
1121 self.assertEqual(1, mock_urlopen.call_count)1134 self.assertEqual(1, mock_urlopen.call_count)
11221135
@@ -1124,7 +1137,7 @@
1124 def test_second_call_cached(self, mock_urlopen):1137 def test_second_call_cached(self, mock_urlopen):
1125 for count in range(2):1138 for count in range(2):
1126 self.client.get(reverse('wc-package-screenshots',1139 self.client.get(reverse('wc-package-screenshots',
1127 args=[self.app.package_name]))1140 args=[self.app.package_name]))
11281141
1129 self.assertEqual(1, mock_urlopen.call_count)1142 self.assertEqual(1, mock_urlopen.call_count)
11301143
@@ -1133,7 +1146,7 @@
1133 mock_get_screenshots.return_value = self.expected1146 mock_get_screenshots.return_value = self.expected
11341147
1135 response = self.client.get(reverse('wc-package-screenshots',1148 response = self.client.get(reverse('wc-package-screenshots',
1136 args=[self.app.package_name]))1149 args=[self.app.package_name]))
11371150
1138 self.assertTemplateNotUsed(1151 self.assertTemplateNotUsed(
1139 response, 'webcatalog/application_review_list.html')1152 response, 'webcatalog/application_review_list.html')
@@ -1145,9 +1158,10 @@
1145 mock_get_screenshots.return_value = self.expected1158 mock_get_screenshots.return_value = self.expected
11461159
1147 with patch_settings(CACHE_MIDDLEWARE_SECONDS=600):1160 with patch_settings(CACHE_MIDDLEWARE_SECONDS=600):
1148 response = self.client.get(reverse('wc-package-screenshots',1161 url = reverse('wc-package-screenshots',
1149 args=[self.app.package_name]),1162 args=[self.app.package_name])
1150 HTTP_X_REQUESTED_WITH='XMLHttpRequest')1163 response = self.client.get(url,
1164 HTTP_X_REQUESTED_WITH='XMLHttpRequest')
11511165
1152 self.assertEqual('max-age=600', response['cache-control'])1166 self.assertEqual('max-age=600', response['cache-control'])
11531167
@@ -1156,7 +1170,7 @@
1156 self.factory.make_application(package_name=self.app.package_name)1170 self.factory.make_application(package_name=self.app.package_name)
11571171
1158 response = self.client.get(reverse('wc-package-screenshots',1172 response = self.client.get(reverse('wc-package-screenshots',
1159 args=[self.app.package_name]))1173 args=[self.app.package_name]))
11601174
1161 self.assertEqual(200, response.status_code)1175 self.assertEqual(200, response.status_code)
11621176
@@ -1164,13 +1178,13 @@
1164 def test_not_dependent_on_is_latest(self, mock_urlopen):1178 def test_not_dependent_on_is_latest(self, mock_urlopen):
1165 lucid = self.factory.make_distroseries(code_name='lucid')1179 lucid = self.factory.make_distroseries(code_name='lucid')
1166 maverick = self.factory.make_distroseries(code_name='maverick')1180 maverick = self.factory.make_distroseries(code_name='maverick')
1167 self.factory.make_application(package_name='foo', distroseries=lucid,1181 self.factory.make_application(
1168 is_latest=False)1182 package_name='foo', distroseries=lucid, is_latest=False)
1169 self.factory.make_application(package_name='foo',1183 self.factory.make_application(
1170 distroseries=maverick, is_latest=False)1184 package_name='foo', distroseries=maverick, is_latest=False)
11711185
1172 response = self.client.get(reverse('wc-package-screenshots',1186 response = self.client.get(reverse('wc-package-screenshots',
1173 args=['foo']))1187 args=['foo']))
11741188
1175 self.assertEqual(200, response.status_code)1189 self.assertEqual(200, response.status_code)
11761190
@@ -1191,16 +1205,16 @@
1191 {u'rating': 4.0, u'package_name': u'tribaltrouble2'},1205 {u'rating': 4.0, u'package_name': u'tribaltrouble2'},
1192 {u'rating': 4.0, u'package_name': u'acm'},1206 {u'rating': 4.0, u'package_name': u'acm'},
1193 {u'rating': 4.0, u'package_name': u'zgv'},1207 {u'rating': 4.0, u'package_name': u'zgv'},
1194 {u'rating': 3.0, u'package_name': u'nautilus-wallpaper'}1208 {u'rating': 3.0, u'package_name': u'nautilus-wallpaper'},
1195 ],1209 ],
1196 u'app': u'firefox',1210 u'app': u'firefox',
1197 }1211 }
1198 self.mock_get_recommends.return_value = self.eg_recommends1212 self.mock_get_recommends.return_value = self.eg_recommends
1199 cache.clear()1213 cache.clear()
12001214
1201 def test_only_valid_apps(self):1215 def test_only_valid_apps(self):
1202 response = self.client.get(reverse('wc-package-recommends',1216 response = self.client.get(reverse('wc-package-recommends',
1203 args=['doesntexist']))1217 args=['doesntexist']))
12041218
1205 self.assertEqual(404, response.status_code)1219 self.assertEqual(404, response.status_code)
12061220
12071221
=== modified file 'src/webcatalog/views.py'
--- src/webcatalog/views.py 2012-06-06 18:03:19 +0000
+++ src/webcatalog/views.py 2012-06-06 18:03:20 +0000
@@ -159,7 +159,7 @@
159 paginator = Paginator(apps, settings.PAGE_BATCH_SIZE)159 paginator = Paginator(apps, settings.PAGE_BATCH_SIZE)
160 page_num = _get_page_num_from_request(request, paginator)160 page_num = _get_page_num_from_request(request, paginator)
161161
162 context = {162 cntxt = {
163 'dept': dept,163 'dept': dept,
164 'subdepts': subdepts,164 'subdepts': subdepts,
165 'page': paginator.page(page_num),165 'page': paginator.page(page_num),
@@ -168,7 +168,7 @@
168 'distroseries': distro,168 'distroseries': distro,
169 }169 }
170 return render_to_response('webcatalog/department_overview.html',170 return render_to_response('webcatalog/department_overview.html',
171 context_instance=RequestContext(request, context))171 context_instance=RequestContext(request, cntxt))
172172
173173
174def application_list(request):174def application_list(request):

Subscribers

People subscribed via source and target branches