1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-02-06 05:40:09 +00:00
bramw_baserow/backend/tests/conftest.py
2024-12-19 19:14:35 +00:00

86 lines
2.4 KiB
Python
Executable file

from __future__ import print_function
from io import IOBase
from pathlib import Path
from django.core.management import call_command
from django.db import connections
from django.test.testcases import TransactionTestCase
import pytest
# noinspection PyUnresolvedReferences
from baserow.test_utils.pytest_conftest import * # noqa: F403, F401
def _fixture_teardown(self):
"""
This is a custom implementation of `TransactionTestCase._fixture_teardown`
from Django (https://github.com/django/django/blob/main/django/test/testcases.py)
that flushes test database after test runs with allow_cascade=True.
This is needed as our custom Baserow tables won't be in the list of tables
to truncate, and hence may create problems when rows are
referencing other tables.
"""
# Allow TRUNCATE ... CASCADE and don't emit the post_migrate signal
# when flushing only a subset of the apps
for db_name in self._databases_names(include_mirrors=False):
# Flush the database
inhibit_post_migrate = (
self.available_apps is not None
or ( # Inhibit the post_migrate signal when using serialized
# rollback to avoid trying to recreate the serialized data.
self.serialized_rollback
and hasattr(connections[db_name], "_test_serialized_contents")
)
)
call_command(
"flush",
verbosity=0,
interactive=False,
database=db_name,
reset_sequences=False,
allow_cascade=True, # CHANGED FROM DJANGO
inhibit_post_migrate=inhibit_post_migrate,
)
TransactionTestCase._fixture_teardown = _fixture_teardown
@pytest.fixture()
def test_data_dir() -> Path:
"""
Returns root path for test data directory
"""
return Path(__file__).parent.joinpath("test_data")
@pytest.fixture()
def open_test_file(test_data_dir):
"""
Opens a test data file on a given path.
usage:
def test_me(open_test_file):
with open_test_file('baserow/core/test.data', 'rt') as f:
assert not f.closed
Note: the caller can treat this as a context manager factory.
"""
fhandle: IOBase | None = None
def get_path(tpath, /, mode="rb") -> IOBase:
nonlocal fhandle
fhandle = (test_data_dir / (tpath)).open(mode=mode)
return fhandle
yield get_path
if fhandle and not fhandle.closed:
fhandle.close()