diff options
| author | Dan Watson <watsond@imsweb.com> | 2018-03-15 15:32:56 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-03-23 13:20:38 -0400 |
| commit | 29150d5da880ac1db15e47052330790cf1b802d2 (patch) | |
| tree | 0a507b5cc4ae95bb1ddab1b59bcac6e4f9542ba7 /tests | |
| parent | ee7f51c66dfc1700ff065dfeb5fe2388cc2e9619 (diff) | |
Fixed #23406 -- Allowed migrations to be loaded from .pyc files.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/migrations/test_loader.py | 34 | ||||
| -rw-r--r-- | tests/migrations/test_migrations_bad_pyc/0001_initial.pyc | bin | 0 -> 511 bytes | |||
| -rw-r--r-- | tests/migrations/test_migrations_bad_pyc/__init__.py | 0 |
3 files changed, 34 insertions, 0 deletions
diff --git a/tests/migrations/test_loader.py b/tests/migrations/test_loader.py index e0e7e3d258..eade230640 100644 --- a/tests/migrations/test_loader.py +++ b/tests/migrations/test_loader.py @@ -1,3 +1,6 @@ +import compileall +import os + from django.db import connection, connections from django.db.migrations.exceptions import ( AmbiguityError, InconsistentMigrationHistory, NodeNotFoundError, @@ -6,6 +9,8 @@ from django.db.migrations.loader import MigrationLoader from django.db.migrations.recorder import MigrationRecorder from django.test import TestCase, modify_settings, override_settings +from .test_base import MigrationTestBase + class RecorderTests(TestCase): """ @@ -494,3 +499,32 @@ class LoaderTests(TestCase): ('app1', '4_auto'), } self.assertEqual(plan, expected_plan) + + +class PycLoaderTests(MigrationTestBase): + + def test_valid(self): + """ + To support frozen environments, MigrationLoader loads .pyc migrations. + """ + with self.temporary_migration_module(module='migrations.test_migrations') as migration_dir: + # Compile .py files to .pyc files and delete .py files. + compileall.compile_dir(migration_dir, force=True, quiet=1, legacy=True) + for name in os.listdir(migration_dir): + if name.endswith('.py'): + os.remove(os.path.join(migration_dir, name)) + loader = MigrationLoader(connection) + self.assertIn(('migrations', '0001_initial'), loader.disk_migrations) + + def test_invalid(self): + """ + MigrationLoader reraises ImportErrors caused by "bad magic number" pyc + files with a more helpful message. + """ + with self.temporary_migration_module(module='migrations.test_migrations_bad_pyc'): + msg = ( + "Couldn't import '\w+.migrations.0001_initial' as it appears " + "to be a stale .pyc file." + ) + with self.assertRaisesRegex(ImportError, msg): + MigrationLoader(connection) diff --git a/tests/migrations/test_migrations_bad_pyc/0001_initial.pyc b/tests/migrations/test_migrations_bad_pyc/0001_initial.pyc Binary files differnew file mode 100644 index 0000000000..07854f4aeb --- /dev/null +++ b/tests/migrations/test_migrations_bad_pyc/0001_initial.pyc diff --git a/tests/migrations/test_migrations_bad_pyc/__init__.py b/tests/migrations/test_migrations_bad_pyc/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/migrations/test_migrations_bad_pyc/__init__.py |
