1
0
mirror of https://github.com/django/django.git synced 2025-03-06 07:22:32 +00:00

Refs #31351 -- Made partial constraints tests use required_db_features.

This will notably silence the warnings issued when running the test
suite on MySQL and MariaDB.
This commit is contained in:
Mariusz Felisiak 2020-04-17 07:45:52 +02:00 committed by GitHub
parent 7b31ba541f
commit 4c9886085b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 3 deletions

View File

@ -41,6 +41,16 @@ class UniqueConstraintProduct(models.Model):
class Meta: class Meta:
constraints = [ constraints = [
models.UniqueConstraint(fields=['name', 'color'], name='name_color_uniq'), models.UniqueConstraint(fields=['name', 'color'], name='name_color_uniq'),
]
class UniqueConstraintConditionProduct(models.Model):
name = models.CharField(max_length=255)
color = models.CharField(max_length=32, null=True)
class Meta:
required_db_features = {'supports_partial_indexes'}
constraints = [
models.UniqueConstraint( models.UniqueConstraint(
fields=['name'], fields=['name'],
name='name_without_color_uniq', name='name_without_color_uniq',

View File

@ -5,7 +5,10 @@ from django.db import IntegrityError, connection, models
from django.db.models.constraints import BaseConstraint from django.db.models.constraints import BaseConstraint
from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
from .models import ChildModel, Product, UniqueConstraintProduct from .models import (
ChildModel, Product, UniqueConstraintConditionProduct,
UniqueConstraintProduct,
)
def get_constraints(table): def get_constraints(table):
@ -207,15 +210,25 @@ class UniqueConstraintTests(TestCase):
with self.assertRaises(IntegrityError): with self.assertRaises(IntegrityError):
UniqueConstraintProduct.objects.create(name=self.p1.name, color=self.p1.color) UniqueConstraintProduct.objects.create(name=self.p1.name, color=self.p1.color)
@skipUnlessDBFeature('supports_partial_indexes')
def test_database_constraint_with_condition(self):
UniqueConstraintConditionProduct.objects.create(name='p1')
UniqueConstraintConditionProduct.objects.create(name='p2')
with self.assertRaises(IntegrityError):
UniqueConstraintConditionProduct.objects.create(name='p1')
def test_model_validation(self): def test_model_validation(self):
msg = 'Unique constraint product with this Name and Color already exists.' msg = 'Unique constraint product with this Name and Color already exists.'
with self.assertRaisesMessage(ValidationError, msg): with self.assertRaisesMessage(ValidationError, msg):
UniqueConstraintProduct(name=self.p1.name, color=self.p1.color).validate_unique() UniqueConstraintProduct(name=self.p1.name, color=self.p1.color).validate_unique()
@skipUnlessDBFeature('supports_partial_indexes')
def test_model_validation_with_condition(self): def test_model_validation_with_condition(self):
"""Partial unique constraints are ignored by Model.validate_unique().""" """Partial unique constraints are ignored by Model.validate_unique()."""
UniqueConstraintProduct(name=self.p1.name, color='blue').validate_unique() obj1 = UniqueConstraintConditionProduct.objects.create(name='p1', color='red')
UniqueConstraintProduct(name=self.p2.name).validate_unique() obj2 = UniqueConstraintConditionProduct.objects.create(name='p2')
UniqueConstraintConditionProduct(name=obj1.name, color='blue').validate_unique()
UniqueConstraintConditionProduct(name=obj2.name).validate_unique()
def test_name(self): def test_name(self):
constraints = get_constraints(UniqueConstraintProduct._meta.db_table) constraints = get_constraints(UniqueConstraintProduct._meta.db_table)