summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark McLoughlin <markmc@redhat.com>2013-05-02 22:09:26 +0100
committerMark McLoughlin <markmc@redhat.com>2013-05-02 23:12:43 +0100
commit1ecc33884f38404e281a533e1fa73c1e8d1f3f09 (patch)
tree3396e9759c114831a3d4b275bb2cd1c430221991
parent90e83530d4dc49d570fa05ea63a93805717dcfa0 (diff)
Add test coverage for sqlite regexp function
Add some tests which for the regexp function which we install for sqlite. Need test coverage to catch e.g. a regression of the fix for bug #1031846. Change-Id: I4bd77d0d93c4fc85588e6e6d5a559e68133dbf73
-rw-r--r--tests/unit/db/sqlalchemy/test_sqlalchemy.py59
1 files changed, 58 insertions, 1 deletions
diff --git a/tests/unit/db/sqlalchemy/test_sqlalchemy.py b/tests/unit/db/sqlalchemy/test_sqlalchemy.py
index 90a048e..efe0264 100644
--- a/tests/unit/db/sqlalchemy/test_sqlalchemy.py
+++ b/tests/unit/db/sqlalchemy/test_sqlalchemy.py
@@ -1,4 +1,6 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
+# encoding=UTF8
+
# Copyright (c) 2012 Rackspace Hosting
# All Rights Reserved.
#
@@ -18,7 +20,7 @@
from sqlalchemy import Column, MetaData, Table, UniqueConstraint
from sqlalchemy.ext.declarative import declarative_base
-from sqlalchemy import DateTime, Integer
+from sqlalchemy import DateTime, Integer, String
from openstack.common.db import exception as db_exc
from openstack.common.db.sqlalchemy import models
@@ -57,6 +59,7 @@ class SessionErrorWrapperTestCase(test_utils.BaseTestCase):
meta.bind = session.get_engine()
test_table = Table(_TABLE_NAME, meta, autoload=True)
test_table.drop()
+ session.cleanup()
def test_flush_wrapper(self):
tbl = TmpTable()
@@ -80,3 +83,57 @@ class SessionErrorWrapperTestCase(test_utils.BaseTestCase):
update
self.assertRaises(db_exc.DBDuplicateEntry,
method, {'foo': 20})
+
+
+_REGEXP_TABLE_NAME = _TABLE_NAME + "regexp"
+
+
+class RegexpTable(BASE, models.ModelBase):
+ __tablename__ = _REGEXP_TABLE_NAME
+ id = Column(Integer, primary_key=True)
+ bar = Column(String(255))
+
+
+class RegexpFilterTestCase(test_utils.BaseTestCase):
+
+ def setUp(self):
+ super(RegexpFilterTestCase, self).setUp()
+ meta = MetaData()
+ meta.bind = session.get_engine()
+ test_table = Table(_REGEXP_TABLE_NAME, meta,
+ Column('id', Integer, primary_key=True,
+ nullable=False),
+ Column('bar', String(255)))
+ test_table.create()
+
+ def tearDown(self):
+ super(RegexpFilterTestCase, self).tearDown()
+ meta = MetaData()
+ meta.bind = session.get_engine()
+ test_table = Table(_REGEXP_TABLE_NAME, meta, autoload=True)
+ test_table.drop()
+ session.cleanup()
+
+ def _test_regexp_filter(self, regexp, expected):
+ _session = session.get_session()
+ with _session.begin():
+ for i in ['10', '20', u'♥']:
+ tbl = RegexpTable()
+ tbl.update({'bar': i})
+ tbl.save(session=_session)
+
+ regexp_op = RegexpTable.bar.op('REGEXP')(regexp)
+ result = _session.query(RegexpTable).filter(regexp_op).all()
+ self.assertEqual([r.bar for r in result], expected)
+
+ def test_regexp_filter(self):
+ self._test_regexp_filter('10', ['10'])
+
+ def test_regexp_filter_nomatch(self):
+ self._test_regexp_filter('11', [])
+
+ def test_regexp_filter_unicode(self):
+ self._test_regexp_filter(u'♥', [u'♥'])
+
+ def test_regexp_filter_unicode_nomatch(self):
+ self._test_regexp_filter(u'♦', [])