summaryrefslogtreecommitdiff
path: root/tests/force_insert_update
diff options
context:
space:
mode:
authorFlorian Apolloner <florian@apolloner.eu>2013-02-26 09:53:47 +0100
committerFlorian Apolloner <florian@apolloner.eu>2013-02-26 14:36:57 +0100
commit89f40e36246100df6a11316c31a76712ebc6c501 (patch)
tree6e65639683ddaf2027908d1ecb1739e0e2ff853b /tests/force_insert_update
parentb3d2ccb5bfbaf6e7fe1f98843baaa48c35a70950 (diff)
downloaddjango-89f40e36246100df6a11316c31a76712ebc6c501.tar.gz
Merged regressiontests and modeltests into the test root.
Diffstat (limited to 'tests/force_insert_update')
-rw-r--r--tests/force_insert_update/__init__.py0
-rw-r--r--tests/force_insert_update/models.py24
-rw-r--r--tests/force_insert_update/tests.py63
3 files changed, 87 insertions, 0 deletions
diff --git a/tests/force_insert_update/__init__.py b/tests/force_insert_update/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/force_insert_update/__init__.py
diff --git a/tests/force_insert_update/models.py b/tests/force_insert_update/models.py
new file mode 100644
index 0000000000..56d6624e0d
--- /dev/null
+++ b/tests/force_insert_update/models.py
@@ -0,0 +1,24 @@
+"""
+Tests for forcing insert and update queries (instead of Django's normal
+automatic behavior).
+"""
+from django.db import models
+
+
+class Counter(models.Model):
+ name = models.CharField(max_length = 10)
+ value = models.IntegerField()
+
+class InheritedCounter(Counter):
+ tag = models.CharField(max_length=10)
+
+class ProxyCounter(Counter):
+ class Meta:
+ proxy = True
+
+class SubCounter(Counter):
+ pass
+
+class WithCustomPK(models.Model):
+ name = models.IntegerField(primary_key=True)
+ value = models.IntegerField()
diff --git a/tests/force_insert_update/tests.py b/tests/force_insert_update/tests.py
new file mode 100644
index 0000000000..a5b2dcebb5
--- /dev/null
+++ b/tests/force_insert_update/tests.py
@@ -0,0 +1,63 @@
+from __future__ import absolute_import
+
+from django.db import transaction, IntegrityError, DatabaseError
+from django.test import TestCase
+
+from .models import (Counter, WithCustomPK, InheritedCounter, ProxyCounter,
+ SubCounter)
+
+
+class ForceTests(TestCase):
+ def test_force_update(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)
+
+ # Won't work because force_update and force_insert are mutually
+ # exclusive
+ c.value = 4
+ self.assertRaises(ValueError, c.save, force_insert=True, force_update=True)
+
+ # 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)
+
+ # Won't work because we can't insert a pk of the same value.
+ sid = transaction.savepoint()
+ c.value = 5
+ self.assertRaises(IntegrityError, c.save, force_insert=True)
+ 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)
+ self.assertRaises(DatabaseError, obj.save, force_update=True)
+
+
+class InheritanceTests(TestCase):
+ def test_force_update_on_inherited_model(self):
+ a = InheritedCounter(name="count", value=1, tag="spam")
+ a.save()
+ a.save(force_update=True)
+
+ def test_force_update_on_proxy_model(self):
+ a = ProxyCounter(name="count", value=1)
+ a.save()
+ a.save(force_update=True)
+
+ def test_force_update_on_inherited_model_without_fields(self):
+ '''
+ Issue 13864: force_update fails on subclassed models, if they don't
+ specify custom fields.
+ '''
+ a = SubCounter(name="count", value=1)
+ a.save()
+ a.value = 2
+ a.save(force_update=True)