nigerian-mobile-validator
Version:
The most rigorous, up-to-date library for validating Nigerian mobile numbers. Fully NCC-compliant, and security-focused, with enterprise-grade features to prevent the business risks of validation failures in regulated industries.
134 lines (133 loc) • 6.12 kB
JavaScript
;
// src/__tests__/synthetic-data/test-data-generator-valid-numbers.ts
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestDataGeneratorValidNumbers = void 0;
const test_data_generator_base_1 = require("./test-data-generator-base");
const network_access_code_1 = require("../../numbering-plan/network-access-code");
const telco_1 = require("../../numbering-plan/telco");
const chance_1 = __importDefault(require("chance"));
// Initialize Chance with a seed for reproducibility if needed
const chance = new chance_1.default();
/**
* Generator for valid Nigerian mobile numbers
*/
class TestDataGeneratorValidNumbers extends test_data_generator_base_1.TestDataGeneratorBase {
/**
* Generate a valid mobile number for a specific network code with randomized subscriber number
*/
static generateValidNumber(networkCode) {
const subscriberNumber = this.randomSubscriberNumber(networkCode);
return `0${networkCode}${subscriberNumber}`;
}
/**
* Generate a valid mobile number for a specific telco
*/
static generateValidNumberForTelco(telco) {
// Handle special case for 702 range
if (telco === telco_1.Telco.Smile) {
return `0${network_access_code_1.NetworkAccessCode.n702}${TestDataGeneratorValidNumbers.random702SubscriberNumber('Smile')}`;
}
else if (telco === telco_1.Telco.InterconnectClearinghouse) {
return `0${network_access_code_1.NetworkAccessCode.n702}${TestDataGeneratorValidNumbers.random702SubscriberNumber('InterconnectClearinghouse')}`;
}
else if (telco === telco_1.Telco.Openskys) {
return `0${network_access_code_1.NetworkAccessCode.n702}${TestDataGeneratorValidNumbers.random702SubscriberNumber('Openskys')}`;
}
else if (telco === telco_1.Telco.Visafone) {
return `0${network_access_code_1.NetworkAccessCode.n702}${TestDataGeneratorValidNumbers.random702SubscriberNumber('Visafone')}`;
}
// For other telcos
const networkCode = this.randomNetworkCodeForTelco(telco);
return TestDataGeneratorValidNumbers.generateValidNumber(networkCode);
}
/**
* Generate an international format number
*/
static generateInternationalNumber(networkCode) {
const subscriberNumber = this.randomSubscriberNumber(networkCode);
return `234${networkCode}${subscriberNumber}`;
}
/**
* Generate an international format number with plus
*/
static generateInternationalPlusNumber(networkCode) {
const subscriberNumber = this.randomSubscriberNumber(networkCode);
return `+234${networkCode}${subscriberNumber}`;
}
/**
* Generate a number with spaces in random positions
*/
static generateNumberWithSpaces(networkCode) {
const subscriberNumber = this.randomSubscriberNumber(networkCode);
const number = `0${networkCode}${subscriberNumber}`;
// Insert 1-3 spaces at random positions
let result = '';
const positions = chance.unique(chance.integer, chance.integer({ min: 1, max: 3 }), { min: 1, max: number.length - 1 });
let lastPos = 0;
for (const pos of positions.sort((a, b) => a - b)) {
result += number.substring(lastPos, pos) + ' ';
lastPos = pos;
}
result += number.substring(lastPos);
return result;
}
/**
* Generate a number with "O" instead of "0" at random positions
*/
static generateNumberWithO(networkCode) {
const subscriberNumber = this.randomSubscriberNumber(networkCode);
const number = `0${networkCode}${subscriberNumber}`;
// Replace 0 with o
let result = '';
for (const element of number) {
if (element === '0') {
result += chance.bool() ? 'o' : 'O';
}
else {
result += element;
}
}
return result;
}
/**
* Generate a comprehensive batch of valid numbers covering all telcos
* Useful for batch validation testing
*/
static generateValidNumberBatch(size = 50) {
const numbers = [];
// Determine proportions for different telcos
const mtnCount = Math.floor(size * 0.4); // 40% MTN
const airtelCount = Math.floor(size * 0.25); // 25% Airtel
const gloCount = Math.floor(size * 0.2); // 20% Glo
const nineMobileCount = Math.floor(size * 0.1); // 10% 9Mobile
const otherCount = size - mtnCount - airtelCount - gloCount - nineMobileCount; // Remaining for other telcos
// MTN numbers
for (let i = 0; i < mtnCount; i++) {
numbers.push(TestDataGeneratorValidNumbers.generateValidNumberForTelco(telco_1.Telco.MTN));
}
// Airtel numbers
for (let i = 0; i < airtelCount; i++) {
numbers.push(TestDataGeneratorValidNumbers.generateValidNumberForTelco(telco_1.Telco.Airtel));
}
// Glo numbers
for (let i = 0; i < gloCount; i++) {
numbers.push(TestDataGeneratorValidNumbers.generateValidNumberForTelco(telco_1.Telco.Globacom));
}
// 9Mobile numbers
for (let i = 0; i < nineMobileCount; i++) {
numbers.push(TestDataGeneratorValidNumbers.generateValidNumberForTelco(telco_1.Telco.NineMobile));
}
// Other telcos
const otherTelcos = [telco_1.Telco.Smile, telco_1.Telco.Telewyz, telco_1.Telco.Mafab, telco_1.Telco.Visafone, telco_1.Telco.InterconnectClearinghouse, telco_1.Telco.Openskys];
for (let i = 0; i < otherCount; i++) {
const telco = chance.pickone(otherTelcos);
numbers.push(TestDataGeneratorValidNumbers.generateValidNumberForTelco(telco));
}
// Shuffle the array to mix telcos
return this.shuffleArray(numbers);
}
}
exports.TestDataGeneratorValidNumbers = TestDataGeneratorValidNumbers;