summaryrefslogtreecommitdiffstats
path: root/tests/test_fields.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_fields.rs')
-rw-r--r--tests/test_fields.rs135
1 files changed, 135 insertions, 0 deletions
diff --git a/tests/test_fields.rs b/tests/test_fields.rs
new file mode 100644
index 0000000..ab43241
--- /dev/null
+++ b/tests/test_fields.rs
@@ -0,0 +1,135 @@
+// Copyright 2019 Alexandros Frantzis
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at https://mozilla.org/MPL/2.0/.
+//
+// SPDX-License-Identifier: MPL-2.0
+
+use mda::Email;
+
+static TEST_EMAIL: &'static str = "Return-Path: <me@source.com>
+Multi: multi1
+To: Destination <someone.else@destination.com>
+Cc: firstcc <firstcc@destination.com>,
+ secondcc <secondcc@destination.com>,
+\tthirsdcc <secondcc@destination.com>
+Multi: multi2
+Multi: multi3
+ multi3.1
+
+To: Body <body@destination.com>
+Multi: multibody
+BodyField: body
+Body body body
+";
+
+static TEST_EMAIL_NO_BODY: &'static str = "Return-Path: <me@source.com>
+Multi: multi1
+To: Destination <someone.else@destination.com>
+Cc: firstcc <firstcc@destination.com>,
+ secondcc <secondcc@destination.com>,
+ thirsdcc <secondcc@destination.com>
+";
+
+static TEST_EMAIL_CRLF: &'static str = "Return-Path: <me@source.com>\r
+Multi: multi1\r
+To: Destination <someone.else@destination.com>\r
+Cc: firstcc <firstcc@destination.com>,\r
+ secondcc <secondcc@destination.com>,\r
+ thirsdcc <secondcc@destination.com>\r
+Multi: multi2\r
+Multi: multi3\r
+ multi3.1
+";
+
+#[test]
+fn parses_single_line_fields() {
+ let email = Email::from_vec(TEST_EMAIL.to_string().into_bytes()).unwrap();
+ assert_eq!(
+ email.header_field("To").unwrap().trim(),
+ "Destination <someone.else@destination.com>"
+ );
+ assert_eq!(
+ email.header_field("Return-Path").unwrap().trim(),
+ "<me@source.com>"
+ );
+}
+
+#[test]
+fn parses_multi_line_fields() {
+ let email = Email::from_vec(TEST_EMAIL.to_string().into_bytes()).unwrap();
+ assert_eq!(
+ email.header_field("Cc").unwrap().trim(),
+ "firstcc <firstcc@destination.com>, secondcc <secondcc@destination.com>,\t\
+ thirsdcc <secondcc@destination.com>"
+ );
+}
+
+#[test]
+fn field_names_are_case_insensitive() {
+ let email = Email::from_vec(TEST_EMAIL.to_string().into_bytes()).unwrap();
+
+ assert_eq!(
+ email.header_field("return-path").unwrap().trim(),
+ "<me@source.com>"
+ );
+ assert_eq!(
+ email.header_field("ReTuRn-PaTh").unwrap().trim(),
+ "<me@source.com>"
+ );
+}
+
+#[test]
+fn non_existent_field_is_none() {
+ let email = Email::from_vec(TEST_EMAIL.to_string().into_bytes()).unwrap();
+ assert!(email.header_field("BodyField").is_none());
+}
+
+#[test]
+fn fields_with_multiple_occurrences_return_all() {
+ let email = Email::from_vec(TEST_EMAIL.to_string().into_bytes()).unwrap();
+
+ let multi = email.header_field_all_occurrences("Multi").unwrap();
+
+ assert_eq!(multi.len(), 3);
+ assert_eq!(multi.iter().filter(|e| e.trim() == "multi1").count(), 1);
+ assert_eq!(multi.iter().filter(|e| e.trim() == "multi2").count(), 1);
+ assert_eq!(multi.iter().filter(|e| e.trim() == "multi3 multi3.1").count(), 1);
+}
+
+#[test]
+fn field_with_multiple_occurrences_returns_first() {
+ let email = Email::from_vec(TEST_EMAIL.to_string().into_bytes()).unwrap();
+
+ assert_eq!(email.header_field("Multi").unwrap().trim(), "multi1");
+}
+
+#[test]
+fn all_occurrences_of_non_existent_field_is_none() {
+ let email = Email::from_vec(TEST_EMAIL.to_string().into_bytes()).unwrap();
+
+ assert!(email.header_field_all_occurrences("BodyField").is_none())
+}
+
+#[test]
+fn header_with_no_body_is_parsed_fully() {
+ let email = Email::from_vec(TEST_EMAIL_NO_BODY.to_string().into_bytes()).unwrap();
+
+ assert_eq!(
+ email.header_field("Cc").unwrap().trim(),
+ "firstcc <firstcc@destination.com>, secondcc <secondcc@destination.com>, \
+ thirsdcc <secondcc@destination.com>"
+ );
+}
+
+#[test]
+fn header_using_crlf() {
+ let email = Email::from_vec(TEST_EMAIL_CRLF.to_string().into_bytes()).unwrap();
+
+ assert_eq!(
+ email.header_field("Cc").unwrap().trim(),
+ "firstcc <firstcc@destination.com>, secondcc <secondcc@destination.com>, \
+ thirsdcc <secondcc@destination.com>"
+ );
+}