From f7348366a34a3e1117fd821e29b01323c9bc794f Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Mon, 31 May 2010 00:38:18 -0400 Subject: all forum reader urls are covered by unit tests --- forum/middleware/pagesize.py | 2 +- forum/tests.py | 196 +++++++++++++++++++++++++++++++++++++++++-- forum/views/users.py | 27 ++++-- run-tests | 1 + urls.py | 2 +- 5 files changed, 212 insertions(+), 16 deletions(-) create mode 100755 run-tests diff --git a/forum/middleware/pagesize.py b/forum/middleware/pagesize.py index 626c84e5..39b9d35b 100644 --- a/forum/middleware/pagesize.py +++ b/forum/middleware/pagesize.py @@ -33,4 +33,4 @@ class QuestionsPageSizeMiddleware(object): import traceback import sys exc_type, exc_value, exc_traceback = sys.exc_info() - logging.debug(repr(traceback.extract_tb(exc_traceback))) + logging.debug(''.join(traceback.format_tb(exc_traceback))) diff --git a/forum/tests.py b/forum/tests.py index 8419dd86..dca9cfad 100644 --- a/forum/tests.py +++ b/forum/tests.py @@ -2,8 +2,11 @@ from django.test import Client, TestCase from django.contrib.auth.models import User from forum import models import datetime +from django.template import defaultfilters from django.core.urlresolvers import reverse + + class AnonymousVisitorTests(TestCase): fixtures = ['forum/fixtures/full_dump.json',] @@ -20,34 +23,110 @@ class AnonymousVisitorTests(TestCase): print 'index works' def test_reader_urls(self): - #todo: test redirects better + """test all reader views thoroughly + on non-crashiness (no correcteness tests here) + """ + def try_url( url_name, status_code=200, template=None, - kwargs={}, redirect_url=None, follow=False + kwargs={}, redirect_url=None, follow=False, + data = {} ): url = reverse(url_name, kwargs = kwargs) - print 'getting url %s' % url - r = self.client.get(url, follow=follow) + url_info = 'getting url %s' % url + if data: + url_info += '?' + '&'.join(['%s=%s' % (k,v) for k,v in data.iteritems()]) + print url_info + + r = self.client.get(url, data=data, follow=follow) if hasattr(self.client, 'redirect_chain'): - print self.client.redirect_chain + print 'redirect chain: %s' % ','.join(self.client.redirect_chain) + self.assertEqual(r.status_code, status_code) + if template: #asuming that there is more than one template + print 'templates are %s' % ','.join([t.name for t in r.template]) self.assertEqual(r.template[0].name, template) + try_url('sitemap') try_url('about', template='about.html') try_url('privacy', template='privacy.html') try_url('logout', template='logout.html') try_url('user_signin', template='authopenid/signin.html') + #todo: test different tabs try_url('tags', template='tags.html') + try_url('tags', data={'sort':'name'}, template='tags.html') + try_url('tags', data={'sort':'used'}, template='tags.html') try_url('badges', template='badges.html') try_url( 'answer_revisions', template='revisions_answer.html', kwargs={'id':38} ) + #todo: test different sort methods and scopes + try_url( + 'questions', + template='questions.html' + ) + try_url( + 'questions', + data={'start_over':'true'}, + template='questions.html' + ) + try_url( + 'questions', + data={'scope':'unanswered'}, + template='questions.html' + ) + try_url( + 'questions', + data={'scope':'all'}, + template='questions.html' + ) + try_url( + 'questions', + data={'scope':'favorite'}, + template='questions.html' + ) + try_url( + 'questions', + data={'scope':'unanswered', 'sort':'latest'}, + template='questions.html' + ) + try_url( + 'questions', + data={'scope':'unanswered', 'sort':'oldest'}, + template='questions.html' + ) + try_url( + 'questions', + data={'scope':'unanswered', 'sort':'active'}, + template='questions.html' + ) + try_url( + 'questions', + data={'scope':'unanswered', 'sort':'inactive'}, + template='questions.html' + ) + try_url( + 'questions', + data={'sort':'hottest'}, + template='questions.html' + ) try_url( 'questions', + data={'sort':'coldest'}, + template='questions.html' + ) + try_url( + 'questions', + data={'sort':'mostvoted'}, + template='questions.html' + ) + try_url( + 'questions', + data={'sort':'leastvoted'}, template='questions.html' ) try_url( @@ -67,9 +146,67 @@ class AnonymousVisitorTests(TestCase): kwargs={'id':17}, template='revisions_question.html' ) + try_url('users', template='users.html') + #todo: really odd naming conventions for sort methods + try_url( + 'users', + template='users.html', + data={'sort':'reputation'}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'newest'}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'last'}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'user'}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'reputation', 'page':2}, + ) try_url( 'users', - template='users.html' + template='users.html', + data={'sort':'newest', 'page':2}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'last', 'page':2}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'user', 'page':2}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'reputation', 'page':1}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'newest', 'page':1}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'last', 'page':1}, + ) + try_url( + 'users', + template='users.html', + data={'sort':'user', 'page':1}, ) try_url( 'edit_user', @@ -78,3 +215,50 @@ class AnonymousVisitorTests(TestCase): status_code=200, follow=True, ) + u = User.objects.get(id=2) + name_slug = defaultfilters.slugify(u.username) + try_url( + 'user_profile', + kwargs={'id': 2, 'slug': name_slug}, + data={'sort':'stats'}, + template='user_stats.html' + ) + try_url( + 'user_profile', + kwargs={'id': 2, 'slug': name_slug}, + data={'sort':'recent'}, + template='user_recent.html' + ) + try_url( + 'user_profile', + kwargs={'id': 2, 'slug': name_slug}, + data={'sort':'responses'}, + status_code=404, + template='404.html' + ) + try_url( + 'user_profile', + kwargs={'id': 2, 'slug': name_slug}, + data={'sort':'reputation'}, + template='user_reputation.html' + ) + try_url( + 'user_profile', + kwargs={'id': 2, 'slug': name_slug}, + data={'sort':'votes'}, + status_code=404, + template='404.html' + ) + try_url( + 'user_profile', + kwargs={'id': 2, 'slug': name_slug}, + data={'sort':'favorites'}, + template='user_favorites.html' + ) + try_url( + 'user_profile', + kwargs={'id': 2, 'slug': name_slug}, + data={'sort':'email_subscriptions'}, + status_code=404, + template='404.html' + ) diff --git a/forum/views/users.py b/forum/views/users.py index dcc247bf..d2c003bc 100644 --- a/forum/views/users.py +++ b/forum/views/users.py @@ -560,6 +560,9 @@ def user_responses(request, user_id, user_view): """ We list answers for question, comments, and answer accepted by others for this user. """ + user = get_object_or_404(models.User, id=user_id) + if request.user != user: + raise Http404 class Response: def __init__(self, type, title, question_id, answer_id, time, username, user_id, content): self.type = type @@ -602,10 +605,19 @@ def user_responses(request, user_id, user_view): 'user_id' ) if len(answers) > 0: - answers = [(Response(TYPE_RESPONSE['QUESTION_ANSWERED'], a['title'], a['question_id'], - a['answer_id'], a['added_at'], a['username'], a['user_id'], a['html'])) for a in answers] - responses.extend(answers) - + answer_responses = [] + for a in answers: + r = Response( + const.TYPE_RESPONSE['QUESTION_ANSWERED'], + a['title'], + a['question_id'], + a['answer_id'], + a['added_at'], + a['username'], + a['user_id'], + a['html'] + ) + responses.extend(answer_responses) # question comments comments = models.Comment.objects.extra( @@ -632,7 +644,7 @@ def user_responses(request, user_id, user_view): ) if len(comments) > 0: - comments = [(Response(TYPE_RESPONSE['QUESTION_COMMENTED'], c['title'], c['question_id'], + comments = [(Response(const.TYPE_RESPONSE['QUESTION_COMMENTED'], c['title'], c['question_id'], '', c['added_at'], c['username'], c['user_id'], c['comment'])) for c in comments] responses.extend(comments) @@ -664,7 +676,7 @@ def user_responses(request, user_id, user_view): ) if len(comments) > 0: - comments = [(Response(TYPE_RESPONSE['ANSWER_COMMENTED'], c['title'], c['question_id'], + comments = [(Response(const.TYPE_RESPONSE['ANSWER_COMMENTED'], c['title'], c['question_id'], c['answer_id'], c['added_at'], c['username'], c['user_id'], c['comment'])) for c in comments] responses.extend(comments) @@ -695,7 +707,7 @@ def user_responses(request, user_id, user_view): 'user_id' ) if len(answers) > 0: - answers = [(Response(TYPE_RESPONSE['ANSWER_ACCEPTED'], a['title'], a['question_id'], + answers = [(Response(const.TYPE_RESPONSE['ANSWER_ACCEPTED'], a['title'], a['question_id'], a['answer_id'], a['added_at'], a['username'], a['user_id'], a['html'])) for a in answers] responses.extend(answers) @@ -867,7 +879,6 @@ def user_favorites(request, user_id, user_view): "view_user" : user }, context_instance=RequestContext(request)) -@login_required def user_email_subscriptions(request, user_id, user_view): user = get_object_or_404(models.User, id=user_id) if request.user != user: diff --git a/run-tests b/run-tests new file mode 100755 index 00000000..642b8a0a --- /dev/null +++ b/run-tests @@ -0,0 +1 @@ +python manage.py test forum diff --git a/urls.py b/urls.py index 8c349456..2a136cfb 100644 --- a/urls.py +++ b/urls.py @@ -1,7 +1,7 @@ """ main url configuration file for the askbot site """ -from django.conf.urls.defaults import patterns, include, url +from django.conf.urls.defaults import patterns, include, handler404, handler500 from django.conf import settings from django.contrib import admin -- cgit v1.2.3-1-g7c22