def _publish_job_events(self, pubsub_channel, pubsub_override=False): """Generic job events tests""" pubsub = self.conn.pubsub() pubsub.subscribe(pubsub_channel) q = rq.Queue('foo') w = MockArthurWorker([q]) if pubsub_override: w.pubsub_channel = pubsub_channel job_a = q.enqueue(mock_sum, task_id=0, a=2, b=3) job_b = q.enqueue(mock_failure, task_id=1) status = w.work(burst=True) self.assertEqual(status, True) # Ignore the first messages because it is a # subscription notification _ = pubsub.get_message() # STARTED event for job 'a' msg_a = pubsub.get_message() event = JobEvent.deserialize(msg_a['data']) self.assertEqual(event.job_id, job_a.id) self.assertEqual(event.task_id, 0) self.assertEqual(event.type, JobEventType.STARTED) self.assertEqual(event.payload, None) # COMPLETED event for job 'a' msg_a = pubsub.get_message() event = JobEvent.deserialize(msg_a['data']) self.assertEqual(job_a.result, 5) self.assertEqual(event.job_id, job_a.id) self.assertEqual(event.task_id, 0) self.assertEqual(event.type, JobEventType.COMPLETED) self.assertEqual(event.payload, 5) # STARTED event for job 'b' msg_b = pubsub.get_message() event = JobEvent.deserialize(msg_b['data']) self.assertEqual(event.job_id, job_b.id) self.assertEqual(event.task_id, 1) self.assertEqual(event.type, JobEventType.STARTED) self.assertEqual(event.payload, None) # FAILURE event for job 'b' msg_b = pubsub.get_message() event = JobEvent.deserialize(msg_b['data']) self.assertEqual(job_b.result, None) self.assertEqual(event.job_id, job_b.id) self.assertEqual(event.task_id, 1) self.assertEqual(event.type, JobEventType.FAILURE) self.assertRegex(event.payload['error'], "Traceback") self.assertEqual(event.payload['result'], None)
def _publish_finished_job_status(self, pubsub_channel, skip_pubsub_override=False): """Test whether the worker publishes the status of a finished job""" pubsub = self.conn.pubsub() pubsub.subscribe(pubsub_channel) q = rq.Queue('foo') w = MockArthurWorker([q]) if not skip_pubsub_override: w.pubsub_channel = pubsub_channel job_a = q.enqueue(mock_sum, a=2, b=3) job_b = q.enqueue(mock_failure) status = w.work(burst=True) self.assertEqual(status, True) # Ignore the first message because it is a # subscription notification _ = pubsub.get_message() msg_a = pubsub.get_message() msg_b = pubsub.get_message() event = JobEvent.deserialize(msg_a['data']) self.assertEqual(job_a.result, 5) self.assertEqual(event.job_id, job_a.id) self.assertEqual(event.type, JobEventType.COMPLETED) self.assertEqual(event.payload, 5) event = JobEvent.deserialize(msg_b['data']) self.assertEqual(job_b.result, None) self.assertEqual(event.job_id, job_b.id) self.assertEqual(event.type, JobEventType.FAILURE) self.assertRegex(event.payload, "Traceback")
def test_serializer(self): """Test if an event is properly serialized and deserialized""" result = MockJobResult(10, 'mockbackend') event_a = JobEvent(JobEventType.COMPLETED, '1', result) data = event_a.serialize() event = JobEvent.deserialize(data) self.assertIsInstance(event, JobEvent) self.assertEqual(event.uuid, event_a.uuid) self.assertEqual(event.timestamp, event_a.timestamp) self.assertEqual(event.type, event_a.type) self.assertEqual(event.job_id, event_a.job_id) payload = event.payload self.assertIsInstance(payload, MockJobResult) self.assertEqual(payload.result, result.result) self.assertEqual(payload.category, result.category) self.assertEqual(payload.timestamp, result.timestamp)