def test_marker(self):
        """test using a marker with a directory tree"""
        keys = [
            u"aaa/b/cccc/1", 
            u"aaa/b/ccccccccc/1", 
            u"aaa/b/ccccccccc/2", 
            u"aaa/b/ccccccccc/3", 
            u"aaa/b/dddd/1", 
            u"aaa/b/dddd/2", 
            u"aaa/e/ccccccccc/1", 
            u"fff/e/ccccccccc/1", 
        ]
        cutoff = len(keys) / 2
        _load_test_data(self._connection, keys)

        result1 = listmatch(self._connection, _collection_id, max_keys=cutoff)
        self.assertTrue("keys" in result1, result1)
        self.assertTrue(len(result1["keys"]) <= cutoff, result1)
        self.assertTrue(result1["truncated"], result1)

        result2 = listmatch(
            self._connection, _collection_id, marker=result1["keys"][-1]
        )
        self.assertTrue("keys" in result2, result2)
        self.assertFalse(result2["truncated"], result2)

        self.assertEqual(
            len(result1["keys"]) + len(result2["keys"]), 
            len(keys),
            (result1, result2, )
        )
    def test_delimiter(self):
        """test using a delimiter with a directory tree"""
        keys = [
            u"aaa",
            u"aaa/b/cccc/1", 
            u"aaa/b/ccccccccc/1", 
            u"aaa/b/ccccccccc/2", 
            u"aaa/b/ccccccccc/3", 
            u"aaa/b/dddd/1", 
            u"aaa/b/dddd/2", 
            u"aaa/e/ccccccccc/1", 
            u"fff/e/ccccccccc/1", 
        ]
        _load_test_data(self._connection, keys)

        result = listmatch(self._connection, _collection_id, delimiter=u"/")
        self.assertFalse("keys" in result, result)
        self.assertTrue("prefixes" in result, result)
        result_set = set(result["prefixes"])
        self.assertEqual(result_set, set([u"aaa/", u"fff/"]))

        result = listmatch(
            self._connection, _collection_id, prefix=u"aaa/", delimiter=u"/"
        )
        self.assertFalse("keys" in result, result)
        self.assertTrue("prefixes" in result, result)
        result_set = set(result["prefixes"])
        self.assertEqual(result_set, set([u"b/", u"e/"]), result_set)
 def test_empty_collection(self):
     """test querying an empty collection"""
     _clear_test_data(self._connection)
     result = listmatch(self._connection, _collection_id, "")
     self.assertTrue("keys" in result, result)
     self.assertEqual(len(result["keys"]), 0, result)
     self.assertFalse(result["truncated"], result)
    def test_tree(self):
        """test storing and retrieving a directory tree"""
        keys = [
            u"aaa/b/cccc/1", 
            u"aaa/b/ccccccccc/1", 
            u"aaa/b/ccccccccc/2", 
            u"aaa/b/ccccccccc/3", 
            u"aaa/b/dddd/1", 
            u"aaa/b/dddd/2", 
            u"aaa/e/ccccccccc/1", 
            u"fff/e/ccccccccc/1", 
        ]
        _load_test_data(self._connection, keys)

        test_prefix = u"aaa/"
        result = listmatch(
            self._connection, _collection_id, prefix=test_prefix
        )
        self.assertTrue("keys" in result, result)
        self.assertEqual(len(result["keys"]), 7, result)
        self.assertFalse(result["truncated"], result)
        for key in result["keys"]:
            self.assertTrue(key.startswith(test_prefix))

        result = listmatch(self._connection, _collection_id, prefix=u"aaa/b")
        self.assertTrue("keys" in result, result)
        self.assertEqual(len(result["keys"]), 6, result)
        self.assertFalse(result["truncated"], result)

        result = listmatch(
            self._connection, _collection_id, prefix=u"aaa/b/ccccccccc/"
        )
        self.assertTrue("keys" in result, result)
        self.assertEqual(len(result["keys"]), 3, result)
        self.assertFalse(result["truncated"], result)

        result = listmatch(
            self._connection, _collection_id, prefix=u"aaa/b/dddd"
        )
        self.assertTrue("keys" in result, result)
        self.assertEqual(len(result["keys"]), 2)
        self.assertFalse(result["truncated"], result)

        result = listmatch(self._connection, _collection_id, prefix=u"aaa/e")
        self.assertTrue("keys" in result, result)
        self.assertEqual(len(result["keys"]), 1)
        self.assertFalse(result["truncated"], result)
 def test_exact_match(self):
     """test getting a single key"""
     keys = [u"aaa", u"bbb", u"ccc", ]
     _load_test_data(self._connection, keys)
     result = listmatch(self._connection, _collection_id, prefix=keys[0])
     self.assertTrue("keys" in result, result)
     self.assertEqual(len(result["keys"]), 1, result)
     self.assertFalse(result["truncated"], result)
     self.assertEqual(result["keys"][0], keys[0])
 def test_max_keys(self):
     """test cutting off the query at max_keys"""
     keys = [u"test-key1", u"test_key2", u"test_key3", ]
     _load_test_data(self._connection, keys)
     result = listmatch(
         self._connection, _collection_id, max_keys=len(keys)-1
     ) 
     self.assertTrue("keys" in result, result)
     self.assertEqual(len(result["keys"]), len(keys)-1, result)
     self.assertTrue(result["truncated"], result)
 def test_tombstone(self):
     """
     test finding the most recent of multiple rows when it is a tombstone
     """
     test_key = u"test_key"
     data_time = datetime.now()
     tombstone_time = data_time + timedelta(hours=1)
     self._connection.execute("begin")
     self._connection.execute(_insert_test_row_with_timestamp_and_tombstone, 
                        [_collection_id, test_key, data_time, 42, False])
     self._connection.execute(_insert_test_row_with_timestamp_and_tombstone, 
                        [_collection_id, test_key, tombstone_time, 0, True])
     self._connection.commit()
     result = listmatch(self._connection, _collection_id)
     self.assertTrue("keys" in result, result)
     self.assertEqual(len(result["keys"]), 0)
     self.assertFalse(result["truncated"], result)