Skip to content

Instantly share code, notes, and snippets.

@gonzaloamadio
Last active June 2, 2021 19:05
Show Gist options
  • Save gonzaloamadio/14f935d96809299b7f1e9fb88a6e8e94 to your computer and use it in GitHub Desktop.
Save gonzaloamadio/14f935d96809299b7f1e9fb88a6e8e94 to your computer and use it in GitHub Desktop.
-------- 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