def test_05_check_migration_table_bad_baseline(): """Verify that multiple baseline recurds are detected""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'info', 'r1.1.10', True, False) _drop_migration_table(config) res = pydbvolve.create_migration_table(config) assert(res) record = { 'version': 'r1.0.0', 'applied_ts': datetime.datetime.now(), 'migration_file': 'somefile.sql', 'migration_type': 'sql', 'migration_user': config['migration_user'], 'db_user': config['db_user'], 'is_current': 0, 'is_baseline': 1 } _add_migration_record(config, record) record['version'] = 'r1.0.1' _add_migration_record(config, record) try: res = pydbvolve.check_migration_table(config) except Exception as e: res = False assert(isinstance(e, pydbvolve.MigrationTableConstraintError)) assert(res == False)
def test_21_upgrade_baseline_current(capsys): """Verify baseline-current and baseline-info and get_version()""" try: os.unlink(TEST_DB_FILE) except: pass config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.1.0', True, False) assert (config is not None) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'upgrade', pydbvolve.LATEST_VERSION, True, False) assert (rc == 0) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'baseline', pydbvolve.CURRENT_VERSION, True, False) assert (rc == 0) curr = pydbvolve.get_current(config) assert curr is not None base = pydbvolve.get_baseline(config) assert base is not None assert curr['version'] == base['version'] os.unlink(TEST_DB_FILE)
def test_06_set_baseline(): """Verify set_baseline functions""" try: os.unlink(TEST_DB_FILE) except: pass config = pydbvolve.initialize(TEST_CONFIG_FILE, 'baseline', 'r0.0.0', True, False) migrateTableExists = pydbvolve.check_migration_table(config) assert (not migrateTableExists) if not migrateTableExists: pydbvolve.create_migration_table(config) rc = pydbvolve.set_baseline(config) assert (rc == 0) baseline = pydbvolve.get_baseline(config) assert (baseline['version'] == 'r0.0.0') assert (baseline['is_baseline'] == True) _drop_migration_table(config) rc = pydbvolve.set_baseline(config) assert (rc != 0) os.unlink(TEST_DB_FILE)
def test_07_clear_baseline(): """Verify that the baseline record flag can be cleared""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'info', 'r1.1.10', True, False) _drop_migration_table(config) res = pydbvolve.create_migration_table(config) assert(res) record = { 'version': 'r1.0.0', 'applied_ts': datetime.datetime.now(), 'migration_file': 'somefile.sql', 'migration_type': 'sql', 'migration_user': config['migration_user'], 'db_user': config['db_user'], 'is_current': 0, 'is_baseline': 1 } _add_migration_record(config, record) assert(_count_baseline(config) == 1) res = pydbvolve.clear_baseline(config) assert(res) assert(_count_baseline(config) == 0) config['conn'].commit() _drop_migration_table(config) res = pydbvolve.clear_baseline(config) assert(res == False)
def test_02_run_python_migration(): """Verify that a sql migration can be run successfully""" try: os.unlink(TEST_DB_FILE) except: pass config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.2.0', True, False) migrations = pydbvolve.setup_migrations(config) res = pydbvolve.find_migration_file_version(config, migrations, 'r1.2.0') migration = migrations[res] assert (migration['filetype'] == 'py') rc = pydbvolve.run_python_migration(config, migration) assert (rc) assert (_table_exists(config['conn'], 'users')) sql = """ select count(*) as "count" from "users"; """ with config['conn'].cursor() as cur: cur.execute(sql) res = cur.fetchone()['count'] assert (res == 1) config['conn'].close() os.unlink(TEST_DB_FILE)
def test_03_run_migration_job_not_serial(): """Verify that a migration can be run and a migration record created""" def pre_script(config, migration): raise Exception("Force a condition") def post_script(config, migration): _drop_migration_table(config) try: os.unlink(TEST_DB_FILE) except: pass config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.0.0', True, False) migrateTableExists = pydbvolve.check_migration_table(config) assert (not migrateTableExists) if not migrateTableExists: pydbvolve.create_migration_table(config) migrations = pydbvolve.setup_migrations(config) res = pydbvolve.find_migration_file_version(config, migrations, 'r1.0.0') migration = migrations[res] exc = None try: rc = pydbvolve.run_migration_job(config, migrations, res, res - 1, 1) except Exception as e: exc = e assert (isinstance(exc, pydbvolve.MigrationError)) exc = None try: rc = pydbvolve.run_migration_job(config, migrations, res - 1, res, -1) except Exception as e: exc = e assert (isinstance(exc, pydbvolve.MigrationError)) rc = pydbvolve.run_migration_job(config, migrations, res, res, 1) assert (rc) curr = pydbvolve.get_current(config) assert (curr['version'] == 'r1.0.0') save = pydbvolve.pre_script pydbvolve.pre_script = pre_script rc = pydbvolve.run_migration_job(config, migrations, res + 1, res + 1, 1) assert (rc == False) pydbvolve.pre_script = save save = pydbvolve.post_script pydbvolve.post_script = post_script rc = pydbvolve.run_migration_job(config, migrations, res + 1, res + 1, 1) assert (rc == False) pydbvolve.post_script = save os.unlink(TEST_DB_FILE)
def test_03_sort_migrations(): """Verify that the migration file list can be sorted properly by the sort_version.""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.1.0', True, False) migrations = pydbvolve.setup_migrations(config) lastSort = (-1, -1, -1) for migration in migrations: assert (lastSort < migration['sort_version']) lastSort = migration['sort_version']
def test_03_create_migration_table(): """Verify that the migration table can be created""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'info', 'r1.1.10', True, False) _drop_migration_table(config) res = pydbvolve.create_migration_table(config) assert(res == True) assert(pydbvolve.check_migration_table(config)) res = pydbvolve.create_migration_table(config) assert(res == False)
def test_04_find_migration_string(): """Verify that a particular migration can be found by the version string match""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.1.0', True, False) migrations = pydbvolve.setup_migrations(config) res = pydbvolve.find_migration_file_version(config, migrations, 'r1.0.0') assert (isinstance(res, int)) assert (res > -1) res = pydbvolve.find_migration_file_version(config, migrations, 'r99.99.999') assert (res is None)
def test_02_check_migration_table_bad_structure(): """Verify that an aberrant table structure can be detected""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'info', 'r1.1.10', True, False) _create_bad_migration_table(config) exc = None try: res = pydbvolve.check_migration_table(config) except Exception as e: exc = e assert(isinstance(exc, pydbvolve.MigrationTableOutOfSync))
def test_08_run_downgrade(): """Verify set_baseline functions""" def no_migrations(*args, **kwargs): return [] try: os.unlink(TEST_DB_FILE) except: pass config = pydbvolve.initialize(TEST_CONFIG_FILE, 'baseline', 'r1.2.0', True, False) migrateTableExists = pydbvolve.check_migration_table(config) assert (not migrateTableExists) if not migrateTableExists: pydbvolve.create_migration_table(config) pydbvolve.set_baseline(config) config['conn'].close() config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.3.0', True, False) rc = pydbvolve.run_upgrade(config) assert (rc == 0) config['conn'].close() config = pydbvolve.initialize(TEST_CONFIG_FILE, 'downgrade', 'r1.2.0', True, False) rc = pydbvolve.run_downgrade(config) assert (rc == 0) curr = pydbvolve.get_current(config) assert (curr['version'] == 'r1.2.0') config = pydbvolve.initialize(TEST_CONFIG_FILE, 'downgrade', 'r1.2.0', True, False) rc = pydbvolve.run_downgrade(config) assert (rc == 0) save = pydbvolve.setup_migrations pydbvolve.setup_migrations = no_migrations config = pydbvolve.initialize(TEST_CONFIG_FILE, 'downgrade', 'r1.1.0', True, False) rc = pydbvolve.run_upgrade(config) assert (rc != 0) pydbvolve.setup_migrations = save config = pydbvolve.initialize(TEST_CONFIG_FILE, 'downgrade', 'r1.1.0', True, False) rc = pydbvolve.run_upgrade(config) assert (rc != 0) config['conn'].close() importlib.reload(pydbvolve) os.unlink(TEST_DB_FILE)
def test_06_load_python_migration(): """Verify that a python migration can be loaded into a module reference.""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.2.0', True, False) migrations = pydbvolve.setup_migrations(config) res = pydbvolve.find_migration_file_version(config, migrations, 'r1.2.0') assert (isinstance(res, int)) assert (res > -1) migration = migrations[res] pymigration = pydbvolve.import_arbitrary(migration['filename'], 'pv_mg_' + migration['version']) elements = set(dir(pymigration)) assert ('create_user_table' in elements) assert ('add_default_user' in elements) assert ('run_migration' in elements)
def test_02_get_migration_filename_info(): """Verify that filename information can be generated from the migration filenames""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.1.0', True, False) info = pydbvolve.get_migration_filename_info(config, '') assert (info is None) migrations = pydbvolve.get_migrations(config) info = pydbvolve.get_migration_filename_info(config, migrations[0]) assert (info is not None) assert (all(k in info for k in ('version', 'description', 'filetype', 'filename', 'sort_version'))) assert (all( bool(info[k]) for k in ('version', 'description', 'filetype', 'filename', 'sort_version'))) assert (isinstance(info['sort_version'], tuple)) assert (all(isinstance(v, int) for v in info['sort_version']))
def test_22_downgrade_baseline(capsys): """Verify downgrade-baseline""" try: os.unlink(TEST_DB_FILE) except: pass config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.1.0', True, False) assert (config is not None) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'upgrade', 'r1.2.9', True, False, chatty=False) assert (rc == 0) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'baseline', pydbvolve.CURRENT_VERSION, True, False) assert (rc == 0) curr = pydbvolve.get_current(config) assert curr is not None base = pydbvolve.get_current(config) assert curr is not None assert curr['version'] == 'r1.2.9' assert curr['version'] == base['version'] rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'upgrade', pydbvolve.LATEST_VERSION, True, False) assert (rc == 0) curr = pydbvolve.get_current(config) assert curr is not None assert curr['version'] != 'r1.2.9' rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'downgrade', pydbvolve.BASELINE_VERSION, True, False) assert (rc == 0) curr = pydbvolve.get_current(config) assert curr is not None assert curr['version'] == 'r1.2.9' os.unlink(TEST_DB_FILE)
def test_13_run_migration(capsys): """Verify run_migration exectuion""" try: os.unlink(TEST_DB_FILE) except: pass rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'baseline', 'r1.2.0', True, False) assert (rc == 0) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'upgrade', pydbvolve.LATEST_VERSION, True, False) assert (rc == 0) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'verify', 'r1.3.1', True, False) assert (rc == 0) config = pydbvolve.initialize(TEST_CONFIG_FILE, 'verify', 'r1.3.1', True, False) all_migrations = pydbvolve.get_migration_data(config) all_versions = set(m['version'] for m in all_migrations) assert ('r0.0.0' not in all_versions) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'downgrade', 'r1.2.0', True, False) assert (rc == 0) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'verify', 'r1.2.0', True, False) assert (rc == 0) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'downgrade', 'r1.1.0', True, True) assert (rc != 0) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'baseline', 'r1.3.0', True, False) assert (rc == 0) rc = pydbvolve.run_migration(TEST_CONFIG_FILE, 'downgrade', 'r1.1.0', True, True) assert (rc != 0) os.unlink(TEST_DB_FILE)
def test_20_initialize(capsys): """Verify top-level call to component functions.""" with capsys.disabled(): config = pydbvolve.initialize(TEST_CONFIG_FILE, 'info', 'r1.1.10', True, False) assert (config is not None) assert (isinstance(config, dict)) assert (len(config) > 0) assert (config['base_dir'] == os.path.dirname(TEST_CONFIG_FILE)) assert (config['migration_action'] == 'info') assert (config['version'] == 'r1.1.10') assert (config['sequential'] == True) assert (config['verbose'] == False) assert (config['migration_table_name'] == '__migrations__') assert (isinstance(config['conn'], sqlite3.Connection)) assert ('credentials' not in config) config['conn'].close()
def test_01_run_sql_migration(): """Verify that a sql migration can be run successfully""" try: os.unlink(TEST_DB_FILE) except: pass config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.0.0', True, False) migrations = pydbvolve.setup_migrations(config) res = pydbvolve.find_migration_file_version(config, migrations, 'r1.0.0') migration = migrations[res] rc = pydbvolve.run_sql_migration(config, migration) assert (rc) assert (_table_exists(config['conn'], 'person')) assert (_table_exists(config['conn'], 'school')) config['conn'].close() os.unlink(TEST_DB_FILE)
def test_05_parse_sql_statements(): """Verify that a sql migration file's statements can be parsed by the statement separator.""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.1.0', True, False) migrations = pydbvolve.setup_migrations(config) res = pydbvolve.find_migration_file_version(config, migrations, 'r1.0.0') assert (isinstance(res, int)) assert (res > -1) sqlfile = open(migrations[res]['filename'], 'r') sep = pydbvolve.get_sql_statement_sep() assert (sep.search('-- run') is not None) statements = [stmt for stmt in pydbvolve.get_statements(sqlfile)] sqlfile.close() assert (len(statements) == 6) assert ('create table person' in statements[0]) assert ('unique index ix01_person' in statements[1]) assert ('ix02_person' in statements[2]) assert ('ix03_person' in statements[3]) assert ('create table school' in statements[4]) assert ('insert into school' in statements[5])
def test_10_add_migration_record(): """Verify that a migration record can be added""" config = pydbvolve.initialize(TEST_CONFIG_FILE, 'info', 'r1.1.10', True, False) _drop_migration_table(config) res = pydbvolve.create_migration_table(config) assert(res) migration = {'version': 'r1.0.0', 'sort_version': (1, 0, 0), 'filename': 'a_test.sql', 'filetype': 'sql'} res = pydbvolve.add_migration_record(config, migration, 1, 0) assert(res) assert(_count_current(config) == 1) migration['version'] = 'r1.0.1' res = pydbvolve.add_migration_record(config, migration, 1, 0) assert(res) assert(_count_current(config) == 1) config['conn'].commit() res = pydbvolve.add_migration_record(config, migration, 0, 0) assert(res == False) migration['version'] = None res = None try: res = pydbvolve.add_migration_record(config, migration, 1, 0) except Exception as e: res = e assert(isinstance(res, Exception)) config['conn'].rollback() _drop_migration_table(config) res = pydbvolve.add_migration_record(config, migration, 1, 0) assert(res == False) res = pydbvolve.add_migration_record(config, migration, 0, 1) assert(res == False)
def test_04_run_migration_job_serial(): """Verify that a migrations can be applied serially""" try: os.unlink(TEST_DB_FILE) except: pass config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.1.0', True, False) migrateTableExists = pydbvolve.check_migration_table(config) assert (not migrateTableExists) if not migrateTableExists: pydbvolve.create_migration_table(config) migrations = pydbvolve.setup_migrations(config) res = pydbvolve.find_migration_file_version(config, migrations, 'r1.1.0') migration = migrations[res] rc = pydbvolve.run_migration_job(config, migrations, 0, res, 1) assert (rc) curr = pydbvolve.get_current(config) assert (curr['version'] == 'r1.1.0') all_migrations = pydbvolve.get_migration_data(config) assert (all_migrations[0]['version'] == 'r0.0.0') assert (all_migrations[0]['is_current'] == False) assert (all_migrations[1]['version'] == 'r1.0.0') assert (all_migrations[1]['is_current'] == False) assert (all_migrations[2]['version'] == 'r1.1.0') assert (all_migrations[2]['is_current'] == True) _drop_migration_table(config) all_migrations = pydbvolve.get_migration_data(config) assert (all_migrations is None) os.unlink(TEST_DB_FILE)
def test_07_run_upgrade(): """Verify set_baseline functions""" def no_migrations(*args, **kwargs): return [] try: os.unlink(TEST_DB_FILE) except: pass config = pydbvolve.initialize(TEST_CONFIG_FILE, 'baseline', 'r1.1.0', True, False) migrateTableExists = pydbvolve.check_migration_table(config) assert (not migrateTableExists) if not migrateTableExists: pydbvolve.create_migration_table(config) rc = pydbvolve.set_baseline(config) assert (rc == 0) config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.2.0', True, False) rc = pydbvolve.run_upgrade(config) assert (rc == 0) config['conn'].close() # cannot upgrade to an earlier version than current config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.1.0', True, False) rc = pydbvolve.run_upgrade(config) assert (rc != 0) config['conn'].close() # can upgrade to later version config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.3.0', True, False) rc = pydbvolve.run_upgrade(config) assert (rc == 0) all_migrations = pydbvolve.get_migration_data(config) all_versions = set(m['version'] for m in all_migrations) assert ('r1.2.0' in all_versions) assert ('r1.2.9' in all_versions) assert ('r1.3.0' in all_versions) assert ('r1.3.1' not in all_versions) save = pydbvolve.setup_migrations pydbvolve.setup_migrations = no_migrations config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.3.0', True, False) rc = pydbvolve.run_upgrade(config) assert (rc != 0) pydbvolve.setup_migrations = save config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.3.0', True, False) rc = pydbvolve.run_upgrade(config) assert (rc == 0) config = pydbvolve.initialize(TEST_CONFIG_FILE, 'baseline', 'r1.2.0', True, False) rc = pydbvolve.set_baseline(config) assert (rc == 0) pydbvolve.setup_migrations = no_migrations config = pydbvolve.initialize(TEST_CONFIG_FILE, 'upgrade', 'r1.0.0', True, False) rc = pydbvolve.run_upgrade(config) assert (rc != 0) config['conn'].close() importlib.reload(pydbvolve) os.unlink(TEST_DB_FILE)