def test_rollback_step_cmd(self): wd = WorkDirectory(self.work_dir) migr_ctx = create_migration_ctx(wd.get_migration_ctx_config()) self.assertIsNone(migr_ctx.head) runner = CliRunner() wd.add_revision( Revision(gen_rev_id(), "adding table foo", datetime.now(), upgrade_sql="create table test.foo (a string);", downgrade_sql="drop table test.foo")) res = runner.invoke(upgrade) self.assertTrue(res.exit_code == 0) wd.add_revision( Revision(gen_rev_id(), "adding table bar", datetime.now(), upgrade_sql="create table test.bar (a string);", downgrade_sql="drop table test.bar")) res = runner.invoke(upgrade) self.assertTrue(res.exit_code == 0) self.assertIsNotNone(migr_ctx.head) self.assertTrue(len(migr_ctx.revisions) == 2) res = runner.invoke(rollback, ['-n', 2]) self.assertIsNone(migr_ctx.head)
def test_rollback_to_rev_id(self): wd = WorkDirectory(self.work_dir) migr_ctx = create_migration_ctx(wd.get_migration_ctx_config()) self.assertIsNone(migr_ctx.head) one = gen_rev_id() two = gen_rev_id() three = gen_rev_id() revisions = [ Revision(one, "adding table foo", datetime.now(), upgrade_sql="create table test.foo (a string);", downgrade_sql="drop table test.foo;"), Revision(two, "adding table bar", datetime.now(), upgrade_sql="create table test.bar (a string);", downgrade_sql="drop table test.bar;"), Revision(three, "add column b foo", datetime.now(), upgrade_sql="alter table test.foo add column b string;", downgrade_sql="alter table test.foo drop column b;") ] for rev in revisions: wd.add_revision(rev) runner = CliRunner() res = runner.invoke(upgrade) self.assertTrue(res.exit_code == 0) self.assertIsNotNone(migr_ctx.head) self.assertTrue(len(migr_ctx.revisions) == 3) res = runner.invoke(rollback, ['-r', two]) self.assertTrue(res.exit_code == 0) self.assertTrue(len(migr_ctx.revisions) == 1)
def test_ctx_revisions(self): wd = WorkDirectory(path=self.work_dir) ctx = create_migration_ctx(wd.get_migration_ctx_config()) ctx.create_revisions_tbl() self.assertTrue(len(ctx.revisions) == 0) conn = pymonetdb.connect(self.db_name) sql = """insert into sys.mroll_revisions values ('{}', '{}', '{}'), ('{}', '{}', '{}');""".format( gen_rev_id(), "revision 1", datetime.now(), gen_rev_id(), "revision 2", datetime.now()) conn.execute(sql) conn.commit() self.assertTrue(len(ctx.revisions) == 2)
def test_ctx_add_revisions(self): wd = WorkDirectory(path=self.work_dir) ctx = create_migration_ctx(wd.get_migration_ctx_config()) ctx.create_revisions_tbl() self.assertTrue(len(ctx.revisions) == 0) revisions = [ Revision(gen_rev_id(), "adding table foo", datetime.now(), upgrade_sql="create table test.foo (a string);", downgrade_sql="drop table test.foo;"), Revision(gen_rev_id(), "adding table bar", datetime.now(), upgrade_sql="create table test.bar (a string);", downgrade_sql="drop table test.bar;") ] ctx.add_revisions(revisions) self.assertTrue(len(ctx.revisions) == 2)
def test_upgrade_raise(self): wd = WorkDirectory(self.work_dir) migr_ctx = create_migration_ctx(wd.get_migration_ctx_config()) self.assertIsNone(migr_ctx.head) wd.add_revision( Revision(gen_rev_id(), "adding table foo", datetime.now())) self.assertTrue(len(wd.revisions) == 1) runner = CliRunner() res = runner.invoke(upgrade) self.assertTrue(res.exit_code == 1)
def test_migr_ctx_head(self): wd = WorkDirectory(path=self.work_dir) ctx = create_migration_ctx(wd.get_migration_ctx_config()) ctx.create_revisions_tbl() self.assertIsNone(ctx.head) conn = pymonetdb.connect(self.db_name) sql = """insert into sys.mroll_revisions values ('{}', '{}', '{}')""".format( gen_rev_id(), "bla bla", datetime.now()) conn.execute(sql) conn.commit() self.assertIsNotNone(ctx.head)
def test_upgrade_num_command(self): # Test upgrade cmd with a step wd = WorkDirectory(self.work_dir) revisions = [ Revision(gen_rev_id(), "adding table foo", datetime.now(), upgrade_sql="create table test.foo (a string);", downgrade_sql="drop table test.foo;"), Revision(gen_rev_id(), "adding table bar", datetime.now(), upgrade_sql="create table test.bar (a string);", downgrade_sql="drop table test.bar;") ] for rev in revisions: wd.add_revision(rev) self.assertTrue(len(wd.revisions) == 2) runner = CliRunner() res = runner.invoke(upgrade, ['-n', 1]) self.assertTrue(res.exit_code == 0) migr_ctx = create_migration_ctx(wd.get_migration_ctx_config()) self.assertIsNotNone(migr_ctx.head) self.assertTrue(len(migr_ctx.revisions) == 1)
def test_show_applied_revisions(self): wd = WorkDirectory(self.work_dir) wd.add_revision( Revision(gen_rev_id(), "adding table bar", datetime.now(), upgrade_sql="create table test.bar (a string);", downgrade_sql="drop table test.bar")) self.assertTrue(len(wd.revisions) == 1) runner = CliRunner() res = runner.invoke(upgrade) self.assertTrue(res.exit_code == 0) res = runner.invoke(show, ['applied']) self.assertTrue(res.exit_code == 0) self.assertNotEqual(res.stdout, '')
def test_get_all_upgrade_sql(self): for i in range(3): id_ = gen_rev_id() content = """ -- identifiers used by mroll -- id={} -- description=add column -- ts=2020-05-04T23:14:37.498799 -- migration:upgrade alter table foo add column b string; -- migration:downgrade """.format(id_) fn = os.path.join(self.work_dir, 'versions', "{}.sql".format(id_)) with open(fn, 'w') as f: f.write(content) res = get_all_upgrade_sql(self.work_dir) self.assertNotEqual(res, '')
def test_rollback_raises(self): wd = WorkDirectory(self.work_dir) migr_ctx = create_migration_ctx(wd.get_migration_ctx_config()) self.assertIsNone(migr_ctx.head) runner = CliRunner() # add revison with no downgrade_sql wd.add_revision( Revision( gen_rev_id(), "adding table foo", datetime.now(), upgrade_sql="create table test.foo (a string);", )) res = runner.invoke(upgrade) self.assertTrue(res.exit_code == 0) self.assertIsNotNone(migr_ctx.head) self.assertTrue(len(migr_ctx.revisions) == 1) res = runner.invoke(rollback) self.assertNotEqual(res.exit_code, 0)
def test_show_pending_revisions(self): wd = WorkDirectory(self.work_dir) wd.add_revision( Revision(gen_rev_id(), "adding table bar", datetime.now(), upgrade_sql="create table test.bar (a string);", downgrade_sql="drop table test.bar;")) self.assertTrue(len(wd.revisions) == 1) runner = CliRunner() res = runner.invoke(upgrade) self.assertTrue(res.exit_code == 0) migr_ctx = create_migration_ctx(wd.get_migration_ctx_config()) self.assertIsNotNone(migr_ctx.head) self.assertTrue(len(migr_ctx.revisions) == 1) self.add_rev_cmd('add column a to bar') self.add_rev_cmd('add column a to baz') self.assertTrue(len(wd.revisions) == 3) res = runner.invoke(show, ['pending']) self.assertTrue(res.exit_code == 0)
def test_rollback_default_cmd(self): # test rollback no cli options wd = WorkDirectory(self.work_dir) migr_ctx = create_migration_ctx(wd.get_migration_ctx_config()) self.assertIsNone(migr_ctx.head) rev = Revision(gen_rev_id(), "adding table foo", datetime.now(), upgrade_sql="create table test.foo (a string);", downgrade_sql="drop table test.foo;") wd.add_revision(rev) self.assertTrue(len(wd.revisions) == 1) runner = CliRunner() res = runner.invoke(upgrade) self.assertTrue(res.exit_code == 0) self.assertIsNotNone(migr_ctx.head) self.assertTrue(len(migr_ctx.revisions) == 1) res = runner.invoke(rollback) self.assertTrue(res.exit_code == 0) self.assertIsNone(migr_ctx.head) self.assertTrue(len(migr_ctx.revisions) == 0)