def test_case2_sending_of_pending_usagedata_mails(self, email_dtos,
                                                      send_mail):
        """
        Case2: When only usageData mails are pending. Multiple mails are possible if none
        are received over the weekend and both arrived on monday.

        | Mail id      | edi_filename                                    | status         |
        + -------------+-------------------------------------------------+----------------+
        | ac1323b135fb | CHIEF_LIVE_SPIRE_licenceData_98720_202106180855 | reply_sent     |
        | d2d9b8d1f582 | CHIEF_LIVE_SPIRE_licenceData_98721_202106180855 | reply_sent     |
        | dc1323b1abcd | CHIEF_LIVE_SPIRE_usageData_5050_202106180855    | pending        |
        | bb2223b132bc | CHIEF_LIVE_SPIRE_usageData_5051_202106180855    | pending        |
        """
        filename_template = "CHIEF_LIVE_CHIEF_usageData_{run_number}_202104070888"
        num_sent_mails = 3
        start_run_number = 78120
        email_dtos.return_value = []
        send_mail.wraps = lambda x: x
        for i in range(num_sent_mails):
            mail = Mail.objects.create(
                extract_type=ExtractTypeEnum.LICENCE_DATA,
                status=ReceptionStatusEnum.REPLY_SENT)
            LicenceData.objects.create(
                mail=mail,
                source_run_number=start_run_number + i,
                hmrc_run_number=start_run_number + i,
                source=SourceEnum.SPIRE,
                licence_ids=f"{i}",
            )
        usage_run_number = 5050
        pending_mails = []
        for i in range(2):
            usage_run_number = usage_run_number + i
            filename = filename_template.format(run_number=usage_run_number)
            mail_body = self.licence_usage_file_body.decode("utf-8")
            mail = Mail.objects.create(
                extract_type=ExtractTypeEnum.USAGE_DATA,
                edi_filename=filename,
                edi_data=mail_body,
                status=ReceptionStatusEnum.PENDING,
            )
            UsageData.objects.create(
                mail=mail,
                spire_run_number=usage_run_number,
                hmrc_run_number=usage_run_number,
                licence_ids=f"{usage_run_number}",
            )
            pending_mails.append(mail)

        for i in range(2):
            check_and_route_emails()

            # assert that the pending mail is sent and status updated
            mail = Mail.objects.get(id=pending_mails[i].id)
            send_mail.assert_called()
            self.assertEqual(send_mail.call_count, int(i + 1))
            self.assertEqual(mail.status, ReceptionStatusEnum.REPLY_SENT)
