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)