def test_schedules(self): storage = self.huey.storage dt1 = datetime.datetime(2013, 1, 1, 0, 0) dt2 = datetime.datetime(2013, 1, 2, 0, 0) dt3 = datetime.datetime(2013, 1, 3, 0, 0) dt4 = datetime.datetime(2013, 1, 4, 0, 0) # Add to schedule out-of-order to ensure sorting is performed by # the schedule. storage.add_to_schedule('s2', dt2) storage.add_to_schedule('s1', dt1) storage.add_to_schedule('s4', dt4) storage.add_to_schedule('s3', dt3) # Ensure that asking for a timestamp previous to any item in the # schedule returns empty list. self.assertEqual( storage.read_schedule(dt1 - datetime.timedelta(days=1)), []) # Ensure the upper boundary is inclusive of whatever timestamp # is passed in. self.assertEqual( storage.read_schedule(dt3), [b('s1'), b('s2'), b('s3')]) self.assertEqual(storage.read_schedule(dt3), []) # Ensure the schedule is flushed and an empty schedule returns an # empty list. self.assertEqual(storage.read_schedule(dt4), [b('s4')]) self.assertEqual(storage.read_schedule(dt4), [])
def test_metadata(self): s = self.huey.storage s.write_metadata('k1', 'v1') self.assertEqual(s.read_metadata('k1'), b('v1')) self.assertEqual(s.read_metadata('kx'), None) s.write_metadata('k2', 'v2') vals = s.metadata_values() self.assertEqual(vals, {b('k1'): b('v1'), b('k2'): b('v2')})
def test_results_metadata(self): add_values(1, 2) add_values(3, 4) t1 = huey_results.dequeue() t2 = huey_results.dequeue() self.assertEqual(huey_results.all_results(), {}) huey_results.execute(t1) self.assertEqual(list(huey_results.all_results()), [b(t1.task_id)]) huey_results.execute(t2) self.assertEqual(sorted(huey_results.all_results().keys()), sorted([b(t1.task_id), b(t2.task_id)]))
def test_events(self): storage = self.huey.storage ps = storage.listener() messages = ['a', 'b', 'c'] for message in messages: storage.emit(message) g = ps.listen() next(g) self.assertEqual(next(g)['data'], b('a')) self.assertEqual(next(g)['data'], b('b')) self.assertEqual(next(g)['data'], b('c'))
def test_data_stores(self): storage = self.huey.storage storage.put_data('k1', 'v1') storage.put_data('k2', 'v2') storage.put_data('k3', 'v3') self.assertEqual(storage.peek_data('k2'), b('v2')) self.assertEqual(storage.pop_data('k2'), b('v2')) self.assertEqual(storage.peek_data('k2'), EmptyData) self.assertEqual(storage.pop_data('k2'), EmptyData) self.assertEqual(storage.peek_data('k3'), b('v3')) storage.put_data('k3', 'v3-2') self.assertEqual(storage.peek_data('k3'), b('v3-2'))
def test_data_stores(self): data_store = self.huey.result_store data_store.put('k1', 'v1') data_store.put('k2', 'v2') data_store.put('k3', 'v3') self.assertEqual(data_store.peek('k2'), b('v2')) self.assertEqual(data_store.get('k2'), b('v2')) self.assertEqual(data_store.peek('k2'), EmptyData) self.assertEqual(data_store.get('k2'), EmptyData) self.assertEqual(data_store.peek('k3'), b('v3')) data_store.put('k3', 'v3-2') self.assertEqual(data_store.peek('k3'), b('v3-2'))
def test_metadata(self): def run_task(fn, a=()): fn(*a) self.worker(test_huey.dequeue()) return test_huey.metadata() metadata = run_task(modify_state, ('k1', 'v1')) self.assertEqual(int(metadata[b('queuecmd_modify_state_executed')]), 1) self.assertEqual(int(metadata[b('tasks_executed')]), 1) self.assertEqual(metadata[b('queuecmd_modify_state_duration')], metadata[b('tasks_duration')]) metadata = run_task(modify_state, ('k1', 'v2')) self.assertEqual(int(metadata[b('queuecmd_modify_state_executed')]), 2) self.assertEqual(int(metadata[b('tasks_executed')]), 2) metadata = run_task(blow_up) self.assertEqual(int(metadata[b('queuecmd_blow_up_errors')]), 1) self.assertFalse(b('queuecmd_blow_up_executed') in metadata) self.assertEqual(int(metadata[b('tasks_executed')]), 2) self.assertEqual(int(metadata[b('tasks_errors')]), 1) metadata = run_task(retry_task, ('test', False)) self.assertEqual(int(metadata[b('queuecmd_retry_task_errors')]), 1) self.assertFalse(b('queuecmd_retry_task_executed') in metadata) self.assertEqual(int(metadata[b('tasks_executed')]), 2) self.assertEqual(int(metadata[b('tasks_errors')]), 2) # Duration is recorded for errors. duration = metadata[b('queuecmd_retry_task_duration')] self.worker(test_huey.dequeue()) metadata = test_huey.metadata() self.assertEqual(int(metadata[b('queuecmd_retry_task_errors')]), 1) self.assertEqual(int(metadata[b('queuecmd_retry_task_executed')]), 1) self.assertEqual(int(metadata[b('tasks_executed')]), 3) self.assertEqual(int(metadata[b('tasks_errors')]), 2) self.assertNotEqual(metadata[b('queuecmd_retry_task_duration')], duration) # Scheduled, ready to run when dequeued -- runs like normal. modify_state.schedule(args=('k1', 'v3'), eta=datetime.date(2015, 1, 1)) self.worker(test_huey.dequeue()) metadata = test_huey.metadata() self.assertEqual(int(metadata[b('queuecmd_modify_state_executed')]), 3) self.assertEqual(int(metadata[b('tasks_executed')]), 4) # When task is put on schedule and not executed immediately, then # the `scheduled` metadata count is incremented. modify_state.schedule(args=('k1', 'v3'), eta=datetime.date(2030, 1, 1)) self.worker(test_huey.dequeue()) metadata = test_huey.metadata() self.assertEqual(int(metadata[b('queuecmd_modify_state_executed')]), 3) self.assertEqual(int(metadata[b('queuecmd_modify_state_scheduled')]), 1) self.assertEqual(int(metadata[b('tasks_executed')]), 4)