summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/testing
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2013-02-06 19:06:09 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2013-02-06 19:06:09 -0500
commita0ef9edc1908adb823ec788eee1974900bca4bac (patch)
tree276bfa6934e56b8d33fae4b287368404725506d9 /lib/sqlalchemy/testing
parent47858b85ec7139af83c2cd0aed1af8917d88ea3e (diff)
downloadsqlalchemy-a0ef9edc1908adb823ec788eee1974900bca4bac.tar.gz
- adding in requirements
- get test_naturalpks to be more generalized
Diffstat (limited to 'lib/sqlalchemy/testing')
-rw-r--r--lib/sqlalchemy/testing/exclusions.py4
-rw-r--r--lib/sqlalchemy/testing/requirements.py42
-rw-r--r--lib/sqlalchemy/testing/suite/test_reflection.py30
-rw-r--r--lib/sqlalchemy/testing/suite/test_types.py37
4 files changed, 110 insertions, 3 deletions
diff --git a/lib/sqlalchemy/testing/exclusions.py b/lib/sqlalchemy/testing/exclusions.py
index f105c8b6a..2c0679e1d 100644
--- a/lib/sqlalchemy/testing/exclusions.py
+++ b/lib/sqlalchemy/testing/exclusions.py
@@ -84,7 +84,9 @@ def succeeds_if(predicate, reason=None):
class Predicate(object):
@classmethod
def as_predicate(cls, predicate):
- if isinstance(predicate, Predicate):
+ if isinstance(predicate, skip_if):
+ return predicate.predicate
+ elif isinstance(predicate, Predicate):
return predicate
elif isinstance(predicate, list):
return OrPredicate([cls.as_predicate(pred) for pred in predicate])
diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py
index 7228f38f9..e6e21d2cb 100644
--- a/lib/sqlalchemy/testing/requirements.py
+++ b/lib/sqlalchemy/testing/requirements.py
@@ -40,6 +40,27 @@ class SuiteRequirements(Requirements):
return exclusions.open()
@property
+ def on_update_cascade(self):
+ """"target database must support ON UPDATE..CASCADE behavior in
+ foreign keys."""
+
+ return exclusions.open()
+
+ @property
+ def deferrable_fks(self):
+ return exclusions.closed()
+
+ @property
+ def on_update_or_deferrable_fks(self):
+ # TODO: exclusions should be composable,
+ # somehow only_if([x, y]) isn't working here, negation/conjunctions
+ # getting confused.
+ return exclusions.only_if(
+ lambda: self.on_update_cascade.enabled or self.deferrable_fks.enabled
+ )
+
+
+ @property
def self_referential_foreign_keys(self):
"""Target database must support self-referential foreign keys."""
@@ -254,6 +275,11 @@ class SuiteRequirements(Requirements):
return exclusions.open()
@property
+ def unicode_ddl(self):
+ """Target driver must support some degree of non-ascii symbol names."""
+ return exclusions.closed()
+
+ @property
def datetime(self):
"""target dialect supports representation of Python
datetime.datetime() objects."""
@@ -349,3 +375,19 @@ class SuiteRequirements(Requirements):
"""target database must use a plain percent '%' as the 'modulus'
operator."""
return exclusions.closed()
+
+ @property
+ def unicode_connections(self):
+ """Target driver must support non-ASCII characters being passed at all."""
+ return exclusions.open()
+
+ @property
+ def skip_mysql_on_windows(self):
+ """Catchall for a large variety of MySQL on Windows failures"""
+ return exclusions.open()
+
+ def _has_mysql_on_windows(self):
+ return False
+
+ def _has_mysql_fully_case_sensitive(self):
+ return False
diff --git a/lib/sqlalchemy/testing/suite/test_reflection.py b/lib/sqlalchemy/testing/suite/test_reflection.py
index 89e233295..5beed6aad 100644
--- a/lib/sqlalchemy/testing/suite/test_reflection.py
+++ b/lib/sqlalchemy/testing/suite/test_reflection.py
@@ -218,6 +218,9 @@ class ComponentReflectionTest(fixtures.TablesTest):
])) > 0, '%s(%s), %s(%s)' % (col.name,
col.type, cols[i]['name'], ctype))
+ if not col.primary_key:
+ assert cols[i]['default'] is None
+
@testing.requires.table_reflection
def test_get_columns(self):
self._test_get_columns()
@@ -386,5 +389,32 @@ class ComponentReflectionTest(fixtures.TablesTest):
def test_get_table_oid_with_schema(self):
self._test_get_table_oid('users', schema='test_schema')
+ @testing.provide_metadata
+ def test_autoincrement_col(self):
+ """test that 'autoincrement' is reflected according to sqla's policy.
+
+ Don't mark this test as unsupported for any backend !
+
+ (technically it fails with MySQL InnoDB since "id" comes before "id2")
+
+ A backend is better off not returning "autoincrement" at all,
+ instead of potentially returning "False" for an auto-incrementing
+ primary key column.
+
+ """
+
+ meta = self.metadata
+ insp = inspect(meta.bind)
+
+ for tname, cname in [
+ ('users', 'user_id'),
+ ('email_addresses', 'address_id'),
+ ('dingalings', 'dingaling_id'),
+ ]:
+ cols = insp.get_columns(tname)
+ id_ = dict((c['name'], c) for c in cols)[cname]
+ assert id_.get('autoincrement', True)
+
+
__all__ = ('ComponentReflectionTest', 'HasTableTest')
diff --git a/lib/sqlalchemy/testing/suite/test_types.py b/lib/sqlalchemy/testing/suite/test_types.py
index 8d0500d71..5ad26c2f2 100644
--- a/lib/sqlalchemy/testing/suite/test_types.py
+++ b/lib/sqlalchemy/testing/suite/test_types.py
@@ -4,7 +4,7 @@ from .. import fixtures, config
from ..assertions import eq_
from ..config import requirements
from sqlalchemy import Integer, Unicode, UnicodeText, select
-from sqlalchemy import Date, DateTime, Time, MetaData, String
+from sqlalchemy import Date, DateTime, Time, MetaData, String, Text
from ..schema import Table, Column
import datetime
@@ -103,6 +103,39 @@ class UnicodeTextTest(_UnicodeFixture, fixtures.TablesTest):
def test_empty_strings_text(self):
self._test_empty_strings()
+class TextTest(fixtures.TablesTest):
+ @classmethod
+ def define_tables(cls, metadata):
+ Table('text_table', metadata,
+ Column('id', Integer, primary_key=True,
+ test_needs_autoincrement=True),
+ Column('text_data', Text),
+ )
+
+ def test_text_roundtrip(self):
+ text_table = self.tables.text_table
+
+ config.db.execute(
+ text_table.insert(),
+ {"text_data": 'some text'}
+ )
+ row = config.db.execute(
+ select([text_table.c.text_data])
+ ).first()
+ eq_(row, ('some text',))
+
+ def test_text_empty_strings(self):
+ text_table = self.tables.text_table
+
+ config.db.execute(
+ text_table.insert(),
+ {"text_data": ''}
+ )
+ row = config.db.execute(
+ select([text_table.c.text_data])
+ ).first()
+ eq_(row, ('',))
+
class StringTest(fixtures.TestBase):
@requirements.unbounded_varchar
@@ -212,7 +245,7 @@ class DateHistoricTest(_DateFixture, fixtures.TablesTest):
__all__ = ('UnicodeVarcharTest', 'UnicodeTextTest',
- 'DateTest', 'DateTimeTest',
+ 'DateTest', 'DateTimeTest', 'TextTest',
'DateTimeHistoricTest', 'DateTimeCoercedToDateTimeTest',
'TimeMicrosecondsTest', 'TimeTest', 'DateTimeMicrosecondsTest',
'DateHistoricTest', 'StringTest')