paperless-ngx/src/documents/tests/utils.py

128 lines
3.7 KiB
Python
Raw Normal View History

import os
import shutil
import tempfile
from collections import namedtuple
2020-12-05 13:19:14 +01:00
from contextlib import contextmanager
2021-02-08 13:18:39 +01:00
from django.apps import apps
from django.db import connection
from django.db.migrations.executor import MigrationExecutor
from django.test import override_settings
from django.test import TransactionTestCase
def setup_directories():
dirs = namedtuple("Dirs", ())
dirs.data_dir = tempfile.mkdtemp()
dirs.scratch_dir = tempfile.mkdtemp()
dirs.media_dir = tempfile.mkdtemp()
dirs.consumption_dir = tempfile.mkdtemp()
2020-11-27 15:00:16 +01:00
dirs.index_dir = os.path.join(dirs.data_dir, "index")
dirs.originals_dir = os.path.join(dirs.media_dir, "documents", "originals")
dirs.thumbnail_dir = os.path.join(dirs.media_dir, "documents", "thumbnails")
2020-11-29 13:37:39 +01:00
dirs.archive_dir = os.path.join(dirs.media_dir, "documents", "archive")
2021-02-06 17:02:00 +01:00
dirs.logging_dir = os.path.join(dirs.data_dir, "log")
2020-11-27 15:00:16 +01:00
os.makedirs(dirs.index_dir, exist_ok=True)
os.makedirs(dirs.originals_dir, exist_ok=True)
2020-11-29 18:37:31 +01:00
os.makedirs(dirs.thumbnail_dir, exist_ok=True)
2020-11-29 13:37:39 +01:00
os.makedirs(dirs.archive_dir, exist_ok=True)
2021-02-06 17:02:00 +01:00
os.makedirs(dirs.logging_dir, exist_ok=True)
2020-12-05 13:19:14 +01:00
dirs.settings_override = override_settings(
DATA_DIR=dirs.data_dir,
SCRATCH_DIR=dirs.scratch_dir,
MEDIA_ROOT=dirs.media_dir,
ORIGINALS_DIR=dirs.originals_dir,
THUMBNAIL_DIR=dirs.thumbnail_dir,
2020-11-29 13:37:39 +01:00
ARCHIVE_DIR=dirs.archive_dir,
CONSUMPTION_DIR=dirs.consumption_dir,
2021-02-06 17:02:00 +01:00
LOGGING_DIR=dirs.logging_dir,
2020-11-27 15:00:16 +01:00
INDEX_DIR=dirs.index_dir,
2020-12-15 13:47:43 +01:00
MODEL_FILE=os.path.join(dirs.data_dir, "classification_model.pickle"),
2022-02-27 15:26:41 +01:00
MEDIA_LOCK=os.path.join(dirs.media_dir, "media.lock"),
2020-12-05 13:19:14 +01:00
)
dirs.settings_override.enable()
return dirs
def remove_dirs(dirs):
shutil.rmtree(dirs.media_dir, ignore_errors=True)
shutil.rmtree(dirs.data_dir, ignore_errors=True)
shutil.rmtree(dirs.scratch_dir, ignore_errors=True)
shutil.rmtree(dirs.consumption_dir, ignore_errors=True)
2020-12-05 13:19:14 +01:00
dirs.settings_override.disable()
@contextmanager
def paperless_environment():
dirs = None
try:
dirs = setup_directories()
yield dirs
finally:
if dirs:
remove_dirs(dirs)
class DirectoriesMixin:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.dirs = None
def setUp(self) -> None:
self.dirs = setup_directories()
super().setUp()
def tearDown(self) -> None:
super().tearDown()
remove_dirs(self.dirs)
2021-02-08 13:18:39 +01:00
class TestMigrations(TransactionTestCase):
@property
def app(self):
return apps.get_containing_app_config(type(self).__module__).name
migrate_from = None
migrate_to = None
auto_migrate = True
2021-02-08 13:18:39 +01:00
def setUp(self):
super().setUp()
2021-02-08 13:18:39 +01:00
2022-02-27 15:26:41 +01:00
assert (
self.migrate_from and self.migrate_to
), "TestCase '{}' must define migrate_from and migrate_to properties".format(
type(self).__name__,
2022-02-27 15:26:41 +01:00
)
2021-02-08 13:18:39 +01:00
self.migrate_from = [(self.app, self.migrate_from)]
self.migrate_to = [(self.app, self.migrate_to)]
executor = MigrationExecutor(connection)
old_apps = executor.loader.project_state(self.migrate_from).apps
# Reverse to the original migration
executor.migrate(self.migrate_from)
self.setUpBeforeMigration(old_apps)
self.apps = old_apps
if self.auto_migrate:
self.performMigration()
def performMigration(self):
2021-02-08 13:18:39 +01:00
# Run the migration to test
executor = MigrationExecutor(connection)
executor.loader.build_graph() # reload.
executor.migrate(self.migrate_to)
self.apps = executor.loader.project_state(self.migrate_to).apps
def setUpBeforeMigration(self, apps):
pass