def test_validate(self): constraint_name = 'pony_pink_gte_check' constraint = CheckConstraint(check=Q(pink__gte=4), name=constraint_name) operation = AddConstraintNotValid('Pony', constraint=constraint) project_state, new_state = self.make_test_state( self.app_label, operation) Pony = new_state.apps.get_model(self.app_label, 'Pony') obj = Pony.objects.create(pink=2, weight=1.0) # Add constraint. with connection.schema_editor(atomic=True) as editor: operation.database_forwards(self.app_label, editor, project_state, new_state) project_state = new_state new_state = new_state.clone() operation = ValidateConstraint('Pony', name=constraint_name) operation.state_forwards(self.app_label, new_state) self.assertEqual( operation.describe(), f'Validate constraint {constraint_name} on model Pony', ) self.assertEqual( operation.migration_name_fragment, f'pony_validate_{constraint_name}', ) # Validate constraint. with connection.schema_editor(atomic=True) as editor: msg = f'check constraint "{constraint_name}"' with self.assertRaisesMessage(IntegrityError, msg): operation.database_forwards(self.app_label, editor, project_state, new_state) obj.pink = 5 obj.save() with connection.schema_editor(atomic=True) as editor: operation.database_forwards(self.app_label, editor, project_state, new_state) # Reversal is a noop. with connection.schema_editor() as editor: with self.assertNumQueries(0): operation.database_backwards(self.app_label, editor, new_state, project_state) # Deconstruction. name, args, kwargs = operation.deconstruct() self.assertEqual(name, 'ValidateConstraint') self.assertEqual(args, []) self.assertEqual(kwargs, { 'model_name': 'Pony', 'name': constraint_name })
def test_add(self): table_name = f'{self.app_label}_pony' constraint_name = 'pony_pink_gte_check' constraint = CheckConstraint(check=Q(pink__gte=4), name=constraint_name) operation = AddConstraintNotValid('Pony', constraint=constraint) project_state, new_state = self.make_test_state( self.app_label, operation) self.assertEqual( operation.describe(), f'Create not valid constraint {constraint_name} on model Pony', ) self.assertEqual( operation.migration_name_fragment, f'pony_{constraint_name}_not_valid', ) self.assertEqual( len(new_state.models[self.app_label, 'pony'].options['constraints']), 1, ) self.assertConstraintNotExists(table_name, constraint_name) Pony = new_state.apps.get_model(self.app_label, 'Pony') self.assertEqual(len(Pony._meta.constraints), 1) Pony.objects.create(pink=2, weight=1.0) # Add constraint. with connection.schema_editor(atomic=True) as editor: operation.database_forwards(self.app_label, editor, project_state, new_state) msg = f'check constraint "{constraint_name}"' with self.assertRaisesMessage(IntegrityError, msg), transaction.atomic(): Pony.objects.create(pink=3, weight=1.0) self.assertConstraintExists(table_name, constraint_name) # Reversal. with connection.schema_editor(atomic=True) as editor: operation.database_backwards(self.app_label, editor, project_state, new_state) self.assertConstraintNotExists(table_name, constraint_name) Pony.objects.create(pink=3, weight=1.0) # Deconstruction. name, args, kwargs = operation.deconstruct() self.assertEqual(name, 'AddConstraintNotValid') self.assertEqual(args, []) self.assertEqual(kwargs, { 'model_name': 'Pony', 'constraint': constraint })