From 7abdbcb33de6a459d9d064e13e95132e54e797b0 Mon Sep 17 00:00:00 2001 From: Dave Dash Date: Thu, 7 Apr 2011 16:56:33 -0700 Subject: [PATCH] bug 648401, opening the gates --- apps/feedback/tests/test_release_views.py | 155 +--------------------- apps/feedback/views.py | 65 +-------- apps/input/tests/test_redirects.py | 4 +- settings.py | 5 +- 4 files changed, 10 insertions(+), 219 deletions(-) diff --git a/apps/feedback/tests/test_release_views.py b/apps/feedback/tests/test_release_views.py index 03de2b84..c4ff46cf 100644 --- a/apps/feedback/tests/test_release_views.py +++ b/apps/feedback/tests/test_release_views.py @@ -1,5 +1,6 @@ import json +from nose import SkipTest from nose.tools import eq_ from product_details.version_compare import Version from pyquery import PyQuery as pq @@ -33,6 +34,7 @@ def test_no_ua(self): @enforce_ua def test_beta(self): """Beta version on release page: redirect.""" + raise SkipTest r = self._get_page('3.6b2') self.assertRedirects(r, reverse('feedback', channel='beta'), 302, 302) @@ -49,6 +51,7 @@ def notest_old_release(self): @enforce_ua def test_old_release(self): """Pre Fx4: Old release: redirect to beta download page.""" + raise SkipTest r = self._get_page('3.5') eq_(r.status_code, 302) assert r['Location'].endswith(reverse('feedback.download', @@ -91,155 +94,3 @@ def post_feedback(self, data, ajax=False, follow=True): return self.client.post(reverse('feedback', channel='release'), data, **options) - - def test_feedback_loads(self): - """No general errors on release feedback page.""" - r = self.client.get(reverse('feedback', channel='release'), - HTTP_USER_AGENT=(FX_UA % '20.0'), - follow=True) - eq_(r.status_code, 200) - doc = pq(r.content) - # Find all three forms - eq_(doc('article form').length, 3) - - def test_feedback_wrongtype(self): - """Test that giving a wrong type generates a 400.""" - # Wrong number - r = self.post_feedback(dict(type=99, follow=False, ajax=True)) - eq_(r.status_code, 400) - - # Not a number - r = self.post_feedback(dict(type='pancakes', follow=False, ajax=True)) - eq_(r.status_code, 400) - - # No type - r = self.post_feedback(dict(follow=False, ajax=True)) - eq_(r.status_code, 400) - - def test_rating(self): - """Submit rating form with and without AJAX.""" - data = {'type': OPINION_RATING.id} - for type in RATING_USAGE: - data[type.short] = RATING_CHOICES[type.id % len(RATING_CHOICES)][0] - - for ajax in True, False: - r = self.post_feedback(data, follow=False, ajax=ajax) - if not ajax: - eq_(r.status_code, 302) - assert r['Location'].endswith( - reverse('feedback', channel='release') + '#thanks') - else: - eq_(r.status_code, 200) - eq_(r['Content-Type'], 'application/json') - - # Check the content made it into the database. - latest = Opinion.objects.no_cache().order_by('-id')[0] - eq_(latest.ratings.count(), len(RATING_USAGE)) - latest.delete() - - def test_rating_errors(self): - # Empty POST: Count errors - for ajax in True, False: - r = self.post_feedback({'type': OPINION_RATING.id}, ajax=ajax) - if not ajax: - doc = pq(r.content) - eq_(doc('article#rate form .errorlist').text(), - 'Please rate at least one item.') - else: - eq_(r.status_code, 400) - errors = json.loads(r.content) - eq_(len(errors), 1) - - def test_rating_one_item(self): - data = {'type': OPINION_RATING.id} - type = RATING_USAGE[0] - data[type.short] = 1 - r = self.post_feedback(data, ajax=True) - eq_(r.status_code, 200) - latest = Opinion.objects.no_cache().order_by('-id')[0] - eq_(latest.ratings.count(), 1) - - def test_broken(self): - """Submit broken website report with and without AJAX.""" - # Empty POST: Count errors - for ajax in True, False: - r = self.post_feedback({'type': OPINION_BROKEN.id}, ajax=ajax) - if not ajax: - doc = pq(r.content) - eq_(doc('article#broken form .errorlist').length, 2) - else: - eq_(r.status_code, 400) - errors = json.loads(r.content) - assert 'url' in errors - assert 'description' in errors - - # Submit actual form - data = { - 'type': OPINION_BROKEN.id, - 'url': 'http://example.com/broken', - 'description': 'This does not work.', - } - - for ajax in True, False: - r = self.post_feedback(data, follow=False, ajax=ajax) - if not ajax: - eq_(r.status_code, 302) - assert r['Location'].endswith( - reverse('feedback', channel='release') + '#thanks') - else: - eq_(r.status_code, 200) - eq_(r['Content-Type'], 'application/json') - - # Check the content made it into the database. - latest = Opinion.objects.no_cache().order_by('-id')[0] - eq_(latest.description, data['description']) - eq_(latest.url, data['url']) - latest.delete() - - def test_idea(self): - """Submit idea with and without AJAX.""" - # Empty POST: Count errors - for ajax in True, False: - r = self.post_feedback({'type': OPINION_IDEA.id}, ajax=ajax) - if not ajax: - doc = pq(r.content) - eq_(doc('article#idea form .errorlist').length, 1) - else: - eq_(r.status_code, 400) - errors = json.loads(r.content) - assert 'description' in errors - - # Submit actual form - data = { - 'type': OPINION_IDEA.id, - 'description': 'This is an idea.', - } - - for ajax in True, False: - r = self.post_feedback(data, follow=False, ajax=ajax) - if not ajax: - eq_(r.status_code, 302) - assert r['Location'].endswith( - reverse('feedback', channel='release') + '#thanks') - else: - eq_(r.status_code, 200) - eq_(r['Content-Type'], 'application/json') - - # Check the content made it into the database. - latest = Opinion.objects.no_cache().order_by('-id')[0] - eq_(latest.description, data['description']) - latest.delete() - - def test_max_length(self): - """ - Ensure description's max_length attribute is propagated correctly for - JS to pick up. - """ - r = self.client.get(reverse('feedback', channel='release'), - HTTP_USER_AGENT=(FX_UA % '20.0'), - follow=True) - doc = pq(r.content) - eq_(doc('#count-broken-desc').attr('data-max'), - str(MAX_FEEDBACK_LENGTH)) - eq_(doc('#count-idea-desc').attr('data-max'), - str(MAX_IDEA_LENGTH)) diff --git a/apps/feedback/views.py b/apps/feedback/views.py index 0157732a..6266ab45 100644 --- a/apps/feedback/views.py +++ b/apps/feedback/views.py @@ -142,9 +142,9 @@ def give_feedback(request, ua, type): @forward_mobile @vary_on_headers('User-Agent') -@enforce_ua(beta=True) +@enforce_ua(beta=False) @cache_page -def beta_feedback(request, ua): +def feedback(request, ua): """ The index page for beta version feedback, which shows links to the happy and sad feedback pages. @@ -154,67 +154,6 @@ def beta_feedback(request, ua): return jingo.render(request, template) -@forward_mobile -@vary_on_headers('User-Agent') -@enforce_ua(beta=False) -@cache_page -@csrf_exempt -def release_feedback(request, ua): - """The index page for release version feedback.""" - data = { - 'RATING_USAGE': input.RATING_USAGE, - 'RATING_CHOICES': input.RATING_CHOICES, - } - - if request.method == 'POST': - try: - type = int(request.POST.get('type')) - FormType = { - input.OPINION_RATING.id: RatingForm, - input.OPINION_BROKEN.id: BrokenWebsiteForm, - input.OPINION_IDEA.id: IdeaReleaseForm, - }[type] - except (TypeError, ValueError, KeyError): - return http.HttpResponseBadRequest(_('Invalid feedback type')) - - form = FormType(request.POST) - if form.is_valid(): - save_opinion_from_form(request, type, ua, form) - - if request.is_ajax(): - return http.HttpResponse(json.dumps('ok'), - mimetype='application/json') - else: - return http.HttpResponseRedirect( - reverse('feedback', channel='release') + '#thanks') - - elif request.is_ajax(): - # For AJAX request, return errors only. - return http.HttpResponseBadRequest(json.dumps(form.errors), - mimetype='application/json') - - else: - # For non-AJAX, return form with errors, and blank other feedback - # forms. - data.update( - rating_form=(form if type == input.OPINION_RATING.id else - RatingForm()), - website_form=(form if type == input.OPINION_BROKEN.id else - BrokenWebsiteForm()), - idea_form=(form if type == input.OPINION_IDEA.id - else IdeaReleaseForm())) - - else: - data.update(rating_form=RatingForm(), website_form=BrokenWebsiteForm(), - idea_form=IdeaReleaseForm()) - - template = 'feedback/%srelease_index.html' % ( - 'mobile/' if request.mobile_site else '') - return jingo.render(request, template, data) - -feedback = negotiate(beta=beta_feedback, release=release_feedback) - - @cache_page def need_beta(request): """Encourage people to download a current beta version.""" diff --git a/apps/input/tests/test_redirects.py b/apps/input/tests/test_redirects.py index c37f1e05..99cc151e 100644 --- a/apps/input/tests/test_redirects.py +++ b/apps/input/tests/test_redirects.py @@ -8,8 +8,8 @@ class RedirectTests(InputTestCase): def test_redirects(self): redirect = lambda x: '/en-US/%s/%s' % (settings.DEFAULT_CHANNEL, x) redirs = { - '/feedback': '/en-US/release/feedback', - '/thanks': '/en-US/%s/thanks' % settings.DEFAULT_CHANNEL, + '/feedback': '/en-US/feedback', + '/thanks': '/en-US/thanks', '/themes': '/en-US/%s/themes' % settings.DEFAULT_CHANNEL, '/sites': redirect('sites') } diff --git a/settings.py b/settings.py index 5e9a0ef1..203aedfb 100644 --- a/settings.py +++ b/settings.py @@ -100,7 +100,8 @@ def __new__(self): SUPPORTED_NONLOCALES = ('media', 'admin') # TODO: These will be ported to /feeedback/beta -SUPPORTED_NONCHANNELS = ('media', 'admin', 'happy', 'sad', 'about', 'idea') +SUPPORTED_NONCHANNELS = ('media', 'admin', 'feedback', 'happy', 'sad', 'about', + 'idea', 'thanks') DEFAULT_CHANNEL = 'release' TEXT_DOMAIN = 'messages' @@ -343,4 +344,4 @@ def JINJA_CONFIG(): ## FEATURE FLAGS: # Setting this to False allows feedback to be collected from any user agent. # (good for testing) -ENFORCE_USER_AGENT = True +ENFORCE_USER_AGENT = False