from mock import Mock, patch
from sqlalchemy import MetaData, Column, Table, Integer, String, Text, \
- Numeric, CHAR, ForeignKey, DATETIME, VARCHAR, \
+ Numeric, CHAR, ForeignKey, DATETIME, INTEGER, \
TypeDecorator, CheckConstraint, Unicode, Enum,\
UniqueConstraint, Boolean, ForeignKeyConstraint,\
PrimaryKeyConstraint
[('remove_table', 'extra'), ('remove_table', 'user')]
)
+
+class AutogenerateCustomCompareTypeTest(AutogenTest, TestCase):
+ @classmethod
+ def _get_db_schema(cls):
+ m = MetaData()
+
+ Table('sometable', m,
+ Column('id', Integer, primary_key=True),
+ Column('value', Integer))
+ return m
+
+ @classmethod
+ def _get_model_schema(cls):
+ m = MetaData()
+
+ Table('sometable', m,
+ Column('id', Integer, primary_key=True),
+ Column('value', String))
+ return m
+
def test_uses_custom_compare_type_function(self):
my_compare_type = Mock()
- my_compare_type.return_value = None
+ self.context._user_compare_type = my_compare_type
- context = MigrationContext.configure(
- connection=self.bind.connect(),
- opts={
- 'compare_type': my_compare_type,
- 'target_metadata': self.m1,
- 'upgrade_token':"upgrades",
- 'downgrade_token':"downgrades",
- 'alembic_module_prefix':'op.',
- 'sqlalchemy_module_prefix':'sa.'
- }
- )
- autogenerate._produce_migration_diffs(context, {}, set())
+ diffs = []
+ autogenerate._produce_net_changes(self.context.bind, self.m2, diffs, self.autogen_context)
+
+ first_table = self.m2.tables['sometable']
+ first_column = first_table.columns['id']
- first_table = self.m1.tables['address']
- first_column = first_table.columns['email_address']
+ eq_(len(my_compare_type.mock_calls), 2)
# We'll just test the first call
_, args, _ = my_compare_type.mock_calls[0]
- ctx, inspected_column, metadata_column, inspected_type, metadata_type = args
- eq_(ctx, context)
+ context, inspected_column, metadata_column, inspected_type, metadata_type = args
+ eq_(context, self.context)
eq_(metadata_column, first_column)
eq_(metadata_type, first_column.type)
eq_(inspected_column.name, first_column.name)
- eq_(type(inspected_type), VARCHAR)
+ eq_(type(inspected_type), INTEGER)
- def test_fields_excluded_when_custom_compare_type_returns_False(self):
+ def test_column_type_not_modified_when_custom_compare_type_returns_False(self):
my_compare_type = Mock()
my_compare_type.return_value = False
+ self.context._user_compare_type = my_compare_type
- context = MigrationContext.configure(
- connection=self.bind.connect(),
- opts={
- 'compare_type': my_compare_type,
- 'target_metadata': self.m1,
- 'upgrade_token':"upgrades",
- 'downgrade_token':"downgrades",
- 'alembic_module_prefix':'op.',
- 'sqlalchemy_module_prefix':'sa.'
- }
- )
- template_args = {}
- newtype = String(length=30)
- with patch.object(self.m1.tables['address'].columns['email_address'], 'type', new=newtype):
- autogenerate._produce_migration_diffs(context, template_args, set())
+ diffs = []
+ autogenerate._produce_net_changes(self.context.bind, self.m2, diffs, self.autogen_context)
- eq_(re.sub(r"u'", "'", template_args['upgrades']),
-"""### commands auto generated by Alembic - please adjust! ###
- pass
- ### end Alembic commands ###""")
+ eq_(diffs, [])
- def test_fields_included_when_custom_compare_type_returns_True(self):
+ def test_column_type_modified_when_custom_compare_type_returns_True(self):
my_compare_type = Mock()
my_compare_type.return_value = True
+ self.context._user_compare_type = my_compare_type
- context = MigrationContext.configure(
- connection=self.bind.connect(),
- opts={
- 'compare_type': my_compare_type,
- 'target_metadata': self.m1,
- 'upgrade_token':"upgrades",
- 'downgrade_token':"downgrades",
- 'alembic_module_prefix':'op.',
- 'sqlalchemy_module_prefix':'sa.'
- }
- )
- template_args = {}
- autogenerate._produce_migration_diffs(context, template_args, set())
+ diffs = []
+ autogenerate._produce_net_changes(self.context.bind, self.m2, diffs, self.autogen_context)
- eq_(re.sub(r"u'", "'", template_args['upgrades']),
-"""### commands auto generated by Alembic - please adjust! ###
- op.alter_column('address', 'email_address',
- existing_type=sa.VARCHAR(length=100),
- type_=sa.String(length=100),
- existing_nullable=False)
- op.alter_column('address', 'id',
- existing_type=sa.INTEGER(),
- type_=sa.Integer(),
- existing_nullable=False)
- op.alter_column('extra', 'uid',
- existing_type=sa.INTEGER(),
- type_=sa.Integer(),
- existing_nullable=True)
- op.alter_column('extra', 'x',
- existing_type=sa.CHAR(),
- type_=sa.CHAR(),
- existing_nullable=True)
- op.alter_column('order', 'amount',
- existing_type=sa.NUMERIC(precision=8, scale=2),
- type_=sa.Numeric(precision=8, scale=2),
- existing_nullable=False,
- existing_server_default='0')
- op.alter_column('order', 'order_id',
- existing_type=sa.INTEGER(),
- type_=sa.Integer(),
- existing_nullable=False)
- op.alter_column('user', 'a1',
- existing_type=sa.TEXT(),
- type_=sa.Text(),
- existing_nullable=True)
- op.alter_column('user', 'id',
- existing_type=sa.INTEGER(),
- type_=sa.Integer(),
- existing_nullable=False)
- op.alter_column('user', 'name',
- existing_type=sa.VARCHAR(length=50),
- type_=sa.String(length=50),
- existing_nullable=True)
- op.alter_column('user', 'pw',
- existing_type=sa.VARCHAR(length=50),
- type_=sa.String(length=50),
- existing_nullable=True)
- ### end Alembic commands ###""")
+ eq_(diffs[0][0][0], 'modify_type')
+ eq_(diffs[1][0][0], 'modify_type')
class AutogenKeyTest(AutogenTest, TestCase):