def test_cursor(self): k = Key("/") self.assertRaises(ValueError, Cursor, None, None) self.assertRaises(ValueError, Cursor, Query(Key("/")), None) self.assertRaises(ValueError, Cursor, None, [1]) c = Cursor(Query(k), [1, 2, 3, 4, 5]) # should not raise self.assertEqual(c.skipped, 0) self.assertEqual(c.returned, 0) self.assertEqual(c._iterable, [1, 2, 3, 4, 5]) c.skipped = 1 c.returned = 2 self.assertEqual(c.skipped, 1) self.assertEqual(c.returned, 2) c._skipped_inc(None) c._skipped_inc(None) self.assertEqual(c.skipped, 3) c._returned_inc(None) c._returned_inc(None) c._returned_inc(None) self.assertEqual(c.returned, 5) self.subtest_cursor(Query(k), [5, 4, 3, 2, 1], [5, 4, 3, 2, 1]) self.subtest_cursor(Query(k, limit=3), [5, 4, 3, 2, 1], [5, 4, 3]) self.subtest_cursor(Query(k, limit=0), [5, 4, 3, 2, 1], []) self.subtest_cursor(Query(k, offset=2), [5, 4, 3, 2, 1], [3, 2, 1]) self.subtest_cursor(Query(k, offset=5), [5, 4, 3, 2, 1], []) self.subtest_cursor(Query(k, limit=2, offset=2), [5, 4, 3, 2, 1], [3, 2]) v1, v2, v3 = version_objects() vs = [v1, v2, v3] t1 = v1["committed"] t2 = v2["committed"] t3 = v3["committed"] self.subtest_cursor(Query(k), vs, vs) self.subtest_cursor(Query(k, limit=2), vs, [v1, v2]) self.subtest_cursor(Query(k, offset=1), vs, [v2, v3]) self.subtest_cursor(Query(k, offset=1, limit=1), vs, [v2]) self.subtest_cursor(Query(k).filter("committed", ">=", t2), vs, [v2, v3]) self.subtest_cursor(Query(k).filter("committed", "<=", t1), vs, [v1]) self.subtest_cursor(Query(k).order("+committed"), vs, [v1, v2, v3]) self.subtest_cursor(Query(k).order("-created"), vs, [v3, v2, v1])
def subtest_cursor(self, query, iterable, expected_results): self.assertRaises(ValueError, Cursor, None, None) self.assertRaises(ValueError, Cursor, query, None) self.assertRaises(ValueError, Cursor, None, iterable) cursor = Cursor(query, iterable) self.assertEqual(cursor.skipped, 0) self.assertEqual(cursor.returned, 0) cursor._ensure_modification_is_safe() cursor.apply_filter() cursor.apply_order() cursor.apply_offset() cursor.apply_limit() cursor_results = [] for i in cursor: self.assertRaises(AssertionError, cursor._ensure_modification_is_safe) self.assertRaises(AssertionError, cursor.apply_filter) self.assertRaises(AssertionError, cursor.apply_order) self.assertRaises(AssertionError, cursor.apply_offset) self.assertRaises(AssertionError, cursor.apply_limit) cursor_results.append(i) # ensure iteration happens only once. self.assertRaises(RuntimeError, iter, cursor) self.assertEqual(cursor_results, expected_results) self.assertEqual(cursor.returned, len(expected_results)) self.assertEqual(cursor.skipped, query.offset) if query.limit: self.assertTrue(cursor.returned <= query.limit)