]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Consoliate test/sql/test_constraint ConstraintAPITest
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 30 Jul 2016 14:06:53 +0000 (10:06 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 30 Jul 2016 14:06:53 +0000 (10:06 -0400)
and test/sql/test_metadata IndexTest into
test/sql/test_metadata ConstraintTest

Change-Id: I7aeee9a1edbbd889200afc393695f73d5fbac3f3

test/sql/test_constraints.py
test/sql/test_metadata.py

index 3e8021ebea9cc8cca9a526dd088927867e20c4e2..efd52ffb5d9d17e1039eda5de4caccb24c98f0d9 100644 (file)
@@ -1150,345 +1150,3 @@ class ConstraintCompilationTest(fixtures.TestBase, AssertsCompiledSQL):
         )
 
 
-class ConstraintAPITest(fixtures.TestBase):
-
-    def test_double_fk_usage_raises(self):
-        f = ForeignKey('b.id')
-
-        Column('x', Integer, f)
-        assert_raises(exc.InvalidRequestError, Column, "y", Integer, f)
-
-    def test_auto_append_constraint(self):
-        m = MetaData()
-
-        t = Table('tbl', m,
-                  Column('a', Integer),
-                  Column('b', Integer)
-                  )
-
-        t2 = Table('t2', m,
-                   Column('a', Integer),
-                   Column('b', Integer)
-                   )
-
-        for c in (
-            UniqueConstraint(t.c.a),
-            CheckConstraint(t.c.a > 5),
-            ForeignKeyConstraint([t.c.a], [t2.c.a]),
-            PrimaryKeyConstraint(t.c.a)
-        ):
-            assert c in t.constraints
-            t.append_constraint(c)
-            assert c in t.constraints
-
-        c = Index('foo', t.c.a)
-        assert c in t.indexes
-
-    def test_auto_append_lowercase_table(self):
-        t = table('t', column('a'))
-        t2 = table('t2', column('a'))
-        for c in (
-            UniqueConstraint(t.c.a),
-            CheckConstraint(t.c.a > 5),
-            ForeignKeyConstraint([t.c.a], [t2.c.a]),
-            PrimaryKeyConstraint(t.c.a),
-            Index('foo', t.c.a)
-        ):
-            assert True
-
-    def test_tometadata_ok(self):
-        m = MetaData()
-
-        t = Table('tbl', m,
-                  Column('a', Integer),
-                  Column('b', Integer)
-                  )
-
-        t2 = Table('t2', m,
-                   Column('a', Integer),
-                   Column('b', Integer)
-                   )
-
-        UniqueConstraint(t.c.a)
-        CheckConstraint(t.c.a > 5)
-        ForeignKeyConstraint([t.c.a], [t2.c.a])
-        PrimaryKeyConstraint(t.c.a)
-
-        m2 = MetaData()
-
-        t3 = t.tometadata(m2)
-
-        eq_(len(t3.constraints), 4)
-
-        for c in t3.constraints:
-            assert c.table is t3
-
-    def test_check_constraint_copy(self):
-        m = MetaData()
-        t = Table('tbl', m,
-                  Column('a', Integer),
-                  Column('b', Integer)
-                  )
-        ck = CheckConstraint(t.c.a > 5)
-        ck2 = ck.copy()
-        assert ck in t.constraints
-        assert ck2 not in t.constraints
-
-    def test_ambig_check_constraint_auto_append(self):
-        m = MetaData()
-
-        t = Table('tbl', m,
-                  Column('a', Integer),
-                  Column('b', Integer)
-                  )
-
-        t2 = Table('t2', m,
-                   Column('a', Integer),
-                   Column('b', Integer)
-                   )
-        c = CheckConstraint(t.c.a > t2.c.b)
-        assert c not in t.constraints
-        assert c not in t2.constraints
-
-    def test_auto_append_ck_on_col_attach_one(self):
-        m = MetaData()
-
-        a = Column('a', Integer)
-        b = Column('b', Integer)
-        ck = CheckConstraint(a > b)
-
-        t = Table('tbl', m, a, b)
-        assert ck in t.constraints
-
-    def test_auto_append_ck_on_col_attach_two(self):
-        m = MetaData()
-
-        a = Column('a', Integer)
-        b = Column('b', Integer)
-        c = Column('c', Integer)
-        ck = CheckConstraint(a > b + c)
-
-        t = Table('tbl', m, a)
-        assert ck not in t.constraints
-
-        t.append_column(b)
-        assert ck not in t.constraints
-
-        t.append_column(c)
-        assert ck in t.constraints
-
-    def test_auto_append_ck_on_col_attach_three(self):
-        m = MetaData()
-
-        a = Column('a', Integer)
-        b = Column('b', Integer)
-        c = Column('c', Integer)
-        ck = CheckConstraint(a > b + c)
-
-        t = Table('tbl', m, a)
-        assert ck not in t.constraints
-
-        t.append_column(b)
-        assert ck not in t.constraints
-
-        t2 = Table('t2', m)
-        t2.append_column(c)
-
-        # two different tables, so CheckConstraint does nothing.
-        assert ck not in t.constraints
-
-    def test_auto_append_uq_on_col_attach_one(self):
-        m = MetaData()
-
-        a = Column('a', Integer)
-        b = Column('b', Integer)
-        uq = UniqueConstraint(a, b)
-
-        t = Table('tbl', m, a, b)
-        assert uq in t.constraints
-
-    def test_auto_append_uq_on_col_attach_two(self):
-        m = MetaData()
-
-        a = Column('a', Integer)
-        b = Column('b', Integer)
-        c = Column('c', Integer)
-        uq = UniqueConstraint(a, b, c)
-
-        t = Table('tbl', m, a)
-        assert uq not in t.constraints
-
-        t.append_column(b)
-        assert uq not in t.constraints
-
-        t.append_column(c)
-        assert uq in t.constraints
-
-    def test_auto_append_uq_on_col_attach_three(self):
-        m = MetaData()
-
-        a = Column('a', Integer)
-        b = Column('b', Integer)
-        c = Column('c', Integer)
-        uq = UniqueConstraint(a, b, c)
-
-        t = Table('tbl', m, a)
-        assert uq not in t.constraints
-
-        t.append_column(b)
-        assert uq not in t.constraints
-
-        t2 = Table('t2', m)
-
-        # two different tables, so UniqueConstraint raises
-        assert_raises_message(
-            exc.ArgumentError,
-            r"Column\(s\) 't2\.c' are not part of table 'tbl'\.",
-            t2.append_column, c
-        )
-
-    def test_auto_append_uq_on_col_attach_four(self):
-        """Test that a uniqueconstraint that names Column and string names
-        won't autoattach using deferred column attachment.
-
-        """
-        m = MetaData()
-
-        a = Column('a', Integer)
-        b = Column('b', Integer)
-        c = Column('c', Integer)
-        uq = UniqueConstraint(a, 'b', 'c')
-
-        t = Table('tbl', m, a)
-        assert uq not in t.constraints
-
-        t.append_column(b)
-        assert uq not in t.constraints
-
-        t.append_column(c)
-
-        # we don't track events for previously unknown columns
-        # named 'c' to be attached
-        assert uq not in t.constraints
-
-        t.append_constraint(uq)
-
-        assert uq in t.constraints
-
-        eq_(
-            [cn for cn in t.constraints if isinstance(cn, UniqueConstraint)],
-            [uq]
-        )
-
-    def test_auto_append_uq_on_col_attach_five(self):
-        """Test that a uniqueconstraint that names Column and string names
-        *will* autoattach if the table has all those names up front.
-
-        """
-        m = MetaData()
-
-        a = Column('a', Integer)
-        b = Column('b', Integer)
-        c = Column('c', Integer)
-
-        t = Table('tbl', m, a, c, b)
-
-        uq = UniqueConstraint(a, 'b', 'c')
-
-        assert uq in t.constraints
-
-        t.append_constraint(uq)
-
-        assert uq in t.constraints
-
-        eq_(
-            [cn for cn in t.constraints if isinstance(cn, UniqueConstraint)],
-            [uq]
-        )
-
-    def test_index_asserts_cols_standalone(self):
-        metadata = MetaData()
-
-        t1 = Table('t1', metadata,
-                   Column('x', Integer)
-                   )
-        t2 = Table('t2', metadata,
-                   Column('y', Integer)
-                   )
-        assert_raises_message(
-            exc.ArgumentError,
-            r"Column\(s\) 't2.y' are not part of table 't1'.",
-            Index,
-            "bar", t1.c.x, t2.c.y
-        )
-
-    def test_index_asserts_cols_inline(self):
-        metadata = MetaData()
-
-        t1 = Table('t1', metadata,
-                   Column('x', Integer)
-                   )
-        assert_raises_message(
-            exc.ArgumentError,
-            "Index 'bar' is against table 't1', and "
-            "cannot be associated with table 't2'.",
-            Table, 't2', metadata,
-            Column('y', Integer),
-            Index('bar', t1.c.x)
-        )
-
-    def test_raise_index_nonexistent_name(self):
-        m = MetaData()
-        # the KeyError isn't ideal here, a nicer message
-        # perhaps
-        assert_raises(
-            KeyError,
-            Table, 't', m, Column('x', Integer), Index("foo", "q")
-        )
-
-    def test_raise_not_a_column(self):
-        assert_raises(
-            exc.ArgumentError,
-            Index, "foo", 5
-        )
-
-    def test_raise_expr_no_column(self):
-        idx = Index('foo', func.lower(5))
-
-        assert_raises_message(
-            exc.CompileError,
-            "Index 'foo' is not associated with any table.",
-            schema.CreateIndex(idx).compile, dialect=testing.db.dialect
-        )
-        assert_raises_message(
-            exc.CompileError,
-            "Index 'foo' is not associated with any table.",
-            schema.CreateIndex(idx).compile
-        )
-
-    def test_no_warning_w_no_columns(self):
-        idx = Index(name="foo")
-
-        assert_raises_message(
-            exc.CompileError,
-            "Index 'foo' is not associated with any table.",
-            schema.CreateIndex(idx).compile, dialect=testing.db.dialect
-        )
-        assert_raises_message(
-            exc.CompileError,
-            "Index 'foo' is not associated with any table.",
-            schema.CreateIndex(idx).compile
-        )
-
-    def test_raise_clauseelement_not_a_column(self):
-        m = MetaData()
-        t2 = Table('t2', m, Column('x', Integer))
-
-        class SomeClass(object):
-
-            def __clause_element__(self):
-                return t2
-        assert_raises(
-            exc.ArgumentError,
-            Index, "foo", SomeClass()
-        )
index 846e7058989446a9459bf2d87b342a15ba6ecf47..d6e5a5dd4bd13a6ac81746c6af16915ce514abe7 100644 (file)
@@ -2055,9 +2055,26 @@ class UseExistingTest(fixtures.TablesTest):
         assert "foo" in users.c
 
 
