Add mongodb and imap tests for dal

Added mongodb uri string for tests
This commit is contained in:
Alan Etkin
2014-01-28 17:46:05 -03:00
parent 2967969add
commit 35d56ec3f0
4 changed files with 344 additions and 49 deletions
+3 -1
View File
@@ -3,7 +3,9 @@ import os, sys
from test_http import *
from test_cache import *
if "google" in (os.getenv("DB") or []):
NOSQL = any([name in (os.getenv("DB") or "")
for name in ("datastore", "mongodb", "imap")])
if NOSQL:
from test_dal_nosql import *
else:
from test_dal import *
+78 -48
View File
@@ -48,27 +48,36 @@ def fix_sys_path():
fix_sys_path()
from dal import DAL, Field, Table, SQLALL
#for travis-ci
DEFAULT_URI = os.environ.get('DB', 'sqlite:memory')
print 'Testing against %s engine (%s)' % (DEFAULT_URI.partition(':')[0], DEFAULT_URI)
IS_GAE = "datastore" in DEFAULT_URI
IS_MONGODB = "mongodb" in DEFAULT_URI
IS_IMAP = "imap" in DEFAULT_URI
if IS_IMAP:
from dal import IMAPAdapter
from contrib import mockimaplib
IMAPAdapter.driver = mockimaplib
from dal import DAL, Field, Table, SQLALL
def drop(table, cascade=None):
if not IS_GAE:
if cascade:
table.drop(cascade)
else:
table.drop()
else:
# mongodb implements drop()
# although it seems it does not work properly
if (IS_GAE or IS_MONGODB or IS_IMAP):
# GAE drop/cleanup is not implemented
db = table._db
db(table).delete()
del db[table._tablename]
del db.tables[db.tables.index(table._tablename)]
db._remove_references_to(table)
else:
if cascade:
table.drop(cascade)
else:
table.drop()
# setup GAE dummy database
@@ -104,7 +113,7 @@ def tearDownModule():
for a in glob.glob('*.table'):
os.unlink(a)
@unittest.skipIf(IS_GAE, 'TODO: Datastore throws "AssertionError: SyntaxError not raised"')
@unittest.skipIf(IS_GAE or IS_IMAP, 'TODO: Datastore throws "AssertionError: SyntaxError not raised"')
class TestFields(unittest.TestCase):
def testFieldName(self):
@@ -157,7 +166,7 @@ class TestFields(unittest.TestCase):
else:
isinstance(f.formatter(datetime.datetime.now()), str)
@unittest.skipIf(IS_GAE, 'TODO: Datastore does accept dict objects as json field input')
@unittest.skipIf(IS_GAE or IS_MONGODB, 'TODO: Datastore does accept dict objects as json field input. MongoDB assertion error Binary("x", 0) != "x"')
def testRun(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
for ft in ['string', 'text', 'password', 'upload', 'blob']:
@@ -228,7 +237,7 @@ class TestFields(unittest.TestCase):
drop(db.tt)
@unittest.skipIf(IS_GAE, 'TODO: Datastore throws "AssertionError: SyntaxError not raised"')
@unittest.skipIf(IS_GAE or IS_IMAP, 'TODO: Datastore throws "AssertionError: SyntaxError not raised"')
class TestTables(unittest.TestCase):
def testTableNames(self):
@@ -247,7 +256,7 @@ class TestTables(unittest.TestCase):
self.assert_(Table(None, 'a_bc'),
"Table isn't allowing underscores in tablename. It should.")
@unittest.skipIf(IS_IMAP, "Skip IMAP")
class TestAll(unittest.TestCase):
def setUp(self):
@@ -257,7 +266,7 @@ class TestAll(unittest.TestCase):
ans = 'PseudoTable.id, PseudoTable.name, PseudoTable.birthdate'
self.assertEqual(str(SQLALL(self.pt)), ans)
@unittest.skipIf(IS_IMAP, "Skip IMAP")
class TestTable(unittest.TestCase):
def testTableCreation(self):
@@ -280,7 +289,7 @@ class TestTable(unittest.TestCase):
self.assert_('persons.firstname, persons.lastname'
in str(persons.ALL))
@unittest.skipIf(IS_GAE, "No table alias on GAE")
@unittest.skipIf(IS_GAE or IS_MONGODB, "No table alias for this backend")
def testTableAlias(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
persons = Table(db, 'persons', Field('firstname',
@@ -303,24 +312,35 @@ class TestTable(unittest.TestCase):
class TestInsert(unittest.TestCase):
def testRun(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
db.define_table('tt', Field('aa'))
self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True)
self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True)
self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True)
self.assertEqual(db(db.tt.aa == '1').count(), 3)
self.assertEqual(db(db.tt.aa == '2').isempty(), True)
self.assertEqual(db(db.tt.aa == '1').update(aa='2'), 3)
self.assertEqual(db(db.tt.aa == '2').count(), 3)
self.assertEqual(db(db.tt.aa == '2').isempty(), False)
self.assertEqual(db(db.tt.aa == '2').delete(), 3)
self.assertEqual(db(db.tt.aa == '2').isempty(), True)
drop(db.tt)
if IS_IMAP:
imap = DAL(DEFAULT_URI)
imap.define_tables()
self.assertEqual(imap.Draft.insert(to="nurse@example.com",
subject="Nurse!",
sender="gumby@example.com",
content="Nurse!\r\nNurse!"), 2)
self.assertEqual(imap.Draft[2].subject, "Nurse!")
self.assertEqual(imap.Draft[2].sender, "gumby@example.com")
self.assertEqual(isinstance(imap.Draft[2].uid, long), True)
self.assertEqual(imap.Draft[2].content[0]["text"], "Nurse!\r\nNurse!")
else:
db = DAL(DEFAULT_URI, check_reserved=['all'])
db.define_table('tt', Field('aa'))
self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True)
self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True)
self.assertEqual(isinstance(db.tt.insert(aa='1'), long), True)
self.assertEqual(db(db.tt.aa == '1').count(), 3)
self.assertEqual(db(db.tt.aa == '2').isempty(), True)
self.assertEqual(db(db.tt.aa == '1').update(aa='2'), 3)
self.assertEqual(db(db.tt.aa == '2').count(), 3)
self.assertEqual(db(db.tt.aa == '2').isempty(), False)
self.assertEqual(db(db.tt.aa == '2').delete(), 3)
self.assertEqual(db(db.tt.aa == '2').isempty(), True)
drop(db.tt)
@unittest.skipIf(IS_GAE, 'TODO: Datastore throws "SyntaxError: Not supported (query using or)"')
@unittest.skipIf(IS_GAE or IS_MONGODB or IS_IMAP, 'TODO: Datastore throws "SyntaxError: Not supported (query using or)". MongoDB assertionerror 5L != 3')
class TestSelect(unittest.TestCase):
def testRun(self):
@@ -351,7 +371,7 @@ class TestSelect(unittest.TestCase):
self.assertEqual(db(~(db.tt.aa > '1') & (db.tt.aa > '2')).count(), 0)
drop(db.tt)
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestAddMethod(unittest.TestCase):
def testRun(self):
@@ -366,7 +386,7 @@ class TestAddMethod(unittest.TestCase):
self.assertEqual(len(db.tt.all()), 3)
drop(db.tt)
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestBelongs(unittest.TestCase):
def testRun(self):
@@ -378,7 +398,7 @@ class TestBelongs(unittest.TestCase):
self.assertEqual(isinstance(db.tt.insert(aa='3'), long), True)
self.assertEqual(db(db.tt.aa.belongs(('1', '3'))).count(),
2)
if not (IS_GAE):
if not (IS_GAE or IS_MONGODB):
self.assertEqual(db(db.tt.aa.belongs(db(db.tt.id > 2)._select(db.tt.aa))).count(), 1)
self.assertEqual(db(db.tt.aa.belongs(db(db.tt.aa.belongs(('1',
@@ -388,12 +408,13 @@ class TestBelongs(unittest.TestCase):
db.tt.aa))).count(),
2)
else:
print "Datastore belongs does not accept queries (skipping)"
print "Datastore/Mongodb belongs does not accept queries (skipping)"
drop(db.tt)
@unittest.skipIf(IS_GAE, "Contains not supported on GAE Datastore")
@unittest.skipIf(IS_GAE or IS_IMAP, "Contains not supported on GAE Datastore. TODO: IMAP tests")
class TestContains(unittest.TestCase):
@unittest.skipIf(IS_MONGODB, "TODO: MongoDB Contains error")
def testRun(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
db.define_table('tt', Field('aa', 'list:string'), Field('bb','string'))
@@ -410,7 +431,7 @@ class TestContains(unittest.TestCase):
drop(db.tt)
@unittest.skipIf(IS_GAE, "Like not supported on GAE Datastore")
@unittest.skipIf(IS_GAE or IS_MONGODB or IS_IMAP, "Like not supported on GAE Datastore. TODO: IMAP test")
class TestLike(unittest.TestCase):
def testRun(self):
@@ -436,7 +457,7 @@ class TestLike(unittest.TestCase):
self.assertEqual(db(db.tt.aa.like('2%')).count(), 0)
drop(db.tt)
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestDatetime(unittest.TestCase):
def testRun(self):
@@ -453,7 +474,7 @@ class TestDatetime(unittest.TestCase):
self.assertEqual(db(db.tt.aa >= datetime.datetime(1971, 1, 1)).count(), 2)
drop(db.tt)
@unittest.skipIf(IS_GAE, "Expressions not supported in GAE Datastore")
@unittest.skipIf(IS_GAE or IS_MONGODB or IS_IMAP, "Expressions are not supported")
class TestExpressions(unittest.TestCase):
def testRun(self):
@@ -541,7 +562,7 @@ class TestJoin(unittest.TestCase):
drop(db.person)
class TestMinMaxSumAvg(unittest.TestCase):
@unittest.skipIf(IS_GAE, 'TODO: Datastore throws "AttributeError: Row object has no attribute _extra"')
@unittest.skipIf(IS_GAE or IS_MONGODB or IS_IMAP, 'TODO: Datastore throws "AttributeError: Row object has no attribute _extra"')
def testRun(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
db.define_table('tt', Field('aa', 'integer'))
@@ -562,7 +583,7 @@ class TestMinMaxSumAvg(unittest.TestCase):
self.assertEqual(db().select(s).first()[s], 2)
drop(db.tt)
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestCache(unittest.TestCase):
def testRun(self):
from cache import CacheInRam
@@ -581,7 +602,7 @@ class TestCache(unittest.TestCase):
self.assertEqual(len(r0),len(r4))
drop(db.tt)
@unittest.skipIf(IS_IMAP, "Skip IMAP")
class TestMigrations(unittest.TestCase):
def testRun(self):
@@ -612,7 +633,7 @@ class TestMigrations(unittest.TestCase):
os.unlink('.storage.table')
class TestReference(unittest.TestCase):
@unittest.skipIf(IS_MONGODB or IS_IMAP, "TODO: MongoDB assertion error (long object has no attribute id)")
def testRun(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
if DEFAULT_URI.startswith('mssql'):
@@ -636,6 +657,7 @@ class TestReference(unittest.TestCase):
drop(db.tt)
db.commit()
@unittest.skipIf(IS_IMAP, "Skip IMAP")
class TestClientLevelOps(unittest.TestCase):
def testRun(self):
@@ -658,7 +680,7 @@ class TestClientLevelOps(unittest.TestCase):
drop(db.tt)
db.commit()
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestVirtualFields(unittest.TestCase):
def testRun(self):
@@ -673,6 +695,7 @@ class TestVirtualFields(unittest.TestCase):
drop(db.tt)
db.commit()
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestComputedFields(unittest.TestCase):
def testRun(self):
@@ -699,9 +722,10 @@ class TestComputedFields(unittest.TestCase):
drop(db.tt)
db.commit()
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestCommonFilters(unittest.TestCase):
@unittest.skipIf(IS_MONGODB, "TODO: MongoDB Assertion error")
def testRun(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
db.define_table('t1', Field('aa'))
@@ -727,6 +751,7 @@ class TestCommonFilters(unittest.TestCase):
# drop(db.t2)
drop(db.t1)
@unittest.skipIf(IS_IMAP, "Skip IMAP test")
class TestImportExportFields(unittest.TestCase):
def testRun(self):
@@ -752,6 +777,7 @@ class TestImportExportFields(unittest.TestCase):
drop(db.person)
db.commit()
@unittest.skipIf(IS_IMAP, "Skip IMAP test")
class TestImportExportUuidFields(unittest.TestCase):
def testRun(self):
@@ -777,7 +803,7 @@ class TestImportExportUuidFields(unittest.TestCase):
drop(db.person)
db.commit()
@unittest.skipIf(IS_IMAP, "Skip IMAP test")
class TestDALDictImportExport(unittest.TestCase):
def testRun(self):
@@ -873,7 +899,7 @@ class TestDALDictImportExport(unittest.TestCase):
drop(db6.tvshow)
db6.commit()
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestValidateAndInsert(unittest.TestCase):
def testRun(self):
@@ -898,6 +924,7 @@ class TestValidateAndInsert(unittest.TestCase):
#cleanup table
drop(db.val_and_insert)
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestSelectAsDict(unittest.TestCase):
def testSelect(self):
@@ -916,9 +943,10 @@ class TestSelectAsDict(unittest.TestCase):
drop(db.a_table)
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestRNameTable(unittest.TestCase):
#tests for highly experimental rname attribute
@unittest.skipIf(IS_MONGODB, "TODO: MongoDB assertion error (long object has no attribute id)")
def testSelect(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
rname = db._adapter.QUOTE_TEMPLATE % 'a very complicated tablename'
@@ -1010,9 +1038,10 @@ class TestRNameTable(unittest.TestCase):
self.assertEqual(len(db.person._referenced_by),0)
drop(db.person)
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestRNameFields(unittest.TestCase):
# tests for highly experimental rname attribute
@unittest.skipIf(IS_GAE, 'TODO: Datastore throws unsupported error for AGGREGATE')
@unittest.skipIf(IS_GAE or IS_MONGODB, 'TODO: Datastore throws unsupported error for AGGREGATE. MongoDB assertion error (long object has no attribute id)')
def testSelect(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
rname = db._adapter.QUOTE_TEMPLATE % 'a very complicated fieldname'
@@ -1128,7 +1157,7 @@ class TestRNameFields(unittest.TestCase):
drop(db.person)
drop(db.easy_name)
@unittest.skipIf(IS_GAE, 'TODO: Datastore does not accept dict objects as json field input')
@unittest.skipIf(IS_GAE or IS_MONGODB, 'TODO: Datastore does not accept dict objects as json field input. MongoDB assertionerror Binary("x", 0) != "x"')
def testRun(self):
db = DAL(DEFAULT_URI, check_reserved=['all'])
rname = db._adapter.QUOTE_TEMPLATE % 'a very complicated fieldname'
@@ -1284,6 +1313,7 @@ class TestRNameFields(unittest.TestCase):
self.assertEqual(len(db.person._referenced_by),0)
drop(db.person)
@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
class TestQuoting(unittest.TestCase):
# tests for case sensitivity