French TIN validation bugs fixed

This commit is contained in:
Juan 2018-03-21 12:57:23 +01:00
parent ffe216f630
commit 70f854a463
4 changed files with 66 additions and 87 deletions

View File

@ -1,12 +1,11 @@
const app = require('../../../../../client/server/server'); const app = require('../../../../../client/server/server');
const catchErrors = require('../../../../../../services/utils/jasmineHelpers').catchErrors;
const restoreFixtures = require('../../../../../../services/db/testing_fixtures'); const restoreFixtures = require('../../../../../../services/db/testing_fixtures');
describe('Client Create', () => { describe('Client Create', () => {
let sqlStatements = {deletes: ` let sqlStatements = {deletes: `
DELETE FROM vn.address WHERE nickname = "Wade"; DELETE FROM vn.address WHERE nickname = 'Wade';
DELETE FROM vn.client WHERE name = "Wade"; DELETE FROM vn.client WHERE name = 'Wade';
DELETE FROM account.user WHERE name = "Deadpool"; DELETE FROM account.user WHERE name = 'Deadpool';
`, inserts: ``, updates: ``}; `, inserts: ``, updates: ``};
beforeAll(() => { beforeAll(() => {
@ -17,70 +16,50 @@ describe('Client Create', () => {
restoreFixtures(sqlStatements); restoreFixtures(sqlStatements);
}); });
let newAccountData = { let newAccount = {
active: true,
name: 'Wade',
userName: 'Deadpool', userName: 'Deadpool',
email: 'Deadpool@marvel.com', email: 'Deadpool@marvel.com',
fi: '16195279J', fi: '16195279J',
socialName: 'Deadpool Marvel', name: 'Wade',
salesPersonFk: 1 socialName: 'Deadpool Marvel'
}; };
it('should find Charles Xavier', done => { it(`should not find Deadpool as he's not created yet`, async() => {
app.models.Account.findOne({where: {name: 'CharlesXavier'}}) let account = await app.models.Account.findOne({where: {name: newAccount.userName}});
.then(account => { let client = await app.models.Client.findOne({where: {name: newAccount.name}});
expect(account.name).toEqual('CharlesXavier');
done(); expect(account).toEqual(null);
}); expect(client).toEqual(null);
}); });
it(`should not find Deadpool as he's not created yet`, done => { it('should create a new account', async() => {
app.models.Account.findOne({where: {name: newAccountData.userName}}) let client = await app.models.Client.createWithUser(newAccount);
.then(account => { let account = await app.models.Account.findOne({where: {name: newAccount.userName}});
expect(account).toEqual(null);
app.models.Client.findOne({where: {name: newAccountData.name}}) expect(account.name).toEqual(newAccount.userName);
.then(client => {
expect(client).toEqual(null); client = await app.models.Client.findOne({where: {name: newAccount.name}});
done();
}); expect(client.id).toEqual(account.id);
}) expect(client.name).toEqual(newAccount.name);
.catch(catchErrors(done)); expect(client.email).toEqual(newAccount.email);
expect(client.fi).toEqual(newAccount.fi);
expect(client.socialName).toEqual(newAccount.socialName);
});
it('should find an existing account', async() => {
let account = await app.models.Account.findOne({where: {name: newAccount.userName}});
expect(account.name).toEqual(newAccount.userName);
}); });
it('should not be able to create a user if exists', async() => { it('should not be able to create a user if exists', async() => {
let client = await app.models.Client.findOne({where: {name: 'Charles Xavier'}});
let account = await app.models.Account.findOne({where: {id: client.id}});
let formerAccountData = {
name: client.name,
userName: account.name,
email: client.email,
fi: client.fi,
socialName: client.socialName
};
try { try {
let client = await app.models.Client.createWithUser(formerAccountData); let client = await app.models.Client.createWithUser(newAccount);
expect(client).toBeNull(); expect(client).toBeNull();
} catch (err) { } catch (err) {
expect(err.details.codes.name[0]).toEqual('uniqueness'); expect(err.details.codes.name[0]).toEqual('uniqueness');
} }
}); });
it('should create a new account', async() => {
let client = await app.models.Client.createWithUser(newAccountData);
let account = await app.models.Account.findOne({where: {name: newAccountData.userName}});
expect(account.name).toEqual(newAccountData.userName);
client = await app.models.Client.findOne({where: {name: newAccountData.name}});
expect(client.id).toEqual(account.id);
expect(client.name).toEqual(newAccountData.name);
expect(client.email).toEqual(newAccountData.email);
expect(client.fi).toEqual(newAccountData.fi);
expect(client.socialName).toEqual(newAccountData.socialName);
});
}); });

View File

@ -44,11 +44,11 @@ module.exports = function(Self) {
allowBlank: true allowBlank: true
}); });
Self.validateAsync('fi', fiIsValid, { Self.validateAsync('fi', tinIsValid, {
message: 'DNI Incorrecto' message: 'DNI Incorrecto'
}); });
let validateDni = require('../validations/validateDni'); let validateTin = require('../validations/validateTin');
async function fiIsValid(err, done) { async function tinIsValid(err, done) {
let filter = { let filter = {
fields: ['code'], fields: ['code'],
where: {id: this.countryFk} where: {id: this.countryFk}
@ -56,7 +56,7 @@ module.exports = function(Self) {
let country = await Self.app.models.Country.findOne(filter); let country = await Self.app.models.Country.findOne(filter);
let code = country ? country.code.toLowerCase() : null; let code = country ? country.code.toLowerCase() : null;
if (!validateDni(this.fi, code)) if (!validateTin(this.fi, code))
err(); err();
done(); done();
} }

View File

@ -1,26 +1,26 @@
const validateDni = require('../validateDni'); const validateDni = require('../validateTin');
describe('DNI validation', () => { describe('TIN validation', () => {
it('should return true for any DNI when no country is passed', () => { it('should return true for any TIN when no country is passed', () => {
let isValid = validateDni('Pepinillos'); let isValid = validateDni('Pepinillos');
expect(isValid).toBeTruthy(); expect(isValid).toBeTruthy();
}); });
describe('Spanish', () => { describe('Spanish', () => {
it('should return true for valid spanish DNI', () => { it('should return true for valid spanish TIN', () => {
let isValid = validateDni('20849756A', 'es'); let isValid = validateDni('20849756A', 'es');
expect(isValid).toBeTruthy(); expect(isValid).toBeTruthy();
}); });
it('should return false for spanish DNI with exceeded digits', () => { it('should return false for spanish TIN with exceeded digits', () => {
let isValid = validateDni('208497563239A', 'es'); let isValid = validateDni('208497563239A', 'es');
expect(isValid).toBeFalsy(); expect(isValid).toBeFalsy();
}); });
it('should return false for spanish DNI with invalid letter', () => { it('should return false for spanish TIN with invalid letter', () => {
let isValid = validateDni('20243746E', 'es'); let isValid = validateDni('20243746E', 'es');
expect(isValid).toBeFalsy(); expect(isValid).toBeFalsy();
@ -40,19 +40,19 @@ describe('DNI validation', () => {
}); });
describe('French', () => { describe('French', () => {
it('should return true for valid french DNI', () => { it('should return true for valid french TIN', () => {
let isValid = validateDni('1B123456789', 'fr'); let isValid = validateDni('012345678', 'fr');
expect(isValid).toBeTruthy(); expect(isValid).toBeTruthy();
}); });
it('should return false for french DNI with exceeded digits', () => { it('should return false for french TIN with exceeded digits', () => {
let isValid = validateDni('1B12345678910', 'fr'); let isValid = validateDni('1B123456789101234', 'fr');
expect(isValid).toBeFalsy(); expect(isValid).toBeFalsy();
}); });
it('should return false for french DNI with bad syntax', () => { it('should return false for french TIN with bad syntax', () => {
let isValid = validateDni('1B12345678A', 'fr'); let isValid = validateDni('1B12345678A', 'fr');
expect(isValid).toBeFalsy(); expect(isValid).toBeFalsy();
@ -60,19 +60,19 @@ describe('DNI validation', () => {
}); });
describe('Italian', () => { describe('Italian', () => {
it('should return true for valid italian DNI', () => { it('should return true for valid italian TIN', () => {
let isValid = validateDni('12345678911', 'it'); let isValid = validateDni('12345678911', 'it');
expect(isValid).toBeTruthy(); expect(isValid).toBeTruthy();
}); });
it('should return false for italian DNI with exceeded digits', () => { it('should return false for italian TIN with exceeded digits', () => {
let isValid = validateDni('123456789112', 'it'); let isValid = validateDni('123456789112', 'it');
expect(isValid).toBeFalsy(); expect(isValid).toBeFalsy();
}); });
it('should return false for italian DNI with bad syntax', () => { it('should return false for italian TIN with bad syntax', () => {
let isValid = validateDni('1234567891A', 'it'); let isValid = validateDni('1234567891A', 'it');
expect(isValid).toBeFalsy(); expect(isValid).toBeFalsy();
@ -80,19 +80,19 @@ describe('DNI validation', () => {
}); });
describe('Portuguese', () => { describe('Portuguese', () => {
it('should return true for valid portuguese DNI', () => { it('should return true for valid portuguese TIN', () => {
let isValid = validateDni('123456789', 'pt'); let isValid = validateDni('123456789', 'pt');
expect(isValid).toBeTruthy(); expect(isValid).toBeTruthy();
}); });
it('should return false for portuguese DNI with exceeded digits', () => { it('should return false for portuguese TIN with exceeded digits', () => {
let isValid = validateDni('12345678910', 'pt'); let isValid = validateDni('12345678910', 'pt');
expect(isValid).toBeFalsy(); expect(isValid).toBeFalsy();
}); });
it('should return false for portuguese DNI with bad syntax', () => { it('should return false for portuguese TIN with bad syntax', () => {
let isValid = validateDni('12345678A', 'pt'); let isValid = validateDni('12345678A', 'pt');
expect(isValid).toBeFalsy(); expect(isValid).toBeFalsy();

View File

@ -1,24 +1,24 @@
module.exports = function(fi, country) { module.exports = function(tin, country) {
if (fi == null || country == null) if (tin == null || country == null)
return true; return true;
if (typeof fi != 'string' || typeof country != 'string') if (typeof tin != 'string' || typeof country != 'string')
return false; return false;
fi = fi.toUpperCase(); tin = tin.toUpperCase();
country = country.toLowerCase(); country = country.toLowerCase();
let len = fi.length; let len = tin.length;
let validators = { let validators = {
es: { es: {
regExp: /^[A-Z0-9]\d{7}[A-Z0-9]$/, regExp: /^[A-Z0-9]\d{7}[A-Z0-9]$/,
validate: () => { validate: () => {
let isCif = /[A-W]/.test(fi.charAt(0)); let isCif = /[A-W]/.test(tin.charAt(0));
let lastDigit = fi.charAt(len - 1); let lastDigit = tin.charAt(len - 1);
let computedDigit; let computedDigit;
if (isCif) { if (isCif) {
let numbers = fi.substring(1, 8) let numbers = tin.substring(1, 8)
.split('') .split('')
.map(x => parseInt(x)); .map(x => parseInt(x));
@ -41,8 +41,8 @@ module.exports = function(fi, country) {
computedDigit = index == -1 ? control.toString() : index; computedDigit = index == -1 ? control.toString() : index;
} else { } else {
// Foreign NIF // Foreign NIF
let index = 'XYZ'.indexOf(fi.charAt(0)); let index = 'XYZ'.indexOf(tin.charAt(0));
let nif = index == -1 ? fi : index.toString() + fi.substring(1); let nif = index == -1 ? tin : index.toString() + tin.substring(1);
let rest = parseInt(nif.substring(0, 8)) % 23; let rest = parseInt(nif.substring(0, 8)) % 23;
computedDigit = 'TRWAGMYFPDXBNJZSQVHLCKE'.charAt(rest); computedDigit = 'TRWAGMYFPDXBNJZSQVHLCKE'.charAt(rest);
@ -52,10 +52,10 @@ module.exports = function(fi, country) {
} }
}, },
fr: { fr: {
regExp: /^[A-Z0-9]{2}\d{9}$/ regExp: /^\d{1,13}$/
}, },
it: { it: {
regExp: /^\d{11}$/ regExp: /^(\d{11}|[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z])$/
}, },
pt: { pt: {
regExp: /^\d{9}$/ regExp: /^\d{9}$/
@ -67,6 +67,6 @@ module.exports = function(fi, country) {
if (!validator) if (!validator)
return true; return true;
return validator.regExp.test(fi) return validator.regExp.test(tin)
&& (!validator.validate || validator.validate()); && (!validator.validate || validator.validate());
}; };