Browse files

Adding unit tests for stubs that ensure the APIs and functionality li…

…ne up. Added some missing functionality to the stub objects as well, to make it more closely line up to the API.
  • Loading branch information...
1 parent f5c794a commit 38207751c3cfaee1388ea23a15f3deb57c94b686 @eyalr eyalr committed Jan 24, 2013
Showing with 133 additions and 10 deletions.
  1. +10 −10 pycassa/contrib/stubs.py
  2. 0 tests/contrib/__init__.py
  3. +123 −0 tests/contrib/stubs.py
View
20 pycassa/contrib/stubs.py
@@ -109,7 +109,7 @@ class ColumnFamilyStub(object):
"""
- def __init__(self, pool=None, column_family=None, rows=None):
+ def __init__(self, pool=None, column_family=None, rows=None, **kwargs):
rows = rows or OrderedDict()
for r in rows.itervalues():
if not isinstance(r, OrderedDictWithTime):
@@ -125,8 +125,7 @@ def __len__(self):
def __contains__(self, obj):
return self.rows.__contains__(obj)
- def get(self, key, columns=None, include_timestamp=False,
- suppress_exceptions=False, **kwargs):
+ def get(self, key, columns=None, include_timestamp=False, **kwargs):
"""Get a value from the column family stub."""
my_columns = self.rows.get(key)
@@ -135,10 +134,7 @@ def get(self, key, columns=None, include_timestamp=False,
else:
get_value = lambda x: x[0]
if not my_columns:
- if not suppress_exceptions:
- raise NotFoundException()
- else:
- return OrderedDict()
+ raise NotFoundException()
return OrderedDict((k, get_value(v)) for (k, v)
in my_columns.iteritems()
@@ -152,8 +148,7 @@ def multiget(self, keys, columns=None, include_timestamp=False, **kwargs):
key,
columns,
include_timestamp,
- suppress_exceptions=True
- )) for key in keys)
+ )) for key in keys if key in self.rows)
def batch(self, **kwargs):
"""Returns itself."""
@@ -171,6 +166,8 @@ def insert(self, key, columns, timestamp=None, **kwargs):
for column in columns:
self.rows[key].__setitem__(column, columns[column], timestamp)
+ return self.rows[key][columns.keys()[0]][1]
+
def get_indexed_slices(self, index_clause, **kwargs):
"""Grabs rows that match a pycassa index clause.
@@ -197,7 +194,10 @@ def remove(self, key, columns=None):
del self.rows[key]
else:
for c in columns:
- del self.rows[key][c]
+ if c in self.rows[key]:
+ del self.rows[key][c]
+ if not self.rows[key]:
+ del self.rows[key]
def get_range(self, include_timestamp=False, columns=None, **kwargs):
View
0 tests/contrib/__init__.py
No changes.
View
123 tests/contrib/stubs.py
@@ -0,0 +1,123 @@
+import unittest
+
+from nose.tools import assert_raises, assert_equal, assert_true
+
+from pycassa import index, ColumnFamily, ConnectionPool,\
+ NotFoundException, SystemManager
+
+from pycassa.contrib.stubs import ColumnFamilyStub, ConnectionPoolStub, \
+ SystemManagerStub
+
+pool = cf = None
+pool_stub = cf_stub = None
+
+
+def setup_module():
+ global pool, cf, indexed_cf, pool_stub, indexed_cf_stub, cf_stub
+ credentials = {'username': 'jsmith', 'password': 'havebadpass'}
+ pool = ConnectionPool(keyspace='PycassaTestKeyspace',
+ credentials=credentials, timeout=1.0)
+ cf = ColumnFamily(pool, 'Standard1', dict_class=TestDict)
+ indexed_cf = ColumnFamily(pool, 'Indexed1')
+
+ pool_stub = ConnectionPoolStub(keyspace='PycassaTestKeyspace',
+ credentials=credentials, timeout=1.0)
+ cf_stub = ColumnFamilyStub(pool_stub, 'Standard1', dict_class=TestDict)
+ indexed_cf_stub = ColumnFamilyStub(pool_stub, 'Indexed1')
+
+
+def teardown_module():
+ cf.truncate()
+ cf_stub.truncate()
+ indexed_cf.truncate()
+ indexed_cf_stub.truncate()
+ pool.dispose()
+
+
+class TestDict(dict):
+ pass
+
+
+class TestColumnFamilyStub(unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ for test_cf in (cf, cf_stub):
+ for key, columns in test_cf.get_range():
+ test_cf.remove(key)
+
+ def test_empty(self):
+ key = 'TestColumnFamily.test_empty'
+
+ for test_cf in (cf, cf_stub):
+ assert_raises(NotFoundException, test_cf.get, key)
+ assert_equal(len(test_cf.multiget([key])), 0)
+ for key, columns in test_cf.get_range():
+ assert_equal(len(columns), 0)
+
+ def test_insert_get(self):
+ key = 'TestColumnFamily.test_insert_get'
+ columns = {'1': 'val1', '2': 'val2'}
+ for test_cf in (cf, cf_stub):
+ assert_raises(NotFoundException, test_cf.get, key)
+ ts = test_cf.insert(key, columns)
+ assert_true(isinstance(ts, (int, long)))
+ assert_equal(test_cf.get(key), columns)
+
+
+ def test_insert_multiget(self):
+ key1 = 'TestColumnFamily.test_insert_multiget1'
+ columns1 = {'1': 'val1', '2': 'val2'}
+ key2 = 'test_insert_multiget1'
+ columns2 = {'3': 'val1', '4': 'val2'}
+ missing_key = 'key3'
+
+ for test_cf in (cf, cf_stub):
+ test_cf.insert(key1, columns1)
+ test_cf.insert(key2, columns2)
+ rows = test_cf.multiget([key1, key2, missing_key])
+ assert_equal(len(rows), 2)
+ assert_equal(rows[key1], columns1)
+ assert_equal(rows[key2], columns2)
+ assert_true(missing_key not in rows)
+
+
+ def insert_insert_get_indexed_slices(self):
+ columns = {'birthdate': 1L}
+
+ keys = set()
+ for i in range(1, 4):
+ indexed_cf.insert('key%d' % i, columns)
+ indexed_cf_stub.insert('key%d' % i, columns)
+ keys.add('key%d' % i)
+
+ expr = index.create_index_expression(column_name='birthdate', value=1L)
+ clause = index.create_index_clause([expr])
+
+ for test_indexed_cf in (indexed_cf, indexed_cf_stub):
+ count = 0
+ for key, cols in test_indexed_cf.get_indexed_slices(clause):
+ assert_equal(cols, columns)
+ assert key in keys
+ count += 1
+ assert_equal(count, 3)
+
+
+ def test_remove(self):
+ key = 'TestColumnFamily.test_remove'
+ for test_cf in (cf, cf_stub):
+ columns = {'1': 'val1', '2': 'val2'}
+ test_cf.insert(key, columns)
+
+ # An empty list for columns shouldn't delete anything
+ test_cf.remove(key, columns=[])
+ assert_equal(test_cf.get(key), columns)
+
+ test_cf.remove(key, columns=['2'])
+ del columns['2']
+ assert_equal(test_cf.get(key), {'1': 'val1'})
+
+ test_cf.remove(key)
+ assert_raises(NotFoundException, test_cf.get, key)

0 comments on commit 3820775

Please sign in to comment.