class TestModelFactoryMulti:

    def __init__(self, *args, **kw):
        
        self.metadata = make_test_db_multi()
        engine = self.metadata.bind
        self.config = DummyConfig(engine)
        self.factory = ModelFactory(self.config)
#        self.factory.models
        
    
    def test_get_foreign_keys(self):
        fks = [t.name for t in self.factory.get_foreign_keys(self.metadata.tables['song']).keys()]
        
        eq_(fks, ['album'])
        
    def test_get_composite_fks(self):
        fks = sorted([k.column.name for k in self.factory.get_composite_foreign_keys(self.metadata.tables['song'])[0]])
        eq_(fks, [u'albumartist', u'albumname'] )
 
    def test_render_song(self):
        self.factory.models
        song = self.factory.models[1]
        eq_(song.__repr__(), """class Song(DeclarativeBase):
    __tablename__ = 'song'

    __table_args__ = {}

    #column definitions
    songalbum = Column(u'songalbum', TEXT(length=None, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), ForeignKey('album.albumname'))
    songartist = Column(u'songartist', TEXT(length=None, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), ForeignKey('album.albumartist'))
    songid = Column(u'songid', INTEGER(), primary_key=True)
    songname = Column(u'songname', TEXT(length=None, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))

    #relation definitions
    album = relation('Album', primaryjoin="and_(Song.songartist==Album.albumartist, Song.songalbum==Album.albumname)")
"""
    )
 def setup(self):
     self.config = DummyConfig()
     self.factory = ModelFactory(self.config)
