Skip to content

Commit b1b7c85

Browse files
committed
Email validator
1 parent 185b7cc commit b1b7c85

File tree

2 files changed

+163
-0
lines changed

2 files changed

+163
-0
lines changed

lib/validators/email.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* Email validator
3+
*
4+
* {
5+
* email: {
6+
* domain: String, Array
7+
* }
8+
* }
9+
*/
10+
11+
function isValid(data, model) {
12+
if (!model.email) {
13+
return true;
14+
}
15+
16+
if(typeof model.email === 'object' && typeof model.email.domain !== 'undefined') {
17+
if (isEmail(data)) {
18+
return validateDomain(data, model.email.domain);
19+
} else {
20+
return false;
21+
}
22+
}
23+
24+
return isEmail(data);
25+
}
26+
27+
function isEmail(data) {
28+
// regex from http://emailregex.com/
29+
const emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
30+
return emailRegex.test(data);
31+
}
32+
33+
function validateDomain(data, domain) {
34+
const dataDomain = data.split('@')[1];
35+
36+
if (typeof domain === 'string') {
37+
return dataDomain.toUpperCase() === domain.toUpperCase();
38+
} else if (Array.isArray(domain)) {
39+
for (var i = domain.length - 1; i >= 0; i--) {
40+
if(domain[i].toUpperCase() === dataDomain.toUpperCase()) {
41+
return true;
42+
}
43+
}
44+
return false;
45+
}
46+
47+
return false;
48+
}
49+
50+
module.exports = isValid;

spec/validators/email.spec.js

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
var valid = require('../../lib/validators/email');
2+
3+
const email = {
4+
example: '[email protected]',
5+
6+
google: '[email protected]',
7+
};
8+
const invalidEmail = {
9+
string: 'emailexamplecom',
10+
notAt: 'emailexample.com',
11+
notDot: 'email@example',
12+
notDomain: '[email protected]',
13+
notName: '@example.com'
14+
};
15+
16+
const modelBool = {
17+
email: true
18+
};
19+
const modelStr = {
20+
email: {
21+
domain: 'gmail.com'
22+
}
23+
};
24+
const modelArr = {
25+
email: {
26+
domain: ['gmail.com', 'google.com']
27+
}
28+
};
29+
30+
31+
describe(' - Email validator', () => {
32+
it('shall be a function', () => {
33+
expect(typeof valid).toEqual('function');
34+
});
35+
36+
it('shall validate everything when empty model set', () => {
37+
// Valid emails
38+
for (let elem in email) {
39+
expect(valid(email[elem], {})).toEqual(true);
40+
}
41+
// Invalid emails
42+
for (let elem in invalidEmail) {
43+
expect(valid(invalidEmail[elem], {})).toEqual(true);
44+
}
45+
});
46+
47+
describe('Just validate emails (boolean)', () => {
48+
describe('shall validate valid emails', () => {
49+
for (let elem in email) {
50+
it('as is ' + email[elem], () => {
51+
expect(valid(email[elem], modelBool)).toEqual(true);
52+
});
53+
}
54+
});
55+
56+
describe('shall not validate invalid emails', () => {
57+
for (let elem in invalidEmail) {
58+
it('as is ' + invalidEmail[elem], () => {
59+
expect(valid(invalidEmail[elem], modelBool)).toEqual(false);
60+
});
61+
}
62+
});
63+
});
64+
65+
describe('Validate email single domain (string)', () => {
66+
describe('shall validate valid emails with valid domain', () => {
67+
for (let elem in email) {
68+
if (elem === 'gmail') {
69+
it('as is ' + email[elem], () => {
70+
expect(valid(email[elem], modelStr)).toEqual(true);
71+
});
72+
} else {
73+
it('as is ' + email[elem], () => {
74+
expect(valid(email[elem], modelStr)).toEqual(false);
75+
});
76+
}
77+
}
78+
});
79+
80+
describe('shall not validate invalid emails', () => {
81+
for (let elem in invalidEmail) {
82+
it('as is ' + invalidEmail[elem], () => {
83+
expect(valid(invalidEmail[elem], modelStr)).toEqual(false);
84+
});
85+
}
86+
});
87+
});
88+
89+
describe('Validate email multiple domain (array)', () => {
90+
describe('shall validate valid emails with valid domains', () => {
91+
for (let elem in email) {
92+
if (elem === 'gmail' || elem === 'google') {
93+
it('as is ' + email[elem], () => {
94+
expect(valid(email[elem], modelArr)).toEqual(true);
95+
});
96+
} else {
97+
it('as is ' + email[elem], () => {
98+
expect(valid(email[elem], modelArr)).toEqual(false);
99+
});
100+
}
101+
}
102+
});
103+
104+
describe('shall not validate invalid emails', () => {
105+
for (let elem in invalidEmail) {
106+
it('as is ' + invalidEmail[elem], () => {
107+
expect(valid(invalidEmail[elem], modelArr)).toEqual(false);
108+
});
109+
}
110+
});
111+
});
112+
113+
});

0 commit comments

Comments
 (0)