Database fixtures¶
SQLAlchemy¶
Charlatan has been heavily used and tested with sqlalchemy. Here’s a simple example:
Tests:
from charlatan import testing
from charlatan import FixturesManager
from charlatan.tests.fixtures.models import Session, Base, engine
from charlatan.tests.fixtures.models import Toaster
session = Session()
manager = FixturesManager(db_session=session)
manager.load("./charlatan/tests/example/data/sqlalchemy.yaml")
class TestSqlalchemyFixtures(testing.TestCase):
def setUp(self):
self.manager = manager
# There's a lot of different patterns to setup and teardown the
# database. This is the simplest possibility.
Base.metadata.create_all(engine)
def tearDown(self):
Base.metadata.drop_all(engine)
session.close()
def test_double_install(self):
"""Verify that there's no double install."""
self.manager.install_fixture('toaster')
toaster = session.query(Toaster).one()
assert toaster.color.name == 'red'
YAML file:
toaster:
fields:
color: !rel color
name: "toaster1"
model: charlatan.tests.fixtures.models:Toaster
color:
fields:
name: "red"
model: charlatan.tests.fixtures.models:Color
Model definition:
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('sqlite:///:memory:')
Session = sessionmaker(bind=engine)
class Toaster(Base):
__tablename__ = "toasters"
id = Column(Integer, primary_key=True)
name = Column(String)
color_id = Column(String, ForeignKey('colors.name'))
color = relationship("Color", backref='toasters')
class Color(Base):
__tablename__ = "colors"
id = Column(Integer, primary_key=True)
name = Column(String)