diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-02-06 19:06:09 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-02-06 19:06:09 -0500 |
| commit | a0ef9edc1908adb823ec788eee1974900bca4bac (patch) | |
| tree | 276bfa6934e56b8d33fae4b287368404725506d9 /lib/sqlalchemy/testing | |
| parent | 47858b85ec7139af83c2cd0aed1af8917d88ea3e (diff) | |
| download | sqlalchemy-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.py | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/requirements.py | 42 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/suite/test_reflection.py | 30 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/suite/test_types.py | 37 |
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') |
