class TestThoonkSortedFeed(TestThoonkBase): @defer.inlineCallbacks def setUp(self): yield TestThoonkBase.setUp(self) self.feed_name = "test_sorted_feed" self.config = {"type": "sorted_feed"} yield self.pub.create_feed(self.feed_name, self.config) from txthoonk.types import SortedFeed self.feed = SortedFeed(pub=self.pub, name=self.feed_name) self.assertEqual(self.feed.feed_ids, "feed.ids:%s" % self.feed_name) self.assertEqual(self.feed.feed_items, "feed.items:%s" % self.feed_name) self.assertEqual(self.feed.feed_publishes, "feed.publishes:%s" % self.feed_name) self.assertEqual(self.feed.feed_config, "feed.config:%s" % self.feed_name) self.assertEqual(self.feed.feed_id_incr, "feed.idincr:%s" % self.feed_name) self.assertEqual(self.feed.channel_retract, "feed.retract:%s" % self.feed_name) self.assertEqual(self.feed.channel_position, "feed.position:%s" % self.feed_name) self.assertEqual(self.feed.channel_publish, "feed.publish:%s" % self.feed_name) ############################################################################ # Tests for publish (append/prepend) ############################################################################ @defer.inlineCallbacks def testFeedPublish(self): item = "my beautiful item" feed = self.feed # 0 publishes (check on redis) n = yield self.pub.redis.get(feed.feed_publishes) self.assertFalse(n) # 0 ids on counter (check on redis) n = yield self.pub.redis.get(feed.feed_id_incr) self.assertFalse(n) id_ = yield feed.publish(item) # check on redis for new id ret = yield self.pub.redis.lrange(feed.feed_ids, 0, -1) self.assertEqual(ret, [id_]) # check on redis for publishes increment n = yield self.pub.redis.get(feed.feed_publishes) self.assertEqual(n, "1") # check on redis for ids counter increment n = yield self.pub.redis.get(feed.feed_id_incr) self.assertEqual(n, "1") # check on redis for new item ret = yield self.pub.redis.hget(feed.feed_items, id_) self.assertEqual(ret[id_], item) @defer.inlineCallbacks def testPublishEvent(self): item = "my beautiful item" feed = self.feed @self.check_called def onPublish(*args): # ret_id = args[0] ret_item = args[1] self.assertEqual(ret_item, item) yield self.sub.register_handler(feed.channel_publish, onPublish) # Assuring that redis.messageReceived (sub) was called cb = self.msg_rcv yield self.feed.publish(item) yield cb @defer.inlineCallbacks def testPositionEndEvent(self): item = "my beautiful item" feed = self.feed @self.check_called def onPosition(*args): # ret_id = args[0] ret_pos = args[1] self.assertEqual(ret_pos, ":end") yield self.sub.register_handler(feed.channel_position, onPosition) # Assuring that redis.messageReceived (sub) was called cb = self.msg_rcv yield self.feed.append(item) yield cb @defer.inlineCallbacks def testFeedAppendPrepend(self): items = ["most important item", "my beautiful item", "another amazing item", "ridiculous item"] items_ids = [] feed = self.feed for item in items[1:]: id_ = yield feed.append(item) items_ids.append(id_) id_ = yield feed.prepend(item) items_ids.insert(0, id_) # check on redis for ids ret = yield self.pub.redis.lrange(feed.feed_ids, 0, -1) self.assertEqual(ret, items_ids) @defer.inlineCallbacks def testPositionBeginEvent(self): item = "my beautiful item" feed = self.feed @self.check_called def onPosition(*args): # ret_id = args[0] ret_pos = args[1] self.assertEqual(ret_pos, ":begin") yield self.sub.register_handler(feed.channel_position, onPosition) # Assuring that redis.messageReceived (sub) was called cb = self.msg_rcv yield self.feed.prepend(item) yield cb ############################################################################ # Tests for get* ############################################################################ @defer.inlineCallbacks def testFeedGetItem(self): item = "my beautiful item" feed = self.feed id_ = yield feed.append(item) ret = yield feed.get_item(id_) self.assertEqual(ret, {id_: item}) # non existing item ret = yield feed.get_item(id_ + "123") self.assertIsNone(ret) @defer.inlineCallbacks def testFeedGetIds(self): item = "my beautiful item" feed = self.feed id_ = yield feed.append(item) ret = yield feed.get_ids() self.assertEqual(ret, [id_]) @defer.inlineCallbacks def testFeedGetIdsGetItems(self): import string items = string.printable feed = self.feed ids = [] for item in items: id_ = yield feed.prepend(item) ids.append(id_) ret = yield feed.get_ids() self.assertEqual(set(ret), set(ids)) ret = yield feed.get_items() ret_ids = ret.keys() ret_items = ret.values() self.assertEqual(set(ret_ids), set(ids)) self.assertEqual(set(ret_items), set(items)) ############################################################################ # Tests for has_id ############################################################################ @defer.inlineCallbacks def testFeedHasId(self): item = "my beautiful item" feed = self.feed id_ = yield feed.append(item) ret = yield feed.has_id(id_) self.assertTrue(ret) # non existing item ret = yield feed.has_id(id_ + "123") self.assertFalse(ret) ############################################################################ # Tests for edit ############################################################################ @defer.inlineCallbacks def testFeedEdit(self): item = "my beautiful item" item2 = "replacement item" feed = self.feed id_ = yield feed.append(item) ids = yield feed.get_ids() self.assertEqual(len(ids), 1) # editing a id that does not exist. ret = yield feed.edit(id_ + "123", item) self.assertFalse(ret) ret = yield feed.get_id(id_) self.assertEqual(ret, {id_: item}) @self.check_called def onEdit(*args): ret_id = args[0] ret_item = args[1] self.assertEqual(ret_id, id_) self.assertEqual(ret_item, item2) yield self.sub.register_handler(feed.channel_publish, onEdit) # Assuring that redis.messageReceived (sub) was called cb = self.msg_rcv ret = yield feed.edit(id_, item2) yield cb self.assertEquals(ret, id_) ids = yield feed.get_ids() self.assertEqual(len(ids), 1) ret = yield feed.get_id(id_) self.assertEqual(ret, {id_: item2})