class TestModelFactory:

    def setup(self):
        self.config = DummyConfig()
        self.factory = ModelFactory(self.config)

    def test_tables(self):
        tables = sorted(self.factory.tables)
        eq_(tables,  [u'tg_group', u'tg_group_permission', u'tg_permission', u'tg_town', u'tg_user', u'tg_user_group'])

    def _setup_all_models(self):
        return self.factory.models

    def test_create_model(self):
        self.factory.used_model_names = []
        self.factory.used_table_names = []

        Group      = self.factory.create_model(self.factory._metadata.tables['tg_group'])
        Permission = self.factory.create_model(self.factory._metadata.tables['tg_permission'])
        Town       = self.factory.create_model(self.factory._metadata.tables['tg_town'])
        User       = self.factory.create_model(self.factory._metadata.tables['tg_user'])

        class_mapper(Town)
        class_mapper(User)

        t = Town(town_name="Arvada")
        u = User(tg_town=t)
        assert u.tg_town.town_name == 'Arvada'

    def test_get_many_to_many_tables(self):
        tables = sorted([table.name for table in self.factory.get_many_to_many_tables()])
        eq_(tables, [u'tg_group_permission', u'tg_user_group'])

    def test_get_related_many_to_many_tables(self):
        tables = [table.name for table in self.factory.get_related_many_to_many_tables('tg_user')]
        eq_(tables, [u'tg_user_group'])

    def test_get_foreign_keys(self):
        columns = [column[0].name for column in self.factory.get_foreign_keys(self.factory._metadata.tables['tg_user']).values()]
        eq_(columns, ['town_id'])


    def test_model___repr__(self):
        models = sorted(self._setup_all_models())
        for model in models:
            if model.__name__=='TgUser':
                User = model
        r = User.__repr__()
        print r
        expected = """\
class TgUser(DeclarativeBase):
    __tablename__ = 'tg_user'

    #column definitions
    created = Column(u'created', TIMESTAMP(timezone=False))
    display_name = Column(u'display_name', VARCHAR(length=255, convert_unicode=False, assert_unicode=None))
    email_address = Column(u'email_address', VARCHAR(length=255, convert_unicode=False, assert_unicode=None), nullable=False)
    password = Column(u'password', VARCHAR(length=80, convert_unicode=False, assert_unicode=None))
    town_id = Column(u'town_id', INTEGER(), ForeignKey('tg_town.town_id'))
    user_id = Column(u'user_id', INTEGER(), primary_key=True, nullable=False)
    user_name = Column(u'user_name', VARCHAR(length=16, convert_unicode=False, assert_unicode=None), nullable=False)

    #relation definitions
    tg_town = relation('TgTown')
    tg_groups = relation('TgGroup', secondary=tg_user_group)
"""
        eq_(r.strip(), expected.strip())

    def test__repr__(self):

        r = repr(self.factory)
        print r
        expected = """\
#autogenerated by sqlautocode

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation

engine = create_engine('sqlite:////Users/percious/oss/tgtut/src/sqlautocode/sqlautocode/tests/data/devdata.db')
DeclarativeBase = declarative_base()
metadata = DeclarativeBase.metadata
metadata.bind = engine

tg_group_permission = Table(u'tg_group_permission', metadata,
    Column(u'group_id', INTEGER(), ForeignKey('tg_group.group_id'), primary_key=True, nullable=False),
    Column(u'permission_id', INTEGER(), ForeignKey('tg_permission.permission_id'), primary_key=True, nullable=False),
)

tg_user_group = Table(u'tg_user_group', metadata,
    Column(u'user_id', INTEGER(), ForeignKey('tg_user.user_id'), primary_key=True, nullable=False),
    Column(u'group_id', INTEGER(), ForeignKey('tg_group.group_id'), primary_key=True, nullable=False),
)

class TgGroup(DeclarativeBase):
    __tablename__ = 'tg_group'

    #column definitions
    created = Column(u'created', TIMESTAMP(timezone=False))
    display_name = Column(u'display_name', VARCHAR(length=255, convert_unicode=False, assert_unicode=None))
    group_id = Column(u'group_id', INTEGER(), primary_key=True, nullable=False)
    group_name = Column(u'group_name', VARCHAR(length=16, convert_unicode=False, assert_unicode=None), nullable=False)

    #relation definitions
    tg_permissions = relation('TgPermission', secondary=tg_group_permission)
    tg_users = relation('TgUser', secondary=tg_user_group)


class TgPermission(DeclarativeBase):
    __tablename__ = 'tg_permission'

    #column definitions
    description = Column(u'description', VARCHAR(length=255, convert_unicode=False, assert_unicode=None))
    permission_id = Column(u'permission_id', INTEGER(), primary_key=True, nullable=False)
    permission_name = Column(u'permission_name', VARCHAR(length=16, convert_unicode=False, assert_unicode=None), nullable=False)

    #relation definitions
    tg_groups = relation('TgGroup', secondary=tg_group_permission)


class TgTown(DeclarativeBase):
    __tablename__ = 'tg_town'

    #column definitions
    town_id = Column(u'town_id', INTEGER(), primary_key=True, nullable=False)
    town_name = Column(u'town_name', VARCHAR(length=255, convert_unicode=False, assert_unicode=None))

    #relation definitions


class TgUser(DeclarativeBase):
    __tablename__ = 'tg_user'

    #column definitions
    created = Column(u'created', TIMESTAMP(timezone=False))
    display_name = Column(u'display_name', VARCHAR(length=255, convert_unicode=False, assert_unicode=None))
    email_address = Column(u'email_address', VARCHAR(length=255, convert_unicode=False, assert_unicode=None), nullable=False)
    password = Column(u'password', VARCHAR(length=80, convert_unicode=False, assert_unicode=None))
    town_id = Column(u'town_id', INTEGER(), ForeignKey('tg_town.town_id'))
    user_id = Column(u'user_id', INTEGER(), primary_key=True, nullable=False)
    user_name = Column(u'user_name', VARCHAR(length=16, convert_unicode=False, assert_unicode=None), nullable=False)

    #relation definitions
    tg_town = relation('TgTown')
    tg_groups = relation('TgGroup', secondary=tg_user_group)


#example on how to query your Schema
from sqlalchemy.orm import sessionmaker
session = sessionmaker(bind=engine)()
objs = session.query(TgGroup).all()
print 'All TgGroup objects: %s'%objs
"""
        assert expected in r, r
 def setup(self):
     self.metadata = make_test_db()
     engine = self.metadata.bind
     self.config = DummyConfig(engine)
     self.factory = ModelFactory(self.config)
     self.factory.models
 def __init__(self, *args, **kw):
     
     self.metadata = make_test_db_multi()
     engine = self.metadata.bind
     self.config = DummyConfig(engine)
     self.factory = ModelFactory(self.config)
 def setup(self):
     self.metadata = make_test_db()
     engine = self.metadata.bind
     self.config = DummyConfig(engine)
     self.factory = ModelFactory(self.config)
     self.factory.models
