def test_digesting(self): backend = self.get_backend() # XXX: This assumes the that adding records and scheduling are working # correctly to set up the state needed for this test! timeline = 'timeline' n = 10 records = list(itertools.islice(self.records, n)) for record in records: backend.add(timeline, record) for entry in backend.schedule(time.time()): pass timeline_key = make_timeline_key(backend.namespace, timeline) client = backend.cluster.get_local_client_for_key(timeline_key) waiting_set_key = make_schedule_key(backend.namespace, SCHEDULE_STATE_WAITING) ready_set_key = make_schedule_key(backend.namespace, SCHEDULE_STATE_READY) get_timeline_size = functools.partial(client.zcard, timeline_key) get_waiting_set_size = functools.partial(get_set_size, backend.cluster, waiting_set_key) get_ready_set_size = functools.partial(get_set_size, backend.cluster, ready_set_key) with self.assertChanges(get_timeline_size, before=n, after=0), \ self.assertChanges(get_waiting_set_size, before=0, after=1), \ self.assertChanges(get_ready_set_size, before=1, after=0): timestamp = time.time() with mock.patch('time.time', return_value=timestamp), \ backend.digest(timeline) as entries: entries = list(entries) assert entries == records[::-1] next_scheduled_delivery = timestamp + backend.minimum_delay assert client.zscore(waiting_set_key, timeline) == next_scheduled_delivery assert int( client.get(make_last_processed_timestamp_key( timeline_key))) == int(timestamp) # Move the timeline back to the ready set. for entry in backend.schedule(next_scheduled_delivery): pass # The digest should be removed from the schedule if it is empty. with self.assertDoesNotChange(get_waiting_set_size), \ self.assertChanges(get_ready_set_size, before=1, after=0): with backend.digest(timeline) as entries: assert list(entries) == [] assert client.get( make_last_processed_timestamp_key(timeline_key)) is None
def test_digesting(self): backend = RedisBackend() # XXX: This assumes the that adding records and scheduling are working # correctly to set up the state needed for this test! timeline = 'timeline' n = 10 records = list(itertools.islice(self.records, n)) for record in records: backend.add(timeline, record) for entry in backend.schedule(time.time()): pass timeline_key = make_timeline_key(backend.namespace, timeline) client = backend.cluster.get_local_client_for_key(timeline_key) waiting_set_key = make_schedule_key(backend.namespace, SCHEDULE_STATE_WAITING) ready_set_key = make_schedule_key(backend.namespace, SCHEDULE_STATE_READY) get_timeline_size = functools.partial(client.zcard, timeline_key) get_waiting_set_size = functools.partial(get_set_size, backend.cluster, waiting_set_key) get_ready_set_size = functools.partial(get_set_size, backend.cluster, ready_set_key) with self.assertChanges(get_timeline_size, before=n, after=0), \ self.assertChanges(get_waiting_set_size, before=0, after=1), \ self.assertChanges(get_ready_set_size, before=1, after=0): timestamp = time.time() with mock.patch('time.time', return_value=timestamp), \ backend.digest(timeline) as entries: entries = list(entries) assert entries == records[::-1] next_scheduled_delivery = timestamp + backend.minimum_delay assert client.zscore(waiting_set_key, timeline) == next_scheduled_delivery assert int(client.get(make_last_processed_timestamp_key(timeline_key))) == int(timestamp) # Move the timeline back to the ready set. for entry in backend.schedule(next_scheduled_delivery): pass # The digest should be removed from the schedule if it is empty. with self.assertDoesNotChange(get_waiting_set_size), \ self.assertChanges(get_ready_set_size, before=1, after=0): with backend.digest(timeline) as entries: assert list(entries) == [] assert client.get(make_last_processed_timestamp_key(timeline_key)) is None