No project description provided
Project description
Extra factories for factory_boy
This library contains 2 base factories.
- AsyncSQLAlchemyModelFactory
- TortoiseModelFactory
TortoiseModelFactory
Is made to use it with tortoise-orm.
Usage
It works aout of the box, if you have already initialized tortoise-orm for testing.
You can check how to do this in tortoise docs.
import factory
from tortoise import fields, models
from factory_boy_extra.tortoise_factory import TortoiseModelFactory
class TargetModel(models.Model):
name = fields.CharField(max_length=200)
class TargetModelFactory(TortoiseModelFactory):
name = factory.Faker("word")
class Meta:
model = TargetModel
That's it. Now you can use it in your tests, E.G.
@pytest.mark.asyncio
async def test_factories():
targets = TargetModelFactory.create_batch(10)
actual_models = await TargetModel.all()
assert len(actual_models) == 10
AsyncSQLAlchemyModelFactory
Usage
At your conftest.py initialize your factories with AsyncSession.
@pytest.fixture(autouse=True)
def init_factories(dbsession: AsyncSession) -> None:
"""Init factories."""
BaseFactory.session = dbsession
The dbsession factory can be obtained in pytest-async-sqlalchemy library, or you can add it by yourself:
import pytest
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
@pytest.fixture()
async def dbsession():
"""
Fixture that returns a SQLAlchemy session with a SAVEPOINT, and the rollback to it
after the test completes.
"""
engine = create_async_engine(database_url) # You must provide your database URL.
connection = await engine.connect()
trans = await connection.begin()
Session = sessionmaker(connection, expire_on_commit=False, class_=AsyncSession)
session = Session()
try:
yield session
finally:
await session.close()
await trans.rollback()
await connection.close()
await engine.dispose()
Now you can create factories and use them in your tests.
from factory_boy_extra.async_sqlalchemy_factory import AsyncSQLAlchemyModelFactory
class TargetModel(Base):
__tablename__ = "targetmodel"
name = Column(String(length=120), nullable=False) # noqa: WPS432
class TargetModelFactory(AsyncSQLAlchemyModelFactory):
name = factory.Faker("word")
class Meta:
model = TargetModel
In tests it wil look like this:
import pytest
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
@pytest.mark.asyncio
async def test_successful_notification(dbsession: AsyncSession) -> None:
TargetModelFactory.create_batch(10)
actual_models = (await dbsession.execute(select(TargetModel))).fetchall()
assert len(actual_models) == 10
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file factory_boy_extra-0.1.3.tar.gz
.
File metadata
- Download URL: factory_boy_extra-0.1.3.tar.gz
- Upload date:
- Size: 4.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.10 CPython/3.9.7 Linux/5.8.0-1042-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4cc2791232d591cb5910cddd560ae3e6323e4f1b107b469a882ba56cbc159c82 |
|
MD5 | 13273a619adcb3ec9ba48cc32a04ebfc |
|
BLAKE2b-256 | 3db03b7a168333534800e74bfea98e57665073f4c91c4841569fe1169063d029 |
File details
Details for the file factory_boy_extra-0.1.3-py3-none-any.whl
.
File metadata
- Download URL: factory_boy_extra-0.1.3-py3-none-any.whl
- Upload date:
- Size: 4.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.10 CPython/3.9.7 Linux/5.8.0-1042-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 770e82bdb0e9a98249741641e69fd8f09254e9ea8d6d29c1a7302ed3d1f8bc2b |
|
MD5 | e2c26189c24acc067150915babb119fb |
|
BLAKE2b-256 | e30a8ba049a5c4389e358203d265f2cf4471e6029a0a366861b5974edeb625ce |