Skip to content

Commit

Permalink
chore: code coverage improvements (#1024)
Browse files Browse the repository at this point in the history
* fix(isISO8601): add additionnals checks for leap years

* fix(isDecimal): correct decimal point type for some locales

* refactor(rtrim): implement the logic of ltrim

* fix(ltrim): add chars escaping

* test: add thrown errors handling

* test: add missing test cases

* fix(isIdentityCard): remove default value for locale

* chore: add nyc config for code coverage

* chore: add compiled bundles
  • Loading branch information
tux-tn authored and profnandaa committed Jun 18, 2019
1 parent d7dbdd5 commit 9ee09a7
Show file tree
Hide file tree
Showing 24 changed files with 348 additions and 129 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -1,5 +1,6 @@
.DS_Store
node_modules
coverage
.nyc_output
package-lock.json
yarn.lock
13 changes: 13 additions & 0 deletions .nycrc
@@ -0,0 +1,13 @@
{
"reporter": [
"html",
"text-summary"
],
"include": [
"src/**/*.js"
],
"exclude": [
"validator.js",
"lib/**/*.js"
]
}
4 changes: 2 additions & 2 deletions lib/alpha.js
Expand Up @@ -87,9 +87,9 @@ for (var _locale, _i = 0; _i < arabicLocales.length; _i++) {
} // Source: https://en.wikipedia.org/wiki/Decimal_mark


var dotDecimal = [];
var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];
exports.dotDecimal = dotDecimal;
var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA'];
var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA'];
exports.commaDecimal = commaDecimal;

