Last active
June 2, 2021 19:05
-
-
Save gonzaloamadio/14f935d96809299b7f1e9fb88a6e8e94 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-------- models.py -------- | |
class ModelBaseWithTimeStamps(models.Model): | |
created_at = models.DateTimeField(auto_now_add=True) | |
updated_at = models.DateTimeField(auto_now=True) | |
class Meta: | |
abstract = True | |
class Ingredient(ModelBaseWithTimeStamps): | |
name = models.CharField(unique=True, max_length=128) | |
class Meta: | |
managed = False | |
db_table = 'ingredient' | |
app_label = 'api' | |
-------- testapp.settings_test.py -------- | |
from .settings import * | |
from django.test.runner import DiscoverRunner | |
class DisableMigrations(object): | |
def __contains__(self, item): | |
return True | |
def __getitem__(self, item): | |
return | |
MIGRATION_MODULES = DisableMigrations() | |
class UnManagedModelTestRunner(DiscoverRunner): | |
""" | |
Test runner that automatically makes all unmanaged models in your Django | |
project managed for the duration of the test run. | |
""" | |
def setup_test_environment(self, *args, **kwargs): | |
from django.apps import apps | |
self.unmanaged_models = [ | |
m for m in apps.get_models() if not m._meta.managed | |
] | |
for m in self.unmanaged_models: | |
m._meta.managed = True | |
super(UnManagedModelTestRunner, self).setup_test_environment( | |
*args, **kwargs | |
) | |
def teardown_test_environment(self, *args, **kwargs): | |
super(UnManagedModelTestRunner, self).teardown_test_environment( | |
*args, **kwargs | |
) | |
# reset unmanaged models | |
for m in self.unmanaged_models: | |
m._meta.managed = False | |
DATABASES = { | |
"default": { | |
"ENGINE": "django.db.backends.sqlite3", | |
"NAME": os.path.join(BASE_DIR, "db_test.sqlite3"), | |
"TEST": { | |
"ENGINE": "django.db.backends.sqlite3", | |
"NAME": os.path.join(BASE_DIR, "db_test.sqlite3"), | |
}, | |
}, | |
'api': { | |
"ENGINE": "django.db.backends.sqlite3", | |
"NAME": os.path.join(BASE_DIR, "db_legacy_test.sqlite3"), | |
"TEST": { | |
"ENGINE": "django.db.backends.sqlite3", | |
"NAME": os.path.join(BASE_DIR, "db_legacy_test.sqlite3"), | |
}, | |
}, | |
} | |
TEST_RUNNER = "testapp.settings_test.UnManagedModelTestRunner" | |
-------- test.py -------- | |
import factory | |
from django.conf import settings | |
from api.models import Ingredient | |
class IngredientFactory(factory.django.DjangoModelFactory): | |
class Meta: | |
model = Ingredient | |
database = 'api' | |
name = "John Smith" | |
class TestBase(TestCase): | |
databases = {'default', 'api'} | |
class TestModelBaseWithTimestamps2(TestBase): | |
TimestampModel = Ingredient | |
TimestampModelFactory = IngredientFactory | |
@classmethod | |
def timestamp_model_instance(cls, **kwargs): | |
args = factory.build(dict, FACTORY_CLASS=cls.TimestampModelFactory) | |
return cls.TimestampModel(**{**args, **kwargs}) | |
def test_fields_assigned_on_create(self): | |
timestamp_model = self.timestamp_model_instance() | |
timestamp_model.full_clean() | |
----------------- ERROR WHEN EXECUTING PYTEST -------------------- | |
self = <unit_tests.models.test_model_base_with_timestamp_unmanaged_model.TestModelBaseWithTimestamps2 testMethod=test_fields_assigned_on_create> | |
def test_fields_assigned_on_create(self): | |
timestamp_model = self.timestamp_model_instance() | |
> timestamp_model.full_clean() | |
unit_tests/models/test_model_base_with_timestamp_unmanaged_model.py:118: | |
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/models/base.py:1201: in full_clean | |
self.validate_unique(exclude=exclude) | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/models/base.py:983: in validate_unique | |
errors = self._perform_unique_checks(unique_checks) | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/models/base.py:1087: in _perform_unique_checks | |
if qs.exists(): | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/models/query.py:766: in exists | |
if self._result_cache is None: | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/models/sql/query.py:522: in has_results | |
return compiler.has_results() | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/models/sql/compiler.py:1112: in has_results | |
return bool(self.execute_sql(SINGLE)) | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/models/sql/compiler.py:1142: in execute_sql | |
cursor.execute(sql, params) | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/backends/utils.py:67: in execute | |
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/backends/utils.py:76: in _execute_with_wrappers | |
return executor(sql, params, many, context) | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/backends/utils.py:84: in _execute | |
return self.cursor.execute(sql, params) | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/utils.py:89: in __exit__ | |
raise dj_exc_value.with_traceback(traceback) from exc_value | |
../../opt/anaconda3/envs/core_api/lib/python3.7/site-packages/django/db/backends/utils.py:84: in _execute | |
return self.cursor.execute(sql, params) | |
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
self = <django.db.backends.sqlite3.base.SQLiteCursorWrapper object at 0x7fa0e87c3370>, query = 'SELECT (1) AS "a" FROM "ingredient" WHERE "ingredient"."name" = ? LIMIT 1', params = ('John Smith',) | |
def execute(self, query, params=None): | |
if params is None: | |
return Database.Cursor.execute(self, query) | |
query = self.convert_query(query) | |
> return Database.Cursor.execute(self, query, params) | |
E django.db.utils.OperationalError: no such table: ingredient |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment