mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-28 03:26:01 -04:00
772374735d
tested using pycodestyle version 2.2.0 Fixes: #3885 Change-Id: I5df43adc3aefe318f9eeab72a078247a548ec566 Pull-request: https://github.com/zzzeek/sqlalchemy/pull/343
471 lines
15 KiB
Python
471 lines
15 KiB
Python
from sqlalchemy import MetaData, Integer, String, ForeignKey
|
|
from sqlalchemy import util
|
|
from sqlalchemy.testing.schema import Table
|
|
from sqlalchemy.testing.schema import Column
|
|
from sqlalchemy.orm import attributes, mapper, relationship, \
|
|
backref, configure_mappers
|
|
from sqlalchemy.testing import fixtures
|
|
|
|
__all__ = ()
|
|
|
|
|
|
class FixtureTest(fixtures.MappedTest):
|
|
"""A MappedTest pre-configured with a common set of fixtures.
|
|
|
|
"""
|
|
|
|
run_define_tables = 'once'
|
|
run_setup_classes = 'once'
|
|
run_setup_mappers = 'each'
|
|
run_inserts = 'each'
|
|
run_deletes = 'each'
|
|
|
|
@classmethod
|
|
def setup_classes(cls):
|
|
class Base(cls.Comparable):
|
|
pass
|
|
|
|
class User(Base):
|
|
pass
|
|
|
|
class Order(Base):
|
|
pass
|
|
|
|
class Item(Base):
|
|
pass
|
|
|
|
class Keyword(Base):
|
|
pass
|
|
|
|
class Address(Base):
|
|
pass
|
|
|
|
class Dingaling(Base):
|
|
pass
|
|
|
|
class Node(Base):
|
|
pass
|
|
|
|
class CompositePk(Base):
|
|
pass
|
|
|
|
@classmethod
|
|
def _setup_stock_mapping(cls):
|
|
Node, composite_pk_table, users, Keyword, items, Dingaling, \
|
|
order_items, item_keywords, Item, User, dingalings, \
|
|
Address, keywords, CompositePk, nodes, Order, orders, \
|
|
addresses = cls.classes.Node, \
|
|
cls.tables.composite_pk_table, cls.tables.users, \
|
|
cls.classes.Keyword, cls.tables.items, \
|
|
cls.classes.Dingaling, cls.tables.order_items, \
|
|
cls.tables.item_keywords, cls.classes.Item, \
|
|
cls.classes.User, cls.tables.dingalings, \
|
|
cls.classes.Address, cls.tables.keywords, \
|
|
cls.classes.CompositePk, cls.tables.nodes, \
|
|
cls.classes.Order, cls.tables.orders, cls.tables.addresses
|
|
|
|
# use OrderedDict on this one to support some tests that
|
|
# assert the order of attributes (e.g. orm/test_inspect)
|
|
mapper(User, users, properties=util.OrderedDict(
|
|
[('addresses', relationship(Address, backref='user',
|
|
order_by=addresses.c.id)),
|
|
('orders', relationship(Order, backref='user',
|
|
order_by=orders.c.id)), # o2m, m2o
|
|
]
|
|
))
|
|
mapper(Address, addresses, properties={
|
|
# o2o
|
|
'dingaling': relationship(Dingaling, uselist=False,
|
|
backref="address")
|
|
})
|
|
mapper(Dingaling, dingalings)
|
|
mapper(Order, orders, properties={
|
|
# m2m
|
|
'items': relationship(Item, secondary=order_items,
|
|
order_by=items.c.id),
|
|
'address': relationship(Address), # m2o
|
|
})
|
|
mapper(Item, items, properties={
|
|
'keywords': relationship(Keyword, secondary=item_keywords) # m2m
|
|
})
|
|
mapper(Keyword, keywords)
|
|
|
|
mapper(Node, nodes, properties={
|
|
'children': relationship(Node,
|
|
backref=backref('parent',
|
|
remote_side=[nodes.c.id]))
|
|
})
|
|
|
|
mapper(CompositePk, composite_pk_table)
|
|
|
|
configure_mappers()
|
|
|
|
@classmethod
|
|
def define_tables(cls, metadata):
|
|
Table('users', metadata,
|
|
Column('id', Integer, primary_key=True,
|
|
test_needs_autoincrement=True),
|
|
Column('name', String(30), nullable=False),
|
|
test_needs_acid=True,
|
|
test_needs_fk=True)
|
|
|
|
Table('addresses', metadata,
|
|
Column('id', Integer, primary_key=True,
|
|
test_needs_autoincrement=True),
|
|
Column('user_id', None, ForeignKey('users.id')),
|
|
Column('email_address', String(50), nullable=False),
|
|
test_needs_acid=True,
|
|
test_needs_fk=True)
|
|
|
|
Table('email_bounces', metadata,
|
|
Column('id', Integer, ForeignKey('addresses.id')),
|
|
Column('bounces', Integer))
|
|
|
|
Table('orders', metadata,
|
|
Column('id', Integer, primary_key=True,
|
|
test_needs_autoincrement=True),
|
|
Column('user_id', None, ForeignKey('users.id')),
|
|
Column('address_id', None, ForeignKey('addresses.id')),
|
|
Column('description', String(30)),
|
|
Column('isopen', Integer),
|
|
test_needs_acid=True,
|
|
test_needs_fk=True)
|
|
|
|
Table("dingalings", metadata,
|
|
Column('id', Integer, primary_key=True,
|
|
test_needs_autoincrement=True),
|
|
Column('address_id', None, ForeignKey('addresses.id')),
|
|
Column('data', String(30)),
|
|
test_needs_acid=True,
|
|
test_needs_fk=True)
|
|
|
|
Table('items', metadata,
|
|
Column('id', Integer, primary_key=True,
|
|
test_needs_autoincrement=True),
|
|
Column('description', String(30), nullable=False),
|
|
test_needs_acid=True,
|
|
test_needs_fk=True)
|
|
|
|
Table('order_items', metadata,
|
|
Column('item_id', None, ForeignKey('items.id')),
|
|
Column('order_id', None, ForeignKey('orders.id')),
|
|
test_needs_acid=True,
|
|
test_needs_fk=True)
|
|
|
|
Table('keywords', metadata,
|
|
Column('id', Integer, primary_key=True,
|
|
test_needs_autoincrement=True),
|
|
Column('name', String(30), nullable=False),
|
|
test_needs_acid=True,
|
|
test_needs_fk=True)
|
|
|
|
Table('item_keywords', metadata,
|
|
Column('item_id', None, ForeignKey('items.id')),
|
|
Column('keyword_id', None, ForeignKey('keywords.id')),
|
|
test_needs_acid=True,
|
|
test_needs_fk=True)
|
|
|
|
Table('nodes', metadata,
|
|
Column('id', Integer, primary_key=True,
|
|
test_needs_autoincrement=True),
|
|
Column('parent_id', Integer, ForeignKey('nodes.id')),
|
|
Column('data', String(30)),
|
|
test_needs_acid=True,
|
|
test_needs_fk=True)
|
|
|
|
Table('composite_pk_table', metadata,
|
|
Column('i', Integer, primary_key=True),
|
|
Column('j', Integer, primary_key=True),
|
|
Column('k', Integer, nullable=False))
|
|
|
|
@classmethod
|
|
def setup_mappers(cls):
|
|
pass
|
|
|
|
@classmethod
|
|
def fixtures(cls):
|
|
return dict(
|
|
users=(
|
|
('id', 'name'),
|
|
(7, 'jack'),
|
|
(8, 'ed'),
|
|
(9, 'fred'),
|
|
(10, 'chuck')
|
|
),
|
|
|
|
addresses=(
|
|
('id', 'user_id', 'email_address'),
|
|
(1, 7, "jack@bean.com"),
|
|
(2, 8, "ed@wood.com"),
|
|
(3, 8, "ed@bettyboop.com"),
|
|
(4, 8, "ed@lala.com"),
|
|
(5, 9, "fred@fred.com")
|
|
),
|
|
|
|
email_bounces=(
|
|
('id', 'bounces'),
|
|
(1, 1),
|
|
(2, 0),
|
|
(3, 5),
|
|
(4, 0),
|
|
(5, 0)
|
|
),
|
|
|
|
orders=(
|
|
('id', 'user_id', 'description', 'isopen', 'address_id'),
|
|
(1, 7, 'order 1', 0, 1),
|
|
(2, 9, 'order 2', 0, 4),
|
|
(3, 7, 'order 3', 1, 1),
|
|
(4, 9, 'order 4', 1, 4),
|
|
(5, 7, 'order 5', 0, None)
|
|
),
|
|
|
|
dingalings=(
|
|
('id', 'address_id', 'data'),
|
|
(1, 2, 'ding 1/2'),
|
|
(2, 5, 'ding 2/5')
|
|
),
|
|
|
|
items=(
|
|
('id', 'description'),
|
|
(1, 'item 1'),
|
|
(2, 'item 2'),
|
|
(3, 'item 3'),
|
|
(4, 'item 4'),
|
|
(5, 'item 5')
|
|
),
|
|
|
|
order_items=(
|
|
('item_id', 'order_id'),
|
|
(1, 1),
|
|
(2, 1),
|
|
(3, 1),
|
|
|
|
(1, 2),
|
|
(2, 2),
|
|
(3, 2),
|
|
|
|
(3, 3),
|
|
(4, 3),
|
|
(5, 3),
|
|
|
|
(1, 4),
|
|
(5, 4),
|
|
|
|
(5, 5)
|
|
),
|
|
|
|
keywords=(
|
|
('id', 'name'),
|
|
(1, 'blue'),
|
|
(2, 'red'),
|
|
(3, 'green'),
|
|
(4, 'big'),
|
|
(5, 'small'),
|
|
(6, 'round'),
|
|
(7, 'square')
|
|
),
|
|
|
|
item_keywords=(
|
|
('keyword_id', 'item_id'),
|
|
(2, 1),
|
|
(2, 2),
|
|
(4, 1),
|
|
(6, 1),
|
|
(5, 2),
|
|
(3, 3),
|
|
(4, 3),
|
|
(7, 2),
|
|
(6, 3)
|
|
),
|
|
|
|
nodes=(
|
|
('id', 'parent_id', 'data'),
|
|
),
|
|
|
|
composite_pk_table=(
|
|
('i', 'j', 'k'),
|
|
(1, 2, 3),
|
|
(2, 1, 4),
|
|
(1, 1, 5),
|
|
(2, 2, 6)
|
|
)
|
|
)
|
|
|
|
@util.memoized_property
|
|
def static(self):
|
|
return CannedResults(self)
|
|
|
|
|
|
class CannedResults(object):
|
|
"""Built on demand, instances use mappers in effect at time of call."""
|
|
|
|
def __init__(self, test):
|
|
self.test = test
|
|
|
|
@property
|
|
def user_result(self):
|
|
User = self.test.classes.User
|
|
|
|
return [
|
|
User(id=7),
|
|
User(id=8),
|
|
User(id=9),
|
|
User(id=10)]
|
|
|
|
@property
|
|
def user_address_result(self):
|
|
User, Address = self.test.classes.User, self.test.classes.Address
|
|
|
|
return [
|
|
User(id=7, addresses=[
|
|
Address(id=1)
|
|
]),
|
|
User(id=8, addresses=[
|
|
Address(id=2, email_address='ed@wood.com'),
|
|
Address(id=3, email_address='ed@bettyboop.com'),
|
|
Address(id=4, email_address='ed@lala.com'),
|
|
]),
|
|
User(id=9, addresses=[
|
|
Address(id=5)
|
|
]),
|
|
User(id=10, addresses=[])]
|
|
|
|
@property
|
|
def address_user_result(self):
|
|
User, Address = self.test.classes.User, self.test.classes.Address
|
|
u7 = User(id=7)
|
|
u8 = User(id=8)
|
|
u9 = User(id=9)
|
|
return [
|
|
Address(id=1, email_address='jack@bean.com', user=u7),
|
|
Address(id=2, email_address='ed@wood.com', user=u8),
|
|
Address(id=3, email_address='ed@bettyboop.com', user=u8),
|
|
Address(id=4, email_address='ed@lala.com', user=u8),
|
|
Address(id=5, user=u9)
|
|
]
|
|
|
|
@property
|
|
def user_all_result(self):
|
|
User, Address, Order, Item = self.test.classes.User, \
|
|
self.test.classes.Address, self.test.classes.Order, \
|
|
self.test.classes.Item
|
|
|
|
return [
|
|
User(id=7,
|
|
addresses=[Address(id=1)],
|
|
orders=[
|
|
Order(description='order 1',
|
|
items=[
|
|
Item(description='item 1'),
|
|
Item(description='item 2'),
|
|
Item(description='item 3')]),
|
|
Order(description='order 3'),
|
|
Order(description='order 5')]),
|
|
User(id=8,
|
|
addresses=[Address(id=2), Address(id=3), Address(id=4)]),
|
|
User(id=9,
|
|
addresses=[
|
|
Address(id=5)],
|
|
orders=[
|
|
Order(description='order 2',
|
|
items=[
|
|
Item(description='item 1'),
|
|
Item(description='item 2'),
|
|
Item(description='item 3')]),
|
|
Order(description='order 4',
|
|
items=[
|
|
Item(description='item 1'),
|
|
Item(description='item 5')])]),
|
|
User(id=10, addresses=[])]
|
|
|
|
@property
|
|
def user_order_result(self):
|
|
User, Order, Item = self.test.classes.User, \
|
|
self.test.classes.Order, self.test.classes.Item
|
|
return [
|
|
User(id=7,
|
|
orders=[
|
|
Order(id=1,
|
|
items=[Item(id=1), Item(id=2), Item(id=3)]),
|
|
Order(id=3,
|
|
items=[Item(id=3), Item(id=4), Item(id=5)]),
|
|
Order(id=5,
|
|
items=[Item(id=5)])]),
|
|
User(id=8,
|
|
orders=[]),
|
|
User(id=9,
|
|
orders=[
|
|
Order(id=2,
|
|
items=[Item(id=1), Item(id=2), Item(id=3)]),
|
|
Order(id=4,
|
|
items=[Item(id=1), Item(id=5)])]),
|
|
User(id=10)]
|
|
|
|
@property
|
|
def item_keyword_result(self):
|
|
Item, Keyword = self.test.classes.Item, self.test.classes.Keyword
|
|
return [
|
|
Item(id=1,
|
|
keywords=[
|
|
Keyword(name='red'),
|
|
Keyword(name='big'),
|
|
Keyword(name='round')]),
|
|
Item(id=2,
|
|
keywords=[
|
|
Keyword(name='red'),
|
|
Keyword(name='small'),
|
|
Keyword(name='square')]),
|
|
Item(id=3,
|
|
keywords=[
|
|
Keyword(name='green'),
|
|
Keyword(name='big'),
|
|
Keyword(name='round')]),
|
|
Item(id=4,
|
|
keywords=[]),
|
|
Item(id=5,
|
|
keywords=[])]
|
|
|
|
@property
|
|
def user_item_keyword_result(self):
|
|
Item, Keyword = self.test.classes.Item, self.test.classes.Keyword
|
|
User, Order = self.test.classes.User, self.test.classes.Order
|
|
|
|
item1, item2, item3, item4, item5 = \
|
|
Item(id=1,
|
|
keywords=[
|
|
Keyword(name='red'),
|
|
Keyword(name='big'),
|
|
Keyword(name='round')]),\
|
|
Item(id=2,
|
|
keywords=[
|
|
Keyword(name='red'),
|
|
Keyword(name='small'),
|
|
Keyword(name='square')]),\
|
|
Item(id=3,
|
|
keywords=[
|
|
Keyword(name='green'),
|
|
Keyword(name='big'),
|
|
Keyword(name='round')]),\
|
|
Item(id=4, keywords=[]),\
|
|
Item(id=5, keywords=[])
|
|
|
|
user_result = [
|
|
User(id=7,
|
|
orders=[
|
|
Order(id=1,
|
|
items=[item1, item2, item3]),
|
|
Order(id=3,
|
|
items=[item3, item4, item5]),
|
|
Order(id=5,
|
|
items=[item5])]),
|
|
User(id=8, orders=[]),
|
|
User(id=9,
|
|
orders=[
|
|
Order(id=2,
|
|
items=[item1, item2, item3]),
|
|
Order(id=4,
|
|
items=[item1, item5])]),
|
|
User(id=10, orders=[])]
|
|
return user_result
|