144 lines
4.2 KiB
Python

# -*- coding: utf-8 -*-
import os
from sqlalchemy import *
from nose.tools import eq_
from migrate.versioning import schemadiff
from migrate.changeset import SQLA_06
from migrate.tests import fixture
class Test_getDiffOfModelAgainstDatabase(fixture.DB):
level = fixture.DB.CONNECT
def _make_table(self,*cols,**kw):
self.table = Table('xtable', self.meta,
Column('id',Integer(), primary_key=True),
*cols
)
if kw.get('create',True):
self.table.create()
def _run_diff(self,**kw):
return schemadiff.getDiffOfModelAgainstDatabase(
self.meta, self.engine, **kw
)
@fixture.usedb()
def test_getDiffOfModelAgainstDatabase_table_missing_in_db(self):
self._make_table(create=False)
diff = self._run_diff()
self.assertTrue(diff)
eq_('Schema diffs:\n tables missing from database: xtable',
str(diff))
@fixture.usedb()
def test_getDiffOfModelAgainstDatabase_table_missing_in_model(self):
self._make_table()
self.meta.clear()
diff = self._run_diff()
self.assertTrue(diff)
eq_('Schema diffs:\n tables missing from model: xtable',
str(diff))
@fixture.usedb()
def test_getDiffOfModelAgainstDatabase_column_missing_in_db(self):
# db
Table('xtable', self.meta,
Column('id',Integer(), primary_key=True),
).create()
self.meta.clear()
# model
self._make_table(
Column('xcol',Integer()),
create=False
)
# run diff
diff = self._run_diff()
self.assertTrue(diff)
eq_('Schema diffs:\n'
' table with differences: xtable\n'
' database missing these columns: xcol',
str(diff))
@fixture.usedb()
def test_getDiffOfModelAgainstDatabase_column_missing_in_model(self):
# db
self._make_table(
Column('xcol',Integer()),
)
self.meta.clear()
# model
self._make_table(
create=False
)
# run diff
diff = self._run_diff()
self.assertTrue(diff)
eq_('Schema diffs:\n'
' table with differences: xtable\n'
' model missing these columns: xcol',
str(diff))
@fixture.usedb()
def test_getDiffOfModelAgainstDatabase_exclude_tables(self):
# db
Table('ytable', self.meta,
Column('id',Integer(), primary_key=True),
).create()
Table('ztable', self.meta,
Column('id',Integer(), primary_key=True),
).create()
self.meta.clear()
# model
self._make_table(
create=False
)
Table('ztable', self.meta,
Column('id',Integer(), primary_key=True),
)
# run diff
diff = self._run_diff(excludeTables=('xtable','ytable'))
# ytable only in database
# xtable only in model
# ztable identical on both
# ...so we expect no diff!
self.assertFalse(diff)
eq_('No schema diffs',str(diff))
@fixture.usedb()
def test_getDiffOfModelAgainstDatabase_identical_just_pk(self):
self._make_table()
diff = self._run_diff()
self.assertFalse(diff)
eq_('No schema diffs',str(diff))
@fixture.usedb()
def test_getDiffOfModelAgainstDatabase_integer_identical(self):
self._make_table(
Column('data', Integer()),
)
diff = self._run_diff()
eq_('No schema diffs',str(diff))
self.assertFalse(diff)
@fixture.usedb()
def test_getDiffOfModelAgainstDatabase_string_identical(self):
self._make_table(
Column('data', String(10)),
)
diff = self._run_diff()
eq_('No schema diffs',str(diff))
self.assertFalse(diff)
@fixture.usedb()
def test_getDiffOfModelAgainstDatabase_text_identical(self):
self._make_table(
Column('data', Text(255)),
)
diff = self._run_diff()
eq_('No schema diffs',str(diff))
self.assertFalse(diff)