From: Mike Bayer Date: Sat, 30 Jul 2016 14:06:53 +0000 (-0400) Subject: - Consoliate test/sql/test_constraint ConstraintAPITest X-Git-Tag: rel_1_1_0~64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e467e899e126db2db7c25d533aee12d78c2dbdfb;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Consoliate test/sql/test_constraint ConstraintAPITest and test/sql/test_metadata IndexTest into test/sql/test_metadata ConstraintTest Change-Id: I7aeee9a1edbbd889200afc393695f73d5fbac3f3 --- diff --git a/test/sql/test_constraints.py b/test/sql/test_constraints.py index 3e8021ebea..efd52ffb5d 100644 --- a/test/sql/test_constraints.py +++ b/test/sql/test_constraints.py @@ -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() - ) diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py index 846e705898..d6e5a5dd4b 100644 --- a/test/sql/test_metadata.py +++ b/test/sql/test_metadata.py @@ -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):