def test_receipt_to_case_timeCreated_valueerror(
            self, mock_send_message_to_rabbit_mq):
        mock_message = MagicMock()
        mock_message.message_id = str(uuid.uuid4())
        mock_message.attributes = {
            'eventType': 'OBJECT_FINALIZE',
            'bucketId': self.gcp_bucket,
            'objectId': self.gcp_object_id
        }
        mock_message.data = json.dumps({
            "metadata": {
                "tx_id": "1",
                "questionnaire_id": "0120000000001000"
            },
            "timeCreated": "123"
        })

        expected_log_event = 'Pub/Sub Message has invalid datetime string'
        expected_log_kwargs = {
            'bucket_name': self.gcp_bucket,
            'object_name': self.gcp_object_id,
            'subscription_name': self.subscription_name,
            'subscription_project': self.subscription_project_id,
            'message_id': mock_message.message_id,
        }

        from app.subscriber import eq_receipt_to_case

        with self.checkExpectedLogLine('ERROR', expected_log_event,
                                       expected_log_kwargs):
            eq_receipt_to_case(mock_message)

        mock_send_message_to_rabbit_mq.assert_not_called()
        mock_message.ack.assert_not_called()
    def test_receipt_to_case_missing_json_metadata_tx_id(
            self, mock_send_message_to_rabbit_mq):
        mock_message = MagicMock()
        mock_message.message_id = str(uuid.uuid4())
        mock_message.attributes = {
            'eventType': 'OBJECT_FINALIZE',
            'bucketId': self.gcp_bucket,
            'objectId': self.gcp_object_id
        }
        mock_message.data = json.dumps({
            "metadata": {
                "case_id": "1"
            },
            "timeCreated": ""
        })

        expected_log_event = 'Pub/Sub Message missing required data'
        expected_log_kwargs = {
            'bucket_name': self.gcp_bucket,
            'object_name': self.gcp_object_id,
            'subscription_name': self.subscription_name,
            'subscription_project': self.subscription_project_id,
            'message_id': mock_message.message_id,
            'missing_json_key': 'tx_id',
        }

        from app.subscriber import eq_receipt_to_case

        with self.checkExpectedLogLine('ERROR', expected_log_event,
                                       expected_log_kwargs):
            eq_receipt_to_case(mock_message)

        mock_send_message_to_rabbit_mq.assert_not_called()
        mock_message.ack.assert_not_called()
    def test_receipt_to_case_missing_json_data(self,
                                               mock_send_message_to_rabbit_mq):
        mock_message = MagicMock()
        mock_message.message_id = str(uuid.uuid4())
        mock_message.attributes = {
            'eventType': 'OBJECT_FINALIZE',
            'bucketId': self.gcp_bucket,
            'objectId': self.gcp_object_id
        }
        mock_message.data = None

        expected_log_event = 'Pub/Sub Message data not JSON'
        expected_log_kwargs = {
            'bucket_name': self.gcp_bucket,
            'object_name': self.gcp_object_id,
            'subscription_name': self.subscription_name,
            'subscription_project': self.subscription_project_id,
            'message_id': mock_message.message_id,
        }

        from app.subscriber import eq_receipt_to_case

        with self.checkExpectedLogLine('ERROR', expected_log_event,
                                       expected_log_kwargs):
            eq_receipt_to_case(mock_message)

        mock_send_message_to_rabbit_mq.assert_not_called()
        mock_message.ack.assert_not_called()
    def test_receipt_to_case(self, mock_send_message_to_rabbit_mq):
        mock_message = MagicMock()
        mock_message.attributes = {
            'eventType': 'OBJECT_FINALIZE',
            'bucketId': self.gcp_bucket,
            'objectId': self.gcp_object_id
        }
        mock_message.data = json.dumps({
            "metadata": {
                "tx_id": "1",
                "questionnaire_id": self.questionnaire_id,
                "case_id": self.case_id
            },
            "timeCreated": self.created
        })
        mock_message.message_id = str(uuid.uuid4())

        expected_log_event = 'Message processing complete'
        expected_log_kwargs = {
            'bucket_name': self.gcp_bucket,
            'questionnaire_id': self.questionnaire_id,
            'created': self.parsed_created,
            'tx_id': '1',
            'case_id': self.case_id,
            'object_name': self.gcp_object_id,
            'subscription_name': self.subscription_name,
            'subscription_project': self.subscription_project_id,
            'message_id': mock_message.message_id
        }

        expected_rabbit_message = json.dumps({
            'event': {
                'type': 'RESPONSE_RECEIVED',
                'source': 'RECEIPT_SERVICE',
                'channel': 'EQ',
                'dateTime': '2008-08-24T00:00:00+00:00',
                'transactionId': '1'
            },
            'payload': {
                'response': {
                    'caseId': self.case_id,
                    'questionnaireId': self.questionnaire_id,
                    'unreceipt': False
                }
            }
        })

        from app.subscriber import eq_receipt_to_case

        with self.checkExpectedLogLine('INFO', expected_log_event,
                                       expected_log_kwargs):
            eq_receipt_to_case(mock_message)

        mock_send_message_to_rabbit_mq.assert_called_once_with(
            expected_rabbit_message)
        mock_message.ack.assert_called_once()
    def test_receipt_to_case_bad_eventType(self,
                                           mock_send_message_to_rabbit_mq):
        mock_message = MagicMock()
        mock_message.message_id = str(uuid.uuid4())
        mock_message.attributes = {'eventType': 'FAIL'}

        expected_log_event = 'Unknown Pub/Sub Message eventType'
        expected_log_kwargs = {
            'eventType': 'FAIL',
            'subscription_name': self.subscription_name,
            'subscription_project': self.subscription_project_id,
            'message_id': mock_message.message_id,
        }

        from app.subscriber import eq_receipt_to_case

        with self.checkExpectedLogLine('ERROR', expected_log_event,
                                       expected_log_kwargs):
            eq_receipt_to_case(mock_message)

        mock_send_message_to_rabbit_mq.assert_not_called()
        mock_message.ack.assert_not_called()