summaryrefslogtreecommitdiff
path: root/tests/update_only_fields
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/update_only_fields
parentb3d2ccb5bfbaf6e7fe1f98843baaa48c35a70950 (diff)
Merged regressiontests and modeltests into the test root.
Diffstat (limited to 'tests/update_only_fields')
-rw-r--r--tests/update_only_fields/__init__.py0
-rw-r--r--tests/update_only_fields/models.py41
-rw-r--r--tests/update_only_fields/tests.py262
3 files changed, 303 insertions, 0 deletions
diff --git a/tests/update_only_fields/__init__.py b/tests/update_only_fields/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/update_only_fields/__init__.py
diff --git a/tests/update_only_fields/models.py b/tests/update_only_fields/models.py
new file mode 100644
index 0000000000..bf5dd99166
--- /dev/null
+++ b/tests/update_only_fields/models.py
@@ -0,0 +1,41 @@
+
+from django.db import models
+from django.utils.encoding import python_2_unicode_compatible
+
+GENDER_CHOICES = (
+ ('M', 'Male'),
+ ('F', 'Female'),
+)
+
+class Account(models.Model):
+ num = models.IntegerField()
+
+
+@python_2_unicode_compatible
+class Person(models.Model):
+ name = models.CharField(max_length=20)
+ gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
+ pid = models.IntegerField(null=True, default=None)
+
+ def __str__(self):
+ return self.name
+
+
+class Employee(Person):
+ employee_num = models.IntegerField(default=0)
+ profile = models.ForeignKey('Profile', related_name='profiles', null=True)
+ accounts = models.ManyToManyField('Account', related_name='employees', blank=True, null=True)
+
+
+@python_2_unicode_compatible
+class Profile(models.Model):
+ name = models.CharField(max_length=200)
+ salary = models.FloatField(default=1000.0)
+
+ def __str__(self):
+ return self.name
+
+
+class ProxyEmployee(Employee):
+ class Meta:
+ proxy = True
diff --git a/tests/update_only_fields/tests.py b/tests/update_only_fields/tests.py
new file mode 100644
index 0000000000..97c05ddc79
--- /dev/null
+++ b/tests/update_only_fields/tests.py
@@ -0,0 +1,262 @@
+from __future__ import absolute_import
+
+from django.db.models.signals import pre_save, post_save
+from django.test import TestCase
+
+from .models import Person, Employee, ProxyEmployee, Profile, Account
+
+
+class UpdateOnlyFieldsTests(TestCase):
+ def test_update_fields_basic(self):
+ s = Person.objects.create(name='Sara', gender='F')
+ self.assertEqual(s.gender, 'F')
+
+ s.gender = 'M'
+ s.name = 'Ian'
+ s.save(update_fields=['name'])
+
+ s = Person.objects.get(pk=s.pk)
+ self.assertEqual(s.gender, 'F')
+ self.assertEqual(s.name, 'Ian')
+
+ def test_update_fields_deferred(self):
+ s = Person.objects.create(name='Sara', gender='F', pid=22)
+ self.assertEqual(s.gender, 'F')
+
+ s1 = Person.objects.defer("gender", "pid").get(pk=s.pk)
+ s1.name = "Emily"
+ s1.gender = "M"
+
+ with self.assertNumQueries(1):
+ s1.save()
+
+ s2 = Person.objects.get(pk=s1.pk)
+ self.assertEqual(s2.name, "Emily")
+ self.assertEqual(s2.gender, "M")
+
+ def test_update_fields_only_1(self):
+ s = Person.objects.create(name='Sara', gender='F')
+ self.assertEqual(s.gender, 'F')
+
+ s1 = Person.objects.only('name').get(pk=s.pk)
+ s1.name = "Emily"
+ s1.gender = "M"
+
+ with self.assertNumQueries(1):
+ s1.save()
+
+ s2 = Person.objects.get(pk=s1.pk)
+ self.assertEqual(s2.name, "Emily")
+ self.assertEqual(s2.gender, "M")
+
+ def test_update_fields_only_2(self):
+ s = Person.objects.create(name='Sara', gender='F', pid=22)
+ self.assertEqual(s.gender, 'F')
+
+ s1 = Person.objects.only('name').get(pk=s.pk)
+ s1.name = "Emily"
+ s1.gender = "M"
+
+ with self.assertNumQueries(2):
+ s1.save(update_fields=['pid'])
+
+ s2 = Person.objects.get(pk=s1.pk)
+ self.assertEqual(s2.name, "Sara")
+ self.assertEqual(s2.gender, "F")
+
+ def test_update_fields_only_repeated(self):
+ s = Person.objects.create(name='Sara', gender='F')
+ self.assertEqual(s.gender, 'F')
+
+ s1 = Person.objects.only('name').get(pk=s.pk)
+ s1.gender = 'M'
+ with self.assertNumQueries(1):
+ s1.save()
+ # Test that the deferred class does not remember that gender was
+ # set, instead the instace should remember this.
+ s1 = Person.objects.only('name').get(pk=s.pk)
+ with self.assertNumQueries(1):
+ s1.save()
+
+ def test_update_fields_inheritance_defer(self):
+ profile_boss = Profile.objects.create(name='Boss', salary=3000)
+ e1 = Employee.objects.create(name='Sara', gender='F',
+ employee_num=1, profile=profile_boss)
+ e1 = Employee.objects.only('name').get(pk=e1.pk)
+ e1.name = 'Linda'
+ with self.assertNumQueries(1):
+ e1.save()
+ self.assertEqual(Employee.objects.get(pk=e1.pk).name,
+ 'Linda')
+
+ def test_update_fields_fk_defer(self):
+ profile_boss = Profile.objects.create(name='Boss', salary=3000)
+ profile_receptionist = Profile.objects.create(name='Receptionist', salary=1000)
+ e1 = Employee.objects.create(name='Sara', gender='F',
+ employee_num=1, profile=profile_boss)
+ e1 = Employee.objects.only('profile').get(pk=e1.pk)
+ e1.profile = profile_receptionist
+ with self.assertNumQueries(1):
+ e1.save()
+ self.assertEqual(Employee.objects.get(pk=e1.pk).profile, profile_receptionist)
+ e1.profile_id = profile_boss.pk
+ with self.assertNumQueries(1):
+ e1.save()
+ self.assertEqual(Employee.objects.get(pk=e1.pk).profile, profile_boss)
+
+ def test_select_related_only_interaction(self):
+ profile_boss = Profile.objects.create(name='Boss', salary=3000)
+ e1 = Employee.objects.create(name='Sara', gender='F',
+ employee_num=1, profile=profile_boss)
+ e1 = Employee.objects.only('profile__salary').select_related('profile').get(pk=e1.pk)
+ profile_boss.name = 'Clerk'
+ profile_boss.salary = 1000
+ profile_boss.save()
+ # The loaded salary of 3000 gets saved, the name of 'Clerk' isn't
+ # overwritten.
+ with self.assertNumQueries(1):
+ e1.profile.save()
+ reloaded_profile = Profile.objects.get(pk=profile_boss.pk)
+ self.assertEqual(reloaded_profile.name, profile_boss.name)
+ self.assertEqual(reloaded_profile.salary, 3000)
+
+ def test_update_fields_m2m(self):
+ profile_boss = Profile.objects.create(name='Boss', salary=3000)
+ e1 = Employee.objects.create(name='Sara', gender='F',
+ employee_num=1, profile=profile_boss)
+
+ a1 = Account.objects.create(num=1)
+ a2 = Account.objects.create(num=2)
+
+ e1.accounts = [a1,a2]
+
+ with self.assertRaises(ValueError):
+ e1.save(update_fields=['accounts'])
+
+ def test_update_fields_inheritance(self):
+ profile_boss = Profile.objects.create(name='Boss', salary=3000)
+ profile_receptionist = Profile.objects.create(name='Receptionist', salary=1000)
+
+ e1 = Employee.objects.create(name='Sara', gender='F',
+ employee_num=1, profile=profile_boss)
+
+ e1.name = 'Ian'
+ e1.gender = 'M'
+ e1.save(update_fields=['name'])
+
+ e2 = Employee.objects.get(pk=e1.pk)
+ self.assertEqual(e2.name, 'Ian')
+ self.assertEqual(e2.gender, 'F')
+ self.assertEqual(e2.profile, profile_boss)
+
+ e2.profile = profile_receptionist
+ e2.name = 'Sara'
+ e2.save(update_fields=['profile'])
+
+ e3 = Employee.objects.get(pk=e1.pk)
+ self.assertEqual(e3.name, 'Ian')
+ self.assertEqual(e3.profile, profile_receptionist)
+
+ with self.assertNumQueries(1):
+ e3.profile = profile_boss
+ e3.save(update_fields=['profile_id'])
+
+ e4 = Employee.objects.get(pk=e3.pk)
+ self.assertEqual(e4.profile, profile_boss)
+ self.assertEqual(e4.profile_id, profile_boss.pk)
+
+ def test_update_fields_inheritance_with_proxy_model(self):
+ profile_boss = Profile.objects.create(name='Boss', salary=3000)
+ profile_receptionist = Profile.objects.create(name='Receptionist', salary=1000)
+
+ e1 = ProxyEmployee.objects.create(name='Sara', gender='F',
+ employee_num=1, profile=profile_boss)
+
+ e1.name = 'Ian'
+ e1.gender = 'M'
+ e1.save(update_fields=['name'])
+
+ e2 = ProxyEmployee.objects.get(pk=e1.pk)
+ self.assertEqual(e2.name, 'Ian')
+ self.assertEqual(e2.gender, 'F')
+ self.assertEqual(e2.profile, profile_boss)
+
+ e2.profile = profile_receptionist
+ e2.name = 'Sara'
+ e2.save(update_fields=['profile'])
+
+ e3 = ProxyEmployee.objects.get(pk=e1.pk)
+ self.assertEqual(e3.name, 'Ian')
+ self.assertEqual(e3.profile, profile_receptionist)
+
+ def test_update_fields_signals(self):
+ p = Person.objects.create(name='Sara', gender='F')
+ pre_save_data = []
+ def pre_save_receiver(**kwargs):
+ pre_save_data.append(kwargs['update_fields'])
+ pre_save.connect(pre_save_receiver)
+ post_save_data = []
+ def post_save_receiver(**kwargs):
+ post_save_data.append(kwargs['update_fields'])
+ post_save.connect(post_save_receiver)
+ p.save(update_fields=['name'])
+ self.assertEqual(len(pre_save_data), 1)
+ self.assertEqual(len(pre_save_data[0]), 1)
+ self.assertTrue('name' in pre_save_data[0])
+ self.assertEqual(len(post_save_data), 1)
+ self.assertEqual(len(post_save_data[0]), 1)
+ self.assertTrue('name' in post_save_data[0])
+
+ pre_save.disconnect(pre_save_receiver)
+ post_save.disconnect(post_save_receiver)
+
+ def test_update_fields_incorrect_params(self):
+ s = Person.objects.create(name='Sara', gender='F')
+
+ with self.assertRaises(ValueError):
+ s.save(update_fields=['first_name'])
+
+ with self.assertRaises(ValueError):
+ s.save(update_fields="name")
+
+ def test_empty_update_fields(self):
+ s = Person.objects.create(name='Sara', gender='F')
+ pre_save_data = []
+ def pre_save_receiver(**kwargs):
+ pre_save_data.append(kwargs['update_fields'])
+ pre_save.connect(pre_save_receiver)
+ post_save_data = []
+ def post_save_receiver(**kwargs):
+ post_save_data.append(kwargs['update_fields'])
+ post_save.connect(post_save_receiver)
+ # Save is skipped.
+ with self.assertNumQueries(0):
+ s.save(update_fields=[])
+ # Signals were skipped, too...
+ self.assertEqual(len(pre_save_data), 0)
+ self.assertEqual(len(post_save_data), 0)
+
+ pre_save.disconnect(pre_save_receiver)
+ post_save.disconnect(post_save_receiver)
+
+ def test_num_queries_inheritance(self):
+ s = Employee.objects.create(name='Sara', gender='F')
+ s.employee_num = 1
+ s.name = 'Emily'
+ with self.assertNumQueries(1):
+ s.save(update_fields=['employee_num'])
+ s = Employee.objects.get(pk=s.pk)
+ self.assertEqual(s.employee_num, 1)
+ self.assertEqual(s.name, 'Sara')
+ s.employee_num = 2
+ s.name = 'Emily'
+ with self.assertNumQueries(1):
+ s.save(update_fields=['name'])
+ s = Employee.objects.get(pk=s.pk)
+ self.assertEqual(s.name, 'Emily')
+ self.assertEqual(s.employee_num, 1)
+ # A little sanity check that we actually did updates...
+ self.assertEqual(Employee.objects.count(), 1)
+ self.assertEqual(Person.objects.count(), 1)
+ with self.assertNumQueries(2):
+ s.save(update_fields=['name', 'employee_num'])