/sqlautocode/tests/test_declarative.py

https://code.google.com/p/sqlautocode/ · Python · 292 lines · 246 code · 43 blank · 3 comment · 9 complexity · 5e233a4fd1c38efc771ae5d1b9bd058c MD5 · raw file

  1. import os
  2. import pprint as pp
  3. from nose.tools import eq_
  4. from sqlautocode.declarative import ModelFactory
  5. from sqlalchemy.orm import class_mapper
  6. testdb = 'sqlite:///'+os.path.abspath(os.path.dirname(__file__))+'/data/devdata.db'
  7. #testdb = 'postgres://postgres@localhost/TestSamples'
  8. from base import make_test_db, make_test_db_multi
  9. class DummyOptions:
  10. tables = None
  11. class DummyConfig:
  12. def __init__(self, engine=testdb):
  13. self.engine = engine
  14. example = True
  15. schema = None
  16. interactive = None
  17. options=DummyOptions()
  18. # schema = ['pdil_samples', 'pdil_tools']
  19. class _TestModelFactory:
  20. def setup(self):
  21. self.config = DummyConfig()
  22. self.factory = ModelFactory(self.config)
  23. def test_tables(self):
  24. tables = sorted([t.name for t in self.factory.tables])
  25. eq_(tables, [u'tg_group', u'tg_group_permission', u'tg_permission', u'tg_town', u'tg_user', u'tg_user_group'])
  26. def _setup_all_models(self):
  27. return self.factory.models
  28. def test_create_model(self):
  29. self.factory.used_model_names = []
  30. self.factory.used_table_names = []
  31. Group = self.factory.create_model(self.factory._metadata.tables['tg_group'])
  32. Permission = self.factory.create_model(self.factory._metadata.tables['tg_permission'])
  33. Town = self.factory.create_model(self.factory._metadata.tables['tg_town'])
  34. User = self.factory.create_model(self.factory._metadata.tables['tg_user'])
  35. class_mapper(Town)
  36. class_mapper(User)
  37. t = Town(town_name="Arvada")
  38. u = User(tg_town=t)
  39. assert u.tg_town.town_name == 'Arvada'
  40. def test_get_many_to_many_tables(self):
  41. tables = sorted([table.name for table in self.factory.get_many_to_many_tables()])
  42. eq_(tables, [u'tg_group_permission', u'tg_user_group'])
  43. def test_get_related_many_to_many_tables(self):
  44. tables = [table.name for table in self.factory.get_related_many_to_many_tables('tg_user')]
  45. eq_(tables, [u'tg_user_group'])
  46. def test_get_foreign_keys(self):
  47. columns = [c[0].column.name for c in self.factory.get_foreign_keys(self.factory._metadata.tables['tg_user']).values()]
  48. eq_(columns, ['town_id'])
  49. def test_model___repr__(self):
  50. models = sorted(self._setup_all_models())
  51. for model in models:
  52. if model.__name__=='TgUser':
  53. User = model
  54. r = User.__repr__()
  55. print r
  56. expected = """\
  57. class TgUser(DeclarativeBase):
  58. __tablename__ = 'tg_user'
  59. #column definitions
  60. created = Column(u'created', TIMESTAMP(timezone=False))
  61. display_name = Column(u'display_name', VARCHAR(length=255, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
  62. email_address = Column(u'email_address', VARCHAR(length=255, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  63. password = Column(u'password', VARCHAR(length=80, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
  64. town_id = Column(u'town_id', INTEGER(), ForeignKey('tg_town.town_id'))
  65. user_id = Column(u'user_id', INTEGER(), primary_key=True, nullable=False)
  66. user_name = Column(u'user_name', VARCHAR(length=16, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  67. #relation definitions
  68. tg_town = relation('TgTown', primaryjoin='TgUser.town_id==TgTown.town_id')
  69. tg_groups = relation('TgGroup', primaryjoin='TgUser.user_id==tg_user_group.c.user_id', secondary=tg_user_group, secondaryjoin='tg_user_group.c.group_id==TgGroup.group_id')
  70. """
  71. eq_(r.strip(), expected.strip())
  72. def test__repr__(self):
  73. r = repr(self.factory)
  74. print r
  75. expected = """\
  76. #autogenerated by sqlautocode
  77. from sqlalchemy import *
  78. from sqlalchemy.ext.declarative import declarative_base
  79. from sqlalchemy.orm import relation
  80. engine = create_engine('sqlite:////Users/percious/oss/tgdev-py27/src/sqlautocode/sqlautocode/tests/data/devdata.db')
  81. DeclarativeBase = declarative_base()
  82. metadata = DeclarativeBase.metadata
  83. metadata.bind = engine
  84. tg_group_permission = Table(u'tg_group_permission', metadata,
  85. Column(u'group_id', INTEGER(), ForeignKey('tg_group.group_id'), primary_key=True, nullable=False),
  86. Column(u'permission_id', INTEGER(), ForeignKey('tg_permission.permission_id'), primary_key=True, nullable=False),
  87. )
  88. tg_user_group = Table(u'tg_user_group', metadata,
  89. Column(u'user_id', INTEGER(), ForeignKey('tg_user.user_id'), primary_key=True, nullable=False),
  90. Column(u'group_id', INTEGER(), ForeignKey('tg_group.group_id'), primary_key=True, nullable=False),
  91. )
  92. class TgGroup(DeclarativeBase):
  93. __tablename__ = 'tg_group'
  94. #column definitions
  95. created = Column(u'created', TIMESTAMP(timezone=False))
  96. display_name = Column(u'display_name', VARCHAR(length=255, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
  97. group_id = Column(u'group_id', INTEGER(), primary_key=True, nullable=False)
  98. group_name = Column(u'group_name', VARCHAR(length=16, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  99. #relation definitions
  100. tg_permissions = relation('TgPermission', primaryjoin='TgGroup.group_id==tg_group_permission.c.group_id', secondary=tg_group_permission, secondaryjoin='tg_group_permission.c.permission_id==TgPermission.permission_id')
  101. tg_users = relation('TgUser', primaryjoin='TgGroup.group_id==tg_user_group.c.group_id', secondary=tg_user_group, secondaryjoin='tg_user_group.c.user_id==TgUser.user_id')
  102. class TgPermission(DeclarativeBase):
  103. __tablename__ = 'tg_permission'
  104. #column definitions
  105. description = Column(u'description', VARCHAR(length=255, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
  106. permission_id = Column(u'permission_id', INTEGER(), primary_key=True, nullable=False)
  107. permission_name = Column(u'permission_name', VARCHAR(length=16, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  108. #relation definitions
  109. tg_groups = relation('TgGroup', primaryjoin='TgPermission.permission_id==tg_group_permission.c.permission_id', secondary=tg_group_permission, secondaryjoin='tg_group_permission.c.group_id==TgGroup.group_id')
  110. class TgTown(DeclarativeBase):
  111. __tablename__ = 'tg_town'
  112. #column definitions
  113. town_id = Column(u'town_id', INTEGER(), primary_key=True, nullable=False)
  114. town_name = Column(u'town_name', VARCHAR(length=255, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
  115. #relation definitions
  116. class TgUser(DeclarativeBase):
  117. __tablename__ = 'tg_user'
  118. #column definitions
  119. created = Column(u'created', TIMESTAMP(timezone=False))
  120. display_name = Column(u'display_name', VARCHAR(length=255, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
  121. email_address = Column(u'email_address', VARCHAR(length=255, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  122. password = Column(u'password', VARCHAR(length=80, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
  123. town_id = Column(u'town_id', INTEGER(), ForeignKey('tg_town.town_id'))
  124. user_id = Column(u'user_id', INTEGER(), primary_key=True, nullable=False)
  125. user_name = Column(u'user_name', VARCHAR(length=16, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  126. #relation definitions
  127. tg_town = relation('TgTown', primaryjoin='TgUser.town_id==TgTown.town_id')
  128. tg_groups = relation('TgGroup', primaryjoin='TgUser.user_id==tg_user_group.c.user_id', secondary=tg_user_group, secondaryjoin='tg_user_group.c.group_id==TgGroup.group_id')
  129. #example on how to query your Schema
  130. from sqlalchemy.orm import sessionmaker
  131. session = sessionmaker(bind=engine)()
  132. objs = session.query(TgGroup).all()
  133. print 'All TgGroup objects: %s'%objs"""
  134. assert expected in r, r
  135. class TestModelFactoryNew:
  136. def setup(self):
  137. self.metadata = make_test_db()
  138. engine = self.metadata.bind
  139. self.config = DummyConfig(engine)
  140. self.factory = ModelFactory(self.config)
  141. self.factory.models
  142. def test_tables(self):
  143. tables = sorted([t.name for t in self.factory.tables])
  144. eq_(tables, [u'environment', u'no_pk', u'report', u'ui_report'])
  145. def test_setup_all_models(self):
  146. assert len(self.factory.models) == 3
  147. def test_repr_environ_model(self):
  148. print self.factory.models
  149. s = self.factory.models[0].__repr__()
  150. assert s == """class Environment(DeclarativeBase):
  151. __tablename__ = 'environment'
  152. __table_args__ = {}
  153. #column definitions
  154. database_host = Column(u'database_host', VARCHAR(length=100, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  155. database_pass = Column(u'database_pass', VARCHAR(length=100, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  156. database_port = Column(u'database_port', VARCHAR(length=5, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  157. database_sid = Column(u'database_sid', VARCHAR(length=32, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  158. database_user = Column(u'database_user', VARCHAR(length=100, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  159. environment_id = Column(u'environment_id', NUMERIC(precision=10, scale=0, asdecimal=True), primary_key=True, nullable=False)
  160. environment_name = Column(u'environment_name', VARCHAR(length=100, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  161. #relation definitions
  162. reports = relation('Report', primaryjoin='Environment.environment_id==UiReport.environment_id', secondary=ui_report, secondaryjoin='UiReport.report_id==Report.report_id')
  163. """, s
  164. def test_no_pk_table_in_output(self):
  165. s = self.factory.__repr__()
  166. assert """no_pk = Table(u'no_pk', metadata,
  167. Column(u'data', TEXT(length=None, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False)),
  168. )""" in s, s
  169. def test_repr_report(self):
  170. s = self.factory.models[1].__repr__()
  171. assert s == """class Report(DeclarativeBase):
  172. __tablename__ = 'report'
  173. __table_args__ = {}
  174. #column definitions
  175. created_by = Column(u'created_by', NUMERIC(precision=10, scale=0, asdecimal=True), nullable=False)
  176. created_date = Column(u'created_date', DATETIME(timezone=False), nullable=False)
  177. deleted = Column(u'deleted', NUMERIC(precision=1, scale=0, asdecimal=True), nullable=False)
  178. deleted_by = Column(u'deleted_by', NUMERIC(precision=10, scale=0, asdecimal=True))
  179. deleted_date = Column(u'deleted_date', DATETIME(timezone=False))
  180. environment_id = Column(u'environment_id', NUMERIC(precision=10, scale=0, asdecimal=True), ForeignKey('environment.environment_id'), nullable=False)
  181. report_description = Column(u'report_description', VARCHAR(length=4000, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
  182. report_id = Column(u'report_id', NUMERIC(precision=10, scale=0, asdecimal=True), primary_key=True, nullable=False)
  183. report_name = Column(u'report_name', VARCHAR(length=50, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), nullable=False)
  184. updated_by = Column(u'updated_by', NUMERIC(precision=10, scale=0, asdecimal=True), nullable=False)
  185. updated_date = Column(u'updated_date', DATETIME(timezone=False), nullable=False)
  186. #relation definitions
  187. environment = relation('Environment', primaryjoin='Report.environment_id==Environment.environment_id')
  188. environments = relation('Environment', primaryjoin='Report.report_id==UiReport.report_id', secondary=ui_report, secondaryjoin='UiReport.environment_id==Environment.environment_id')
  189. """, s
  190. class TestModelFactoryMulti:
  191. def __init__(self, *args, **kw):
  192. self.metadata = make_test_db_multi()
  193. engine = self.metadata.bind
  194. self.config = DummyConfig(engine)
  195. self.factory = ModelFactory(self.config)
  196. # self.factory.models
  197. def test_get_foreign_keys(self):
  198. fks = [t.name for t in self.factory.get_foreign_keys(self.metadata.tables['song']).keys()]
  199. eq_(fks, ['album'])
  200. def test_get_composite_fks(self):
  201. fks = sorted([k.column.name for k in self.factory.get_composite_foreign_keys(self.metadata.tables['song'])[0]])
  202. eq_(fks, [u'albumartist', u'albumname'] )
  203. def test_render_song(self):
  204. self.factory.models
  205. song = self.factory.models[1]
  206. eq_(song.__repr__(), """class Song(DeclarativeBase):
  207. __tablename__ = 'song'
  208. __table_args__ = {}
  209. #column definitions
  210. songalbum = Column(u'songalbum', TEXT(length=None, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), ForeignKey('album.albumname'))
  211. songartist = Column(u'songartist', TEXT(length=None, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), ForeignKey('album.albumartist'))
  212. songid = Column(u'songid', INTEGER(), primary_key=True)
  213. songname = Column(u'songname', TEXT(length=None, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False))
  214. #relation definitions
  215. album = relation('Album', primaryjoin="and_(Song.songartist==Album.albumartist, Song.songalbum==Album.albumname)")
  216. """
  217. )