def test_batch(self): res = bulk_create(TestModel, [{ 'id': 11, 'name': 'bulk_update_11' }, { 'id': 12, 'name': 'bulk_update_12' }, { 'id': 13, 'name': 'bulk_update_13' }], batch_size=1) self.assertEqual(3, res) # 9 from fixture + 3 created self.assertEqual(12, TestModel.objects.all().count()) for pk, name, int_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'int_field'): if pk > 10: self.assertEqual('bulk_update_%d' % pk, name) self.assertIsNone(int_field) else: self.assertEqual('test%d' % pk, name) self.assertEqual(pk, int_field) # Test for empty values correct res = bulk_create(TestModel, [], batch_size=10) self.assertEqual(0, res)
def test_empty(self): res = bulk_create(TestModel, []) self.assertEqual(0, res) for pk, name, int_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'int_field'): self.assertEqual('test%d' % pk, name) self.assertEqual(pk, int_field)
def test_returning(self): res = bulk_create(TestModel, [{ 'id': 11, 'name': 'bulk_update_11' }, { 'id': 12, 'name': 'bulk_update_12' }, { 'id': 13, 'name': 'bulk_update_13' }], returning=('id', 'name', 'int_field')) from django_pg_returning import ReturningQuerySet self.assertIsInstance(res, ReturningQuerySet) self.assertSetEqual( { (11, 'bulk_update_11', None), (12, 'bulk_update_12', None), (13, 'bulk_update_13', None), }, set(res.values_list('id', 'name', 'int_field'))) # 9 from fixture + 3 created self.assertEqual(12, TestModel.objects.all().count()) for pk, name, int_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'int_field'): if pk > 10: self.assertEqual('bulk_update_%d' % pk, name) self.assertIsNone(int_field) else: self.assertEqual('test%d' % pk, name) self.assertEqual(pk, int_field)
def test_jsonb(self): res = bulk_create(TestModel, [{ 'id': 11, 'json_field': { 'test': '11' } }, { 'id': 12, 'json_field': {} }, { 'id': 13, 'json_field': { 'single': "'", "multi": '"' } }]) self.assertEqual(3, res) for pk, name, json_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'json_field'): if pk == 11: self.assertDictEqual({'test': str(pk)}, json_field) elif pk == 12: self.assertDictEqual({}, json_field) elif pk == 13: self.assertDictEqual({'single': "'", "multi": '"'}, json_field) else: self.assertIsNone(json_field) if pk > 10: self.assertEqual('', name) else: self.assertEqual('test%d' % pk, name)
def test_hstore(self): res = bulk_create(TestModel, [{ 'id': 11, 'hstore_field': { 'test': '11' } }, { 'id': 12, 'hstore_field': {} }, { 'id': 13, 'hstore_field': { 'single': "'", "multi": '"' } }]) self.assertEqual(3, res) for item in TestModel.objects.all().order_by('id'): if item.pk == 11: self.assertDictEqual({'test': str(item.pk)}, item.hstore_field) elif item.pk == 12: self.assertDictEqual({}, item.hstore_field) elif item.pk == 13: self.assertDictEqual({ 'single': "'", "multi": '"' }, item.hstore_field) else: self.assertIsNone(item.hstore_field) if item.pk > 10: self.assertEqual('', item.name) else: self.assertEqual('test%d' % item.pk, item.name)
def test_using(self): res = bulk_create(TestModel, [{ 'id': 11, 'name': 'bulk_update_11' }, { 'id': 12, 'name': 'bulk_update_12' }, { 'id': 13, 'name': 'bulk_update_13' }], using='secondary') self.assertEqual(3, res) # 9 from fixture + 3 created self.assertEqual(12, TestModel.objects.all().using('secondary').count()) self.assertEqual(9, TestModel.objects.all().using('default').count()) for pk, name, int_field in TestModel.objects.all().using('secondary').order_by('id'). \ values_list('id', 'name', 'int_field'): if pk > 10: self.assertEqual('bulk_update_%d' % pk, name) self.assertIsNone(int_field) else: self.assertEqual('test%d' % pk, name) self.assertEqual(pk, int_field) for pk, name, int_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'int_field'): self.assertEqual('test%d' % pk, name) self.assertEqual(pk, int_field)
def test_auto_now(self): res = bulk_create(AutoNowModel, [{'id': 11}]) self.assertEqual(1, res) instance = AutoNowModel.objects.get(pk=11) self.assertGreaterEqual(instance.created, now() - timedelta(seconds=1)) self.assertLessEqual(instance.created, now() + timedelta(seconds=1)) self.assertEqual(instance.updated, datetime.now(pytz.utc).date()) self.assertIsNone(instance.checked)
def test_now(self): res = bulk_create(AutoNowModel, [{ 'id': 1 }], set_functions={'checked': 'now'}) self.assertEqual(1, res) instance = AutoNowModel.objects.get(pk=1) self.assertGreaterEqual(instance.checked, now() - timedelta(seconds=1)) self.assertLessEqual(instance.checked, now() + timedelta(seconds=1))
def test_auto_now_given_directly(self): res = bulk_create(AutoNowModel, [{ 'id': 11, 'created': now(), 'updated': now().date() }]) self.assertEqual(1, res) instance = AutoNowModel.objects.get(pk=11) self.assertGreaterEqual(instance.created, now() - timedelta(seconds=1)) self.assertLessEqual(instance.created, now() + timedelta(seconds=1)) self.assertIsNone(instance.checked) self.assertEqual(instance.updated, now().date())
def test_values(self): with self.assertRaises(TypeError): bulk_create(TestModel, 123) with self.assertRaises(TypeError): bulk_create(TestModel, [123]) with self.assertRaises(TypeError): bulk_create(TestModel, {(1, 2): {'id': 10}}) self.assertEqual(1, bulk_create(TestModel, [{'name': 'abc'}])) self.assertEqual( 1, bulk_create(TestModel, [{ 'name': 'abc', 'int_field': 2 }]))
def test_incr(self): res = bulk_create(TestModel, [{ 'id': 11, 'int_field': 11 }], set_functions={'int_field': '+'}) self.assertEqual(1, res) for pk, name, int_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'int_field'): self.assertEqual(pk, int_field) if pk == 11: self.assertEqual('', name) else: self.assertEqual('test%d' % pk, name)
def test_auto_now_respects_override(self): # Now check to make sure we can explicitly set values # (requires passing set functions) bulk_create( AutoNowModel, [{ 'id': 1, 'created': datetime(2011, 1, 2, 0, 0, 0, tzinfo=tz_utc), 'updated': date(2011, 1, 3), 'checked': datetime(2011, 1, 4, 0, 0, 0, tzinfo=tz_utc), }], set_functions={ "created": "eq", "updated": "eq", "checked": "eq" }) instance = AutoNowModel.objects.get() self.assertEqual(datetime(2011, 1, 2, 0, 0, 0, tzinfo=tz_utc), instance.created) self.assertEqual(date(2011, 1, 3), instance.updated) self.assertEqual(datetime(2011, 1, 4, 0, 0, 0, tzinfo=tz_utc), instance.checked)
def test_create(self): res = bulk_create(UUIDFieldPrimaryModel, [{ 'key_field': 1 }, { 'key_field': 2 }]) self.assertEqual(2, res) data = UUIDFieldPrimaryModel.objects.all().values_list( 'pk', 'char_field') self.assertEqual(2, len(data)) for pk, char_field in data: self.assertIsInstance(pk, UUID) self.assertEqual('', char_field)
def test_batch(self): with self.assertRaises(TypeError): bulk_create(TestModel, [{ 'id': 100, 'name': 'test1' }], batch_size='abc') with self.assertRaises(ValueError): bulk_create(TestModel, [{ 'id': 101, 'name': 'test1' }], batch_size=-2) with self.assertRaises(TypeError): bulk_create(TestModel, [{ 'id': 102, 'name': 'test1' }], batch_size=2.5) with self.assertRaises(TypeError): bulk_create(TestModel, [{ 'id': 103, 'name': 'test1' }], batch_size=1, batch_delay='abc') with self.assertRaises(ValueError): bulk_create(TestModel, [{ 'id': 104, 'name': 'test1' }], batch_size=1, batch_delay=-2)
def test_concat_str(self): res = bulk_create(TestModel, [{ 'id': 11, 'name': 'bulk_update_11' }], set_functions={'name': '||'}) self.assertEqual(1, res) for pk, name, int_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'int_field'): if pk == 11: self.assertEqual('bulk_update_%d' % pk, name) self.assertIsNone(int_field) else: self.assertEqual('test%d' % pk, name) self.assertEqual(pk, int_field)
def test_using(self): values = [{'name': 'bulk_update_1'}] self.assertEqual(1, bulk_create(TestModel, values)) self.assertEqual(1, bulk_create(TestModel, values, using='default')) with self.assertRaises(ValueError): bulk_create(TestModel, values, using='invalid') with self.assertRaises(TypeError): bulk_create(TestModel, values, using=123)
def test_django_expression(self): # Default for IntegerField should be 0 from django.db.models import F res = bulk_create( TestModel, [{ 'id': 11, 'int_field': 1 }, { 'id': 12, 'int_field': 2 }], set_functions={'int_field': F('int_field') + BulkValue()}) self.assertEqual(2, res) for instance in TestModel.objects.filter(pk__in={11, 12}): self.assertEqual(instance.pk - 10, instance.int_field) self.assertEqual('', instance.name)
def test_eq_not_null(self): res = bulk_create(TestModel, [{ 'id': 11, 'name': None }], set_functions={'name': 'eq_not_null'}) self.assertEqual(1, res) # 9 from fixture + 1 created self.assertEqual(10, TestModel.objects.all().count()) for pk, name, int_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'int_field'): if pk == 11: # Default name, not None, look https://github.com/M1hacka/django-pg-bulk-update/issues/2 self.assertEqual('', name) self.assertIsNone(int_field) else: self.assertEqual('test%d' % pk, name) self.assertEqual(pk, int_field)
def test_auto_id(self): res = bulk_create(TestModel, [{ 'name': 'bulk_create' }, { 'name': 'bulk_create' }, { 'name': 'bulk_create' }]) self.assertEqual(3, res) # 9 from fixture + 3 created self.assertEqual(12, TestModel.objects.all().count()) for pk, name, int_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'int_field'): if pk > 9: self.assertEqual('bulk_create', name) self.assertIsNone(int_field) else: self.assertEqual('test%d' % pk, name) self.assertEqual(pk, int_field)
def test_returning_all(self): res = bulk_create(TestModel, [{ 'id': 11, 'name': 'bulk_update_11' }, { 'id': 12, 'name': 'bulk_update_12' }, { 'id': 13, 'name': 'bulk_update_13' }], returning='*') from django_pg_returning import ReturningQuerySet self.assertIsInstance(res, ReturningQuerySet) self.assertSetEqual( { (11, 'bulk_update_11', None), (12, 'bulk_update_12', None), (13, 'bulk_update_13', None), }, set(res.values_list('id', 'name', 'int_field')))
def test_array(self): res = bulk_create(TestModel, [{ 'id': 11, 'array_field': [11] }, { 'id': 12, 'array_field': [] }]) self.assertEqual(2, res) for pk, name, array_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'array_field'): if pk == 11: self.assertListEqual([pk], array_field) elif pk == 12: self.assertListEqual([], array_field) else: self.assertIsNone(array_field) if pk > 10: self.assertEqual('', name) else: self.assertEqual('test%d' % pk, name)
def test_upper_case(self): res = bulk_create(UpperCaseModel, [{ 'id': 11, 'UpperCaseName': 'BulkUpdate11' }, { 'id': 12, 'UpperCaseName': 'BulkUpdate12' }, { 'id': 13, 'UpperCaseName': 'BulkUpdate13' }]) self.assertEqual(3, res) # 3 from fixture + 3 created self.assertEqual(6, UpperCaseModel.objects.all().count()) for pk, name in UpperCaseModel.objects.all().order_by( 'id').values_list('id', 'UpperCaseName'): if pk > 10: self.assertEqual('BulkUpdate%d' % pk, name) else: self.assertEqual('test%d' % pk, name)
def test_quotes(self): res = bulk_create(TestModel, [{ 'id': 11, 'name': '\'' }, { 'id': 12, 'name': '"' }]) self.assertEqual(2, res) for pk, name, int_field in TestModel.objects.all().order_by( 'id').values_list('id', 'name', 'int_field'): if pk == 11: self.assertEqual('\'', name) elif pk == 12: self.assertEqual('"', name) else: self.assertEqual('test%d' % pk, name) if pk > 10: self.assertIsNone(int_field) else: self.assertEqual(pk, int_field)
def test_quoted_table_name(self): # Test for https://github.com/M1ha-Shvn/django-pg-bulk-update/issues/63 self.assertEqual(1, bulk_create(TestModelWithSchema, [{ 'name': 'abc' }]))
def test_model(self): with self.assertRaises(TypeError): bulk_create(123, []) with self.assertRaises(TypeError): bulk_create('123', [])
def test_set_functions(self): with self.assertRaises(TypeError): bulk_create(TestModel, [{'name': 'test1'}], set_functions=123) with self.assertRaises(TypeError): bulk_create(TestModel, [{'name': 'test1'}], set_functions=[123]) with self.assertRaises(ValueError): bulk_create(TestModel, [{ 'name': 'test1' }], set_functions={1: 'test'}) with self.assertRaises(ValueError): bulk_create(TestModel, [{ 'name': 'test1' }], set_functions={'id': 1}) with self.assertRaises(ValueError): bulk_create(TestModel, [{ 'name': 'test1' }], set_functions={'invalid': 1}) with self.assertRaises(ValueError): bulk_create(TestModel, [{ 'int_field': 1 }], set_functions={'int_field': 'invalid'}) # I don't test all set functions here, as there is another TestCase for this: TestSetFunctions self.assertEqual( 1, bulk_create(TestModel, [{ 'name': 'test1' }], set_functions={'name': ConcatSetFunction()})) self.assertEqual( 1, bulk_create(TestModel, [{ 'name': 'test1' }], set_functions={'name': '||'}))
def test_returning_empty(self): res = bulk_create(TestModel, [], returning='id') from django_pg_returning import ReturningQuerySet self.assertIsInstance(res, ReturningQuerySet) self.assertEqual(0, res.count())