|
1 | 1 | from django.conf import settings
|
| 2 | +from django.db import IntegrityError |
2 | 3 | from django.db.models import Q
|
3 | 4 | from django.test import TestCase
|
4 | 5 |
|
@@ -68,13 +69,27 @@ def test_all_features_at_once(self):
|
68 | 69 | self.assertEqual(50, new_e5.age)
|
69 | 70 | self.assertEqual(c1, new_e5.company)
|
70 | 71 |
|
71 |
| - def test_pk_set_but_keyfield_changes_ignores_pk(self): |
| 72 | + def test_provided_pk_is_retained_but_raises_if_mismatch_with_keyfield(self): |
72 | 73 | c1 = Company.objects.create(name="Foo Products, Ltd.")
|
73 | 74 | e1 = Employee.objects.create(name="Scott", age=40, company=c1)
|
74 | 75 | new_objs = [Employee(id=e1.id, name="Notscott", age=41, company=c1)]
|
75 | 76 |
|
| 77 | + with self.assertRaises(IntegrityError): |
| 78 | + # Crashes because e1.id already exists in database, even though 'name' doesnt match so it tries to INSERT. |
| 79 | + ret = bulk_sync(new_models=new_objs, filters=Q(company_id=c1.id), key_fields=("name",)) |
| 80 | + |
| 81 | + unique_pk = Employee.objects.values_list('id', flat=True).order_by('-id').first() + 1 |
| 82 | + new_objs = [Employee(id=unique_pk, name="Notscott", age=41, company=c1)] |
76 | 83 | ret = bulk_sync(new_models=new_objs, filters=Q(company_id=c1.id), key_fields=("name",))
|
77 | 84 |
|
| 85 | + self.assertEqual(0, ret["stats"]["updated"]) |
| 86 | + self.assertEqual(1, ret["stats"]["created"]) # Added 'Notscott' |
| 87 | + self.assertEqual(1, ret["stats"]["deleted"]) # Deleted 'Scott' |
| 88 | + |
| 89 | + # Make sure we retained the PK |
| 90 | + self.assertEqual(Employee.objects.filter(id=unique_pk).count(), 1) |
| 91 | + |
| 92 | + |
78 | 93 | def test_fields_parameter(self):
|
79 | 94 | c1 = Company.objects.create(name="Foo Products, Ltd.")
|
80 | 95 | c2 = Company.objects.create(name="Bar Microcontrollers, Inc.")
|
|
0 commit comments