/* -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /** * Test suite for nsIMsgHeaderParser::makeFromDisplayAddress. * This is what is used to parse in the user input from addressing fields. */ var { MailServices } = ChromeUtils.import( "resource:///modules/MailServices.jsm" ); function run_test() { const checks = [ { displayString: "", addresses: [] }, { displayString: "test@foo.invalid", addresses: [["", "test@foo.invalid"]], }, { displayString: "test@foo.invalid, test2@foo.invalid", addresses: [ ["", "test@foo.invalid"], ["", "test2@foo.invalid"], ], }, { displayString: "John Doe ", addresses: [["John Doe", "test@foo.invalid"]], }, // Trim spaces. { displayString: " John Doe ", addresses: [["John Doe", "test@foo.invalid"]], }, // No space before the email address. { displayString: " John Doe", addresses: [["John Doe", "test@foo.invalid"]], }, // Additional text after the email address to be ignored. { displayString: " John Doe Junior", addresses: [["John Doe", "test@foo.invalid"]], }, { displayString: "Doe, John ", addresses: [["Doe, John", "test@foo.invalid"]], }, { displayString: "Doe, John , Bond, James ", addresses: [ ["Doe, John", "test@foo.invalid"], ["Bond, James", "test2@foo.invalid"], ], }, // Additional text after the email address to be ignored, multiple addresses. { displayString: "Doe, John Junior, Bond, James 007", addresses: [ ["Doe, John", "test@foo.invalid"], ["Bond, James", "test2@foo.invalid"], ], }, // Multiple commas { displayString: "Doe,, John ,, Bond, James , , Gold Finger ,, ", addresses: [ ["Doe,, John", "test@foo.invalid"], ["Bond, James", "test2@foo.invalid"], ["Gold Finger", "goldfinger@example.com"], ], }, // More tests where the user forgot to close the quote or added extra quotes. { displayString: '"Yatter King1 ', addresses: [['"Yatter King1', "a@a.a.a"]], }, { displayString: 'Yatter King2" ', addresses: [['Yatter King2"', "a@a.a.a"]], }, { displayString: '"Yatter King3" ', addresses: [['"Yatter King3"', "a@a.a.a"]], }, { displayString: 'Yatter "XXX" King4 ', addresses: [['Yatter "XXX" King4', "a@a.a.a"]], }, { displayString: '"Yatter "XXX" King5" ', addresses: [['"Yatter "XXX" King5"', "a@a.a.a"]], }, { displayString: '"Yatter King6 "', addresses: [["Yatter King6", "a@a.a.a"]], }, { displayString: '"Yatter King7 " ', addresses: [['"Yatter King7 "', "b@b.b.b"]], }, // Handle invalid mailbox separation with semicolons gracefully. { displayString: 'Bart ; lisa@example.com; "Homer, J; President" , Marge ; ', addresses: [ ["Bart", "bart@example.com"], ["", "lisa@example.com"], ['"Homer, J; President"', "pres@example.com"], ["Marge", "marge@example.com"], ], }, // Junk after a bracketed email address to be ignored. { displayString: "friend@example.com", addresses: [["", "attacker@example.com"]], }, { displayString: ",foo ", addresses: [ ["", "attacker2@example.com"], ["foo", "attacker3@example.com"], ], }, { displayString: 'jay "bad" ass ', addresses: [['jay "bad" ass', "name@evil.com"]], }, { displayString: 'me "you" (via foo@example.com) friend@example.com,', addresses: [['me "you" (via foo@example.com)', "attacker2@example.com"]], }, // An uncompleted autocomplete... { displayString: "me >> test ", addresses: [["me >> test", "joe@examp.com"]], }, // A mail list. { displayString: "Holmes and Watson , foo@example.com", addresses: [ ["Holmes and Watson", "Tenants221B"], ["", "foo@example.com"], ], }, // A mail list with a space in the name. { displayString: 'Watson and Holmes <"Quoted Tenants221B">', addresses: [["Watson and Holmes", '"Quoted Tenants221B"']], }, // Mail Merge template { displayString: "{{PrimaryEmail}} <>", addresses: [["{{PrimaryEmail}}", ""]], }, // Quoted heart. { displayString: 'Marge "<3" S ', addresses: [['Marge "<3" S', "qheart@example.com"]], }, // Heart. { displayString: "Maggie <3 S ", addresses: [["Maggie <3 S", "heart@example.com"]], }, // Unbalanced quotes. { displayString: 'Homer <3 "B>" "J ', addresses: [['Homer <3 "B>" "J', "unb@example.com"]], }, ]; // Test - strings for (let i = 0; i < checks.length; ++i) { let addrs = MailServices.headerParser.makeFromDisplayAddress( checks[i].displayString ); let checkaddrs = checks[i].addresses; Assert.equal(addrs.length, checkaddrs.length, "Number of parsed addresses"); for (let j = 0; j < addrs.length; j++) { Assert.equal(addrs[j].name, checkaddrs[j][0], "Parsed name"); Assert.equal(addrs[j].email, checkaddrs[j][1], "Parsed email"); } } }