diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/dialect/test_mysql.py | 24 | ||||
-rw-r--r-- | test/dialect/test_postgresql.py | 19 | ||||
-rw-r--r-- | test/sql/test_types.py | 81 |
3 files changed, 121 insertions, 3 deletions
diff --git a/test/dialect/test_mysql.py b/test/dialect/test_mysql.py index 64f65d8f6..49dde1520 100644 --- a/test/dialect/test_mysql.py +++ b/test/dialect/test_mysql.py @@ -7,18 +7,19 @@ import sets # end Py2K from sqlalchemy import * -from sqlalchemy import sql, exc +from sqlalchemy import sql, exc, schema from sqlalchemy.dialects.mysql import base as mysql from sqlalchemy.test.testing import eq_ from sqlalchemy.test import * from sqlalchemy.test.engines import utf8_engine -class TypesTest(TestBase, AssertsExecutionResults): +class TypesTest(TestBase, AssertsExecutionResults, AssertsCompiledSQL): "Test MySQL column types" __only_on__ = 'mysql' - + __dialect__ = mysql.dialect() + @testing.uses_deprecated('Manually quoting ENUM value literals') def test_basic(self): meta1 = MetaData(testing.db) @@ -643,6 +644,23 @@ class TypesTest(TestBase, AssertsExecutionResults): finally: metadata.drop_all() + def test_enum_compile(self): + e1 = Enum('x', 'y', 'z', name="somename") + t1 = Table('sometable', MetaData(), Column('somecolumn', e1)) + self.assert_compile( + schema.CreateTable(t1), + "CREATE TABLE sometable (somecolumn ENUM('x','y','z'))" + ) + t1 = Table('sometable', MetaData(), + Column('somecolumn', Enum('x', 'y', 'z', native_enum=False)) + ) + self.assert_compile( + schema.CreateTable(t1), + "CREATE TABLE sometable (" + "somecolumn VARCHAR(1), " + " CHECK (somecolumn IN ('x','y','z'))" + ")" + ) @testing.exclude('mysql', '<', (4,), "3.23 can't handle an ENUM of ''") @testing.uses_deprecated('Manually quoting ENUM value literals') diff --git a/test/dialect/test_postgresql.py b/test/dialect/test_postgresql.py index 4e9a324d4..626d54677 100644 --- a/test/dialect/test_postgresql.py +++ b/test/dialect/test_postgresql.py @@ -132,6 +132,25 @@ class EnumTest(TestBase, AssertsExecutionResults, AssertsCompiledSQL): postgresql.DropEnumType(e2), "DROP TYPE someschema.somename" ) + + t1 = Table('sometable', MetaData(), Column('somecolumn', e1)) + self.assert_compile( + schema.CreateTable(t1), + "CREATE TABLE sometable (" + "somecolumn somename" + ")" + ) + t1 = Table('sometable', MetaData(), + Column('somecolumn', Enum('x', 'y', 'z', native_enum=False)) + ) + self.assert_compile( + schema.CreateTable(t1), + "CREATE TABLE sometable (" + "somecolumn VARCHAR(1), " + " CHECK (somecolumn IN ('x','y','z'))" + ")" + ) + @testing.fails_on('postgresql+zxjdbc', 'zxjdbc fails on ENUM: column "XXX" is of type XXX ' diff --git a/test/sql/test_types.py b/test/sql/test_types.py index c844cf696..51dd4c12b 100644 --- a/test/sql/test_types.py +++ b/test/sql/test_types.py @@ -329,6 +329,87 @@ class UnicodeTest(TestBase, AssertsExecutionResults): assert uni(unicodedata) == unicodedata.encode('utf-8') +class EnumTest(TestBase): + @classmethod + def setup_class(cls): + global enum_table, non_native_enum_table, metadata + metadata = MetaData(testing.db) + enum_table = Table('enum_table', metadata, + Column("id", Integer, primary_key=True), + Column('someenum', Enum('one','two','three', name='myenum')) + ) + + non_native_enum_table = Table('non_native_enum_table', metadata, + Column("id", Integer, primary_key=True), + Column('someenum', Enum('one','two','three', native_enum=False)), + ) + + metadata.create_all() + + def teardown(self): + enum_table.delete().execute() + non_native_enum_table.delete().execute() + + @classmethod + def teardown_class(cls): + metadata.drop_all() + + @testing.fails_on('postgresql+zxjdbc', + 'zxjdbc fails on ENUM: column "XXX" is of type XXX ' + 'but expression is of type character varying') + @testing.fails_on('postgresql+pg8000', + 'zxjdbc fails on ENUM: column "XXX" is of type XXX ' + 'but expression is of type text') + def test_round_trip(self): + enum_table.insert().execute([ + {'id':1, 'someenum':'two'}, + {'id':2, 'someenum':'two'}, + {'id':3, 'someenum':'one'}, + ]) + + eq_( + enum_table.select().order_by(enum_table.c.id).execute().fetchall(), + [ + (1, 'two'), + (2, 'two'), + (3, 'one'), + ] + ) + + def test_non_native_round_trip(self): + non_native_enum_table.insert().execute([ + {'id':1, 'someenum':'two'}, + {'id':2, 'someenum':'two'}, + {'id':3, 'someenum':'one'}, + ]) + + eq_( + non_native_enum_table.select(). + order_by(non_native_enum_table.c.id).execute().fetchall(), + [ + (1, 'two'), + (2, 'two'), + (3, 'one'), + ] + ) + + @testing.fails_on('postgresql+zxjdbc', + 'zxjdbc fails on ENUM: column "XXX" is of type XXX ' + 'but expression is of type character varying') + @testing.fails_on('mysql', "MySQL seems to issue a 'data truncated' warning.") + def test_constraint(self): + assert_raises(exc.DBAPIError, + enum_table.insert().execute, + {'id':4, 'someenum':'four'} + ) + + @testing.fails_on('mysql', "the CHECK constraint doesn't raise an exception for unknown reason") + def test_non_native_constraint(self): + assert_raises(exc.DBAPIError, + non_native_enum_table.insert().execute, + {'id':4, 'someenum':'four'} + ) + class BinaryTest(TestBase, AssertsExecutionResults): __excluded_on__ = ( ('mysql', '<', (4, 1, 1)), # screwy varbinary types |