diff options
| author | Markus Holtermann <info@markusholtermann.eu> | 2015-01-07 21:10:56 +0100 |
|---|---|---|
| committer | Carl Meyer <carl@oddbird.net> | 2015-01-07 17:29:20 -0700 |
| commit | 862ea825b5073588efafd5b7eed349ad098b5fe1 (patch) | |
| tree | 5b934572778b21084ee3676f92dca48a7f17faf4 /tests | |
| parent | f487a3275ebb786d3e7716e1ed9cc994bd092f34 (diff) | |
Fixed #24093 -- Prevented MigrationWriter to write operation kwargs that are not explicitly deconstructed
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/custom_migration_operations/operations.py | 61 | ||||
| -rw-r--r-- | tests/migrations/test_writer.py | 77 |
2 files changed, 136 insertions, 2 deletions
diff --git a/tests/custom_migration_operations/operations.py b/tests/custom_migration_operations/operations.py index 3a4127d753..bd62280f81 100644 --- a/tests/custom_migration_operations/operations.py +++ b/tests/custom_migration_operations/operations.py @@ -31,3 +31,64 @@ class TestOperation(Operation): class CreateModel(TestOperation): pass + + +class ArgsOperation(TestOperation): + def __init__(self, arg1, arg2): + self.arg1, self.arg2 = arg1, arg2 + + def deconstruct(self): + return ( + self.__class__.__name__, + [self.arg1, self.arg2], + {} + ) + + +class KwargsOperation(TestOperation): + def __init__(self, kwarg1=None, kwarg2=None): + self.kwarg1, self.kwarg2 = kwarg1, kwarg2 + + def deconstruct(self): + kwargs = {} + if self.kwarg1 is not None: + kwargs['kwarg1'] = self.kwarg1 + if self.kwarg2 is not None: + kwargs['kwarg2'] = self.kwarg2 + return ( + self.__class__.__name__, + [], + kwargs + ) + + +class ArgsKwargsOperation(TestOperation): + def __init__(self, arg1, arg2, kwarg1=None, kwarg2=None): + self.arg1, self.arg2 = arg1, arg2 + self.kwarg1, self.kwarg2 = kwarg1, kwarg2 + + def deconstruct(self): + kwargs = {} + if self.kwarg1 is not None: + kwargs['kwarg1'] = self.kwarg1 + if self.kwarg2 is not None: + kwargs['kwarg2'] = self.kwarg2 + return ( + self.__class__.__name__, + [self.arg1, self.arg2], + kwargs, + ) + + +class ExpandArgsOperation(TestOperation): + serialization_expand_args = ['arg'] + + def __init__(self, arg): + self.arg = arg + + def deconstruct(self): + return ( + self.__class__.__name__, + [self.arg], + {} + ) diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py index edcc5b285d..2519e43f42 100644 --- a/tests/migrations/test_writer.py +++ b/tests/migrations/test_writer.py @@ -10,8 +10,8 @@ import unittest from django.core.validators import RegexValidator, EmailValidator from django.db import models, migrations -from django.db.migrations.writer import MigrationWriter, SettingsReference -from django.test import TestCase, ignore_warnings +from django.db.migrations.writer import MigrationWriter, OperationWriter, SettingsReference +from django.test import SimpleTestCase, TestCase, ignore_warnings from django.conf import settings from django.utils import datetime_safe, six from django.utils.deconstruct import deconstructible @@ -30,6 +30,79 @@ class TestModel1(object): thing = models.FileField(upload_to=upload_to) +class OperationWriterTests(SimpleTestCase): + + def test_empty_signature(self): + operation = custom_migration_operations.operations.TestOperation() + writer = OperationWriter(operation) + writer.indentation = 0 + buff, imports = writer.serialize() + self.assertEqual(imports, {'import custom_migration_operations.operations'}) + self.assertEqual( + buff, + 'custom_migration_operations.operations.TestOperation(\n' + '),' + ) + + def test_args_signature(self): + operation = custom_migration_operations.operations.ArgsOperation(1, 2) + writer = OperationWriter(operation) + writer.indentation = 0 + buff, imports = writer.serialize() + self.assertEqual(imports, {'import custom_migration_operations.operations'}) + self.assertEqual( + buff, + 'custom_migration_operations.operations.ArgsOperation(\n' + ' arg1=1,\n' + ' arg2=2,\n' + '),' + ) + + def test_kwargs_signature(self): + operation = custom_migration_operations.operations.KwargsOperation(kwarg1=1) + writer = OperationWriter(operation) + writer.indentation = 0 + buff, imports = writer.serialize() + self.assertEqual(imports, {'import custom_migration_operations.operations'}) + self.assertEqual( + buff, + 'custom_migration_operations.operations.KwargsOperation(\n' + ' kwarg1=1,\n' + '),' + ) + + def test_args_kwargs_signature(self): + operation = custom_migration_operations.operations.ArgsKwargsOperation(1, 2, kwarg2=4) + writer = OperationWriter(operation) + writer.indentation = 0 + buff, imports = writer.serialize() + self.assertEqual(imports, {'import custom_migration_operations.operations'}) + self.assertEqual( + buff, + 'custom_migration_operations.operations.ArgsKwargsOperation(\n' + ' arg1=1,\n' + ' arg2=2,\n' + ' kwarg2=4,\n' + '),' + ) + + def test_expand_args_signature(self): + operation = custom_migration_operations.operations.ExpandArgsOperation([1, 2]) + writer = OperationWriter(operation) + writer.indentation = 0 + buff, imports = writer.serialize() + self.assertEqual(imports, {'import custom_migration_operations.operations'}) + self.assertEqual( + buff, + 'custom_migration_operations.operations.ExpandArgsOperation(\n' + ' arg=[\n' + ' 1,\n' + ' 2,\n' + ' ],\n' + '),' + ) + + class WriterTests(TestCase): """ Tests the migration writer (makes migration files from Migration instances) |
