1
1
from django .conf import settings
2
2
from django .db import IntegrityError
3
+ from django .core .exceptions import FieldDoesNotExist
3
4
from django .db .models import Q
4
5
from django .test import TestCase
5
6
@@ -78,18 +79,17 @@ def test_provided_pk_is_retained_but_raises_if_mismatch_with_keyfield(self):
78
79
# Crashes because e1.id already exists in database, even though 'name' doesnt match so it tries to INSERT.
79
80
ret = bulk_sync (new_models = new_objs , filters = Q (company_id = c1 .id ), key_fields = ("name" ,))
80
81
81
- unique_pk = Employee .objects .values_list ('id' , flat = True ).order_by (' -id' ).first () + 1
82
+ unique_pk = Employee .objects .values_list ("id" , flat = True ).order_by (" -id" ).first () + 1
82
83
new_objs = [Employee (id = unique_pk , name = "Notscott" , age = 41 , company = c1 )]
83
84
ret = bulk_sync (new_models = new_objs , filters = Q (company_id = c1 .id ), key_fields = ("name" ,))
84
85
85
86
self .assertEqual (0 , ret ["stats" ]["updated" ])
86
- self .assertEqual (1 , ret ["stats" ]["created" ]) # Added 'Notscott'
87
- self .assertEqual (1 , ret ["stats" ]["deleted" ]) # Deleted 'Scott'
87
+ self .assertEqual (1 , ret ["stats" ]["created" ]) # Added 'Notscott'
88
+ self .assertEqual (1 , ret ["stats" ]["deleted" ]) # Deleted 'Scott'
88
89
89
90
# Make sure we retained the PK
90
91
self .assertEqual (Employee .objects .filter (id = unique_pk ).count (), 1 )
91
92
92
-
93
93
def test_fields_parameter (self ):
94
94
c1 = Company .objects .create (name = "Foo Products, Ltd." )
95
95
c2 = Company .objects .create (name = "Bar Microcontrollers, Inc." )
@@ -98,12 +98,39 @@ def test_fields_parameter(self):
98
98
e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = c2 )
99
99
100
100
# We should update Scott's age, and not touch company.
101
- new_objs = [
102
- Employee (name = "Scott" , age = 41 , company = c1 ),
103
- Employee (name = "Isaac" , age = 9 , company = c1 ),
104
- ]
101
+ new_objs = [Employee (name = "Scott" , age = 41 , company = c1 ), Employee (name = "Isaac" , age = 9 , company = c1 )]
105
102
106
- ret = bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), fields = ['age' ])
103
+ ret = bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), fields = ["age" ])
104
+
105
+ new_e1 = Employee .objects .get (id = e1 .id )
106
+ self .assertEqual ("Scott" , new_e1 .name )
107
+ self .assertEqual (41 , new_e1 .age )
108
+ self .assertEqual (c1 , new_e1 .company )
109
+
110
+ new_e2 = Employee .objects .get (id = e2 .id )
111
+ self .assertEqual ("Isaac" , new_e2 .name )
112
+ self .assertEqual (9 , new_e2 .age )
113
+ self .assertEqual (c2 , new_e2 .company )
114
+
115
+ self .assertEqual (2 , ret ["stats" ]["updated" ])
116
+ self .assertEqual (0 , ret ["stats" ]["created" ])
117
+ self .assertEqual (0 , ret ["stats" ]["deleted" ])
118
+
119
+ def test_exclude_fields_parameter (self ):
120
+ c1 = Company .objects .create (name = "Foo Products, Ltd." )
121
+ c2 = Company .objects .create (name = "Bar Microcontrollers, Inc." )
122
+
123
+ e1 = Employee .objects .create (name = "Scott" , age = 40 , company = c1 )
124
+ e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = c2 )
125
+
126
+ # We should update Scott's age, and not touch company.
127
+ new_objs = [Employee (name = "Scott" , age = 41 , company = c1 ), Employee (name = "Isaac" , age = 9 , company = c1 )]
128
+
129
+ with self .assertRaises (FieldDoesNotExist ):
130
+ # Crashes because we attempted to exclude a field that does not exist
131
+ bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), exclude_fields = ["missing_field" ])
132
+
133
+ ret = bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), exclude_fields = ["company" ])
107
134
108
135
new_e1 = Employee .objects .get (id = e1 .id )
109
136
self .assertEqual ("Scott" , new_e1 .name )
@@ -126,14 +153,12 @@ def test_skip_deletes(self):
126
153
e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = c1 )
127
154
128
155
# update Scott - this makes Isaac is the "stale object" that would be deleted if skip_deletes were False
129
- new_objs = [
130
- Employee (name = "Scott" , age = 41 , company = c1 ),
131
- ]
156
+ new_objs = [Employee (name = "Scott" , age = 41 , company = c1 )]
132
157
133
158
# but Isaac should remain when the skip_deletes flag is True
134
159
ret = bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), skip_deletes = True )
135
160
136
- self .assertEqual (["Scott" , "Isaac" ], [x .name for x in Employee .objects .all ().order_by ('id' )])
161
+ self .assertEqual (["Scott" , "Isaac" ], [x .name for x in Employee .objects .all ().order_by ("id" )])
137
162
138
163
new_e1 = Employee .objects .get (id = e1 .id )
139
164
self .assertEqual (41 , new_e1 .age )
@@ -151,14 +176,12 @@ def test_skip_creates(self):
151
176
e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = c1 )
152
177
153
178
# create a new employee that will be ignored
154
- new_objs = [
155
- Employee (name = "John" , age = 52 , company = c1 )
156
- ]
179
+ new_objs = [Employee (name = "John" , age = 52 , company = c1 )]
157
180
158
181
ret = bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), skip_creates = True , skip_deletes = True )
159
182
160
183
self .assertEqual (2 , Employee .objects .count ())
161
- self .assertEqual (["Scott" , "Isaac" ], [x .name for x in Employee .objects .all ().order_by ('id' )])
184
+ self .assertEqual (["Scott" , "Isaac" ], [x .name for x in Employee .objects .all ().order_by ("id" )])
162
185
163
186
self .assertEqual (0 , ret ["stats" ]["updated" ])
164
187
self .assertEqual (0 , ret ["stats" ]["created" ])
@@ -171,10 +194,7 @@ def test_skip_updates(self):
171
194
e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = c1 )
172
195
173
196
# update employee that will be ignored, create a new one
174
- new_objs = [
175
- Employee (name = "Scott" , age = 100 , company = c1 ),
176
- Employee (name = "Alice" , age = 36 , company = c1 )
177
- ]
197
+ new_objs = [Employee (name = "Scott" , age = 100 , company = c1 ), Employee (name = "Alice" , age = 36 , company = c1 )]
178
198
179
199
ret = bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), skip_updates = True )
180
200
@@ -184,15 +204,13 @@ def test_skip_updates(self):
184
204
185
205
# Isaac is "stale" object - was deleted, Alice was created
186
206
self .assertEqual (2 , Employee .objects .count ())
187
- self .assertEqual (["Scott" , "Alice" ], [x .name for x in Employee .objects .all ().order_by ('id' )])
188
-
207
+ self .assertEqual (["Scott" , "Alice" ], [x .name for x in Employee .objects .all ().order_by ("id" )])
189
208
190
209
self .assertEqual (0 , ret ["stats" ]["updated" ])
191
210
self .assertEqual (1 , ret ["stats" ]["created" ])
192
211
self .assertEqual (1 , ret ["stats" ]["deleted" ])
193
212
194
213
195
-
196
214
class BulkCompareTests (TestCase ):
197
215
""" Test `bulk_compare` method """
198
216
@@ -261,5 +279,5 @@ def test_bulk_compare_with_ignore_relation_field(self):
261
279
self .assertEqual ([new_objs [2 ], new_objs [3 ]], ret ["added" ])
262
280
self .assertEqual ([e3 ], list (ret ["removed" ]))
263
281
self .assertEqual ([new_objs [0 ]], ret ["updated" ])
264
- self .assertEqual ({new_objs [0 ]: {' age' : (40 , 41 )}}, ret ["updated_details" ])
282
+ self .assertEqual ({new_objs [0 ]: {" age" : (40 , 41 )}}, ret ["updated_details" ])
265
283
self .assertEqual ([new_objs [1 ]], ret ["unchanged" ])
0 commit comments