class TestMigrations(TestCase):

    def setUp(self):
        self.migration_path = os.path.abspath(os.path.join(
            os.path.dirname(__file__),
            "migrations"
        ))

    def create_migration_handler(
            self,
            package=None,
            supported_packages=('testpackage', 'testpackage2')
    ):
        self.amigrations = AMigrations(
            'sqlite+pysqlite:///{}'.format(
                os.path.join(self.migration_path, 'test.db')
            ),
            self.migration_path,
            current_package=package,
            supported_packages=supported_packages
        )

    def tearDown(self):
        shutil.rmtree(self.migration_path)

    @property
    def c_migrations(self):
        cursor = self.amigrations._adapter._client.cursor()
        cursor.execute("SELECT COUNT(*) FROM migrations")
        return cursor.fetchone()[0]

    def test_migrations(self):
        self.create_migration_handler()
        files = self.amigrations.create('test message1')
        with files['up'].open('w') as fpu, files['down'].open('w') as fpd:
            fpu.write('''
            CREATE TABLE test
             (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)
            ''')
            fpd.write('drop table test')
        files = self.amigrations.create('test message2')
        with files['up'].open('w') as fpu, files['down'].open('w') as fpd:
            fpu.write('''
            CREATE TABLE test1
             (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)''')
            fpd.write('drop table test1')
        self.amigrations.upgrade()
        self.assertEqual(self.c_migrations, 2)
        files = self.amigrations.create('test message3')
        with files['up'].open('w') as fpu, files['down'].open('w') as fpd:
            fpu.write('''
            alter table test add column prefix
             varchar(10) not null default "";''')
            fpd.write('''
            alter table test add column prefix1
             varchar(11) not null default "";''')
        files = self.amigrations.create('test message4')
        with files['up'].open('w') as fpu, files['down'].open('w') as fpd:
            fpu.write('''
            alter table test1 add column prefix
             varchar(10) not null default "";''')
            fpd.write('''
            alter table test1 add column prefix1
             varchar(11) not null default "";''')
        self.amigrations.upgrade()
        self.assertEqual(self.c_migrations, 4)
        self.amigrations.downgrade_to(3)
        self.assertEqual(self.c_migrations, 2)
        self.amigrations.downgrade_to(0)
        self.assertEqual(self.c_migrations, 0)

    def test_migrations_with_a_package(self):
        self.create_migration_handler(package='testpackage')
        files = self.amigrations.create('test message1')
        with files['up'].open('w') as fpu, files['down'].open('w') as fpd:
            fpu.write('''
            CREATE TABLE test
             (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)
            ''')
            fpd.write('drop table test')
        files = self.amigrations.create('test message2')
        with files['up'].open('w') as fpu, files['down'].open('w') as fpd:
            fpu.write('''
            CREATE TABLE test1
             (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)''')
            fpd.write('drop table test1')
        self.amigrations.upgrade()
        self.assertEqual(self.c_migrations, 2)
        files = self.amigrations.create('test message3')
        with files['up'].open('w') as fpu, files['down'].open('w') as fpd:
            fpu.write('''
            alter table test add column prefix
             varchar(10) not null default "";''')
            fpd.write('''
            alter table test add column prefix1
             varchar(11) not null default "";''')
        files = self.amigrations.create('test message4')
        with files['up'].open('w') as fpu, files['down'].open('w') as fpd:
            fpu.write('''
            alter table test1 add column prefix
             varchar(10) not null default "";''')
            fpd.write('''
            alter table test1 add column prefix1
             varchar(11) not null default "";''')
        self.amigrations.upgrade()
        self.assertEqual(self.c_migrations, 4)
        self.amigrations.downgrade_to(3)
        self.assertEqual(self.c_migrations, 2)
        self.amigrations.downgrade_to(0)
        self.assertEqual(self.c_migrations, 0)