class AutogenerateUniqueIndexTest(AutogenFixtureTest, TestCase):
+ reports_unique_constraints = True
def test_index_flag_becomes_named_unique_constraint(self):
m1 = MetaData()
diffs = self._fixture(m1, m2)
- eq_(diffs[0][0], "add_constraint")
- eq_(diffs[0][1].name, "uq_user_name")
+ if self.reports_unique_constraints:
+ eq_(diffs[0][0], "add_constraint")
+ eq_(diffs[0][1].name, "uq_user_name")
- eq_(diffs[1][0], "remove_index")
- eq_(diffs[1][1].name, "ix_user_name")
+ eq_(diffs[1][0], "remove_index")
+ eq_(diffs[1][1].name, "ix_user_name")
+ else:
+ eq_(diffs[0][0], "remove_index")
+ eq_(diffs[0][1].name, "ix_user_name")
def test_add_unique_constraint(self):
)
diffs = self._fixture(m1, m2)
- eq_(diffs[0][0], "add_constraint")
- eq_(diffs[0][1].name, "uq_email_address")
+
+ if self.reports_unique_constraints:
+ eq_(diffs[0][0], "add_constraint")
+ eq_(diffs[0][1].name, "uq_email_address")
+ else:
+ eq_(diffs, [])
def test_index_becomes_unique(self):
eq_(diffs[1][1].unique, True)
+
def test_mismatch_db_named_col_flag(self):
m1 = MetaData()
m2 = MetaData()
diffs = self._fixture(m1, m2)
- eq_(diffs[0][0], "remove_constraint")
- eq_(diffs[0][1].name, "nochange")
-
- eq_(diffs[1][0], "add_constraint")
- eq_(diffs[1][1].name, "nochange")
+ if self.reports_unique_constraints:
+ eq_(diffs[0][0], "remove_constraint")
+ eq_(diffs[0][1].name, "nochange")
+ eq_(diffs[1][0], "add_constraint")
+ eq_(diffs[1][1].name, "nochange")
+ else:
+ eq_(diffs, [])
def test_nothing_changed_one(self):
m1 = MetaData()
diffs = self._fixture(m1, m2)
- diffs = set((cmd, obj.name) for cmd, obj in diffs)
- assert ("remove_index", "xidx") in diffs
+ if self.reports_unique_constraints:
+ diffs = set((cmd, obj.name) for cmd, obj in diffs)
+ assert ("remove_index", "xidx") in diffs
+ else:
+ eq_(diffs, [])
def test_remove_named_unique_constraint(self):
diffs = self._fixture(m1, m2)
- diffs = ((cmd, obj.name) for cmd, obj in diffs)
- assert ("remove_constraint", "xidx") in diffs
+ if self.reports_unique_constraints:
+ diffs = ((cmd, obj.name) for cmd, obj in diffs)
+ assert ("remove_constraint", "xidx") in diffs
+ else:
+ eq_(diffs, [])
def test_dont_add_uq_on_table_create(self):
m1 = MetaData()
def _get_bind(cls):
return db_for_dialect('mysql')
+class NoUqReflectionIndexTest(AutogenerateUniqueIndexTest):
+ reports_unique_constraints = False
+
+ @classmethod
+ def _get_bind(cls):
+ eng = sqlite_db()
+
+ def unimpl(*arg, **kw):
+ raise NotImplementedError()
+ eng.dialect.get_unique_constraints = unimpl
+ return eng
+
+ def test_unique_not_reported(self):
+ m1 = MetaData()
+ Table('order', m1,
+ Column('order_id', Integer, primary_key=True),
+ Column('amount', Numeric(10, 2), nullable=True),
+ Column('user_id', Integer),
+ UniqueConstraint('order_id', 'user_id',
+ name='order_order_id_user_id_unique'
+ )
+ )
+
+ diffs = self._fixture(m1, m1)
+ eq_(diffs, [])
+
+ def test_remove_unique_index_not_reported(self):
+ m1 = MetaData()
+ Table('order', m1,
+ Column('order_id', Integer, primary_key=True),
+ Column('amount', Numeric(10, 2), nullable=True),
+ Column('user_id', Integer),
+ Index('oid_ix', 'order_id', 'user_id',
+ unique=True
+ )
+ )
+ m2 = MetaData()
+ Table('order', m2,
+ Column('order_id', Integer, primary_key=True),
+ Column('amount', Numeric(10, 2), nullable=True),
+ Column('user_id', Integer),
+ )
+
+ diffs = self._fixture(m1, m2)
+ eq_(diffs, [])
+
+ def test_remove_plain_index_is_reported(self):
+ m1 = MetaData()
+ Table('order', m1,
+ Column('order_id', Integer, primary_key=True),
+ Column('amount', Numeric(10, 2), nullable=True),
+ Column('user_id', Integer),
+ Index('oid_ix', 'order_id', 'user_id')
+ )
+ m2 = MetaData()
+ Table('order', m2,
+ Column('order_id', Integer, primary_key=True),
+ Column('amount', Numeric(10, 2), nullable=True),
+ Column('user_id', Integer),
+ )
+
+ diffs = self._fixture(m1, m2)
+ eq_(diffs[0][0], 'remove_index')
+
+
+class NoUqReportsIndAsUqTest(NoUqReflectionIndexTest):
+ """this test suite simulates the condition where:
+
+ a. the dialect doesn't report unique constraints
+
+ b. the dialect returns unique constraints within the indexes list.
+
+ Currently the mssql dialect does this, but here we force this
+ condition so that we can test the behavior regardless of if/when
+ mssql supports unique constraint reflection.
+
+ """
+
+ @classmethod
+ def _get_bind(cls):
+ eng = sqlite_db()
+
+ _get_unique_constraints = eng.dialect.get_unique_constraints
+ _get_indexes = eng.dialect.get_indexes
+
+ def unimpl(*arg, **kw):
+ raise NotImplementedError()
+
+ def get_indexes(self, connection, tablename, **kw):
+ indexes = _get_indexes(self, connection, tablename, **kw)
+ for uq in _get_unique_constraints(
+ self, connection, tablename, **kw
+ ):
+ uq['unique'] = True
+ indexes.append(uq)
+ return indexes
+
+ eng.dialect.get_unique_constraints = unimpl
+ eng.dialect.get_indexes = get_indexes
+ return eng
+
+
class AutogenerateCustomCompareTypeTest(AutogenTest, TestCase):
@classmethod