Example #1
0
    def test_emails_are_sequenced_correctly(self):
        mail = Mail.objects.create(
            edi_filename="something",
            edi_data="some data",
            extract_type=ExtractTypeEnum.LICENCE_DATA,
            status=ReceptionStatusEnum.REPLY_PENDING,
        )
        LicenceData.objects.create(source_run_number=4, hmrc_run_number=49543, mail=mail, source=SourceEnum.LITE)

        mail_lite = serialize_email_message(self.dto_2)
        mail_spire = serialize_email_message(self.dto_1)

        self.assertEqual(Mail.objects.filter(status=ReceptionStatusEnum.REPLY_RECEIVED).count(), 1)
        self.assertEqual(Mail.objects.filter(status=ReceptionStatusEnum.PENDING).count(), 1)

        mail = select_email_for_sending()

        self.assertEqual(mail_spire, mail)

        mail_spire.status = ReceptionStatusEnum.REPLY_SENT
        mail_spire.save()

        mail = select_email_for_sending()

        self.assertEqual(mail_lite, mail)
    def test_licence_reply_does_not_throw_exception_if_mail_already_updated(
            self):
        self.mail.extract_type = ExtractTypeEnum.LICENCE_DATA
        self.mail.status = ReceptionStatusEnum.REPLY_SENT
        self.mail.save()

        response_date = self.mail.response_date

        email_message_dto = EmailMessageDto(
            run_number=self.hmrc_run_number,
            sender=HMRC_ADDRESS,
            receiver=EMAIL_USER,
            date="Mon, 17 May 2021 14:20:18 +0100",
            body="body",
            subject=self.licence_data_reply_name,
            attachment=[
                self.licence_data_reply_name, self.licence_data_reply_body
            ],
            raw_data="qwerty",
        )

        serialize_email_message(email_message_dto)

        self.mail.refresh_from_db()

        self.assertEqual(response_date, self.mail.response_date)
    def test_usage_data_reply_is_saved(self):
        self.mail.status = ReceptionStatusEnum.REPLY_PENDING
        self.mail.save()
        email_message_dto = EmailMessageDto(
            run_number=self.source_run_number + 1,
            sender=SPIRE_ADDRESS,
            receiver=HMRC_ADDRESS,
            date="Mon, 17 May 2021 14:20:18 +0100",
            body="body",
            subject=self.usage_data_reply_name,
            attachment=[
                self.usage_data_reply_name, self.usage_data_reply_body
            ],
            raw_data="qwerty",
        )

        serialize_email_message(email_message_dto)
        self.mail.refresh_from_db()

        self.assertEqual(self.mail.status, ReceptionStatusEnum.REPLY_RECEIVED)
        self.assertIsNotNone(self.mail.response_date)

        self.assertIn(
            self.mail.response_data,
            self.usage_data_reply_body.decode("utf-8"),
        )
Example #4
0
    def test_retry(self):
        serialize_email_message(self.dto_2)
        mail_count = Mail.objects.count()
        licence_data_count = LicenceData.objects.count()
        mail = serialize_email_message(self.dto_2)
        mail.response_data = "rejected"
        mail.save()

        serialize_email_message(self.dto_2)

        self.assertEqual(Mail.objects.count(), mail_count + 1)
        self.assertEqual(LicenceData.objects.count(), licence_data_count + 1)
Example #5
0
def check_and_route_emails():
    logger.info("Checking for emails")
    hmrc_to_dit_server = get_hmrc_to_dit_mailserver()
    email_message_dtos = _get_email_message_dtos(hmrc_to_dit_server, number=None)
    email_message_dtos = sort_dtos_by_date(email_message_dtos)
    logging.info("Incoming message dtos sorted by date: %s" % email_message_dtos)

    spire_to_dit_server = get_spire_to_dit_mailserver()
    if hmrc_to_dit_server != spire_to_dit_server:
        # if the config for the return path is different to outgoing mail path
        # then check the return path otherwise don't bother as it will contain the
        # same emails.
        reply_message_dtos = _get_email_message_dtos(spire_to_dit_server)
        reply_message_dtos = sort_dtos_by_date(reply_message_dtos)
        logging.info("Reply message dtos sorted by date: %s" % reply_message_dtos)

        email_message_dtos.extend(reply_message_dtos)

    if not email_message_dtos:
        pending_message = check_for_pending_messages()
        if pending_message:
            logging.info(
                f"Found pending mail ({pending_message.id}) of extract type {pending_message.extract_type} for sending"
            )
            _collect_and_send(pending_message)

        logger.info(f"No new emails found from {hmrc_to_dit_server.user} or {spire_to_dit_server.user}")

        publish_queue_status()

        return

    for email, mark_status in email_message_dtos:
        try:
            logging.info(f"Processing mail with subject {email.subject}")
            serialize_email_message(email)
            mark_status(MailReadStatuses.READ)
        except ValidationError as ve:
            logger.info(f"Marking message {email.subject} as UNPROCESSABLE. {ve.detail}")
            mark_status(MailReadStatuses.UNPROCESSABLE)

    logger.info("Finished checking for emails")

    mail = select_email_for_sending()  # Can return None in the event of in flight or no pending or no reply_received
    if mail:
        logging.info(
            f"Selected mail ({mail.id}) for sending, extract type {mail.extract_type}, current status {mail.status}"
        )
        _collect_and_send(mail)

    publish_queue_status()
Example #6
0
    def test_duplicate_emails_and_licence_datas_not_saved(self):
        mail = Mail.objects.create(
            edi_filename=self.dto_2.attachment[0],
            edi_data=self.dto_2.attachment[1],
            extract_type=ExtractTypeEnum.LICENCE_DATA,
            status=ReceptionStatusEnum.REPLY_SENT,
        )
        LicenceData.objects.create(source_run_number=17, hmrc_run_number=49542, mail=mail, source=SourceEnum.SPIRE)
        mail_count = Mail.objects.count()
        licence_data_count = LicenceData.objects.count()

        serialize_email_message(self.dto_3)

        self.assertEqual(mail_count, Mail.objects.count() - 1)
        self.assertEqual(licence_data_count, LicenceData.objects.count())
    def test_licence_data_reply_is_saved(self):
        self.mail.extract_type = ExtractTypeEnum.LICENCE_DATA
        self.mail.status = ReceptionStatusEnum.REPLY_PENDING
        self.mail.save()

        email_message_dto = EmailMessageDto(
            run_number=self.source_run_number + 1,
            sender=HMRC_ADDRESS,
            receiver=SPIRE_ADDRESS,
            date="Mon, 17 May 2021 14:20:18 +0100",
            body="body",
            subject=self.licence_data_reply_name,
            attachment=[
                self.licence_data_reply_name,
                self.licence_data_reply_body,
            ],
            raw_data="qwerty",
        )

        serialize_email_message(email_message_dto)
        self.mail.refresh_from_db()
        logging.debug("resp data: {}".format(self.mail.response_data))
        self.assertEqual(self.mail.status, ReceptionStatusEnum.REPLY_RECEIVED)
        self.assertIsNotNone(self.mail.response_date)