def setUp(self): super().setUp() self.dto_1 = EmailMessageDto( run_number=49543, sender=HMRC_ADDRESS, receiver=EMAIL_USER, date="Mon, 17 May 2021 14:20:18 +0100", body="lite licence reply", subject="ILBDOTI_live_CHIEF_licenceReply_49543_201901130300", attachment=["ILBDOTI_live_CHIEF_licenceReply_49543_201901130300", self.licence_data_reply_body,], raw_data="qwerty", ) self.dto_2 = EmailMessageDto( run_number=17, sender=SPIRE_ADDRESS, receiver=EMAIL_USER, date="Mon, 17 May 2021 14:20:18 +0100", body="spire licence update", subject="ILBDOTI_live_CHIEF_licenceData_17_201901130300", attachment=["ILBDOTI_live_CHIEF_licenceData_49543_201901130300", self.licence_data_file_body,], raw_data="qwerty", ) self.dto_3 = EmailMessageDto( run_number=49542, sender=HMRC_ADDRESS, receiver=EMAIL_USER, date="Mon, 17 May 2021 14:20:18 +0100", body="spire licence reply", subject="ILBDOTI_live_CHIEF_licenceReply_49542_201901130300", attachment=["ILBDOTI_live_CHIEF_licenceReply_49542_201901130300", self.licence_data_reply_body], raw_data="qwerty", )
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_mail_data_serialized_successfully(self): email_message_dto = EmailMessageDto( run_number=self.source_run_number, sender=HMRC_ADDRESS, receiver=SPIRE_ADDRESS, date="Mon, 17 May 2021 14:20:18 +0100", body="body", subject=self.licence_usage_file_name, attachment=[ self.licence_usage_file_name, self.licence_usage_file_body ], raw_data="", ) self.assertRaises(ValidationError, serialize_email_message, email_message_dto) email = Mail.objects.last() usage_data = UsageData.objects.get(mail=email) self.assertEqual(email.extract_type, ExtractTypeEnum.USAGE_DATA) self.assertEqual(email.response_filename, None) self.assertEqual(email.response_data, None) self.assertEqual(usage_data.hmrc_run_number, self.hmrc_run_number) self.assertEqual(usage_data.spire_run_number, email_message_dto.run_number) self.assertEqual(email.raw_data, email_message_dto.raw_data)
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"), )
def to_mail_message_dto(mail_data) -> EmailMessageDto: mail_contents = mail_data[1] contents = b"\r\n".join(mail_contents).decode(settings.DEFAULT_ENCODING) msg_obj = Parser().parsestr(contents) msg = body_contents_of(msg_obj) file_name, file_data = get_attachment(msg_obj) msg_date = parse(msg_obj.get("Date")) return EmailMessageDto( subject=msg_obj.get("Subject"), sender=msg_obj.get("From"), receiver=msg_obj.get("To"), date=msg_date, body=msg, attachment=[file_name, file_data], run_number=get_run_number(msg_obj.get("Subject")), raw_data=str(mail_data), )
def build_reply_mail_message_dto(mail) -> EmailMessageDto: sender = settings.HMRC_ADDRESS receiver = settings.SPIRE_ADDRESS run_number = None if mail.extract_type == ExtractTypeEnum.LICENCE_DATA: licence_data = LicenceData.objects.get(mail=mail) run_number = licence_data.source_run_number receiver = convert_source_to_sender(licence_data.source) logging.info( f"[{mail.extract_type}] Source {licence_data.source} run number: {run_number}, HMRC run number: {licence_data.hmrc_run_number}" ) elif mail.extract_type == ExtractTypeEnum.LICENCE_REPLY: licence_data = LicenceData.objects.get(mail=mail) run_number = licence_data.source_run_number receiver = convert_source_to_sender(licence_data.source) logging.info( f"[{mail.extract_type}] Source {licence_data.source} run number: {run_number}, HMRC run number: {licence_data.hmrc_run_number}" ) elif mail.extract_type == ExtractTypeEnum.USAGE_DATA: usage_data = UsageData.objects.get(mail=mail) run_number = usage_data.hmrc_run_number sender = settings.SPIRE_ADDRESS receiver = settings.HMRC_ADDRESS mail.response_data = combine_lite_and_spire_usage_responses(mail) attachment = [ build_sent_filename(mail.response_filename, run_number), build_sent_file_data(mail.response_data, run_number), ] logging.info( f"Preparing reply Mail dto of extract type {mail.extract_type}, sender {sender}, receiver {receiver} with filename {attachment[0]}" ) return EmailMessageDto( run_number=run_number, sender=sender, receiver=receiver, subject=attachment[0], date=datetime.now(), body=None, attachment=attachment, raw_data=None, )
def build_request_mail_message_dto(mail: Mail) -> EmailMessageDto: sender = None receiver = None attachment = [None, None] run_number = 0 if mail.extract_type == ExtractTypeEnum.LICENCE_DATA: sender = settings.INCOMING_EMAIL_USER receiver = settings.OUTGOING_EMAIL_USER licence_data = LicenceData.objects.get(mail=mail) run_number = licence_data.hmrc_run_number attachment = [ build_sent_filename(mail.edi_filename, run_number), build_sent_file_data(mail.edi_data, run_number), ] elif mail.extract_type == ExtractTypeEnum.USAGE_DATA: sender = settings.HMRC_ADDRESS receiver = settings.SPIRE_ADDRESS update = UsageData.objects.get(mail=mail) run_number = update.spire_run_number spire_data, _ = split_edi_data_by_id(mail.edi_data) if len( spire_data ) > 2: # if SPIRE blocks contain more than just a header & footer file = build_edifact_file_from_data_blocks(spire_data) attachment = [ build_sent_filename(mail.edi_filename, run_number), build_sent_file_data(file, run_number), ] logging.info( f"Preparing request Mail dto of extract type {mail.extract_type}, sender {sender}, receiver {receiver} with filename {attachment[0]}" ) return EmailMessageDto( run_number=run_number, sender=sender, receiver=receiver, date=datetime.now(), subject=attachment[0], body=None, attachment=attachment, raw_data=None, )
def build_reply_mail_message_dto(mail) -> EmailMessageDto: if mail.extract_type not in MOCK_HMRC_SUPPORTED_EXTRACT_TYPES: return None sender = settings.MOCK_HMRC_EMAIL_USER receiver = settings.SPIRE_STANDIN_EMAIL_USER attachment = [ build_reply_pending_filename(mail.edi_filename), build_reply_pending_file_data(mail), ] return EmailMessageDto( run_number=mail.source_run_number, sender=sender, receiver=receiver, subject=attachment[0], body=None, attachment=attachment, raw_data=None, )
def test_build_email_message(self): attachment = "30 \U0001d5c4\U0001d5c6/\U0001d5c1 \u5317\u4EB0" email_message_dto = EmailMessageDto( run_number=1, sender=settings.HMRC_ADDRESS, receiver=settings.SPIRE_ADDRESS, date="Mon, 17 May 2021 14:20:18 +0100", body=None, subject="Some subject", attachment=["some filename", attachment], raw_data="", ) mime_multipart = builders.build_email_message(email_message_dto) mime_multipart.set_boundary("===============8537751789001939036==") self.assertEqual( mime_multipart.as_string(), ('Content-Type: multipart/mixed; boundary="===============8537751789001939036=="\n' "MIME-Version: 1.0\n" f"From: {settings.EMAIL_USER}\n" f"To: {settings.SPIRE_ADDRESS}\n" "Subject: Some subject\n" "name: Some subject\n\n" "--===============8537751789001939036==\n" 'Content-Type: text/plain; charset="iso-8859-1"\n' "MIME-Version: 1.0\n" "Content-Transfer-Encoding: quoted-printable\n\n" "\n\n\n" "--===============8537751789001939036==\n" "Content-Type: application/octet-stream\n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: base64\n" 'Content-Disposition: attachment; filename="some filename"\n' "Content-Transfer-Encoding: 7bit\n" "name: Some subject\n\n" "30 km/h Bei Jing \n" "--===============8537751789001939036==--\n"), )
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)