summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorKaren Tracey <kmtracey@gmail.com>2009-01-16 02:30:22 +0000
committerKaren Tracey <kmtracey@gmail.com>2009-01-16 02:30:22 +0000
commit344f16e2205a4959ba65d975716a38db77d2061e (patch)
treef87bf6bde5db1a4c566a1b4d44927d4a2ecfc4f6 /tests
parentf9f9d703cfef64766ab5a3d7cb5d79298367f621 (diff)
Fixed #8138 -- Changed django.test.TestCase to rollback tests (when the database supports it) instead of flushing and reloading the database. This can substantially reduce the time it takes to run large test suites.
This change may be slightly backwards incompatible, if existing tests need to test transactional behavior, or if they rely on invalid assumptions or a specific test case ordering. For the first case, django.test.TransactionTestCase should be used. TransactionTestCase is also a quick fix to get around test case errors revealed by the new rollback approach, but a better long-term fix is to correct the test case. See the testing doc for full details. Many thanks to: * Marc Remolt for the initial proposal and implementation. * Luke Plant for initial testing and improving the implementation. * Ramiro Morales for feedback and help with tracking down a mysterious PostgreSQL issue. * Eric Holscher for feedback regarding the effect of the change on the Ellington testsuite. * Russell Keith-Magee for guidance and feedback from beginning to end. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9756 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/regressiontests/comment_tests/tests/comment_view_tests.py21
-rw-r--r--tests/regressiontests/comment_tests/tests/moderation_view_tests.py77
-rw-r--r--tests/regressiontests/file_uploads/tests.py3
-rw-r--r--tests/regressiontests/generic_inline_admin/tests.py9
4 files changed, 68 insertions, 42 deletions
diff --git a/tests/regressiontests/comment_tests/tests/comment_view_tests.py b/tests/regressiontests/comment_tests/tests/comment_view_tests.py
index 0c975116ef..312fab633f 100644
--- a/tests/regressiontests/comment_tests/tests/comment_view_tests.py
+++ b/tests/regressiontests/comment_tests/tests/comment_view_tests.py
@@ -1,3 +1,4 @@
+import re
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.comments import signals
@@ -5,6 +6,8 @@ from django.contrib.comments.models import Comment
from regressiontests.comment_tests.models import Article
from regressiontests.comment_tests.tests import CommentTestCase
+post_redirect_re = re.compile(r'^http://testserver/posted/\?c=(?P<pk>\d+$)')
+
class CommentViewTests(CommentTestCase):
def testPostCommentHTTPMethods(self):
@@ -181,18 +184,26 @@ class CommentViewTests(CommentTestCase):
a = Article.objects.get(pk=1)
data = self.getValidData(a)
response = self.client.post("/post/", data)
- self.assertEqual(response["Location"], "http://testserver/posted/?c=1")
-
+ location = response["Location"]
+ match = post_redirect_re.match(location)
+ self.failUnless(match != None, "Unexpected redirect location: %s" % location)
+
data["next"] = "/somewhere/else/"
data["comment"] = "This is another comment"
response = self.client.post("/post/", data)
- self.assertEqual(response["Location"], "http://testserver/somewhere/else/?c=2")
+ location = response["Location"]
+ match = re.search(r"^http://testserver/somewhere/else/\?c=\d+$", location)
+ self.failUnless(match != None, "Unexpected redirect location: %s" % location)
def testCommentDoneView(self):
a = Article.objects.get(pk=1)
data = self.getValidData(a)
response = self.client.post("/post/", data)
- response = self.client.get("/posted/", {'c':1})
+ location = response["Location"]
+ match = post_redirect_re.match(location)
+ self.failUnless(match != None, "Unexpected redirect location: %s" % location)
+ pk = int(match.group('pk'))
+ response = self.client.get(location)
self.assertTemplateUsed(response, "comments/posted.html")
- self.assertEqual(response.context[0]["comment"], Comment.objects.get(pk=1))
+ self.assertEqual(response.context[0]["comment"], Comment.objects.get(pk=pk))
diff --git a/tests/regressiontests/comment_tests/tests/moderation_view_tests.py b/tests/regressiontests/comment_tests/tests/moderation_view_tests.py
index 2f6b51d709..b9eadd78b4 100644
--- a/tests/regressiontests/comment_tests/tests/moderation_view_tests.py
+++ b/tests/regressiontests/comment_tests/tests/moderation_view_tests.py
@@ -8,39 +8,43 @@ class FlagViewTests(CommentTestCase):
def testFlagGet(self):
"""GET the flag view: render a confirmation page."""
- self.createSomeComments()
+ comments = self.createSomeComments()
+ pk = comments[0].pk
self.client.login(username="normaluser", password="normaluser")
- response = self.client.get("/flag/1/")
+ response = self.client.get("/flag/%d/" % pk)
self.assertTemplateUsed(response, "comments/flag.html")
def testFlagPost(self):
"""POST the flag view: actually flag the view (nice for XHR)"""
- self.createSomeComments()
+ comments = self.createSomeComments()
+ pk = comments[0].pk
self.client.login(username="normaluser", password="normaluser")
- response = self.client.post("/flag/1/")
- self.assertEqual(response["Location"], "http://testserver/flagged/?c=1")
- c = Comment.objects.get(pk=1)
+ response = self.client.post("/flag/%d/" % pk)
+ self.assertEqual(response["Location"], "http://testserver/flagged/?c=%d" % pk)
+ c = Comment.objects.get(pk=pk)
self.assertEqual(c.flags.filter(flag=CommentFlag.SUGGEST_REMOVAL).count(), 1)
return c
def testFlagPostTwice(self):
"""Users don't get to flag comments more than once."""
c = self.testFlagPost()
- self.client.post("/flag/1/")
- self.client.post("/flag/1/")
+ self.client.post("/flag/%d/" % c.pk)
+ self.client.post("/flag/%d/" % c.pk)
self.assertEqual(c.flags.filter(flag=CommentFlag.SUGGEST_REMOVAL).count(), 1)
def testFlagAnon(self):
"""GET/POST the flag view while not logged in: redirect to log in."""
- self.createSomeComments()
- response = self.client.get("/flag/1/")
- self.assertEqual(response["Location"], "http://testserver/accounts/login/?next=/flag/1/")
- response = self.client.post("/flag/1/")
- self.assertEqual(response["Location"], "http://testserver/accounts/login/?next=/flag/1/")
+ comments = self.createSomeComments()
+ pk = comments[0].pk
+ response = self.client.get("/flag/%d/" % pk)
+ self.assertEqual(response["Location"], "http://testserver/accounts/login/?next=/flag/%d/" % pk)
+ response = self.client.post("/flag/%d/" % pk)
+ self.assertEqual(response["Location"], "http://testserver/accounts/login/?next=/flag/%d/" % pk)
def testFlaggedView(self):
- self.createSomeComments()
- response = self.client.get("/flagged/", data={"c":1})
+ comments = self.createSomeComments()
+ pk = comments[0].pk
+ response = self.client.get("/flagged/", data={"c":pk})
self.assertTemplateUsed(response, "comments/flagged.html")
def testFlagSignals(self):
@@ -70,23 +74,25 @@ class DeleteViewTests(CommentTestCase):
def testDeletePermissions(self):
"""The delete view should only be accessible to 'moderators'"""
- self.createSomeComments()
+ comments = self.createSomeComments()
+ pk = comments[0].pk
self.client.login(username="normaluser", password="normaluser")
- response = self.client.get("/delete/1/")
- self.assertEqual(response["Location"], "http://testserver/accounts/login/?next=/delete/1/")
+ response = self.client.get("/delete/%d/" % pk)
+ self.assertEqual(response["Location"], "http://testserver/accounts/login/?next=/delete/%d/" % pk)
makeModerator("normaluser")
- response = self.client.get("/delete/1/")
+ response = self.client.get("/delete/%d/" % pk)
self.assertEqual(response.status_code, 200)
def testDeletePost(self):
"""POSTing the delete view should mark the comment as removed"""
- self.createSomeComments()
+ comments = self.createSomeComments()
+ pk = comments[0].pk
makeModerator("normaluser")
self.client.login(username="normaluser", password="normaluser")
- response = self.client.post("/delete/1/")
- self.assertEqual(response["Location"], "http://testserver/deleted/?c=1")
- c = Comment.objects.get(pk=1)
+ response = self.client.post("/delete/%d/" % pk)
+ self.assertEqual(response["Location"], "http://testserver/deleted/?c=%d" % pk)
+ c = Comment.objects.get(pk=pk)
self.failUnless(c.is_removed)
self.assertEqual(c.flags.filter(flag=CommentFlag.MODERATOR_DELETION, user__username="normaluser").count(), 1)
@@ -103,21 +109,23 @@ class DeleteViewTests(CommentTestCase):
self.assertEqual(received_signals, [signals.comment_was_flagged])
def testDeletedView(self):
- self.createSomeComments()
- response = self.client.get("/deleted/", data={"c":1})
+ comments = self.createSomeComments()
+ pk = comments[0].pk
+ response = self.client.get("/deleted/", data={"c":pk})
self.assertTemplateUsed(response, "comments/deleted.html")
class ApproveViewTests(CommentTestCase):
def testApprovePermissions(self):
"""The delete view should only be accessible to 'moderators'"""
- self.createSomeComments()
+ comments = self.createSomeComments()
+ pk = comments[0].pk
self.client.login(username="normaluser", password="normaluser")
- response = self.client.get("/approve/1/")
- self.assertEqual(response["Location"], "http://testserver/accounts/login/?next=/approve/1/")
+ response = self.client.get("/approve/%d/" % pk)
+ self.assertEqual(response["Location"], "http://testserver/accounts/login/?next=/approve/%d/" % pk)
makeModerator("normaluser")
- response = self.client.get("/approve/1/")
+ response = self.client.get("/approve/%d/" % pk)
self.assertEqual(response.status_code, 200)
def testApprovePost(self):
@@ -127,9 +135,9 @@ class ApproveViewTests(CommentTestCase):
makeModerator("normaluser")
self.client.login(username="normaluser", password="normaluser")
- response = self.client.post("/approve/1/")
- self.assertEqual(response["Location"], "http://testserver/approved/?c=1")
- c = Comment.objects.get(pk=1)
+ response = self.client.post("/approve/%d/" % c1.pk)
+ self.assertEqual(response["Location"], "http://testserver/approved/?c=%d" % c1.pk)
+ c = Comment.objects.get(pk=c1.pk)
self.failUnless(c.is_public)
self.assertEqual(c.flags.filter(flag=CommentFlag.MODERATOR_APPROVAL, user__username="normaluser").count(), 1)
@@ -146,8 +154,9 @@ class ApproveViewTests(CommentTestCase):
self.assertEqual(received_signals, [signals.comment_was_flagged])
def testApprovedView(self):
- self.createSomeComments()
- response = self.client.get("/approved/", data={"c":1})
+ comments = self.createSomeComments()
+ pk = comments[0].pk
+ response = self.client.get("/approved/", data={"c":pk})
self.assertTemplateUsed(response, "comments/approved.html")
diff --git a/tests/regressiontests/file_uploads/tests.py b/tests/regressiontests/file_uploads/tests.py
index 6fcd8a99aa..21f8ad4de2 100644
--- a/tests/regressiontests/file_uploads/tests.py
+++ b/tests/regressiontests/file_uploads/tests.py
@@ -238,6 +238,9 @@ class DirectoryCreationTests(unittest.TestCase):
self.obj = FileModel()
if not os.path.isdir(temp_storage.location):
os.makedirs(temp_storage.location)
+ if os.path.isdir(UPLOAD_TO):
+ os.chmod(UPLOAD_TO, 0700)
+ shutil.rmtree(UPLOAD_TO)
def tearDown(self):
os.chmod(temp_storage.location, 0700)
diff --git a/tests/regressiontests/generic_inline_admin/tests.py b/tests/regressiontests/generic_inline_admin/tests.py
index e03cc1f2f4..a3ea5fc60b 100644
--- a/tests/regressiontests/generic_inline_admin/tests.py
+++ b/tests/regressiontests/generic_inline_admin/tests.py
@@ -21,8 +21,10 @@ class GenericAdminViewTest(TestCase):
# relies on content type IDs, which will vary depending on what
# other tests have been run), thus we do it here.
e = Episode.objects.create(name='This Week in Django')
+ self.episode_pk = e.pk
m = Media(content_object=e, url='http://example.com/podcast.mp3')
m.save()
+ self.media_pk = m.pk
def tearDown(self):
self.client.logout()
@@ -39,7 +41,7 @@ class GenericAdminViewTest(TestCase):
"""
A smoke test to ensure GET on the change_view works.
"""
- response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episode/1/')
+ response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episode/%d/' % self.episode_pk)
self.failUnlessEqual(response.status_code, 200)
def testBasicAddPost(self):
@@ -64,10 +66,11 @@ class GenericAdminViewTest(TestCase):
# inline data
"generic_inline_admin-media-content_type-object_id-TOTAL_FORMS": u"2",
"generic_inline_admin-media-content_type-object_id-INITIAL_FORMS": u"1",
- "generic_inline_admin-media-content_type-object_id-0-id": u"1",
+ "generic_inline_admin-media-content_type-object_id-0-id": u"%d" % self.media_pk,
"generic_inline_admin-media-content_type-object_id-0-url": u"http://example.com/podcast.mp3",
"generic_inline_admin-media-content_type-object_id-1-id": u"",
"generic_inline_admin-media-content_type-object_id-1-url": u"",
}
- response = self.client.post('/generic_inline_admin/admin/generic_inline_admin/episode/1/', post_data)
+ url = '/generic_inline_admin/admin/generic_inline_admin/episode/%d/' % self.episode_pk
+ response = self.client.post(url, post_data)
self.failUnlessEqual(response.status_code, 302) # redirect somewhere