Files
recipes/cookbook/tests/factories/__init__.py
2021-12-15 12:36:33 -06:00

127 lines
3.9 KiB
Python

import factory
import pytest
from django.contrib import auth
from django.contrib.auth.models import User
from django_scopes import scopes_disabled
from faker import Factory as FakerFactory
faker = FakerFactory.create()
@pytest.fixture(autouse=True)
def enable_db_access_for_all_tests(db):
pass
@pytest.hookimpl(hookwrapper=True)
def pytest_fixture_setup(fixturedef, request):
if inspect.isgeneratorfunction(fixturedef.func):
yield
else:
with scopes_disabled():
yield
class SpaceFactory(factory.django.DjangoModelFactory):
"""Space factory."""
name = factory.LazyAttribute(lambda x: faker.word())
@classmethod
def _create(cls, model_class, **kwargs):
with scopes_disabled():
return super()._create(model_class, **kwargs)
class Meta:
model = 'cookbook.Space'
class UserFactory(factory.django.DjangoModelFactory):
"""User factory."""
username = factory.LazyAttribute(lambda x: faker.word())
first_name = factory.LazyAttribute(lambda x: faker.first_name())
last_name = factory.LazyAttribute(lambda x: faker.last_name())
email = factory.LazyAttribute(lambda x: faker.email())
space = factory.SubFactory(SpaceFactory)
class Meta:
model = User
class SupermarketCategoryFactory(factory.django.DjangoModelFactory):
"""SupermarketCategory factory."""
name = factory.LazyAttribute(lambda x: faker.word())
description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10))
space = factory.SubFactory(SpaceFactory)
class Meta:
model = 'cookbook.SupermarketCategory'
# @factory.django.mute_signals(post_save)
class FoodFactory(factory.django.DjangoModelFactory):
"""Food factory."""
name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3))
description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10))
supermarket_category = factory.Maybe(
factory.LazyAttribute(
lambda x:
x.add_categories),
yes_declaration=factory.SubFactory(SupermarketCategoryFactory),
no_declaration=None
)
space = factory.SubFactory(SpaceFactory)
# this code will run immediately prior to creating the model object useful when you want a reverse relationship
# log = factory.RelatedFactory(
# UserLogFactory,
# factory_related_name='user',
# action=models.UserLog.ACTION_CREATE,
# )
class Params:
add_categories = False
class Meta:
model = 'cookbook.Food'
class UnitFactory(factory.django.DjangoModelFactory):
"""Unit factory."""
name = factory.LazyAttribute(lambda x: faker.word())
description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10))
space = factory.SubFactory(SpaceFactory)
class Meta:
model = 'cookbook.Unit'
class IngredientFactory(factory.django.DjangoModelFactory):
"""Ingredient factory."""
food = factory.SubFactory(FoodFactory)
unit = factory.SubFactory(UnitFactory)
amount = 1
note = factory.LazyAttribute(lambda x: faker.sentence(nb_words=5))
space = factory.SubFactory(SpaceFactory)
class Meta:
model = 'cookbook.Ingredient'
class ShoppingListEntryFactory(factory.django.DjangoModelFactory):
"""ShoppingListEntry factory."""
# list_recipe = models.ForeignKey(ShoppingListRecipe, on_delete=models.CASCADE, null=True, blank=True, related_name='entries')
food = factory.SubFactory(FoodFactory)
unit = factory.SubFactory(UnitFactory)
ingredient = factory.SubFactory(IngredientFactory)
amount = 1
order = 0
checked = False
created_by = factory.SubFactory(UserFactory)
# created_at = models.DateTimeField(auto_now_add=True)
# completed_at = models.DateTimeField(null=True, blank=True)
# delay_until = models.DateTimeField(null=True, blank=True)
space = factory.SubFactory(SpaceFactory)
class Meta:
model = 'cookbook.ShoppingListEntry'