diff options
| author | iElectric <unknown> | 2009-07-08 22:03:00 +0200 |
|---|---|---|
| committer | iElectric <unknown> | 2009-07-08 22:03:00 +0200 |
| commit | 67af81806d96f4071d2ac6bc0d956b4e2e8879dc (patch) | |
| tree | 5e566be9a24cbece0cfa6a0c52a03d6d01e7cede /test | |
| parent | 286a912e34823483ae0fd767721fb5221d7b7ea1 (diff) | |
| download | sqlalchemy-migrate-67af81806d96f4071d2ac6bc0d956b4e2e8879dc.tar.gz | |
add tests for plain API, fixed some small bugs
Diffstat (limited to 'test')
| -rw-r--r-- | test/fixture/models.py | 3 | ||||
| -rw-r--r-- | test/versioning/test_api.py | 102 | ||||
| -rw-r--r-- | test/versioning/test_keyedinstance.py | 5 | ||||
| -rw-r--r-- | test/versioning/test_repository.py | 10 | ||||
| -rw-r--r-- | test/versioning/test_schema.py | 20 | ||||
| -rw-r--r-- | test/versioning/test_script.py | 53 | ||||
| -rw-r--r-- | test/versioning/test_shell.py | 51 | ||||
| -rw-r--r-- | test/versioning/test_util.py | 5 | ||||
| -rw-r--r-- | test/versioning/test_version.py | 25 |
9 files changed, 246 insertions, 28 deletions
diff --git a/test/fixture/models.py b/test/fixture/models.py index 4454bf5..40e8e48 100644 --- a/test/fixture/models.py +++ b/test/fixture/models.py @@ -3,9 +3,12 @@ from sqlalchemy import * # test rundiffs in shell meta_old_rundiffs = MetaData() meta_rundiffs = MetaData() +meta = MetaData() tmp_account_rundiffs = Table('tmp_account_rundiffs', meta_rundiffs, Column('id', Integer, primary_key=True), Column('login', String(40)), Column('passwd', String(40)), ) + +tmp_sql_table = Table('tmp_sql_table', meta, Column('id', Integer)) diff --git a/test/versioning/test_api.py b/test/versioning/test_api.py index f13ea1a..0356a85 100644 --- a/test/versioning/test_api.py +++ b/test/versioning/test_api.py @@ -5,6 +5,8 @@ from migrate.versioning import api from migrate.versioning.exceptions import * from test.fixture.pathed import * +from test.fixture import models +from test import fixture class TestAPI(Pathed): @@ -15,14 +17,104 @@ class TestAPI(Pathed): self.assertRaises(UsageError, api.help, 'foobar') self.assert_(isinstance(api.help('create'), str)) - def test_help_commands(self): - pass + # test that all commands return some text + for cmd in api.__all__: + content = api.help(cmd) + self.assertTrue(content) def test_create(self): - pass + tmprepo = self.tmp_repos() + api.create(tmprepo, 'temp') + + # repository already exists + self.assertRaises(KnownError, api.create, tmprepo, 'temp') def test_script(self): - pass + repo = self.tmp_repos() + api.create(repo, 'temp') + api.script('first version', repo) def test_script_sql(self): - pass + repo = self.tmp_repos() + api.create(repo, 'temp') + api.script_sql('postgres', repo) + + def test_version(self): + repo = self.tmp_repos() + api.create(repo, 'temp') + api.version(repo) + + def test_source(self): + repo = self.tmp_repos() + api.create(repo, 'temp') + api.script('first version', repo) + api.script_sql('default', repo) + + # no repository + self.assertRaises(UsageError, api.source, 1) + + # stdout + out = api.source(1, dest=None, repository=repo) + self.assertTrue(out) + + # file + out = api.source(1, dest=self.tmp_repos(), repository=repo) + self.assertFalse(out) + + def test_manage(self): + output = api.manage(os.path.join(self.temp_usable_dir, 'manage.py')) + + +class TestSchemaAPI(fixture.DB, Pathed): + + def _setup(self, url): + super(TestSchemaAPI, self)._setup(url) + self.repo = self.tmp_repos() + api.create(self.repo, 'temp') + self.schema = api.version_control(url, self.repo) + + def _teardown(self): + self.schema = api.drop_version_control(self.url, self.repo) + super(TestSchemaAPI, self)._teardown() + + @fixture.usedb() + def test_workflow(self): + self.assertEqual(api.db_version(self.url, self.repo), 0) + api.script('First Version', self.repo) + self.assertEqual(api.db_version(self.url, self.repo), 0) + api.upgrade(self.url, self.repo, 1) + self.assertEqual(api.db_version(self.url, self.repo), 1) + api.downgrade(self.url, self.repo, 0) + self.assertEqual(api.db_version(self.url, self.repo), 0) + api.test(self.url, self.repo) + self.assertEqual(api.db_version(self.url, self.repo), 0) + + # preview + # TODO: test output + out = api.upgrade(self.url, self.repo, preview_py=True) + out = api.upgrade(self.url, self.repo, preview_sql=True) + + api.upgrade(self.url, self.repo, 1) + api.script_sql('default', self.repo) + self.assertRaises(UsageError, api.upgrade, self.url, self.repo, 2, preview_py=True) + out = api.upgrade(self.url, self.repo, 2, preview_sql=True) + + # cant upgrade to version 1, already at version 1 + self.assertEqual(api.db_version(self.url, self.repo), 1) + self.assertRaises(KnownError, api.upgrade, self.url, self.repo, 0) + + @fixture.usedb() + def test_compare_model_to_db(self): + diff = api.compare_model_to_db(self.url, self.repo, models.meta) + + @fixture.usedb() + def test_create_model(self): + model = api.create_model(self.url, self.repo) + + @fixture.usedb() + def test_make_update_script_for_model(self): + model = api.make_update_script_for_model(self.url, self.repo, models.meta_old_rundiffs, models.meta_rundiffs) + + @fixture.usedb() + def test_update_db_from_model(self): + model = api.update_db_from_model(self.url, self.repo, models.meta_rundiffs) diff --git a/test/versioning/test_keyedinstance.py b/test/versioning/test_keyedinstance.py index eaedf01..9bc9202 100644 --- a/test/versioning/test_keyedinstance.py +++ b/test/versioning/test_keyedinstance.py @@ -1,3 +1,6 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + from test import fixture from migrate.versioning.util.keyedinstance import * @@ -38,3 +41,5 @@ class TestKeydInstance(fixture.Base): Uniq1.clear() a12 = Uniq1('a') self.assert_(a10 is not a12) + + self.assertRaises(NotImplementedError, KeyedInstance._key) diff --git a/test/versioning/test_repository.py b/test/versioning/test_repository.py index 4d95e31..6c10454 100644 --- a/test/versioning/test_repository.py +++ b/test/versioning/test_repository.py @@ -101,13 +101,15 @@ class TestVersionedRepository(fixture.Pathed): # Load repository and commit script repo = Repository(self.path_repos) repo.create_script('') - - # Get script object - source = repo.version(1).script().source() + repo.create_script_sql('postgres') # Source is valid: script must have an upgrade function # (not a very thorough test, but should be plenty) - self.assert_(source.find('def upgrade') >= 0) + source = repo.version(1).script().source() + self.assertTrue(source.find('def upgrade') >= 0) + + source = repo.version(2).script('postgres', 'upgrade').source() + self.assertEqual(source.strip(), '') def test_latestversion(self): """Repository.version() (no params) returns the latest version""" diff --git a/test/versioning/test_schema.py b/test/versioning/test_schema.py index 9f84217..90d4411 100644 --- a/test/versioning/test_schema.py +++ b/test/versioning/test_schema.py @@ -16,11 +16,10 @@ class TestControlledSchema(fixture.Pathed, fixture.DB): # Transactions break postgres in this test; we'll clean up after ourselves level = fixture.DB.CONNECT - def setUp(self): super(TestControlledSchema, self).setUp() - path_repos = self.temp_usable_dir + '/repo/' - self.repos = Repository.create(path_repos, 'repo_name') + self.path_repos = self.temp_usable_dir + '/repo/' + self.repos = Repository.create(self.path_repos, 'repo_name') def _setup(self, url): self.setUp() @@ -45,6 +44,19 @@ class TestControlledSchema(fixture.Pathed, fixture.DB): super(TestControlledSchema, self).tearDown() @fixture.usedb() + def test_schema_table_fail(self): + """Test scenarios when loading schema should fail""" + dbcontrol = ControlledSchema.create(self.engine, self.path_repos) + dbcontrol.table.drop() + + try: + dbcontrol.load() + except exceptions.DatabaseNotControlledError: + pass + else: + self.fail() + + @fixture.usedb() def test_version_control(self): """Establish version control on a particular database""" # Establish version control on this database @@ -116,7 +128,7 @@ class TestControlledSchema(fixture.Pathed, fixture.DB): #self.assertRaises(ControlledSchema.InvalidVersionError, # Can't have custom errors with assertRaises... try: - ControlledSchema.create(self.engine,self.repos,version) + ControlledSchema.create(self.engine, self.repos,version) self.assert_(False, repr(version)) except exceptions.InvalidVersionError: pass diff --git a/test/versioning/test_script.py b/test/versioning/test_script.py index 16fa166..9272f96 100644 --- a/test/versioning/test_script.py +++ b/test/versioning/test_script.py @@ -10,6 +10,7 @@ from migrate.versioning.script import * from migrate.versioning.util import * from test import fixture +from test.fixture.models import tmp_sql_table class TestBaseScript(fixture.Pathed): @@ -48,6 +49,25 @@ class TestPyScript(fixture.Pathed, fixture.DB): self.assertRaises(exceptions.ScriptError, pyscript.run, self.engine, 0) self.assertRaises(exceptions.ScriptError, pyscript._func, 'foobar') + # clean pyc file + os.remove(script_path + 'c') + + # test deprecated upgrade/downgrade with no arguments + contents = open(script_path, 'r').read() + f = open(script_path, 'w') + f.write(contents.replace("upgrade(migrate_engine)", "upgrade()")) + f.close() + + pyscript = PythonScript(script_path) + pyscript._module = None + try: + pyscript.run(self.engine, 1) + pyscript.run(self.engine, -1) + except TypeError: + pass + else: + self.fail() + def test_verify_notfound(self): """Correctly verify a python migration script: nonexistant file""" path = self.tmp_py() @@ -86,7 +106,7 @@ class TestPyScript(fixture.Pathed, fixture.DB): path = self.tmp_py() f = open(path, 'w') - content = """ + content = ''' from migrate import * from sqlalchemy import * @@ -99,7 +119,7 @@ UserGroup = Table('Link', metadata, def upgrade(migrate_engine): metadata.create_all(migrate_engine) - """ + ''' f.write(content) f.close() @@ -130,7 +150,6 @@ def upgrade(migrate_engine): 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'), @@ -195,3 +214,31 @@ class TestSqlScript(fixture.Pathed, fixture.DB): sqls = SqlScript(src) self.assertRaises(Exception, sqls.run, self.engine) + + @fixture.usedb() + def test_success(self): + """Test sucessful SQL execution""" + # cleanup and prepare python script + tmp_sql_table.metadata.drop_all(self.engine, checkfirst=True) + script_path = self.tmp_py() + pyscript = PythonScript.create(script_path) + + # populate python script + contents = open(script_path, 'r').read() + contents = contents.replace("pass", "tmp_sql_table.create(migrate_engine)") + contents = 'from test.fixture.models import tmp_sql_table\n' + contents + f = open(script_path, 'w') + f.write(contents) + f.close() + + # write SQL script from python script preview + pyscript = PythonScript(script_path) + src = self.tmp() + f = open(src, 'w') + f.write(pyscript.preview_sql(self.url, 1)) + f.close() + + # run the change + sqls = SqlScript(src) + sqls.run(self.engine, executemany=False) + tmp_sql_table.metadata.drop_all(self.engine, checkfirst=True) diff --git a/test/versioning/test_shell.py b/test/versioning/test_shell.py index a4d2b64..d9e3364 100644 --- a/test/versioning/test_shell.py +++ b/test/versioning/test_shell.py @@ -3,13 +3,14 @@ import os import tempfile +from runpy import run_module from sqlalchemy import MetaData, Table -from migrate.versioning import genmodel, shell, api from migrate.versioning.repository import Repository from migrate.versioning.exceptions import * from test.fixture import * +from migrate.versioning import genmodel, shell, api class TestShellCommands(Shell): @@ -30,6 +31,36 @@ class TestShellCommands(Shell): self.assertTrue(result.stdout) self.assertFalse(result.stderr) + def test_main(self): + """Test main() function""" + # TODO: test output? + try: + run_module('migrate.versioning.shell', run_name='__main__') + except: + pass + repos = self.tmp_repos() + shell.main(['help']) + shell.main(['help', 'create']) + shell.main(['create', 'repo_name', '--preview_sql'], repository=repos) + shell.main(['version', '--', '--repository=%s' % repos]) + shell.main(['version', '-d', '--repository=%s' % repos, '--version=2']) + try: + shell.main(['foobar']) + except SystemExit, e: + pass + try: + shell.main(['create', 'f', 'o', 'o']) + except SystemExit, e: + pass + try: + shell.main(['create']) + except SystemExit, e: + pass + try: + shell.main(['create', 'repo_name'], repository=repos) + except SystemExit, e: + pass + def test_create(self): """Repositories are created successfully""" repos = self.tmp_repos() @@ -333,7 +364,7 @@ class TestShellDatabase(Shell, DB): # Empty script should succeed result = self.env.run('migrate script Desc %s' % repos_path) - result = self.env.run('migrate test %s %s' % (repos_path, self.url)) + result = self.env.run('migrate test %s %s' % (self.url, repos_path)) self.assertEquals(self.run_version(repos_path), 1) self.assertEquals(self.run_db_version(self.url, repos_path), 0) @@ -355,7 +386,7 @@ class TestShellDatabase(Shell, DB): file.write(script_text) file.close() - result = self.env.run('migrate test %s %s bla' % (repos_path, self.url), expect_error=True) + result = self.env.run('migrate test %s %s bla' % (self.url, repos_path), expect_error=True) self.assertEqual(result.returncode, 2) self.assertEquals(self.run_version(repos_path), 1) self.assertEquals(self.run_db_version(self.url, repos_path), 0) @@ -384,7 +415,7 @@ class TestShellDatabase(Shell, DB): file = open(script_path, 'w') file.write(script_text) file.close() - result = self.env.run('migrate test %s %s' % (repos_path, self.url)) + result = self.env.run('migrate test %s %s' % (self.url, repos_path)) self.assertEquals(self.run_version(repos_path), 1) self.assertEquals(self.run_db_version(self.url, repos_path), 0) @@ -426,12 +457,12 @@ class TestShellDatabase(Shell, DB): # Update db to latest model. result = self.env.run('migrate update_db_from_model %s %s %s'\ - % (self.url, model_module, repos_path)) + % (self.url, repos_path, model_module)) self.assertEquals(self.run_version(repos_path), 0) self.assertEquals(self.run_db_version(self.url, repos_path), 0) # version did not get bumped yet because new version not yet created result = self.env.run('migrate compare_model_to_db %s %s %s'\ - % (self.url, model_module, repos_path)) + % (self.url, repos_path, model_module)) self.assert_("No schema diffs" in result.stdout) result = self.env.run('migrate drop_version_control %s %s' % (self.url, repos_path), expect_error=True) @@ -448,9 +479,9 @@ class TestShellDatabase(Shell, DB): self.assertTrue('Not enough arguments' in result.stderr) result_script = self.env.run('migrate make_update_script_for_model %s %s %s %s'\ - % (self.url, old_model_module, model_module, repos_path)) + % (self.url, repos_path, old_model_module, model_module)) self.assertEqualsIgnoreWhitespace(result_script.stdout, - """from sqlalchemy import * + '''from sqlalchemy import * from migrate import * meta = MetaData() @@ -469,7 +500,7 @@ class TestShellDatabase(Shell, DB): def downgrade(migrate_engine): # Operations to reverse the above upgrade go here. meta.bind = migrate_engine - tmp_account_rundiffs.drop()""") + tmp_account_rundiffs.drop()''') # Save the upgrade script. result = self.env.run('migrate script Desc %s' % repos_path) @@ -477,7 +508,7 @@ class TestShellDatabase(Shell, DB): open(upgrade_script_path, 'w').write(result_script.stdout) result = self.env.run('migrate compare_model_to_db %s %s %s'\ - % (self.url, model_module, repos_path)) + % (self.url, repos_path, model_module)) self.assert_("No schema diffs" in result.stdout) self.meta.drop_all() # in case junk tables are lying around in the test database diff --git a/test/versioning/test_util.py b/test/versioning/test_util.py index a3d4834..7471651 100644 --- a/test/versioning/test_util.py +++ b/test/versioning/test_util.py @@ -36,10 +36,13 @@ class TestUtil(fixture.Pathed): engine_arg_assert_unicode=True) self.assertTrue(engine.dialect.assert_unicode) - # deprecated echo= parameter + # deprecated echo=True parameter engine = construct_engine(url, echo='True') self.assertTrue(engine.echo) + # unsupported argument + self.assertRaises(ValueError, construct_engine, 1) + def test_asbool(self): """test asbool parsing""" result = asbool(True) diff --git a/test/versioning/test_version.py b/test/versioning/test_version.py index a4855fe..7f79f66 100644 --- a/test/versioning/test_version.py +++ b/test/versioning/test_version.py @@ -3,6 +3,7 @@ from test import fixture from migrate.versioning.version import * +from migrate.versioning.exceptions import * class TestVerNum(fixture.Base): @@ -12,6 +13,11 @@ class TestVerNum(fixture.Base): for version in versions: self.assertRaises(ValueError, VerNum, version) + def test_str(self): + """Test str and repr version numbers""" + self.assertEqual(str(VerNum(2)), '2') + self.assertEqual(repr(VerNum(2)), '<VerNum(2)>') + def test_is(self): """Two version with the same number should be equal""" a = VerNum(1) @@ -62,6 +68,7 @@ class TestVerNum(fixture.Base): self.assert_(VerNum(2) >= 1) self.assertFalse(VerNum(1) >= 2) + class TestVersion(fixture.Pathed): def setUp(self): @@ -69,6 +76,7 @@ class TestVersion(fixture.Pathed): def test_str_to_filename(self): self.assertEquals(str_to_filename(''), '') + self.assertEquals(str_to_filename(''), '') self.assertEquals(str_to_filename('__'), '_') self.assertEquals(str_to_filename('a'), 'a') self.assertEquals(str_to_filename('Abc Def'), 'Abc_Def') @@ -91,12 +99,18 @@ class TestVersion(fixture.Pathed): coll2 = Collection(self.temp_usable_dir) self.assertEqual(coll.versions, coll2.versions) + Collection.clear() + + def test_old_repository(self): + open(os.path.join(self.temp_usable_dir, '1'), 'w') + self.assertRaises(Exception, Collection, self.temp_usable_dir) + #def test_collection_unicode(self): # pass def test_create_new_python_version(self): coll = Collection(self.temp_usable_dir) - coll.create_new_python_version("foo bar") + coll.create_new_python_version("'") ver = coll.version() self.assert_(ver.script().source()) @@ -140,3 +154,12 @@ class TestVersion(fixture.Pathed): ver = Version(1, path, [sqlite_upgrade_file, python_file]) self.assertEquals(os.path.basename(ver.script('postgres', 'upgrade').path), python_file) + + def test_bad_version(self): + ver = Version(1, self.temp_usable_dir, []) + self.assertRaises(ScriptError, ver.add_script, '123.sql') + + pyscript = os.path.join(self.temp_usable_dir, 'bla.py') + open(pyscript, 'w') + ver.add_script(pyscript) + self.assertRaises(ScriptError, ver.add_script, 'bla.py') |
