示例#1
0
    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)
示例#2
0
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})