def test_delete_from_topic_no_subscribers(self): """ Tests deleting of messages from a topic without subscribers. """ ps = RedisPubSub(self.kvdb, self.key_prefix) msg_value = '"msg_value"' topic = Topic('/test/delete') ps.add_topic(topic) producer = Client('Producer', 'producer') ps.add_producer(producer, topic) pub_ctx = PubCtx() pub_ctx.client_id = producer.id pub_ctx.topic = topic.name pub_ctx.msg = Message(msg_value) msg_id = ps.publish(pub_ctx).msg.msg_id # We've got a msg_id now and we know this is a topic with no subsribers. In that case, deleting a messages should # also delete all the metadata related to it along with its payload. # First, let's confirm the messages is actually there result = self.kvdb.zrange(ps.MSG_IDS_PREFIX.format(topic.name), 0, -1) eq_(result, [msg_id]) result = self.kvdb.hgetall(ps.MSG_VALUES_KEY) eq_(len(result), 1) self.assertTrue(msg_id in result) result = self.kvdb.hgetall(ps.MSG_METADATA_KEY) eq_(len(result), 1) self.assertTrue(msg_id in result) result = self.kvdb.hgetall(ps.MSG_EXPIRE_AT_KEY) eq_(len(result), 1) self.assertTrue(msg_id in result) # Ok, now delete the message and confirm it's not in Redis anymore ps.delete_from_topic(topic.name, msg_id) result = self.kvdb.zrange(ps.MSG_IDS_PREFIX.format(topic.name), 0, -1) eq_(result, []) result = self.kvdb.hgetall(ps.MSG_VALUES_KEY) eq_({}, result) result = self.kvdb.hgetall(ps.MSG_METADATA_KEY) eq_({}, result) result = self.kvdb.hgetall(ps.MSG_EXPIRE_AT_KEY) eq_({}, result)
def test_delete_from_topic_has_subscribers(self): """ Tests deleting of messages from a topic which has subscribers. """ ps = RedisPubSub(self.kvdb, self.key_prefix) msg_value = '"msg_value"' topic = Topic('/test/delete') ps.add_topic(topic) producer = Client('Producer', 'producer') ps.add_producer(producer, topic) consumer = Consumer('Consumer', 'consumer', new_cid()) ps.add_consumer(consumer, topic) pub_ctx = PubCtx() pub_ctx.client_id = producer.id pub_ctx.topic = topic.name pub_ctx.msg = Message(msg_value) msg_id = ps.publish(pub_ctx).msg.msg_id # We've got a msg_id now and we know this is a topic which has a subscriber so deleting a message from the topic # should not delete it from any other place because the consumer may still hold onto it. # First, let's confirm the messages is actually there result = self.kvdb.zrange(ps.MSG_IDS_PREFIX.format(topic.name), 0, -1) eq_(result, [msg_id]) result = self.kvdb.hgetall(ps.MSG_VALUES_KEY) eq_(len(result), 1) self.assertTrue(msg_id in result) result = self.kvdb.hgetall(ps.MSG_METADATA_KEY) eq_(len(result), 1) self.assertTrue(msg_id in result) result = self.kvdb.hgetall(ps.MSG_EXPIRE_AT_KEY) eq_(len(result), 1) self.assertTrue(msg_id in result) # Ok, now delete the message and confirm it's not in the topic anymore however it's still kept elsewhere. ps.delete_from_topic(topic.name, msg_id) result = self.kvdb.zrange(ps.MSG_IDS_PREFIX.format(topic.name), 0, -1) eq_(result, []) result = self.kvdb.hgetall(ps.MSG_VALUES_KEY) eq_(len(result), 1) self.assertTrue(msg_id in result) result = self.kvdb.hgetall(ps.MSG_METADATA_KEY) eq_(len(result), 1) self.assertTrue(msg_id in result) result = self.kvdb.hgetall(ps.MSG_EXPIRE_AT_KEY) eq_(len(result), 1) self.assertTrue(msg_id in result)