class TestModelFactoryNew:

    def setup(self):
        self.metadata = make_test_db()
        engine = self.metadata.bind
        self.config = DummyConfig(engine)
        self.factory = ModelFactory(self.config)
        self.factory.models

    def test_tables(self):
        tables = sorted([t.name for t in self.factory.tables])
        eq_(tables,  [u'environment', u'no_pk', u'report', u'ui_report'])

    def test_setup_all_models(self):
        assert len(self.factory.models) == 3

    def test_repr_environ_model(self):
        print self.factory.models
        s = self.factory.models[0].__repr__()
        assert s == """class Environment(DeclarativeBase):
    __tablename__ = 'environment'

    __table_args__ = {}

    #column definitions
    database_host = Column(u'database_host', VARCHAR(length=100, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
    database_pass = Column(u'database_pass', VARCHAR(length=100, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
    database_port = Column(u'database_port', VARCHAR(length=5, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
    database_sid = Column(u'database_sid', VARCHAR(length=32, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
    database_user = Column(u'database_user', VARCHAR(length=100, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
    environment_id = Column(u'environment_id', NUMERIC(precision=10, scale=0, asdecimal=True), primary_key=True, nullable=False)
    environment_name = Column(u'environment_name', VARCHAR(length=100, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)

    #relation definitions
    reports = relation('Report', primaryjoin='Environment.environment_id==UiReport.environment_id', secondary=ui_report, secondaryjoin='UiReport.report_id==Report.report_id')
""", s

    def test_no_pk_table_in_output(self):
        s = self.factory.__repr__()
        assert """no_pk = Table(u'no_pk', metadata,
    Column(u'data', TEXT(length=None, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False)),
)""" in s, s
        
        
    def test_repr_report(self):
        s = self.factory.models[1].__repr__()
        assert s == """class Report(DeclarativeBase):
    __tablename__ = 'report'

    __table_args__ = {}

    #column definitions
    created_by = Column(u'created_by', NUMERIC(precision=10, scale=0, asdecimal=True), nullable=False)
    created_date = Column(u'created_date', DATETIME(timezone=False), nullable=False)
    deleted = Column(u'deleted', NUMERIC(precision=1, scale=0, asdecimal=True), nullable=False)
    deleted_by = Column(u'deleted_by', NUMERIC(precision=10, scale=0, asdecimal=True))
    deleted_date = Column(u'deleted_date', DATETIME(timezone=False))
    environment_id = Column(u'environment_id', NUMERIC(precision=10, scale=0, asdecimal=True), ForeignKey('environment.environment_id'), nullable=False)
    report_description = Column(u'report_description', VARCHAR(length=4000, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
    report_id = Column(u'report_id', NUMERIC(precision=10, scale=0, asdecimal=True), primary_key=True, nullable=False)
    report_name = Column(u'report_name', VARCHAR(length=50, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
    updated_by = Column(u'updated_by', NUMERIC(precision=10, scale=0, asdecimal=True), nullable=False)
    updated_date = Column(u'updated_date', DATETIME(timezone=False), nullable=False)

    #relation definitions
    environment = relation('Environment', primaryjoin='Report.environment_id==Environment.environment_id')
    environments = relation('Environment', primaryjoin='Report.report_id==UiReport.report_id', secondary=ui_report, secondaryjoin='UiReport.environment_id==Environment.environment_id')
""", s