phone validation

This commit is contained in:
OMGiTzPomPom 2024-03-29 12:23:21 +01:00
parent 98edde4a8f
commit 1ab49d8b08
2 changed files with 80 additions and 0 deletions

View File

@ -0,0 +1,35 @@
import { PhoneValidation } from "./index";
describe("Test PhoneValidation", () => {
const phoneValidator = new PhoneValidation();
it.each([
{ input: "0612345678", expected: "0612345678" },
{ input: "07.12.34.56.78", expected: "07.12.34.56.78" },
{ input: "04 12 34 56 78", expected: "04 12 34 56 78" },
{ input: "08/12/34/56/78", expected: "08/12/34/56/78" }
])(
"should validate phone %s correctly",
({ input, expected }) => {
const result = phoneValidator.validatePhone(input);
expect(result).toEqual(expected);
console.log(`Test with input = ${input}, expected = ${expected}, result = ${result}`);
}
);
it.each([
{ input: "", expectedErrorMsg: "Le numéro ne peut pas être vide" },
{ input: "123", expectedErrorMsg: "Le numéro doit contenir exactement 10 chiffres" },
{ input: "061234567", expectedErrorMsg: "Le numéro doit contenir exactement 10 chiffres" },
{ input: "0912345678", expectedErrorMsg: "Le numéro doit commencer par 04, 06, 07 ou 08" },
{ input: "06.123.45.6.78", expectedErrorMsg: "Le numéro doit être composé de 5 paires de deux chiffres séparés par des points, des espaces ou des slashs" },
{ input: "06/12/34/56", expectedErrorMsg: "Le numéro doit contenir exactement 10 chiffres" },
{ input: "0312345678", expectedErrorMsg: "Le numéro doit commencer par 04, 06, 07 ou 08" },
{ input: "05.12.34.56.78", expectedErrorMsg: "Le numéro doit commencer par 04, 06, 07 ou 08" }
])(
"should throw a validation exception for invalid phone %s",
({ input, expectedErrorMsg }) => {
expect(() => phoneValidator.validatePhone(input)).toThrowError(expectedErrorMsg);
}
);
});

View File

@ -0,0 +1,45 @@
export class PhoneValidation {
validatePhone(input: string): string {
if (input.length === 0) {
throw new ValidationException("Le numéro ne peut pas être vide");
}
// digit checker
const digitsOnly = input.replace(/[ ./]/g, '');
if (!/^\d{10}$/.test(digitsOnly)) {
throw new ValidationException("Le numéro doit contenir exactement 10 chiffres");
}
// check number
if (!/^(04|06|07|08)/.test(digitsOnly)) {
throw new ValidationException("Le numéro doit commencer par 04, 06, 07 ou 08");
}
// separator is '.' or '/' or ' ' and identiques
const separators = input.match(/[ ./]/g);
if (separators) {
if (separators.length !== 4) {
throw new ValidationException("Le numéro doit comporter 5 paires de chiffres séparés par des points, des espaces ou des slashs, mais pas en même temps");
}
const separator = separators[0];
if (!/^[ .\/]$/.test(separator)) {
throw new ValidationException("Les séparateurs acceptés sont seulement des points, des espaces ou des slashs");
}
const parts = input.split(separator);
if (parts.length !== 5 || parts.some(part => part.length !== 2 || !/^\d{2}$/.test(part))) {
throw new ValidationException("Le numéro doit être composé de 5 paires de deux chiffres séparés par des points, des espaces ou des slashs");
}
}
return input;
}
}
export class ValidationException extends Error {
constructor(message: string) {
super(message);
this.name = 'ValidationException';
}
}