summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/dialect/test_mysql.py24
-rw-r--r--test/dialect/test_postgresql.py19
-rw-r--r--test/sql/test_types.py81
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