예제 #2
0
def manage_inbox():
    """Main task which scans inbox for SPIRE and HMRC emails"""

    logging.info("Polling inbox for updates")

    try:
        check_and_route_emails()
    except Exception as exc:  # noqa
        logging.error(f"An unexpected error occurred when polling inbox for updates -> {type(exc).__name__}: {exc}")
        raise exc
    def test_case1_sending_of_pending_licencedata_mails(
            self, email_dtos, send_mail):
        """
        Ensure pending mails are sent and status updated as expected.

        Case1: When only one licenceData mail is pending

        | Mail id      | edi_filename                                    | status         |
        + -------------+-------------------------------------------------+----------------+
        | ac1323b135fb | CHIEF_LIVE_SPIRE_licenceData_98720_202106180855 | reply_sent     |
        | d2d9b8d1f582 | CHIEF_LIVE_SPIRE_licenceData_98721_202106180855 | reply_sent     |
        | dc1323b1abcd | CHIEF_LIVE_SPIRE_licenceData_98722_202106180855 | pending        |
        """
        num_sent_mails = 3
        start_run_number = 78120
        email_dtos.return_value = []
        send_mail.wraps = lambda x: x
        for i in range(num_sent_mails):
            mail = Mail.objects.create(
                extract_type=ExtractTypeEnum.LICENCE_DATA,
                status=ReceptionStatusEnum.REPLY_SENT)
            LicenceData.objects.create(
                mail=mail,
                source_run_number=start_run_number + i,
                hmrc_run_number=start_run_number + i,
                source=SourceEnum.SPIRE,
                licence_ids=f"{i}",
            )

        next_run_number = start_run_number + num_sent_mails
        filename = self.licence_data_file_name
        mail_body = self.licence_data_file_body.decode("utf-8")
        pending_mail = Mail.objects.create(
            extract_type=ExtractTypeEnum.LICENCE_DATA,
            edi_filename=filename,
            edi_data=mail_body,
            status=ReceptionStatusEnum.PENDING,
            sent_at=datetime.now(timezone.utc),
        )
        LicenceData.objects.create(
            mail=pending_mail,
            source_run_number=next_run_number,
            hmrc_run_number=next_run_number,
            source=SourceEnum.SPIRE,
            licence_ids=f"{next_run_number}",
        )
        check_and_route_emails()

        # assert that the pending mail is sent and status updated
        mail = Mail.objects.get(id=pending_mail.id)
        send_mail.assert_called_once()
        self.assertEqual(mail.status, ReceptionStatusEnum.REPLY_PENDING)
    def test_case4_sending_of_pending_licencedata_when_waiting_for_reply(
            self, email_dtos, send_mail):
        """
        Another variation of case3 is,

        | Mail id      | edi_filename                                    | status         |
        + -------------+-------------------------------------------------+----------------+
        | ac1323b135fb | CHIEF_LIVE_SPIRE_licenceData_98720_202106180855 | reply_sent     |
        | d2d9b8d1f582 | CHIEF_LIVE_SPIRE_licenceData_98721_202106180855 | reply_pending  |
        | dc1323b1abcd | CHIEF_LIVE_SPIRE_usageData_5050_202106180855    | reply_sent     |
        | 541323b18976 | CHIEF_LIVE_SPIRE_licenceData_98721_202106180855 | pending        |
        """
        mails_status = [
            ReceptionStatusEnum.REPLY_SENT, ReceptionStatusEnum.REPLY_PENDING
        ]
        start_run_number = 78120
        usage_run_number = 5050
        email_dtos.return_value = []
        send_mail.wraps = lambda x: x
        for i, status in enumerate(mails_status):
            mail = Mail.objects.create(
                extract_type=ExtractTypeEnum.LICENCE_DATA, status=status)
            LicenceData.objects.create(
                mail=mail,
                source_run_number=start_run_number + i,
                hmrc_run_number=start_run_number + i,
                source=SourceEnum.SPIRE,
                licence_ids=f"{i}",
            )

        filename_template = "CHIEF_LIVE_CHIEF_usageData_{run_number}_202104070888"
        filename = filename_template.format(run_number=usage_run_number)
        mail_body = self.licence_usage_file_body.decode("utf-8")
        mail = Mail.objects.create(
            extract_type=ExtractTypeEnum.USAGE_DATA,
            edi_filename=filename,
            edi_data=mail_body,
            status=ReceptionStatusEnum.REPLY_SENT,
        )
        UsageData.objects.create(
            mail=mail,
            spire_run_number=usage_run_number,
            hmrc_run_number=usage_run_number,
            licence_ids=f"{usage_run_number}",
        )

        licence_data_run_number = start_run_number + len(mails_status)
        filename = self.licence_data_file_name
        mail_body = self.licence_data_file_body.decode("utf-8")
        pending_mail = Mail.objects.create(
            extract_type=ExtractTypeEnum.LICENCE_DATA,
            edi_filename=filename,
            edi_data=mail_body,
            status=ReceptionStatusEnum.PENDING,
        )
        LicenceData.objects.create(
            mail=pending_mail,
            source_run_number=licence_data_run_number,
            hmrc_run_number=licence_data_run_number,
            source=SourceEnum.SPIRE,
            licence_ids=f"{licence_data_run_number}",
        )

        with self.assertRaises(Exception) as err:
            check_and_route_emails()

        self.assertEqual(
            str(err.exception),
            "Received another licenceData mail while waiting for reply")

        # assert that the pending mail is sent and status updated
        mail = Mail.objects.get(id=pending_mail.id)
        send_mail.assert_not_called()
        self.assertEqual(mail.status, ReceptionStatusEnum.PENDING)
    def test_case3_sending_of_pending_licencedata_and_usagedata_mails_2(
            self, email_dtos, send_mail):
        """
        Another variation of case3 is,

        | Mail id      | edi_filename                                    | status         |
        + -------------+-------------------------------------------------+----------------+
        | ac1323b135fb | CHIEF_LIVE_SPIRE_licenceData_98720_202106180855 | reply_sent     |
        | d2d9b8d1f582 | CHIEF_LIVE_SPIRE_licenceData_98721_202106180855 | reply_sent     |
        | dc1323b1abcd | CHIEF_LIVE_SPIRE_usageData_5050_202106180855    | reply_sent     |
        | 541323b18976 | CHIEF_LIVE_SPIRE_licenceData_98722_202106180855 | pending        |
        """
        num_sent_mails = 3
        start_run_number = 78120
        usage_run_number = 5050
        email_dtos.return_value = []
        send_mail.wraps = lambda x: x
        for i in range(num_sent_mails):
            mail = Mail.objects.create(
                extract_type=ExtractTypeEnum.LICENCE_DATA,
                status=ReceptionStatusEnum.REPLY_SENT)
            LicenceData.objects.create(
                mail=mail,
                source_run_number=start_run_number + i,
                hmrc_run_number=start_run_number + i,
                source=SourceEnum.SPIRE,
                licence_ids=f"{i}",
            )

        filename_template = "CHIEF_LIVE_CHIEF_usageData_{run_number}_202104070888"
        filename = filename_template.format(run_number=usage_run_number)
        mail_body = self.licence_usage_file_body.decode("utf-8")
        mail = Mail.objects.create(
            extract_type=ExtractTypeEnum.USAGE_DATA,
            edi_filename=filename,
            edi_data=mail_body,
            status=ReceptionStatusEnum.REPLY_SENT,
        )
        UsageData.objects.create(
            mail=mail,
            spire_run_number=usage_run_number,
            hmrc_run_number=usage_run_number,
            licence_ids=f"{usage_run_number}",
        )

        licence_data_run_number = start_run_number + num_sent_mails + 1
        filename = self.licence_data_file_name
        mail_body = self.licence_data_file_body.decode("utf-8")
        pending_mail = Mail.objects.create(
            extract_type=ExtractTypeEnum.LICENCE_DATA,
            edi_filename=filename,
            edi_data=mail_body,
            status=ReceptionStatusEnum.PENDING,
        )
        LicenceData.objects.create(
            mail=pending_mail,
            source_run_number=licence_data_run_number,
            hmrc_run_number=licence_data_run_number,
            source=SourceEnum.SPIRE,
            licence_ids=f"{licence_data_run_number}",
        )

        check_and_route_emails()

        # assert that the pending mail is sent and status updated
        mail = Mail.objects.get(id=pending_mail.id)
        send_mail.assert_called_once()
        self.assertEqual(mail.status, ReceptionStatusEnum.REPLY_PENDING)