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)
Пример #2
0
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)
Пример #3
0
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)
Пример #5
0
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)
Пример #6
0
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)
Пример #7
0
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)
Пример #9
0
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))
Пример #11
0
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)
Пример #12
0
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)
Пример #13
0
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']))
Пример #14
0
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)
Пример #15
0
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)
Пример #16
0
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()
Пример #17
0
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)
Пример #18
0
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)
Пример #20
0
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)
Пример #21
0
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)