summaryrefslogtreecommitdiff
path: root/migrate/tests
diff options
context:
space:
mode:
authorGabriel <g2p.code+sqla@gmail.com>2011-07-05 00:44:57 +0200
committerGabriel <g2p.code+sqla@gmail.com>2011-07-05 00:44:57 +0200
commit3fe1b4a3be05fe5184feb8bc237ceded5a98e8dc (patch)
tree812139ad9bf4c9404d82cd5c7e6c76920a533ba2 /migrate/tests
parent5cfc74959f6f7cf0ff58693613ca410a256c3b4f (diff)
downloadsqlalchemy-migrate-3fe1b4a3be05fe5184feb8bc237ceded5a98e8dc.tar.gz
Fix and test issue 118. Clarify genmodel transformations.
Diffstat (limited to 'migrate/tests')
-rw-r--r--migrate/tests/versioning/test_genmodel.py64
-rw-r--r--migrate/tests/versioning/test_script.py51
2 files changed, 76 insertions, 39 deletions
diff --git a/migrate/tests/versioning/test_genmodel.py b/migrate/tests/versioning/test_genmodel.py
index cf5a378..aa3ac06 100644
--- a/migrate/tests/versioning/test_genmodel.py
+++ b/migrate/tests/versioning/test_genmodel.py
@@ -35,7 +35,7 @@ class TestSchemaDiff(fixture.DB):
def _applyLatestModel(self):
diff = schemadiff.getDiffOfModelAgainstDatabase(self.meta, self.engine, excludeTables=['migrate_version'])
- genmodel.ModelGenerator(diff,self.engine).applyModel()
+ genmodel.ModelGenerator(diff,self.engine).runB2A()
@fixture.usedb()
def test_functional(self):
@@ -57,30 +57,44 @@ class TestSchemaDiff(fixture.DB):
# Check Python upgrade and downgrade of database from updated model.
diff = schemadiff.getDiffOfModelAgainstDatabase(self.meta, self.engine, excludeTables=['migrate_version'])
- decls, upgradeCommands, downgradeCommands = genmodel.ModelGenerator(diff,self.engine).toUpgradeDowngradePython()
- self.assertEqualsIgnoreWhitespace(decls, '''
- from migrate.changeset import schema
- meta = MetaData()
- tmp_schemadiff = Table('tmp_schemadiff', meta,
- Column('id', Integer(), primary_key=True, nullable=False),
- Column('name', UnicodeText(length=None)),
- Column('data', UnicodeText(length=None)),
- )
- ''')
+ decls, upgradeCommands, downgradeCommands = genmodel.ModelGenerator(diff,self.engine).genB2AMigration()
+
+ # Feature test for a recent SQLa feature;
+ # expect different output in that case.
+ if repr(String()) == 'String()':
+ self.assertEqualsIgnoreWhitespace(decls, '''
+ from migrate.changeset import schema
+ meta = MetaData()
+ tmp_schemadiff = Table('tmp_schemadiff', meta,
+ Column('id', Integer, primary_key=True, nullable=False),
+ Column('name', UnicodeText),
+ Column('data', UnicodeText),
+ )
+ ''')
+ else:
+ self.assertEqualsIgnoreWhitespace(decls, '''
+ from migrate.changeset import schema
+ meta = MetaData()
+ tmp_schemadiff = Table('tmp_schemadiff', meta,
+ Column('id', Integer(), primary_key=True, nullable=False),
+ Column('name', UnicodeText(length=None)),
+ Column('data', UnicodeText(length=None)),
+ )
+ ''')
self.assertEqualsIgnoreWhitespace(upgradeCommands,
'''meta.bind = migrate_engine
tmp_schemadiff.create()''')
self.assertEqualsIgnoreWhitespace(downgradeCommands,
'''meta.bind = migrate_engine
tmp_schemadiff.drop()''')
-
+
# Create table in database, now model should match database.
self._applyLatestModel()
assertDiff(False, [], [], [])
-
+
# Check Python code gen from database.
diff = schemadiff.getDiffOfModelAgainstDatabase(MetaData(), self.engine, excludeTables=['migrate_version'])
- src = genmodel.ModelGenerator(diff,self.engine).toPython()
+ src = genmodel.ModelGenerator(diff,self.engine).genBDefinition()
exec src in locals()
@@ -105,25 +119,25 @@ class TestSchemaDiff(fixture.DB):
Column('data2',Integer(),nullable=True),
)
assertDiff(True, [], [], [self.table_name])
-
+
# Apply latest model changes and find no more diffs.
self._applyLatestModel()
assertDiff(False, [], [], [])
-
+
if not self.engine.name == 'oracle':
# Make sure data is still present.
result = self.engine.execute(self.table.select(self.table.c.id==dataId))
rows = result.fetchall()
eq_(len(rows), 1)
eq_(rows[0].name, 'mydata')
-
+
# Add data, later we'll make sure it's still present.
result = self.engine.execute(self.table.insert(), id=2, name=u'mydata2', data2=123)
if SQLA_06:
dataId2 = result.inserted_primary_key[0]
else:
dataId2 = result.last_inserted_ids()[0]
-
+
# Change column type in model.
self.meta.remove(self.table)
self.table = Table(self.table_name,self.meta,
@@ -134,13 +148,13 @@ class TestSchemaDiff(fixture.DB):
# XXX test type diff
return
-
+
assertDiff(True, [], [], [self.table_name])
-
+
# Apply latest model changes and find no more diffs.
self._applyLatestModel()
assertDiff(False, [], [], [])
-
+
if not self.engine.name == 'oracle':
# Make sure data is still present.
result = self.engine.execute(self.table.select(self.table.c.id==dataId2))
@@ -148,11 +162,11 @@ class TestSchemaDiff(fixture.DB):
self.assertEquals(len(rows), 1)
self.assertEquals(rows[0].name, 'mydata2')
self.assertEquals(rows[0].data2, '123')
-
+
# Delete data, since we're about to make a required column.
# Not even using sqlalchemy.PassiveDefault helps because we're doing explicit column select.
self.engine.execute(self.table.delete(), id=dataId)
-
+
if not self.engine.name == 'firebird':
# Change column nullable in model.
self.meta.remove(self.table)
@@ -162,11 +176,11 @@ class TestSchemaDiff(fixture.DB):
Column('data2',String(255),nullable=False),
)
assertDiff(True, [], [], [self.table_name]) # TODO test nullable diff
-
+
# Apply latest model changes and find no more diffs.
self._applyLatestModel()
assertDiff(False, [], [], [])
-
+
# Remove table from model.
self.meta.remove(self.table)
assertDiff(True, [], [self.table_name], [])
diff --git a/migrate/tests/versioning/test_script.py b/migrate/tests/versioning/test_script.py
index 021b880..6c9d585 100644
--- a/migrate/tests/versioning/test_script.py
+++ b/migrate/tests/versioning/test_script.py
@@ -161,23 +161,44 @@ def upgrade(migrate_engine):
self.assertTrue('User.create()' in source_script)
self.assertTrue('User.drop()' in source_script)
- #@fixture.usedb()
- #def test_make_update_script_for_model_equals(self):
- # """Try to make update script from two identical models"""
+ @fixture.usedb()
+ def test_make_update_script_for_equal_models(self):
+ """Try to make update script from two identical models"""
+
+ self.setup_model_params()
+ self.write_file(self.first_model_path, self.base_source + self.model_source)
+ self.write_file(self.second_model_path, self.base_source + self.model_source)
+
+ source_script = self.pyscript.make_update_script_for_model(
+ engine=self.engine,
+ oldmodel=load_model('testmodel_first:meta'),
+ model=load_model('testmodel_second:meta'),
+ repository=self.repo_path,
+ )
- # self.setup_model_params()
- # self.write_file(self.first_model_path, self.base_source + self.model_source)
- # self.write_file(self.second_model_path, self.base_source + self.model_source)
+ self.assertFalse('User.create()' in source_script)
+ self.assertFalse('User.drop()' in source_script)
- # source_script = self.pyscript.make_update_script_for_model(
- # engine=self.engine,
- # oldmodel=load_model('testmodel_first:meta'),
- # model=load_model('testmodel_second:meta'),
- # repository=self.repo_path,
- # )
+ @fixture.usedb()
+ def test_make_update_script_direction(self):
+ """Check update scripts go in the right direction"""
+
+ self.setup_model_params()
+ self.write_file(self.first_model_path, self.base_source)
+ self.write_file(self.second_model_path, self.base_source + self.model_source)
+
+ source_script = self.pyscript.make_update_script_for_model(
+ engine=self.engine,
+ oldmodel=load_model('testmodel_first:meta'),
+ model=load_model('testmodel_second:meta'),
+ repository=self.repo_path,
+ )
- # self.assertFalse('User.create()' in source_script)
- # self.assertFalse('User.drop()' in source_script)
+ self.assertTrue(0
+ < source_script.find('upgrade')
+ < source_script.find('User.create()')
+ < source_script.find('downgrade')
+ < source_script.find('User.drop()'))
def setup_model_params(self):
self.script_path = self.tmp_py()
@@ -195,6 +216,8 @@ User = Table('User', meta,
self.repo = repository.Repository.create(self.repo_path, 'repo')
self.pyscript = PythonScript.create(self.script_path)
+ sys.modules.pop('testmodel_first', None)
+ sys.modules.pop('testmodel_second', None)
def write_file(self, path, contents):
f = open(path, 'w')