summaryrefslogtreecommitdiff
path: root/tests/get_or_create
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/get_or_create
parentb3d2ccb5bfbaf6e7fe1f98843baaa48c35a70950 (diff)
downloaddjango-89f40e36246100df6a11316c31a76712ebc6c501.tar.gz
Merged regressiontests and modeltests into the test root.
Diffstat (limited to 'tests/get_or_create')
-rw-r--r--tests/get_or_create/__init__.py0
-rw-r--r--tests/get_or_create/models.py26
-rw-r--r--tests/get_or_create/tests.py66
3 files changed, 92 insertions, 0 deletions
diff --git a/tests/get_or_create/__init__.py b/tests/get_or_create/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/get_or_create/__init__.py
diff --git a/tests/get_or_create/models.py b/tests/get_or_create/models.py
new file mode 100644
index 0000000000..678f5a401c
--- /dev/null
+++ b/tests/get_or_create/models.py
@@ -0,0 +1,26 @@
+"""
+33. get_or_create()
+
+``get_or_create()`` does what it says: it tries to look up an object with the
+given parameters. If an object isn't found, it creates one with the given
+parameters.
+"""
+
+from __future__ import unicode_literals
+
+from django.db import models
+from django.utils.encoding import python_2_unicode_compatible
+
+
+@python_2_unicode_compatible
+class Person(models.Model):
+ first_name = models.CharField(max_length=100)
+ last_name = models.CharField(max_length=100)
+ birthday = models.DateField()
+
+ def __str__(self):
+ return '%s %s' % (self.first_name, self.last_name)
+
+class ManualPrimaryKeyTest(models.Model):
+ id = models.IntegerField(primary_key=True)
+ data = models.CharField(max_length=100)
diff --git a/tests/get_or_create/tests.py b/tests/get_or_create/tests.py
new file mode 100644
index 0000000000..1e300fbb4d
--- /dev/null
+++ b/tests/get_or_create/tests.py
@@ -0,0 +1,66 @@
+from __future__ import absolute_import
+
+from datetime import date
+import traceback
+
+from django.db import IntegrityError
+from django.test import TestCase
+
+from .models import Person, ManualPrimaryKeyTest
+
+
+class GetOrCreateTests(TestCase):
+ def test_get_or_create(self):
+ p = Person.objects.create(
+ first_name='John', last_name='Lennon', birthday=date(1940, 10, 9)
+ )
+
+ p, created = Person.objects.get_or_create(
+ first_name="John", last_name="Lennon", defaults={
+ "birthday": date(1940, 10, 9)
+ }
+ )
+ self.assertFalse(created)
+ self.assertEqual(Person.objects.count(), 1)
+
+ p, created = Person.objects.get_or_create(
+ first_name='George', last_name='Harrison', defaults={
+ 'birthday': date(1943, 2, 25)
+ }
+ )
+ self.assertTrue(created)
+ self.assertEqual(Person.objects.count(), 2)
+
+ # If we execute the exact same statement, it won't create a Person.
+ p, created = Person.objects.get_or_create(
+ first_name='George', last_name='Harrison', defaults={
+ 'birthday': date(1943, 2, 25)
+ }
+ )
+ self.assertFalse(created)
+ self.assertEqual(Person.objects.count(), 2)
+
+ # If you don't specify a value or default value for all required
+ # fields, you will get an error.
+ self.assertRaises(IntegrityError,
+ Person.objects.get_or_create, first_name="Tom", last_name="Smith"
+ )
+
+ # If you specify an existing primary key, but different other fields,
+ # then you will get an error and data will not be updated.
+ m = ManualPrimaryKeyTest.objects.create(id=1, data="Original")
+ self.assertRaises(IntegrityError,
+ ManualPrimaryKeyTest.objects.get_or_create, id=1, data="Different"
+ )
+ self.assertEqual(ManualPrimaryKeyTest.objects.get(id=1).data, "Original")
+
+ # get_or_create should raise IntegrityErrors with the full traceback.
+ # This is tested by checking that a known method call is in the traceback.
+ # We cannot use assertRaises/assertRaises here because we need to inspect
+ # the actual traceback. Refs #16340.
+ try:
+ ManualPrimaryKeyTest.objects.get_or_create(id=1, data="Different")
+ except IntegrityError as e:
+ formatted_traceback = traceback.format_exc()
+ self.assertIn('obj.save', formatted_traceback)
+