summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-05-31 00:38:18 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-05-31 00:38:18 -0400
commitf7348366a34a3e1117fd821e29b01323c9bc794f (patch)
tree6dd1f6f8d04b9adf33b71d2bfc019304a7a20257
parent714311f3d883c6589d278e3e2a05bd1583e4b96d (diff)
downloadaskbot-f7348366a34a3e1117fd821e29b01323c9bc794f.tar.gz
askbot-f7348366a34a3e1117fd821e29b01323c9bc794f.tar.bz2
askbot-f7348366a34a3e1117fd821e29b01323c9bc794f.zip
all forum reader urls are covered by unit tests
-rw-r--r--forum/middleware/pagesize.py2
-rw-r--r--forum/tests.py196
-rw-r--r--forum/views/users.py27
-rwxr-xr-xrun-tests1
-rw-r--r--urls.py2
5 files changed, 212 insertions, 16 deletions
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