Add (failing) tests cases for makeing a column not null with a Django default value

This commit is contained in:
David Wobrock committed 2020-06-20 18:08:16 +02:00
1 parent d411ea2f6b
commit f21ff2c278
16 files changed
+174

No files matched your search

+2
View File
@@ -11,3 +11,5 @@ ALTER_COLUMN_DROP_NOT_NULL = "app_alter_column_drop_not_null"
DROP_UNIQUE_TOGETHER = "app_unique_together"
ADD_MANYTOMANY_FIELD = "app_add_manytomany_field"
DATA_MIGRATIONS = "app_data_migrations"
MAKE_NOT_NULL_WITH_DJANGO_DEFAULT = "app_make_not_null_with_django_default"
MAKE_NOT_NULL_WITH_LIB_DEFAULT = "app_make_not_null_with_lib_default"
+17
View File
@@ -44,6 +44,14 @@ class BaseBackwardCompatibilityDetection(object):
app = fixtures.ADD_NOT_NULL_COLUMN
self._test_linter_finds_errors(app)
def test_detect_make_column_not_null_with_django_default(self):
app = fixtures.MAKE_NOT_NULL_WITH_DJANGO_DEFAULT
self._test_linter_finds_errors(app)
def test_detect_make_column_not_null_with_lib_default(self):
app = fixtures.MAKE_NOT_NULL_WITH_LIB_DEFAULT
self._test_linter_finds_no_errors(app)
def test_detect_drop_column(self):
app = fixtures.DROP_COLUMN
self._test_linter_finds_errors(app)
@@ -97,6 +105,15 @@ class SqliteBackwardCompatibilityDetectionTestCase(
app = fixtures.ADD_NOT_NULL_COLUMN_FOLLOWED_BY_DEFAULT
self._test_linter_finds_errors(app)
def test_detect_make_column_not_null_with_django_default(self):
app = fixtures.MAKE_NOT_NULL_WITH_DJANGO_DEFAULT
self._test_linter_finds_errors(app)
def test_detect_make_column_not_null_with_lib_default(self):
# The 'django-add-default-value' doesn't handle sqlite correctly
app = fixtures.MAKE_NOT_NULL_WITH_LIB_DEFAULT
self._test_linter_finds_errors(app)
class MySqlBackwardCompatibilityDetectionTestCase(
BaseBackwardCompatibilityDetection, unittest.TestCase
Whitespace-only changes.
@@ -0,0 +1,5 @@
from django.apps import AppConfig
class AppMakeNotNullWithDjangoDefaultConfig(AppConfig):
name = "app_make_not_null_with_django_default"
@@ -0,0 +1,28 @@
# Generated by Django 2.2 on 2020-06-20 15:17
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="A",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("col", models.CharField(max_length=10, null=True)),
],
),
]
@@ -0,0 +1,18 @@
# Generated by Django 2.2 on 2020-06-20 15:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("app_make_not_null_with_django_default", "0001_initial"),
]
operations = [
migrations.AlterField(
model_name="a",
name="col",
field=models.CharField(default="empty", max_length=10),
),
]
@@ -0,0 +1,5 @@
from django.db import models
class A(models.Model):
col = models.CharField(max_length=10, null=False, default="empty")
Whitespace-only changes.
@@ -0,0 +1,5 @@
from django.apps import AppConfig
class AppMakeNotNullWithLibDefaultConfig(AppConfig):
name = "app_make_not_null_with_lib_default"
@@ -0,0 +1,28 @@
# Generated by Django 2.2 on 2020-06-20 15:23
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="A",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("col", models.CharField(max_length=10, null=True)),
],
),
]
@@ -0,0 +1,21 @@
# Generated by Django 2.2 on 2020-06-20 15:23
from django.db import migrations, models
from django_add_default_value import AddDefaultValue
class Migration(migrations.Migration):
dependencies = [
("app_make_not_null_with_lib_default", "0001_initial"),
]
operations = [
migrations.AlterField(
model_name="a",
name="col",
field=models.CharField(default="avalue", max_length=10),
),
AddDefaultValue(model_name="a", name="col", value="avalue"),
]
@@ -0,0 +1,5 @@
from django.db import models
class A(models.Model):
col = models.CharField(max_length=10, null=False, default="avalue")
+2
View File
@@ -54,6 +54,8 @@ INSTALLED_APPS = [
"tests.test_project.app_rename_table",
"tests.test_project.app_unique_together",
"tests.test_project.app_data_migrations",
"tests.test_project.app_make_not_null_with_django_default",
"tests.test_project.app_make_not_null_with_lib_default",
]
MIDDLEWARE = [
+38
View File
@@ -64,6 +64,25 @@ class MySqlAnalyserTestCase(SqlAnalyserTestCase):
]
self.assertValidSql(sql)
def test_make_column_not_null_with_django_default(self):
sql = [
"ALTER TABLE `app_drop_default_a` ALTER COLUMN `col` SET DEFAULT 'empty';",
"UPDATE `app_drop_default_a` SET `col` = 'empty' WHERE `col` IS NULL;",
"ALTER TABLE `app_drop_default_a` MODIFY `col` varchar(10) NOT NULL;",
"ALTER TABLE `app_drop_default_a` ALTER COLUMN `col` DROP DEFAULT;",
]
self.assertBackwardIncompatibleSql(sql)
def test_make_column_not_null_with_lib_default(self):
sql = [
"ALTER TABLE `app_drop_default_a` ALTER COLUMN `col` SET DEFAULT 'empty';",
"UPDATE `app_drop_default_a` SET `col` = 'empty' WHERE `col` IS NULL;",
"ALTER TABLE `app_drop_default_a` MODIFY `col` varchar(10) NOT NULL;",
"ALTER TABLE `app_drop_default_a` ALTER COLUMN `col` DROP DEFAULT;",
"ALTER TABLE `app_drop_default_a` ALTER COLUMN `col` SET DEFAULT 'empty';",
]
self.assertValidSql(sql)
class SqliteAnalyserTestCase(SqlAnalyserTestCase):
database_vendor = "sqlite"
@@ -165,3 +184,22 @@ class PostgresqlAnalyserTestCase(SqlAnalyserTestCase):
'CREATE INDEX "app_add_manytomany_field_b_many_to_many_a_id_4b44832a" ON "app_add_manytomany_field_b_many_to_many"("a_id");',
]
self.assertValidSql(sql)
def test_make_column_not_null_with_django_default(self):
sql = [
'ALTER TABLE "app_drop_default_a" ALTER COLUMN "col" SET DEFAULT \'empty\';',
'UPDATE "app_drop_default_a" SET "col" = \'empty\' WHERE "col" IS NULL;',
'ALTER TABLE "app_drop_default_a" ALTER COLUMN "col" SET NOT NULL;',
'ALTER TABLE "app_drop_default_a" ALTER COLUMN "col" DROP DEFAULT;',
]
self.assertBackwardIncompatibleSql(sql)
def test_make_column_not_null_with_lib_default(self):
sql = [
'ALTER TABLE "app_drop_default_a" ALTER COLUMN "col" SET DEFAULT \'empty\';',
'UPDATE "app_drop_default_a" SET "col" = \'empty\' WHERE "col" IS NULL;',
'ALTER TABLE "app_drop_default_a" ALTER COLUMN "col" SET NOT NULL;',
'ALTER TABLE "app_drop_default_a" ALTER COLUMN "col" DROP DEFAULT;',
'ALTER TABLE "app_drop_default_a" ALTER COLUMN "col" SET DEFAULT `\'empty\';',
]
self.assertValidSql(sql)