UNPKG

2.46 kBJavaScriptView Raw
1var fs = require("fs"),
2 libxmljs = require("libxmljs"),
3 test = require("tap").test;
4
5var addrs = require("../lib/email-addresses");
6
7var TESTS_FILE = "tests.xml",
8 TESTS_FILE_ENCODING = "utf8";
9
10var ISEMAIL_ERR = "ISEMAIL_ERR",
11 ISEMAIL_ERR_DOMAINHYPHENSTART = "ISEMAIL_ERR_DOMAINHYPHENSTART",
12 ISEMAIL_ERR_DOMAINHYPHENEND = "ISEMAIL_ERR_DOMAINHYPHENEND";
13
14
15function isEmailTest(t, data) {
16 var nodes = getNodes(data, "//test");
17 nodes.forEach(function (node) {
18 var id = getAttr(node, "id"),
19 address = getChildValue(node, "address"),
20 diagnosis = getChildValue(node, "diagnosis");
21
22 var result = addrs(convertAddress(address)),
23 ast = null;
24 if (result !== null) {
25 ast = result.addresses[0].node;
26 }
27
28 var isValid = ast !== null,
29 expectedToBeValid = shouldParse(diagnosis);
30
31 t.equal(isValid, expectedToBeValid,
32 "[test " + id + "] address: " + address + ", expects: " + expectedToBeValid);
33 });
34 t.end();
35}
36
37function shouldParse(diagnosis) {
38 var isOk = !startsWith(diagnosis, ISEMAIL_ERR) ||
39 // is_email considers address with a domain beginning
40 // or ending with "-" to be incorrect because they are not
41 // valid domains, but we are only concerned with rfc5322.
42 // From rfc5322's perspective, this is OK.
43 diagnosis === ISEMAIL_ERR_DOMAINHYPHENSTART ||
44 diagnosis === ISEMAIL_ERR_DOMAINHYPHENEND;
45 return isOk;
46}
47
48// the is_email tests encode control characters
49// in the U+2400 block for display purposes
50function convertAddress(s) {
51 var chars = [];
52 for (var i = 0; i < s.length; i += 1) {
53 var code = s.charCodeAt(i);
54 if (code >= 0x2400) {
55 code -= 0x2400;
56 }
57 chars.push(String.fromCharCode(code));
58 }
59 return chars.join('');
60}
61
62function getChildValue(parent, nodeName) {
63 return parent.find(nodeName)[0].text();
64}
65
66function getAttr(node, attrName) {
67 return node.attr(attrName).value();
68}
69
70function getNodes(xml, xpath) {
71 var doc = libxmljs.parseXml(xml);
72 return doc.find(xpath);
73}
74
75function startsWith(s, t) {
76 return s.substring(0, t.length) === t;
77}
78
79test("isemail tests", function (t) {
80 fs.readFile(TESTS_FILE, TESTS_FILE_ENCODING, function (err, data) {
81 if (err) {
82 t.end();
83 return console.error(err);
84 }
85 isEmailTest(t, data);
86 });
87});