6
6
7
7
from bulk_sync import bulk_compare
8
8
from bulk_sync import bulk_sync
9
- from .models import Company , Employee
9
+ from .models import Company , Employee , EmployeeDifferentPk
10
10
11
11
12
12
class BulkSyncTests (TestCase ):
@@ -70,6 +70,61 @@ def test_all_features_at_once(self):
70
70
self .assertEqual (50 , new_e5 .age )
71
71
self .assertEqual (c1 , new_e5 .company )
72
72
73
+ def test_all_features_at_once_nonstandard_pk (self ):
74
+ c1 = Company .objects .create (name = "Foo Products, Ltd." )
75
+ c2 = Company .objects .create (name = "Bar Microcontrollers, Inc." )
76
+
77
+ e1 = EmployeeDifferentPk .objects .create (name = "Scott" , age = 40 , company = c1 )
78
+ e2 = EmployeeDifferentPk .objects .create (name = "Isaac" , age = 9 , company = c1 )
79
+ e3 = EmployeeDifferentPk .objects .create (name = "Zoe" , age = 9 , company = c1 )
80
+ e4 = EmployeeDifferentPk .objects .create (name = "Bob" , age = 25 , company = c2 )
81
+
82
+ # We should update Scott's and Isaac's age, delete Zoe, add Newguy and
83
+ # add a second Bob (since he's not in company c1, which we filtered on.)
84
+ new_objs = [
85
+ EmployeeDifferentPk (name = "Scott" , age = 41 , company = c1 ),
86
+ EmployeeDifferentPk (name = "Isaac" , age = 9 , company = c1 ),
87
+ EmployeeDifferentPk (name = "Newguy" , age = 10 , company = c1 ),
88
+ EmployeeDifferentPk (name = "Bob" , age = 50 , company = c1 ),
89
+ ]
90
+
91
+ ret = bulk_sync (new_models = new_objs , filters = Q (company_id = c1 .id ), key_fields = ("name" ,))
92
+
93
+ self .assertEqual (2 , ret ["stats" ]["updated" ])
94
+ self .assertEqual (2 , ret ["stats" ]["created" ])
95
+ self .assertEqual (1 , ret ["stats" ]["deleted" ])
96
+
97
+ self .assertEqual (4 , EmployeeDifferentPk .objects .filter (company = c1 ).count ())
98
+ self .assertEqual (1 , EmployeeDifferentPk .objects .filter (company = c2 ).count ())
99
+
100
+ new_e1 = EmployeeDifferentPk .objects .get (employee_id = e1 .employee_id )
101
+ self .assertEqual ("Scott" , new_e1 .name )
102
+ self .assertEqual (41 , new_e1 .age )
103
+ self .assertEqual (c1 , new_e1 .company )
104
+
105
+ new_e2 = EmployeeDifferentPk .objects .get (employee_id = e2 .employee_id )
106
+ self .assertEqual ("Isaac" , new_e2 .name )
107
+ self .assertEqual (9 , new_e2 .age )
108
+ self .assertEqual (c1 , new_e2 .company )
109
+
110
+ with self .assertRaises (EmployeeDifferentPk .DoesNotExist ):
111
+ EmployeeDifferentPk .objects .get (employee_id = e3 .employee_id )
112
+
113
+ new_e4 = EmployeeDifferentPk .objects .get (employee_id = e4 .employee_id )
114
+ self .assertEqual ("Bob" , new_e4 .name )
115
+ self .assertEqual (25 , new_e4 .age )
116
+ self .assertEqual (c2 , new_e4 .company )
117
+
118
+ new_e3 = EmployeeDifferentPk .objects .get (name = "Newguy" )
119
+ self .assertEqual ("Newguy" , new_e3 .name )
120
+ self .assertEqual (10 , new_e3 .age )
121
+ self .assertEqual (c1 , new_e3 .company )
122
+
123
+ new_e5 = EmployeeDifferentPk .objects .get (name = "Bob" , company = c1 )
124
+ self .assertEqual ("Bob" , new_e5 .name )
125
+ self .assertEqual (50 , new_e5 .age )
126
+ self .assertEqual (c1 , new_e5 .company )
127
+
73
128
def test_provided_pk_is_retained_but_raises_if_mismatch_with_keyfield (self ):
74
129
c1 = Company .objects .create (name = "Foo Products, Ltd." )
75
130
e1 = Employee .objects .create (name = "Scott" , age = 40 , company = c1 )
@@ -245,26 +300,47 @@ def test_new_objs_with_unprepped_field_values_are_processed_correctly(self):
245
300
class BulkCompareTests (TestCase ):
246
301
""" Test `bulk_compare` method """
247
302
248
- @classmethod
249
- def setUpTestData (cls ):
250
- cls .c1 = Company .objects .create (name = "Foo Products, Ltd." )
251
- cls .c2 = Company .objects .create (name = "Bar Microcontrollers, Inc." )
303
+ # @classmethod
304
+ # def setUpTestData(cls):
305
+ def setupEmployees (self ):
306
+ self .c1 = Company .objects .create (name = "Foo Products, Ltd." )
307
+ self .c2 = Company .objects .create (name = "Bar Microcontrollers, Inc." )
308
+
309
+ self .e1 = Employee .objects .create (name = "Scott" , age = 40 , company = self .c1 )
310
+ self .e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = self .c1 )
311
+ self .e3 = Employee .objects .create (name = "Zoe" , age = 9 , company = self .c1 )
312
+ self .e4 = Employee .objects .create (name = "Bob" , age = 25 , company = self .c2 )
313
+
314
+ # We should update Scott's and Isaac's age, delete Zoe, add Newguy and
315
+ # add a second Bob (since he's not in company c1, which we filtered on.)
316
+ self .new_objs = [
317
+ Employee (name = "Scott" , age = 41 , company = self .c1 ),
318
+ Employee (name = "Isaac" , age = 9 , company = self .c1 ),
319
+ Employee (name = "Newguy" , age = 10 , company = self .c1 ),
320
+ Employee (name = "Bob" , age = 50 , company = self .c1 ),
321
+ ]
322
+
323
+ def setupEmployeeDiffPk (self ):
324
+ self .c1 = Company .objects .create (name = "Foo Products, Ltd." )
325
+ self .c2 = Company .objects .create (name = "Bar Microcontrollers, Inc." )
252
326
253
- cls .e1 = Employee .objects .create (name = "Scott" , age = 40 , company = cls .c1 )
254
- cls .e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = cls .c1 )
255
- cls .e3 = Employee .objects .create (name = "Zoe" , age = 9 , company = cls .c1 )
256
- cls .e4 = Employee .objects .create (name = "Bob" , age = 25 , company = cls .c2 )
327
+ self .e1 = EmployeeDifferentPk .objects .create (name = "Scott" , age = 40 , company = self .c1 )
328
+ self .e2 = EmployeeDifferentPk .objects .create (name = "Isaac" , age = 9 , company = self .c1 )
329
+ self .e3 = EmployeeDifferentPk .objects .create (name = "Zoe" , age = 9 , company = self .c1 )
330
+ self .e4 = EmployeeDifferentPk .objects .create (name = "Bob" , age = 25 , company = self .c2 )
257
331
258
332
# We should update Scott's and Isaac's age, delete Zoe, add Newguy and
259
333
# add a second Bob (since he's not in company c1, which we filtered on.)
260
- cls .new_objs = [
261
- Employee (name = "Scott" , age = 41 , company = cls .c1 ),
262
- Employee (name = "Isaac" , age = 9 , company = cls .c1 ),
263
- Employee (name = "Newguy" , age = 10 , company = cls .c1 ),
264
- Employee (name = "Bob" , age = 50 , company = cls .c1 ),
334
+ self .new_objs = [
335
+ EmployeeDifferentPk (name = "Scott" , age = 41 , company = self .c1 ),
336
+ EmployeeDifferentPk (name = "Isaac" , age = 9 , company = self .c1 ),
337
+ EmployeeDifferentPk (name = "Newguy" , age = 10 , company = self .c1 ),
338
+ EmployeeDifferentPk (name = "Bob" , age = 50 , company = self .c1 ),
265
339
]
266
340
267
341
def test_bulk_compare (self ):
342
+ self .setupEmployees ()
343
+
268
344
c1 = self .c1
269
345
e3 = self .e3
270
346
new_objs = self .new_objs
@@ -278,6 +354,8 @@ def test_bulk_compare(self):
278
354
self .assertEqual ([new_objs [1 ]], ret ["unchanged" ])
279
355
280
356
def test_bulk_compare_with_ignore_int_field (self ):
357
+ self .setupEmployees ()
358
+
281
359
c1 = self .c1
282
360
e3 = self .e3
283
361
new_objs = self .new_objs
@@ -296,6 +374,8 @@ def test_bulk_compare_with_ignore_int_field(self):
296
374
self .assertEqual ([new_objs [0 ], new_objs [1 ]], ret ["unchanged" ])
297
375
298
376
def test_bulk_compare_with_ignore_relation_field (self ):
377
+ self .setupEmployees ()
378
+
299
379
c1 = self .c1
300
380
e3 = self .e3
301
381
new_objs = self .new_objs
@@ -312,3 +392,23 @@ def test_bulk_compare_with_ignore_relation_field(self):
312
392
self .assertEqual ([new_objs [0 ]], ret ["updated" ])
313
393
self .assertEqual ({new_objs [0 ]: {"age" : (40 , 41 )}}, ret ["updated_details" ])
314
394
self .assertEqual ([new_objs [1 ]], ret ["unchanged" ])
395
+
396
+ def test_nonstandard_pk (self ):
397
+ self .setupEmployeeDiffPk ()
398
+
399
+ c1 = self .c1
400
+ e3 = self .e3
401
+ new_objs = self .new_objs
402
+
403
+ ret = bulk_compare (
404
+ old_models = EmployeeDifferentPk .objects .filter (company = c1 ).order_by ("name" ),
405
+ new_models = new_objs ,
406
+ key_fields = ("name" ,),
407
+ ignore_fields = ("company_id" ,),
408
+ )
409
+
410
+ self .assertEqual ([new_objs [2 ], new_objs [3 ]], ret ["added" ])
411
+ self .assertEqual ([e3 ], list (ret ["removed" ]))
412
+ self .assertEqual ([new_objs [0 ]], ret ["updated" ])
413
+ self .assertEqual ({new_objs [0 ]: {"age" : (40 , 41 )}}, ret ["updated_details" ])
414
+ self .assertEqual ([new_objs [1 ]], ret ["unchanged" ])
0 commit comments