From 979e8b42ac39208966189f60979dfc1b035d7ff8 Mon Sep 17 00:00:00 2001 From: Chris Heywood <15127-creywood@users.noreply.gitlab.gnome.org> Date: Tue, 5 Nov 2019 20:36:20 +0100 Subject: [PATCH] Added a few tests for RFC822.Message - Inline attachments in from_composed_email - get_recipients - get_searchable_body - get_searchable_recipients - get_network_buffer --- test/data/org.gnome.GearyTest.gresource.xml | 1 + test/data/test-attachment-image.png | Bin 0 -> 7153 bytes test/engine/rfc822-message-test.vala | 121 ++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 test/data/test-attachment-image.png diff --git a/test/data/org.gnome.GearyTest.gresource.xml b/test/data/org.gnome.GearyTest.gresource.xml index e0ef0e06..0f38310f 100644 --- a/test/data/org.gnome.GearyTest.gresource.xml +++ b/test/data/org.gnome.GearyTest.gresource.xml @@ -6,5 +6,6 @@ basic-multipart-alternative.eml basic-multipart-tnef.eml geary-0.6-db.tar.xz + test-attachment-image.png diff --git a/test/data/test-attachment-image.png b/test/data/test-attachment-image.png new file mode 100644 index 0000000000000000000000000000000000000000..e542ff58710c533ab474fe56a6b28a18d8293a95 GIT binary patch literal 7153 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 P7#KWV{an^LB{Ts5OF*%! literal 0 HcmV?d00001 diff --git a/test/engine/rfc822-message-test.vala b/test/engine/rfc822-message-test.vala index fe696f6b..d0c2502f 100644 --- a/test/engine/rfc822-message-test.vala +++ b/test/engine/rfc822-message-test.vala @@ -29,6 +29,11 @@ This is the second line. """; + private static string SIMPLE_MULTIRECIPIENT_TO_CC_BCC = "From: Jill Smith \r\nTo: Jane Doe \r\nCc: Jane Doe CC \r\nBcc: Jane Doe BCC \r\nSubject: Re: Saying Hello\r\nDate: Fri, 21 Nov 1997 10:01:10 -0600\r\n\r\nThis is a reply to your hello.\r\n\r\n"; + private static string NETWORK_BUFFER_EXPECTED = "From: Alice \r\nSender: Bob \r\nTo: Charlie \r\nCC: Dave \r\nBCC: Eve \r\nReply-To: \"Alice: Personal Account\" \r\nSubject: Re: Basic text/plain message\r\nDate: Fri, 21 Nov 1997 10:01:10 -0600\r\nMessage-ID: <3456@example.net>\r\nIn-Reply-To: <1234@local.machine.example>\r\nReferences: <1234@local.machine.example>\r\nX-Mailer: Geary Test Suite 1.0\r\n\r\nThis is the first line.\r\n\r\nThis is the second line.\r\n\r\n"; + + private static string TEST_ATTACHMENT_IMAGE_FILENAME = "test-attachment-image.png"; + public MessageTest() { base("Geary.RFC822.MessageTest"); add_test("basic_message_from_buffer", basic_message_from_buffer); @@ -49,6 +54,11 @@ This is the second line. add_test("multipart_alternative_as_html", multipart_alternative_as_html); add_test("get_preview", get_preview); + add_test("get_recipients", get_recipients); + add_test("get_searchable_body", get_searchable_body); + add_test("get_searchable_recipients", get_searchable_recipients); + add_test("get_network_buffer", get_network_buffer); + add_test("from_composed_email_inline_attachments", from_composed_email_inline_attachments); } public void basic_message_from_buffer() throws Error { @@ -169,6 +179,106 @@ This is the second line. assert(multipart_signed.get_preview() == MULTIPART_SIGNED_MESSAGE_PREVIEW); } + public void get_recipients() throws Error { + Message test = string_to_message(SIMPLE_MULTIRECIPIENT_TO_CC_BCC); + + Gee.List? addresses = test.get_recipients(); + + Gee.List verify_list = new Gee.ArrayList(); + verify_list.add("Jane Doe "); + verify_list.add("Jane Doe CC "); + verify_list.add("Jane Doe BCC "); + + assert_addresses_list(addresses, verify_list, "get_recipients"); + } + + public void get_searchable_body() throws Error { + Message test = resource_to_message(BASIC_TEXT_HTML); + string searchable = test.get_searchable_body(); + assert_true(searchable.contains("This is the first line"), "Expected body text"); + assert_false(searchable.contains("