-class IndexTest(fixtures.TestBase):
+class ConstraintTest(fixtures.TestBase):
+
+    def _single_fixture(self):
+        m = MetaData()
+
+        t1 = Table('t1', m,
+                   Column('a', Integer),
+                   Column('b', Integer)
+                   )
+
+        t2 = Table('t2', m,
+                   Column('a', Integer, ForeignKey('t1.a'))
+                   )
 
-    def _assert(self, t, i, columns=True):
+        t3 = Table('t3', m,
+                   Column('a', Integer)
+                   )
+        return t1, t2, t3
+
+    def _assert_index_col_x(self, t, i, columns=True):
         eq_(t.indexes, set([i]))
         if columns:
             eq_(list(i.columns), [t.c.x])
@@ -2065,50 +2082,51 @@ class IndexTest(fixtures.TestBase):
             eq_(list(i.columns), [])
         assert i.table is t
 
+
     def test_separate_decl_columns(self):
         m = MetaData()
         t = Table('t', m, Column('x', Integer))
         i = Index('i', t.c.x)
-        self._assert(t, i)
+        self._assert_index_col_x(t, i)
 
     def test_separate_decl_columns_functional(self):
         m = MetaData()
         t = Table('t', m, Column('x', Integer))
         i = Index('i', func.foo(t.c.x))
