1
0
mirror of https://github.com/django/django.git synced 2025-07-05 18:29:11 +00:00

[soc2010/test-refactor] Converted force_insert_update to unittest. We have always been at war with doctests.

git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/test-refactor@13395 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Paul McMillan 2010-06-23 14:12:45 +00:00
parent e09d2de906
commit 2ca92d49f8
2 changed files with 50 additions and 52 deletions

View File

@ -2,7 +2,7 @@
Tests for forcing insert and update queries (instead of Django's normal Tests for forcing insert and update queries (instead of Django's normal
automatic behaviour). automatic behaviour).
""" """
from django.db import models, transaction, IntegrityError from django.db import models
class Counter(models.Model): class Counter(models.Model):
name = models.CharField(max_length = 10) name = models.CharField(max_length = 10)
@ -11,54 +11,3 @@ class Counter(models.Model):
class WithCustomPK(models.Model): class WithCustomPK(models.Model):
name = models.IntegerField(primary_key=True) name = models.IntegerField(primary_key=True)
value = models.IntegerField() value = models.IntegerField()
__test__ = {"API_TESTS": """
>>> c = Counter.objects.create(name="one", value=1)
# The normal case
>>> c.value = 2
>>> c.save()
# Same thing, via an update
>>> c.value = 3
>>> c.save(force_update=True)
# Won't work because force_update and force_insert are mutually exclusive
>>> c.value = 4
>>> c.save(force_insert=True, force_update=True)
Traceback (most recent call last):
...
ValueError: Cannot force both insert and updating in model saving.
# Try to update something that doesn't have a primary key in the first place.
>>> c1 = Counter(name="two", value=2)
>>> c1.save(force_update=True)
Traceback (most recent call last):
...
ValueError: Cannot force an update in save() with no primary key.
>>> c1.save(force_insert=True)
# Won't work because we can't insert a pk of the same value.
>>> sid = transaction.savepoint()
>>> c.value = 5
>>> try:
... c.save(force_insert=True)
... except Exception, e:
... if isinstance(e, IntegrityError):
... print "Pass"
... else:
... print "Fail with %s" % type(e)
Pass
>>> transaction.savepoint_rollback(sid)
# Trying to update should still fail, even with manual primary keys, if the
# data isn't in the database already.
>>> obj = WithCustomPK(name=1, value=1)
>>> obj.save(force_update=True)
Traceback (most recent call last):
...
DatabaseError: ...
"""
}

View File

@ -0,0 +1,49 @@
from django.test import TestCase
from models import Counter, WithCustomPK
from django.db import DatabaseError, IntegrityError
class ForceInsertUpdateTestCase(TestCase):
def test_normal_case(self):
c = Counter.objects.create(name="one", value=1)
# The normal case
c.value = 2
c.save()
# Same thing, via an update
c.value = 3
c.save(force_update=True)
def test_update_and_insert_simultaneously(self):
# Won't work because force_update and force_insert are
# mutually exclusive
c = Counter.objects.create(name="one", value=1)
self.assertRaises(ValueError,
c.save,
force_insert=True, force_update=True)
def test_update_with_no_pk(self):
# Try to update something that doesn't have a primary key in
# the first place.
c1 = Counter(name="two", value=2)
self.assertRaises(ValueError,
c1.save,
force_update=True)
c1.save(force_insert=True)
def test_insert_duplicate_pk(self):
# Won't work because we can't insert a pk of the same value.
c = Counter.objects.create(name="one", value=1)
c.value = 2
self.assertRaises(IntegrityError,
c.save,
force_insert=True)
def test_nonexistent_update(self):
# Trying to update should still fail, even with manual primary
# keys, if the data isn't in the database already.
obj = WithCustomPK(name=1, value=1)
self.assertRaises(DatabaseError,
obj.save,
force_update=True)