"), "Expected html removed"); + } + + public void get_searchable_recipients() throws Error { + Message test = string_to_message(SIMPLE_MULTIRECIPIENT_TO_CC_BCC); + string searchable = test.get_searchable_recipients(); + assert_true(searchable.contains("Jane Doe "), "Expected to address"); + assert_true(searchable.contains("Jane Doe CC "), "Expected cc address"); + assert_true(searchable.contains("Jane Doe BCC "), "Expected bcc address"); + } + + public void get_network_buffer() throws Error { + Message test = resource_to_message(BASIC_TEXT_PLAIN); + Memory.Buffer buffer = test.get_network_buffer(true); + assert_true(buffer.to_string() == NETWORK_BUFFER_EXPECTED, "Network buffer differs"); + } + + public void from_composed_email_inline_attachments() throws Error { + RFC822.MailboxAddress to = new RFC822.MailboxAddress( + "Test", "test@example.com" + ); + RFC822.MailboxAddress from = new RFC822.MailboxAddress( + "Sender", "sender@example.com" + ); + + Geary.ComposedEmail composed = new Geary.ComposedEmail( + new GLib.DateTime.now_local(), + new Geary.RFC822.MailboxAddresses.single(from), + new Geary.RFC822.MailboxAddresses.single(to), + null, + null, + null, + null, + "" + ); + + GLib.File resource = + GLib.File.new_for_uri(RESOURCE_URI).resolve_relative_path(TEST_ATTACHMENT_IMAGE_FILENAME); + uint8[] contents; + resource.load_contents(null, out contents, null); + Geary.Memory.ByteBuffer buffer = new Geary.Memory.ByteBuffer(contents, contents.length); + composed.cid_files[TEST_ATTACHMENT_IMAGE_FILENAME] = buffer; + Geary.Memory.ByteBuffer buffer2 = new Geary.Memory.ByteBuffer(contents, contents.length); + composed.inline_files["needing_cid.png"] = buffer2; + + this.message_from_composed_email.begin( + composed, + async_complete_full + ); + Geary.RFC822.Message message = message_from_composed_email.end(async_result()); + + Gee.List attachments = message.get_attachments(); + + bool found_first = false; + bool found_second = false; + bool second_id_renamed = false; + foreach (Part part in attachments) { + if (part.get_clean_filename() == TEST_ATTACHMENT_IMAGE_FILENAME) { + found_first = true; + } else if (part.get_clean_filename() == "needing_cid.png") { + found_second = true; + second_id_renamed = part.content_id != "needing_cid.png"; + } + } + assert_true(found_first, "Expected CID attachment"); + assert_true(found_second, "Expected inline attachment"); + assert_true(second_id_renamed, "Expected inline attachment renamed"); + + string html_body = message.get_html_body(null); + assert_false(html_body.contains("src=\"needing_cid.png\""), "Expected updated attachment content ID"); + + Memory.Buffer out_buffer = message.get_native_buffer(); + assert_true(out_buffer.size > (buffer.size+buffer2.size), "Expected sizeable message"); + } + + private async Geary.RFC822.Message message_from_composed_email(Geary.ComposedEmail composed) { + return yield new Geary.RFC822.Message.from_composed_email( + composed, + GMime.utils_generate_message_id(composed.from.get(0).domain), + null + ); + } + private Message resource_to_message(string path) throws Error { GLib.File resource = GLib.File.new_for_uri(RESOURCE_URI).resolve_relative_path(path); @@ -208,6 +318,17 @@ This is the second line. assert_string(expected, addresses.to_rfc822_string()); } + private void assert_addresses_list(Gee.List? addresses, + Gee.List expected, + string context) + throws Error { + assert_non_null(addresses, context + " not null"); + assert_true(addresses.size == expected.size, context + " size"); + foreach (RFC822.MailboxAddress address in addresses) { + assert_true(expected.contains(address.to_rfc822_string()), context + " missing"); + } + } + private void assert_message_id_list(Geary.RFC822.MessageIDList? ids, string expected) throws Error {