-        self._assert(t, i)
+        self._assert_index_col_x(t, i)
 
     def test_inline_decl_columns(self):
         m = MetaData()
         c = Column('x', Integer)
         i = Index('i', c)
         t = Table('t', m, c, i)
-        self._assert(t, i)
+        self._assert_index_col_x(t, i)
 
     def test_inline_decl_columns_functional(self):
         m = MetaData()
         c = Column('x', Integer)
         i = Index('i', func.foo(c))
         t = Table('t', m, c, i)
-        self._assert(t, i)
+        self._assert_index_col_x(t, i)
 
     def test_inline_decl_string(self):
         m = MetaData()
         i = Index('i', "x")
         t = Table('t', m, Column('x', Integer), i)
-        self._assert(t, i)
+        self._assert_index_col_x(t, i)
 
     def test_inline_decl_textonly(self):
         m = MetaData()
         i = Index('i', text("foobar(x)"))
         t = Table('t', m, Column('x', Integer), i)
-        self._assert(t, i, columns=False)
+        self._assert_index_col_x(t, i, columns=False)
 
     def test_separate_decl_textonly(self):
         m = MetaData()
         i = Index('i', text("foobar(x)"))
         t = Table('t', m, Column('x', Integer))
         t.append_constraint(i)
-        self._assert(t, i, columns=False)
+        self._assert_index_col_x(t, i, columns=False)
 
     def test_unnamed_column_exception(self):
         # this can occur in some declarative situations
