Merge lp:~fabricematrat/charmworld/redirect-charm into lp:charmworld
- redirect-charm
- Merge into trunk
Proposed by
Fabrice Matrat
Status: | Merged |
---|---|
Approved by: | Brad Crittenden |
Approved revision: | 525 |
Merged at revision: | 520 |
Proposed branch: | lp:~fabricematrat/charmworld/redirect-charm |
Merge into: | lp:charmworld |
Diff against target: |
470 lines (+88/-225) 3 files modified
charmworld/views/charms.py (+42/-21) charmworld/views/tests/test_charms.py (+42/-203) default.ini (+4/-1) |
To merge this branch: | bzr merge lp:~fabricematrat/charmworld/redirect-charm |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Brad Crittenden (community) | code | Approve | |
Juju Gui Bot | continuous-integration | Approve | |
j.c.sackett (community) | Approve | ||
Review via email: mp+249038@code.launchpad.net |
Commit message
Add a redirect for charms
R=bac, jcsackett
Description of the change
Add a redirect for charms
To post a comment you must log in.
Revision history for this message
j.c.sackett (jcsackett) wrote : | # |
Fabrice--
This looks alright. I have some concerns about the redirects, but I don't think there's a better solution at this time--possibly something worth filing issues against jujucharms.com for?
Revision history for this message
j.c.sackett (jcsackett) : | # |
review:
Approve
Revision history for this message
Juju Gui Bot (juju-gui-bot) : | # |
review:
Approve
(continuous-integration)
Revision history for this message
Brad Crittenden (bac) wrote : | # |
Even better
review:
Approve
(code)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'charmworld/views/charms.py' | |||
2 | --- charmworld/views/charms.py 2014-04-02 14:12:22 +0000 | |||
3 | +++ charmworld/views/charms.py 2015-02-09 18:46:28 +0000 | |||
4 | @@ -9,6 +9,7 @@ | |||
5 | 9 | import json | 9 | import json |
6 | 10 | import os | 10 | import os |
7 | 11 | import pymongo | 11 | import pymongo |
8 | 12 | from pyramid.httpexceptions import HTTPMovedPermanently | ||
9 | 12 | from pyramid.view import view_config | 13 | from pyramid.view import view_config |
10 | 13 | from webob import Response | 14 | from webob import Response |
11 | 14 | 15 | ||
12 | @@ -36,7 +37,6 @@ | |||
13 | 36 | found, | 37 | found, |
14 | 37 | interfaces, | 38 | interfaces, |
15 | 38 | name_filter, | 39 | name_filter, |
16 | 39 | sub_filter, | ||
17 | 40 | ) | 40 | ) |
18 | 41 | 41 | ||
19 | 42 | 42 | ||
20 | @@ -246,42 +246,42 @@ | |||
21 | 246 | route_name="charm-collection", | 246 | route_name="charm-collection", |
22 | 247 | renderer="charmworld:templates/charm-collection.pt") | 247 | renderer="charmworld:templates/charm-collection.pt") |
23 | 248 | def charm_collection(request): | 248 | def charm_collection(request): |
27 | 249 | query, sub_only = sub_filter({}, request) | 249 | redirect_url = request.registry.settings.get('redirect_jujucharms') |
28 | 250 | return found_charm_collection( | 250 | location = ('{url}/solutions'.format(url=redirect_url)) |
29 | 251 | request.db, query, sub_only, only_promulgated=True) | 251 | raise HTTPMovedPermanently(location=location) |
30 | 252 | 252 | ||
31 | 253 | 253 | ||
32 | 254 | @cached_view_config( | 254 | @cached_view_config( |
33 | 255 | route_name="personal-collection", | 255 | route_name="personal-collection", |
34 | 256 | renderer="charmworld:templates/charm-collection.pt") | 256 | renderer="charmworld:templates/charm-collection.pt") |
35 | 257 | def personal_collection(request): | 257 | def personal_collection(request): |
40 | 258 | query, sub_only = sub_filter({ | 258 | redirect_url = request.registry.settings.get('redirect_jujucharms') |
41 | 259 | "owner": request.matchdict["owner"] | 259 | location = ('{url}/q/{owner}'.format(url=redirect_url, |
42 | 260 | }, request) | 260 | owner=request.matchdict["owner"])) |
43 | 261 | return found_charm_collection(request.db, query, sub_only) | 261 | raise HTTPMovedPermanently(location=location) |
44 | 262 | 262 | ||
45 | 263 | 263 | ||
46 | 264 | @cached_view_config( | 264 | @cached_view_config( |
47 | 265 | route_name="series-collection", | 265 | route_name="series-collection", |
48 | 266 | renderer="charmworld:templates/charm-collection.pt") | 266 | renderer="charmworld:templates/charm-collection.pt") |
49 | 267 | def series_collection(request): | 267 | def series_collection(request): |
54 | 268 | query, sub_only = sub_filter( | 268 | redirect_url = request.registry.settings.get('redirect_jujucharms') |
55 | 269 | {"series": request.matchdict["series"]}, request) | 269 | location = ('{url}/q/{series}'.format(url=redirect_url, |
56 | 270 | return found_charm_collection( | 270 | series=request.matchdict["series"])) |
57 | 271 | request.db, query, sub_only, only_promulgated=True) | 271 | raise HTTPMovedPermanently(location=location) |
58 | 272 | 272 | ||
59 | 273 | 273 | ||
60 | 274 | @cached_view_config( | 274 | @cached_view_config( |
61 | 275 | route_name="personal-series", | 275 | route_name="personal-series", |
62 | 276 | renderer="charmworld:templates/charm-collection.pt") | 276 | renderer="charmworld:templates/charm-collection.pt") |
63 | 277 | def personal_series_collection(request): | 277 | def personal_series_collection(request): |
71 | 278 | query, sub_only = sub_filter( | 278 | redirect_url = request.registry.settings.get('redirect_jujucharms') |
72 | 279 | { | 279 | location = ('{url}/q/{owner}/{series}'.format( |
73 | 280 | "owner": request.matchdict["owner"], | 280 | url=redirect_url, |
74 | 281 | "series": request.matchdict["series"] | 281 | owner=request.matchdict["owner"], |
75 | 282 | }, | 282 | series=request.matchdict["series"]) |
76 | 283 | request) | 283 | ) |
77 | 284 | return found_charm_collection(request.db, query, sub_only) | 284 | raise HTTPMovedPermanently(location=location) |
78 | 285 | 285 | ||
79 | 286 | 286 | ||
80 | 287 | @cached_view_config( | 287 | @cached_view_config( |
81 | @@ -292,7 +292,18 @@ | |||
82 | 292 | renderer="charmworld:templates/charm.pt") | 292 | renderer="charmworld:templates/charm.pt") |
83 | 293 | def personal_charm(request): | 293 | def personal_charm(request): |
84 | 294 | _reconcile_revision(request) | 294 | _reconcile_revision(request) |
86 | 295 | return _charm_view(request, find_charm(request)) | 295 | redirect_url = request.registry.settings.get('redirect_jujucharms') |
87 | 296 | match = request.matchdict | ||
88 | 297 | location = '{url}/u/{owner}/{charm}/{series}'.format( | ||
89 | 298 | url=redirect_url, | ||
90 | 299 | owner=match['owner'], | ||
91 | 300 | charm=match['charm'], | ||
92 | 301 | series=match['series'] | ||
93 | 302 | ) | ||
94 | 303 | if 'revision' in match: | ||
95 | 304 | location = '{location}/{revision}'.format(location=location, | ||
96 | 305 | revision=match['revision']) | ||
97 | 306 | raise HTTPMovedPermanently(location=location) | ||
98 | 296 | 307 | ||
99 | 297 | 308 | ||
100 | 298 | @cached_view_config( | 309 | @cached_view_config( |
101 | @@ -316,7 +327,17 @@ | |||
102 | 316 | renderer="charmworld:templates/charm.pt") | 327 | renderer="charmworld:templates/charm.pt") |
103 | 317 | def distro_charm(request): | 328 | def distro_charm(request): |
104 | 318 | _reconcile_revision(request) | 329 | _reconcile_revision(request) |
106 | 319 | return _charm_view(request, find_charm(request, promulgated=True)) | 330 | redirect_url = request.registry.settings.get('redirect_jujucharms') |
107 | 331 | match = request.matchdict | ||
108 | 332 | location = '{url}/{charm}/{series}'.format( | ||
109 | 333 | url=redirect_url, | ||
110 | 334 | charm=match['charm'], | ||
111 | 335 | series=match['series'] | ||
112 | 336 | ) | ||
113 | 337 | if 'revision' in match: | ||
114 | 338 | location = '{location}/{revision}'.format(location=location, | ||
115 | 339 | revision=match['revision']) | ||
116 | 340 | raise HTTPMovedPermanently(location=location) | ||
117 | 320 | 341 | ||
118 | 321 | 342 | ||
119 | 322 | @cached_view_config( | 343 | @cached_view_config( |
120 | 323 | 344 | ||
121 | === modified file 'charmworld/views/tests/test_charms.py' | |||
122 | --- charmworld/views/tests/test_charms.py 2014-04-02 14:12:22 +0000 | |||
123 | +++ charmworld/views/tests/test_charms.py 2015-02-09 18:46:28 +0000 | |||
124 | @@ -4,6 +4,8 @@ | |||
125 | 4 | from datetime import date | 4 | from datetime import date |
126 | 5 | from logging import getLogger | 5 | from logging import getLogger |
127 | 6 | 6 | ||
128 | 7 | from pyramid.httpexceptions import HTTPMovedPermanently | ||
129 | 8 | |||
130 | 7 | from charmworld.jobs.ingest import ( | 9 | from charmworld.jobs.ingest import ( |
131 | 8 | add_files, | 10 | add_files, |
132 | 9 | ) | 11 | ) |
133 | @@ -131,189 +133,30 @@ | |||
134 | 131 | 133 | ||
135 | 132 | def test_charm_collection_basic(self): | 134 | def test_charm_collection_basic(self): |
136 | 133 | """Simple sanity check.""" | 135 | """Simple sanity check.""" |
168 | 134 | one_id, one = factory.makeCharm(self.db, promulgated=True) | 136 | with self.assertRaises(HTTPMovedPermanently) as e: |
169 | 135 | two_id, two = factory.makeCharm(self.db, promulgated=True, owner='foo') | 137 | charm_collection(self.getRequest()) |
170 | 136 | three_id, three = factory.makeCharm(self.db, promulgated=False) | 138 | self.assertIn('/solutions', e.exception.location) |
140 | 137 | |||
141 | 138 | response = charm_collection(self.getRequest()) | ||
142 | 139 | charm_names = set(charm.name for charm in response['charms']) | ||
143 | 140 | expected = set((one['name'], two['name'])) | ||
144 | 141 | self.assertEqual(expected, charm_names) | ||
145 | 142 | |||
146 | 143 | def test_charm_collection_sub_filter(self): | ||
147 | 144 | """With the subordinate filter we limit out the non-sub charms.""" | ||
148 | 145 | one_id, one = factory.makeCharm( | ||
149 | 146 | self.db, subordinate=True, promulgated=True) | ||
150 | 147 | two_id, two = factory.makeCharm(self.db, promulgated=True) | ||
151 | 148 | |||
152 | 149 | request = self.getRequest() | ||
153 | 150 | request.GET['sub'] = 'true' | ||
154 | 151 | response = charm_collection(request) | ||
155 | 152 | charms = response['charms'] | ||
156 | 153 | self.assertEqual(1, len(charms)) | ||
157 | 154 | self.assertEqual(one['name'], charms[0].name) | ||
158 | 155 | |||
159 | 156 | def test_charm_collection_charms_with_errors(self): | ||
160 | 157 | """Charms with errors are not returned by charm_collection().""" | ||
161 | 158 | one_id, one = factory.makeCharm(self.db, promulgated=True) | ||
162 | 159 | two_id, two = factory.makeCharm( | ||
163 | 160 | self.db, charm_error=True, promulgated=True) | ||
164 | 161 | response = charm_collection(self.getRequest()) | ||
165 | 162 | charms = response['charms'] | ||
166 | 163 | self.assertEqual(1, len(charms)) | ||
167 | 164 | self.assertEqual(one['name'], charms[0].name) | ||
171 | 165 | 139 | ||
172 | 166 | def test_personal_collection(self): | 140 | def test_personal_collection(self): |
219 | 167 | # personal_collection() returns only charms owned by the given | 141 | request = self.getRequest() |
220 | 168 | # person. | 142 | request.matchdict = {'owner': 'foo'} |
221 | 169 | one_id, one = factory.makeCharm(self.db, owner='foo') | 143 | with self.assertRaises(HTTPMovedPermanently) as e: |
222 | 170 | two_id, two = factory.makeCharm(self.db, owner='bar') | 144 | personal_collection(request) |
223 | 171 | request = self.getRequest() | 145 | self.assertIn('/q/foo', e.exception.location) |
178 | 172 | request.matchdict = {'owner': 'foo'} | ||
179 | 173 | response = personal_collection(request) | ||
180 | 174 | charms = response['charms'] | ||
181 | 175 | self.assertEqual(1, len(charms)) | ||
182 | 176 | self.assertEqual('foo', charms[0].owner) | ||
183 | 177 | |||
184 | 178 | def test_personal_collection_sub_filter(self): | ||
185 | 179 | # If the request parameter 'sub' is set, only subordinate charms | ||
186 | 180 | # are returned. | ||
187 | 181 | one_id, one = factory.makeCharm(self.db, owner='foo') | ||
188 | 182 | two_id, two = factory.makeCharm(self.db, owner='bar') | ||
189 | 183 | three_id, three = factory.makeCharm( | ||
190 | 184 | self.db, owner='foo', subordinate=True) | ||
191 | 185 | request = self.getRequest() | ||
192 | 186 | request.GET['sub'] = 'true' | ||
193 | 187 | request.matchdict = {'owner': 'foo'} | ||
194 | 188 | response = personal_collection(request) | ||
195 | 189 | charms = response['charms'] | ||
196 | 190 | self.assertEqual(1, len(charms)) | ||
197 | 191 | self.assertEqual(three['name'], charms[0].name) | ||
198 | 192 | # If the filter is no given in the request, all charms are returned. | ||
199 | 193 | request = self.getRequest() | ||
200 | 194 | request.matchdict = {'owner': 'foo'} | ||
201 | 195 | response = personal_collection(request) | ||
202 | 196 | charms = response['charms'] | ||
203 | 197 | self.assertEqual(2, len(charms)) | ||
204 | 198 | self.assertEqual('foo', charms[0].owner) | ||
205 | 199 | self.assertEqual('foo', charms[1].owner) | ||
206 | 200 | |||
207 | 201 | def test_personal_collection_charms_with_errors(self): | ||
208 | 202 | # Charms with errors are not returned by personal_collection(). | ||
209 | 203 | one_id, one = factory.makeCharm(self.db, owner='foo') | ||
210 | 204 | two_id, two = factory.makeCharm(self.db, owner='bar') | ||
211 | 205 | three_id, three = factory.makeCharm( | ||
212 | 206 | self.db, owner='foo', charm_error=True) | ||
213 | 207 | request = self.getRequest() | ||
214 | 208 | request.matchdict = {'owner': 'foo'} | ||
215 | 209 | response = personal_collection(request) | ||
216 | 210 | charms = response['charms'] | ||
217 | 211 | self.assertEqual(1, len(charms)) | ||
218 | 212 | self.assertEqual(one['name'], charms[0].name) | ||
224 | 213 | 146 | ||
225 | 214 | def test_series_collection(self): | 147 | def test_series_collection(self): |
276 | 215 | # series_collection() returns only promulgated charms for a | 148 | request = self.getRequest() |
277 | 216 | # given series. | 149 | request.matchdict = {'series': 'one'} |
278 | 217 | one_id, one = factory.makeCharm( | 150 | with self.assertRaises(HTTPMovedPermanently) as e: |
279 | 218 | self.db, series='one', promulgated=True, name='charm-a') | 151 | series_collection(request) |
280 | 219 | two_id, two = factory.makeCharm( | 152 | self.assertIn('/q/one', e.exception.location) |
231 | 220 | self.db, series='two', promulgated=True) | ||
232 | 221 | three_id, three = factory.makeCharm( | ||
233 | 222 | self.db, series='one') | ||
234 | 223 | four_id, four = factory.makeCharm( | ||
235 | 224 | self.db, series='one', promulgated=True, owner='foo', | ||
236 | 225 | name='charm-b') | ||
237 | 226 | request = self.getRequest() | ||
238 | 227 | request.matchdict = {'series': 'one'} | ||
239 | 228 | response = series_collection(request) | ||
240 | 229 | charms = response['charms'] | ||
241 | 230 | self.assertEqual( | ||
242 | 231 | ['charm-a', 'charm-b'], [charm.name for charm in charms]) | ||
243 | 232 | self.assertEqual('one', charms[0].series) | ||
244 | 233 | |||
245 | 234 | def test_series_collection_sub_filter(self): | ||
246 | 235 | # If the request parameter 'sub' is set, only subordinate charms | ||
247 | 236 | # are returned. | ||
248 | 237 | one_id, one = factory.makeCharm( | ||
249 | 238 | self.db, series='one', promulgated=True) | ||
250 | 239 | two_id, two = factory.makeCharm( | ||
251 | 240 | self.db, series='two', promulgated=True) | ||
252 | 241 | three_is, three = factory.makeCharm( | ||
253 | 242 | self.db, series='one', subordinate=True, promulgated=True) | ||
254 | 243 | request = self.getRequest() | ||
255 | 244 | request.matchdict = {'series': 'one'} | ||
256 | 245 | request.GET['sub'] = 'true' | ||
257 | 246 | response = series_collection(request) | ||
258 | 247 | charms = response['charms'] | ||
259 | 248 | self.assertEqual(1, len(charms)) | ||
260 | 249 | self.assertEqual(three['name'], charms[0].name) | ||
261 | 250 | |||
262 | 251 | def test_series_collection_charms_with_errors(self): | ||
263 | 252 | # Charms with errors are not returned by series_collection(). | ||
264 | 253 | one_id, one = factory.makeCharm( | ||
265 | 254 | self.db, series='one', promulgated=True) | ||
266 | 255 | two_id, two = factory.makeCharm( | ||
267 | 256 | self.db, series='two', promulgated=True) | ||
268 | 257 | three_is, three = factory.makeCharm( | ||
269 | 258 | self.db, series='one', charm_error=True, promulgated=True) | ||
270 | 259 | request = self.getRequest() | ||
271 | 260 | request.matchdict = {'series': 'one'} | ||
272 | 261 | response = series_collection(request) | ||
273 | 262 | charms = response['charms'] | ||
274 | 263 | self.assertEqual(1, len(charms)) | ||
275 | 264 | self.assertEqual(one['name'], charms[0].name) | ||
281 | 265 | 153 | ||
282 | 266 | def test_personal_series_collection(self): | 154 | def test_personal_series_collection(self): |
333 | 267 | # personal_series_collection() returns only charms for a given | 155 | request = self.getRequest() |
334 | 268 | # series and person. | 156 | request.matchdict = {'series': 'one', 'owner': 'me'} |
335 | 269 | one_id, one = factory.makeCharm(self.db, series='one', owner='foo') | 157 | with self.assertRaises(HTTPMovedPermanently) as e: |
336 | 270 | two_id, two = factory.makeCharm(self.db, series='two', owner='foo') | 158 | personal_series_collection(request) |
337 | 271 | three_id, three = factory.makeCharm(self.db, series='one', owner='bar') | 159 | self.assertIn('/q/me/one', e.exception.location) |
288 | 272 | request = self.getRequest() | ||
289 | 273 | request.matchdict = { | ||
290 | 274 | 'owner': 'foo', | ||
291 | 275 | 'series': 'one', | ||
292 | 276 | } | ||
293 | 277 | response = personal_series_collection(request) | ||
294 | 278 | charms = response['charms'] | ||
295 | 279 | self.assertEqual(1, len(charms)) | ||
296 | 280 | self.assertEqual(one['name'], charms[0].name) | ||
297 | 281 | |||
298 | 282 | def test_personal_series_collection_sub_filter(self): | ||
299 | 283 | # If the parameter 'sub' is set, personal_series_collection() | ||
300 | 284 | # returns only subordinate charms for the given person ans series. | ||
301 | 285 | one_id, one = factory.makeCharm(self.db, series='one', owner='foo') | ||
302 | 286 | two_id, two = factory.makeCharm(self.db, series='two', owner='foo') | ||
303 | 287 | three_id, three = factory.makeCharm(self.db, series='one', owner='bar') | ||
304 | 288 | four_id, four = factory.makeCharm( | ||
305 | 289 | self.db, series='one', owner='foo', subordinate=True) | ||
306 | 290 | request = self.getRequest() | ||
307 | 291 | request.matchdict = { | ||
308 | 292 | 'owner': 'foo', | ||
309 | 293 | 'series': 'one', | ||
310 | 294 | } | ||
311 | 295 | request.GET['sub'] = 'true' | ||
312 | 296 | response = personal_series_collection(request) | ||
313 | 297 | charms = response['charms'] | ||
314 | 298 | self.assertEqual(1, len(charms)) | ||
315 | 299 | self.assertEqual(four['name'], charms[0].name) | ||
316 | 300 | |||
317 | 301 | def test_personal_series_collection_charms_with_errors(self): | ||
318 | 302 | # Charms with errors are not returned by series_collection(). | ||
319 | 303 | one_id, one = factory.makeCharm(self.db, series='one', owner='foo') | ||
320 | 304 | two_id, two = factory.makeCharm(self.db, series='two', owner='foo') | ||
321 | 305 | three_id, three = factory.makeCharm(self.db, series='one', owner='bar') | ||
322 | 306 | four_id, four = factory.makeCharm( | ||
323 | 307 | self.db, series='one', owner='foo', charm_error=True) | ||
324 | 308 | request = self.getRequest() | ||
325 | 309 | request.matchdict = { | ||
326 | 310 | 'owner': 'foo', | ||
327 | 311 | 'series': 'one', | ||
328 | 312 | } | ||
329 | 313 | response = personal_series_collection(request) | ||
330 | 314 | charms = response['charms'] | ||
331 | 315 | self.assertEqual(1, len(charms)) | ||
332 | 316 | self.assertEqual(one['name'], charms[0].name) | ||
338 | 317 | 160 | ||
339 | 318 | def test_interface(self): | 161 | def test_interface(self): |
340 | 319 | # interface() returns all charms requiring or providing a given | 162 | # interface() returns all charms requiring or providing a given |
341 | @@ -429,12 +272,8 @@ | |||
342 | 429 | 'charm': 'sample_charm', | 272 | 'charm': 'sample_charm', |
343 | 430 | 'series': 'precise', | 273 | 'series': 'precise', |
344 | 431 | } | 274 | } |
351 | 432 | response = distro_charm(request) | 275 | with self.assertRaises(HTTPMovedPermanently): |
352 | 433 | expected_keys = set(( | 276 | distro_charm(request) |
347 | 434 | 'charm', 'is_featured', 'format_change', 'format_proof', 'name', | ||
348 | 435 | 'others', 'project', 'qadata', 'readme', 'readme_format', | ||
349 | 436 | 'icon_path')) | ||
350 | 437 | self.assertEqual(expected_keys, set(response)) | ||
353 | 438 | 277 | ||
354 | 439 | def test_distro_charm_json(self): | 278 | def test_distro_charm_json(self): |
355 | 440 | ignore, charm = factory.makeCharm( | 279 | ignore, charm = factory.makeCharm( |
356 | @@ -542,9 +381,8 @@ | |||
357 | 542 | two_id, two = factory.makeCharm(self.db, promulgated=True) | 381 | two_id, two = factory.makeCharm(self.db, promulgated=True) |
358 | 543 | del two['summary'] | 382 | del two['summary'] |
359 | 544 | self.db.charms.save(two) | 383 | self.db.charms.save(two) |
363 | 545 | # Test that the route works. | 384 | response = self.app.get('/charms/precise', status=301) |
364 | 546 | resp = self.app.get('/charms/precise', status=200) | 385 | self.assertIn('/q/precise', response.body) |
362 | 547 | self.assertIn(two['short_url'], resp.body) | ||
365 | 548 | 386 | ||
366 | 549 | def test_route_personal_charm_with_revision(self): | 387 | def test_route_personal_charm_with_revision(self): |
367 | 550 | # The route /~owner/series/charm-1 finds charms using owner, | 388 | # The route /~owner/series/charm-1 finds charms using owner, |
368 | @@ -552,8 +390,8 @@ | |||
369 | 552 | # does not include the revision. | 390 | # does not include the revision. |
370 | 553 | ignore, charm = factory.makeCharm( | 391 | ignore, charm = factory.makeCharm( |
371 | 554 | self.db, owner='owner', series='series', name='charm', files={}) | 392 | self.db, owner='owner', series='series', name='charm', files={}) |
374 | 555 | response = self.app.get('/~owner/series/charm-1', status=200) | 393 | response = self.app.get('/~owner/series/charm-1', status=301) |
375 | 556 | self.assertIn('juju deploy cs:~owner/series/charm', response.body) | 394 | self.assertIn('/u/owner/charm/series/1', response.body) |
376 | 557 | 395 | ||
377 | 558 | def test_route_personal_charm_with_dash_and_revision(self): | 396 | def test_route_personal_charm_with_dash_and_revision(self): |
378 | 559 | # /~owner/series/charm-name-1 route find the charm. | 397 | # /~owner/series/charm-name-1 route find the charm. |
379 | @@ -562,16 +400,17 @@ | |||
380 | 562 | ignore, charm = factory.makeCharm( | 400 | ignore, charm = factory.makeCharm( |
381 | 563 | self.db, owner='owner', series='series', name='charm-name', | 401 | self.db, owner='owner', series='series', name='charm-name', |
382 | 564 | files={}) | 402 | files={}) |
385 | 565 | response = self.app.get('/~owner/series/charm-name-1', status=200) | 403 | response = self.app.get('/~owner/series/charm-name-1', status=301) |
386 | 566 | self.assertIn('juju deploy cs:~owner/series/charm-name', response.body) | 404 | self.assertIn('/u/owner/charm-name/series/1', response.body) |
387 | 567 | 405 | ||
388 | 568 | def test_route_personal_charm_with_head_revision(self): | 406 | def test_route_personal_charm_with_head_revision(self): |
389 | 569 | # the /~owner/series/charm-name-HEAD route finds the charm. | 407 | # the /~owner/series/charm-name-HEAD route finds the charm. |
390 | 570 | # The juju-gui apache rewrite versionless charm urls to help the GUI. | 408 | # The juju-gui apache rewrite versionless charm urls to help the GUI. |
391 | 571 | ignore, charm = factory.makeCharm( | 409 | ignore, charm = factory.makeCharm( |
392 | 572 | self.db, owner='owner', series='series', name='charm', files={}) | 410 | self.db, owner='owner', series='series', name='charm', files={}) |
395 | 573 | response = self.app.get('/~owner/series/charm-HEAD', status=200) | 411 | response = self.app.get('/~owner/series/charm-HEAD', status=301) |
396 | 574 | self.assertIn('juju deploy cs:~owner/series/charm', response.body) | 412 | self.assertIn('/u/owner/charm/series', response.body) |
397 | 413 | self.assertNotIn('HEAD', response.body) | ||
398 | 575 | 414 | ||
399 | 576 | def test_route_personal_charm_without_revision(self): | 415 | def test_route_personal_charm_without_revision(self): |
400 | 577 | # The route /~owner/series/charm route finds the charm using owner | 416 | # The route /~owner/series/charm route finds the charm using owner |
401 | @@ -579,8 +418,8 @@ | |||
402 | 579 | # matches the route. | 418 | # matches the route. |
403 | 580 | ignore, charm = factory.makeCharm( | 419 | ignore, charm = factory.makeCharm( |
404 | 581 | self.db, owner='owner', series='series', name='charm', files={}) | 420 | self.db, owner='owner', series='series', name='charm', files={}) |
407 | 582 | response = self.app.get('/~owner/series/charm', status=200) | 421 | response = self.app.get('/~owner/series/charm', status=301) |
408 | 583 | self.assertIn('juju deploy cs:~owner/series/charm', response.body) | 422 | self.assertIn('/u/owner/charm/series', response.body) |
409 | 584 | 423 | ||
410 | 585 | def test_route_personal_charm_json_with_revision(self): | 424 | def test_route_personal_charm_json_with_revision(self): |
411 | 586 | # The route /~owner/series/charm-1/json finds charms using owner, | 425 | # The route /~owner/series/charm-1/json finds charms using owner, |
412 | @@ -604,10 +443,10 @@ | |||
413 | 604 | # The route /series/charm-1 route finds promulgated charms using | 443 | # The route /series/charm-1 route finds promulgated charms using |
414 | 605 | # The series, charm name and version. The deploy instruction does not | 444 | # The series, charm name and version. The deploy instruction does not |
415 | 606 | # include the version. | 445 | # include the version. |
417 | 607 | ignore, charm = factory.makeCharm( | 446 | factory.makeCharm( |
418 | 608 | self.db, promulgated=True, series='series', name='charm', files={}) | 447 | self.db, promulgated=True, series='series', name='charm', files={}) |
421 | 609 | response = self.app.get('/series/charm-1', status=200) | 448 | response = self.app.get('/series/charm-1', status=301) |
422 | 610 | self.assertIn('juju deploy cs:series/charm', response.body) | 449 | self.assertIn('/charm/series/1', response.body) |
423 | 611 | 450 | ||
424 | 612 | def test_route_promulgated_charm_with_head_revision(self): | 451 | def test_route_promulgated_charm_with_head_revision(self): |
425 | 613 | # The route /series/charm-HEAD finds promulgated charms using | 452 | # The route /series/charm-HEAD finds promulgated charms using |
426 | @@ -615,22 +454,22 @@ | |||
427 | 615 | # in the deploy instruction. | 454 | # in the deploy instruction. |
428 | 616 | ignore, charm = factory.makeCharm( | 455 | ignore, charm = factory.makeCharm( |
429 | 617 | self.db, promulgated=True, series='series', name='charm', files={}) | 456 | self.db, promulgated=True, series='series', name='charm', files={}) |
432 | 618 | response = self.app.get('/series/charm-HEAD', status=200) | 457 | response = self.app.get('/series/charm-HEAD', status=301) |
433 | 619 | self.assertIn('juju deploy cs:series/charm', response.body) | 458 | self.assertNotIn('HEAD', response.body) |
434 | 459 | self.assertIn('/charm/series', response.body) | ||
435 | 620 | 460 | ||
436 | 621 | def test_route_promulgated_charm_without_revision(self): | 461 | def test_route_promulgated_charm_without_revision(self): |
437 | 622 | # The route /series/charm finds the promulgated charms using just | 462 | # The route /series/charm finds the promulgated charms using just |
438 | 623 | # the series and charm name. The deploy instruction matches the route. | 463 | # the series and charm name. The deploy instruction matches the route. |
440 | 624 | ignore, charm = factory.makeCharm( | 464 | factory.makeCharm( |
441 | 625 | self.db, promulgated=True, series='series', name='charm', files={}) | 465 | self.db, promulgated=True, series='series', name='charm', files={}) |
444 | 626 | response = self.app.get('/series/charm', status=200) | 466 | self.app.get('/series/charm', status=301) |
443 | 627 | self.assertIn('juju deploy cs:series/charm', response.body) | ||
445 | 628 | 467 | ||
446 | 629 | def test_charm_short_url_route(self): | 468 | def test_charm_short_url_route(self): |
447 | 630 | ignore, charm_data = factory.makeCharm( | 469 | ignore, charm_data = factory.makeCharm( |
448 | 631 | self.db, promulgated=True, series='series', name='charm', files={}) | 470 | self.db, promulgated=True, series='series', name='charm', files={}) |
449 | 632 | charm = Charm(charm_data) | 471 | charm = Charm(charm_data) |
451 | 633 | self.app.get(charm.short_url, status=200) | 472 | self.app.get(charm.short_url, status=301) |
452 | 634 | 473 | ||
453 | 635 | 474 | ||
454 | 636 | class TestQAForm(ViewTestBase): | 475 | class TestQAForm(ViewTestBase): |
455 | 637 | 476 | ||
456 | === modified file 'default.ini' | |||
457 | --- default.ini 2014-01-14 14:37:56 +0000 | |||
458 | +++ default.ini 2015-02-09 18:46:28 +0000 | |||
459 | @@ -66,7 +66,10 @@ | |||
460 | 66 | run_test_builds = false | 66 | run_test_builds = false |
461 | 67 | charm_test_url = | 67 | charm_test_url = |
462 | 68 | charm_test_token = | 68 | charm_test_token = |
464 | 69 | charm_test_job = | 69 | charm_test_job = |
465 | 70 | |||
466 | 71 | # New web site for redirection | ||
467 | 72 | redirect_jujucharms = https://jujucharms.com | ||
468 | 70 | 73 | ||
469 | 71 | [server:main] | 74 | [server:main] |
470 | 72 | use = egg:Paste#http | 75 | use = egg:Paste#http |
Looks good Fabrice, thanks for the branch. A few suggestions.