for (var _i2 = 0; _i2 < dotDecimal.length; _i2++) {
Expand Down
3 changes: 1 addition & 2 deletions lib/isISO8601.js
Expand Up @@ -25,7 +25,7 @@ var isValidDate = function isValidDate(str) {
var oYear = Number(ordinalMatch[1]);
var oDay = Number(ordinalMatch[2]); // if is leap year

if (oYear % 4 === 0 && oYear % 100 !== 0) return oDay <= 366;
if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;
return oDay <= 365;
}

Expand All @@ -37,7 +37,6 @@ var isValidDate = function isValidDate(str) {
var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare

var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01'));
if (isNaN(d.getUTCFullYear())) return false;

if (month && day) {
return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;
Expand Down
5 changes: 3 additions & 2 deletions lib/isIdentityCard.js
Expand Up @@ -78,14 +78,15 @@ var validators = {
}
};

function isIdentityCard(str) {
var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'any';
function isIdentityCard(str, locale) {
(0, _assertString.default)(str);

if (locale in validators) {
return validators[locale](str);
} else if (locale === 'any') {
for (var key in validators) {
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
// istanbul ignore else
if (validators.hasOwnProperty(key)) {
var validator = validators[key];

Expand Down
2 changes: 2 additions & 0 deletions lib/isIn.js
Expand Up @@ -21,6 +21,8 @@ function isIn(str, options) {
var array = [];

for (i in options) {
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
// istanbul ignore else
if ({}.hasOwnProperty.call(options, i)) {
array[i] = (0, _toString.default)(options[i]);
}
Expand Down
3 changes: 3 additions & 0 deletions lib/isMobilePhone.js
Expand Up @@ -101,6 +101,8 @@ function isMobilePhone(str, locale, options) {

if (Array.isArray(locale)) {
return locale.some(function (key) {
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
// istanbul ignore else
if (phones.hasOwnProperty(key)) {
var phone = phones[key];

Expand All @@ -115,6 +117,7 @@ function isMobilePhone(str, locale, options) {
return phones[locale].test(str); // alias falsey locale as 'any'
} else if (!locale || locale === 'any') {
for (var key in phones) {
// istanbul ignore else
if (phones.hasOwnProperty(key)) {
var phone = phones[key];

Expand Down
2 changes: 2 additions & 0 deletions lib/isPostalCode.js
Expand Up @@ -74,6 +74,8 @@ function _default(str, locale) {
return patterns[locale].test(str);
} else if (locale === 'any') {
for (var key in patterns) {
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
// istanbul ignore else
if (patterns.hasOwnProperty(key)) {
var pattern = patterns[key];

Expand Down
5 changes: 3 additions & 2 deletions lib/ltrim.js
Expand Up @@ -10,8 +10,9 @@ var _assertString = _interopRequireDefault(require("./util/assertString"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function ltrim(str, chars) {
(0, _assertString.default)(str);
var pattern = chars ? new RegExp("^[".concat(chars, "]+"), 'g') : /^\s+/g;
(0, _assertString.default)(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping

var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g;
return str.replace(pattern, '');
}

Expand Down
11 changes: 3 additions & 8 deletions lib/rtrim.js
Expand Up @@ -10,15 +10,10 @@ var _assertString = _interopRequireDefault(require("./util/assertString"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function rtrim(str, chars) {
(0, _assertString.default)(str);
var pattern = chars ? new RegExp("[".concat(chars, "]")) : /\s/;
var idx = str.length - 1;
(0, _assertString.default)(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping

for (; idx >= 0 && pattern.test(str[idx]); idx--) {
;
}

return idx < str.length ? str.substr(0, idx + 1) : str;
var pattern = chars ? new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g') : /\s+$/g;
return str.replace(pattern, '');
}

module.exports = exports.default;
Expand Down
3 changes: 2 additions & 1 deletion package.json
Expand Up @@ -47,6 +47,7 @@
"eslint-config-airbnb-base": "^12.1.0",
"eslint-plugin-import": "^2.11.0",
"mocha": "^5.1.1",
"nyc": "^14.1.0",
"rollup": "^0.43.0",
"rollup-plugin-babel": "^4.0.1",
"uglify-js": "^3.0.19"
Expand All @@ -62,7 +63,7 @@
"build:node": "babel src -d .",
"build": "npm run build:browser && npm run build:node",
"pretest": "npm run lint && npm run build",
"test": "mocha --require @babel/register --reporter dot"
"test": "nyc mocha --require @babel/register --reporter dot"
},
"engines": {
"node": ">= 0.10"
Expand Down
4 changes: 2 additions & 2 deletions src/lib/alpha.js
Expand Up @@ -83,9 +83,9 @@ for (let locale, i = 0; i < arabicLocales.length; i++) {
}

// Source: https://en.wikipedia.org/wiki/Decimal_mark
export const dotDecimal = [];
export const dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];
export const commaDecimal = [
'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO',
'bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-FR', 'it-IT', 'ku-IQ', 'hu-HU', 'nb-NO',
'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin',
'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA',
];
Expand Down
4 changes: 1 addition & 3 deletions src/lib/isISO8601.js
Expand Up @@ -14,8 +14,7 @@ const isValidDate = (str) => {
const oYear = Number(ordinalMatch[1]);
const oDay = Number(ordinalMatch[2]);
// if is leap year
if (oYear % 4 === 0
&& oYear % 100 !== 0) return oDay <= 366;
if ((oYear % 4 === 0 && oYear % 100 !== 0) || oYear % 400 === 0) return oDay <= 366;
return oDay <= 365;
}
const match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number);
Expand All @@ -27,7 +26,6 @@ const isValidDate = (str) => {

// create a date object and compare
const d = new Date(`${year}-${monthString || '01'}-${dayString || '01'}`);
if (isNaN(d.getUTCFullYear())) return false;
if (month && day) {
return d.getUTCFullYear() === year
&& (d.getUTCMonth() + 1) === month
Expand Down
4 changes: 3 additions & 1 deletion src/lib/isIdentityCard.js
Expand Up @@ -80,12 +80,14 @@ const validators = {
},
};

export default function isIdentityCard(str, locale = 'any') {
export default function isIdentityCard(str, locale) {
assertString(str);
if (locale in validators) {
return validators[locale](str);
} else if (locale === 'any') {
for (const key in validators) {
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
// istanbul ignore else
if (validators.hasOwnProperty(key)) {
const validator = validators[key];
if (validator(str)) {
Expand Down
2 changes: 2 additions & 0 deletions src/lib/isIn.js
Expand Up @@ -7,6 +7,8 @@ export default function isIn(str, options) {
if (Object.prototype.toString.call(options) === '[object Array]') {
const array = [];
for (i in options) {
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
// istanbul ignore else
if ({}.hasOwnProperty.call(options, i)) {
array[i] = toString(options[i]);
}
Expand Down
3 changes: 3 additions & 0 deletions src/lib/isMobilePhone.js
Expand Up @@ -89,6 +89,8 @@ export default function isMobilePhone(str, locale, options) {
}
if (Array.isArray(locale)) {
return locale.some((key) => {
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
// istanbul ignore else
if (phones.hasOwnProperty(key)) {
const phone = phones[key];
if (phone.test(str)) {
Expand All @@ -102,6 +104,7 @@ export default function isMobilePhone(str, locale, options) {
// alias falsey locale as 'any'
} else if (!locale || locale === 'any') {
for (const key in phones) {
// istanbul ignore else
if (phones.hasOwnProperty(key)) {
const phone = phones[key];
if (phone.test(str)) {
Expand Down
2 changes: 2 additions & 0 deletions src/lib/isPostalCode.js
Expand Up @@ -64,6 +64,8 @@ export default function (str, locale) {
return patterns[locale].test(str);
} else if (locale === 'any') {
for (const key in patterns) {
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
// istanbul ignore else
if (patterns.hasOwnProperty(key)) {
const pattern = patterns[key];
if (pattern.test(str)) {
Expand Down
3 changes: 2 additions & 1 deletion src/lib/ltrim.js
Expand Up @@ -2,6 +2,7 @@ import assertString from './util/assertString';

export default function ltrim(str, chars) {
assertString(str);
const pattern = chars ? new RegExp(`^[${chars}]+`, 'g') : /^\s+/g;
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
const pattern = chars ? new RegExp(`^[${chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}]+`, 'g') : /^\s+/g;
return str.replace(pattern, '');
}
10 changes: 3 additions & 7 deletions src/lib/rtrim.js
Expand Up @@ -2,11 +2,7 @@ import assertString from './util/assertString';

export default function rtrim(str, chars) {
assertString(str);
const pattern = chars ? new RegExp(`[${chars}]`) : /\s/;

let idx = str.length - 1;
for (; idx >= 0 && pattern.test(str[idx]); idx--)
;

return idx < str.length ? str.substr(0, idx + 1) : str;
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
const pattern = chars ? new RegExp(`[${chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}]+$`, 'g') : /\s+$/g;
return str.replace(pattern, '');
}
10 changes: 5 additions & 5 deletions test/exports.js
@@ -1,10 +1,10 @@
import assert from 'assert';
import validator from '../index';
import { locales as isPostalCodeLocales } from '../lib/isPostalCode';
import { locales as isAlphaLocales } from '../lib/isAlpha';
import { locales as isAlphanumericLocales } from '../lib/isAlphanumeric';
import { locales as isMobilePhoneLocales } from '../lib/isMobilePhone';
import { locales as isFloatLocales } from '../lib/isFloat';
import { locales as isPostalCodeLocales } from '../src/lib/isPostalCode';
import { locales as isAlphaLocales } from '../src/lib/isAlpha';
import { locales as isAlphanumericLocales } from '../src/lib/isAlphanumeric';
import { locales as isMobilePhoneLocales } from '../src/lib/isMobilePhone';
import { locales as isFloatLocales } from '../src/lib/isFloat';

describe('Exports', () => {
it('should export validators', () => {
Expand Down
22 changes: 21 additions & 1 deletion test/sanitizers.js
@@ -1,5 +1,5 @@
import { format } from 'util';
import validator from '../index';
import validator from '../src/index';

function test(options) {
let args = options.args || [];
Expand Down Expand Up @@ -91,11 +91,24 @@ describe('Sanitizers', () => {
expect: { '010100201000': '201000' },
});

test({
sanitizer: 'ltrim',
args: ['\\S'],
expect: { '\\S01010020100001': '01010020100001' },
});


test({
sanitizer: 'rtrim',
args: ['01'],
expect: { '010100201000': '0101002' },
});

test({
sanitizer: 'rtrim',
args: ['\\S'],
expect: { '01010020100001\\S': '01010020100001' },
});
});

it('should convert strings to integers', () => {
Expand Down Expand Up @@ -246,6 +259,10 @@ describe('Sanitizers', () => {
'test@yandex.ua': 'test@yandex.ru',
'test@yandex.com': 'test@yandex.ru',
'test@yandex.by': 'test@yandex.ru',
'@gmail.com': false,
'@icloud.com': false,
'@outlook.com': false,
'@yahoo.com': false,
},
});

Expand All @@ -268,6 +285,7 @@ describe('Sanitizers', () => {
'SOME.name@yahoo.ca': 'some.name@yahoo.ca',
'SOME.name@outlook.ie': 'some.name@outlook.ie',
'SOME.name@me.com': 'some.name@me.com',
'SOME.name@yandex.ru': 'some.name@yandex.ru',
},
});

Expand All @@ -280,6 +298,7 @@ describe('Sanitizers', () => {
icloud_lowercase: false,
outlookdotcom_lowercase: false,
yahoo_lowercase: false,
yandex_lowercase: false,
}],
expect: {
'TEST@FOO.COM': 'TEST@foo.com', // all_lowercase
Expand All @@ -289,6 +308,7 @@ describe('Sanitizers', () => {
'ME@outlook.COM': 'ME@outlook.com', // outlookdotcom_lowercase
'JOHN@live.CA': 'JOHN@live.ca', // outlookdotcom_lowercase
'ME@ymail.COM': 'ME@ymail.com', // yahoo_lowercase
'ME@yandex.RU': 'ME@yandex.ru', // yandex_lowercase
},
});

Expand Down

0 comments on commit 9ee09a7

Please sign in to comment.