@@ -2129,26 +2147,6 @@ class IndexTest(fixtures.TestBase):
         idx = Index('q', c)
         is_(idx.table, None)  # lower-case-T table doesn't have indexes
 
-
-class ConstraintTest(fixtures.TestBase):
-
-    def _single_fixture(self):
-        m = MetaData()
-
-        t1 = Table('t1', m,
-                   Column('a', Integer),
-                   Column('b', Integer)
-                   )
-
-        t2 = Table('t2', m,
-                   Column('a', Integer, ForeignKey('t1.a'))
-                   )
-
-        t3 = Table('t3', m,
-                   Column('a', Integer)
-                   )
-        return t1, t2, t3
-
     def test_table_references(self):
         t1, t2, t3 = self._single_fixture()
         assert list(t2.c.a.foreign_keys)[0].references(t1)
@@ -2575,6 +2573,349 @@ class ConstraintTest(fixtures.TestBase):
         # remove twice OK
         metadata.remove(t2)
 
+    def test_double_fk_usage_raises(self):
+        f = ForeignKey('b.id')
+
+        Column('x', Integer, f)
+        assert_raises(exc.InvalidRequestError, Column, "y", Integer, f)
+
+    def test_auto_append_constraint(self):
+        m = MetaData()
+
+        t = Table('tbl', m,
+                  Column('a', Integer),
+                  Column('b', Integer)
+                  )
+
+        t2 = Table('t2', m,
+                   Column('a', Integer),
+                   Column('b', Integer)
+                   )
+
+        for c in (
+            UniqueConstraint(t.c.a),
+            CheckConstraint(t.c.a > 5),
+            ForeignKeyConstraint([t.c.a], [t2.c.a]),
+            PrimaryKeyConstraint(t.c.a)
+        ):
+            assert c in t.constraints
+            t.append_constraint(c)
+            assert c in t.constraints
+
+        c = Index('foo', t.c.a)
+        assert c in t.indexes
+
+    def test_auto_append_lowercase_table(self):
+        from sqlalchemy import table, column
+
+        t = table('t', column('a'))
+        t2 = table('t2', column('a'))
+        for c in (
+            UniqueConstraint(t.c.a),
+            CheckConstraint(t.c.a > 5),
+            ForeignKeyConstraint([t.c.a], [t2.c.a]),
+            PrimaryKeyConstraint(t.c.a),
+            Index('foo', t.c.a)
+        ):
+            assert True
+
+    def test_tometadata_ok(self):
+        m = MetaData()
+
+        t = Table('tbl', m,
+                  Column('a', Integer),
+                  Column('b', Integer)
+                  )
+
+        t2 = Table('t2', m,
+                   Column('a', Integer),
+                   Column('b', Integer)
+                   )
+
+        UniqueConstraint(t.c.a)
+        CheckConstraint(t.c.a > 5)
+        ForeignKeyConstraint([t.c.a], [t2.c.a])
+        PrimaryKeyConstraint(t.c.a)
+
+        m2 = MetaData()
+
+        t3 = t.tometadata(m2)
+
+        eq_(len(t3.constraints), 4)
+
+        for c in t3.constraints:
+            assert c.table is t3
+
+    def test_check_constraint_copy(self):
+        m = MetaData()
+        t = Table('tbl', m,
+                  Column('a', Integer),
+                  Column('b', Integer)
+                  )
+        ck = CheckConstraint(t.c.a > 5)
+        ck2 = ck.copy()
+        assert ck in t.constraints
+        assert ck2 not in t.constraints
+
+    def test_ambig_check_constraint_auto_append(self):
+        m = MetaData()
+
+        t = Table('tbl', m,
+                  Column('a', Integer),
+                  Column('b', Integer)
+                  )
+
+        t2 = Table('t2', m,
+                   Column('a', Integer),
+                   Column('b', Integer)
+                   )
+        c = CheckConstraint(t.c.a > t2.c.b)
+        assert c not in t.constraints
+        assert c not in t2.constraints
+
+    def test_auto_append_ck_on_col_attach_one(self):
+        m = MetaData()
+
+        a = Column('a', Integer)
+        b = Column('b', Integer)
+        ck = CheckConstraint(a > b)
+
+        t = Table('tbl', m, a, b)
+        assert ck in t.constraints
+
+    def test_auto_append_ck_on_col_attach_two(self):
+        m = MetaData()
+
+        a = Column('a', Integer)
+        b = Column('b', Integer)
+        c = Column('c', Integer)
+        ck = CheckConstraint(a > b + c)
+
+        t = Table('tbl', m, a)
+        assert ck not in t.constraints
+
+        t.append_column(b)
+        assert ck not in t.constraints
+
+        t.append_column(c)
+        assert ck in t.constraints
+
+    def test_auto_append_ck_on_col_attach_three(self):
+        m = MetaData()
+
+        a = Column('a', Integer)
+        b = Column('b', Integer)
+        c = Column('c', Integer)
+        ck = CheckConstraint(a > b + c)
+
+        t = Table('tbl', m, a)
+        assert ck not in t.constraints
+
+        t.append_column(b)
+        assert ck not in t.constraints
+
+        t2 = Table('t2', m)
+        t2.append_column(c)
+
+        # two different tables, so CheckConstraint does nothing.
+        assert ck not in t.constraints
+
+    def test_auto_append_uq_on_col_attach_one(self):
+        m = MetaData()
+
+        a = Column('a', Integer)
+        b = Column('b', Integer)
+        uq = UniqueConstraint(a, b)
+
+        t = Table('tbl', m, a, b)
+        assert uq in t.constraints
+
+    def test_auto_append_uq_on_col_attach_two(self):
+        m = MetaData()
+
+        a = Column('a', Integer)
+        b = Column('b', Integer)
+        c = Column('c', Integer)
+        uq = UniqueConstraint(a, b, c)
+
+        t = Table('tbl', m, a)
+        assert uq not in t.constraints
+
+        t.append_column(b)
+        assert uq not in t.constraints
+
+        t.append_column(c)
+        assert uq in t.constraints
+
+    def test_auto_append_uq_on_col_attach_three(self):
+        m = MetaData()
+
+        a = Column('a', Integer)
+        b = Column('b', Integer)
+        c = Column('c', Integer)
+        uq = UniqueConstraint(a, b, c)
+
+        t = Table('tbl', m, a)
+        assert uq not in t.constraints
+
+        t.append_column(b)
+        assert uq not in t.constraints
+
+        t2 = Table('t2', m)
+
+        # two different tables, so UniqueConstraint raises
+        assert_raises_message(
+            exc.ArgumentError,
+            r"Column\(s\) 't2\.c' are not part of table 'tbl'\.",
+            t2.append_column, c
+        )
+
+    def test_auto_append_uq_on_col_attach_four(self):
+        """Test that a uniqueconstraint that names Column and string names
+        won't autoattach using deferred column attachment.
+
+        """
+        m = MetaData()
+
+        a = Column('a', Integer)
+        b = Column('b', Integer)
+        c = Column('c', Integer)
+        uq = UniqueConstraint(a, 'b', 'c')
+
+        t = Table('tbl', m, a)
+        assert uq not in t.constraints
+
+        t.append_column(b)
+        assert uq not in t.constraints
+
+        t.append_column(c)
+
+        # we don't track events for previously unknown columns
+        # named 'c' to be attached
+        assert uq not in t.constraints
+
+        t.append_constraint(uq)
+
+        assert uq in t.constraints
+
+        eq_(
+            [cn for cn in t.constraints if isinstance(cn, UniqueConstraint)],
+            [uq]
+        )
+
+    def test_auto_append_uq_on_col_attach_five(self):
+        """Test that a uniqueconstraint that names Column and string names
+        *will* autoattach if the table has all those names up front.
+
+        """
+        m = MetaData()
+
+        a = Column('a', Integer)
+        b = Column('b', Integer)
+        c = Column('c', Integer)
+
+        t = Table('tbl', m, a, c, b)
+
+        uq = UniqueConstraint(a, 'b', 'c')
+
+        assert uq in t.constraints
+
+        t.append_constraint(uq)
+
+        assert uq in t.constraints
+
+        eq_(
+            [cn for cn in t.constraints if isinstance(cn, UniqueConstraint)],
+            [uq]
+        )
+
+    def test_index_asserts_cols_standalone(self):
+        metadata = MetaData()
+
+        t1 = Table('t1', metadata,
+                   Column('x', Integer)
+                   )
+        t2 = Table('t2', metadata,
+                   Column('y', Integer)
+                   )
+        assert_raises_message(
+            exc.ArgumentError,
+            r"Column\(s\) 't2.y' are not part of table 't1'.",
+            Index,
+            "bar", t1.c.x, t2.c.y
+        )
+
+    def test_index_asserts_cols_inline(self):
+        metadata = MetaData()
+
+        t1 = Table('t1', metadata,
+                   Column('x', Integer)
+                   )
+        assert_raises_message(
+            exc.ArgumentError,
+            "Index 'bar' is against table 't1', and "
+            "cannot be associated with table 't2'.",
+            Table, 't2', metadata,
+            Column('y', Integer),
+            Index('bar', t1.c.x)
+        )
+
+    def test_raise_index_nonexistent_name(self):
+        m = MetaData()
+        # the KeyError isn't ideal here, a nicer message
+        # perhaps
+        assert_raises(
+            KeyError,
+            Table, 't', m, Column('x', Integer), Index("foo", "q")
+        )
+
+    def test_raise_not_a_column(self):
+        assert_raises(
+            exc.ArgumentError,
+            Index, "foo", 5
+        )
+
+    def test_raise_expr_no_column(self):
+        idx = Index('foo', func.lower(5))
+
+        assert_raises_message(
+            exc.CompileError,
+            "Index 'foo' is not associated with any table.",
+            schema.CreateIndex(idx).compile, dialect=testing.db.dialect
+        )
+        assert_raises_message(
+            exc.CompileError,
+            "Index 'foo' is not associated with any table.",
+            schema.CreateIndex(idx).compile
+        )
+
+    def test_no_warning_w_no_columns(self):
+        idx = Index(name="foo")
+
+        assert_raises_message(
+            exc.CompileError,
+            "Index 'foo' is not associated with any table.",
+            schema.CreateIndex(idx).compile, dialect=testing.db.dialect
+        )
+        assert_raises_message(
+            exc.CompileError,
+            "Index 'foo' is not associated with any table.",
+            schema.CreateIndex(idx).compile
+        )
+
+    def test_raise_clauseelement_not_a_column(self):
+        m = MetaData()
+        t2 = Table('t2', m, Column('x', Integer))
+
+        class SomeClass(object):
+
+            def __clause_element__(self):
+                return t2
+        assert_raises(
+            exc.ArgumentError,
+            Index, "foo", SomeClass()
+        )
+
 
 class ColumnDefinitionTest(AssertsCompiledSQL, fixtures.TestBase):