diff options
| author | Gabriel <g2p.code+sqla@gmail.com> | 2011-07-05 00:44:57 +0200 |
|---|---|---|
| committer | Gabriel <g2p.code+sqla@gmail.com> | 2011-07-05 00:44:57 +0200 |
| commit | 3fe1b4a3be05fe5184feb8bc237ceded5a98e8dc (patch) | |
| tree | 812139ad9bf4c9404d82cd5c7e6c76920a533ba2 /migrate/tests | |
| parent | 5cfc74959f6f7cf0ff58693613ca410a256c3b4f (diff) | |
| download | sqlalchemy-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.py | 64 | ||||
| -rw-r--r-- | migrate/tests/versioning/test_script.py | 51 |
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') |
