diff --git a/src/locales/el/finance/credit_card/discover.ts b/src/locales/el/finance/credit_card/discover.ts index 1010fae7e49..6b7bbb482ea 100644 --- a/src/locales/el/finance/credit_card/discover.ts +++ b/src/locales/el/finance/credit_card/discover.ts @@ -1,5 +1 @@ -export default [ - '/6011-####-####-###L/', - '/64[4-9]#-####-####-###L/', - '/65##-####-####-###L/', -]; +export default ['/6011-####-####-###L/', '/65##-####-####-###L/']; diff --git a/src/locales/en/finance/credit_card/diners_club.ts b/src/locales/en/finance/credit_card/diners_club.ts index b372913b820..b5eb693355b 100644 --- a/src/locales/en/finance/credit_card/diners_club.ts +++ b/src/locales/en/finance/credit_card/diners_club.ts @@ -1,5 +1 @@ -export default [ - '30[0-5]#-######-###L', - '36##-######-###L', - '54##-####-####-###L', -]; +export default ['30[0-5]#-######-###L', '36##-######-###L']; diff --git a/src/locales/en/finance/credit_card/discover.ts b/src/locales/en/finance/credit_card/discover.ts index d2b3ac18dbb..734723f8929 100644 --- a/src/locales/en/finance/credit_card/discover.ts +++ b/src/locales/en/finance/credit_card/discover.ts @@ -1,5 +1 @@ -export default [ - '6011-####-####-###L', - '64[4-9]#-####-####-###L', - '65##-####-####-###L', -]; +export default ['6011-####-####-###L', '65##-####-####-###L']; diff --git a/test/modules/finance.spec.ts b/test/modules/finance.spec.ts index d325f1b7813..d79bc79a060 100644 --- a/test/modules/finance.spec.ts +++ b/test/modules/finance.spec.ts @@ -1,6 +1,7 @@ import isCreditCard from 'validator/lib/isCreditCard'; +import isLuhnNumber from 'validator/lib/isLuhnNumber'; import { describe, expect, it } from 'vitest'; -import { faker, fakerZH_CN } from '../../src'; +import { allLocales, faker, fakerZH_CN } from '../../src'; import { FakerError } from '../../src/errors/faker-error'; import { BitcoinAddressFamily, @@ -597,3 +598,63 @@ describe('finance', () => { } ); }); + +describe('finance locale data', () => { + // Dedicated type for readability purposes + type KnownProvider = Exclude< + Parameters[1], + undefined + >['provider']; + + function getKnownProvider(value: string | undefined): KnownProvider { + // taken from definitions of validatorjs: + // https://github.com/validatorjs/validator.js/blob/72573b3d1d8ab2e6575e6bba1cbe2b01f95f4935/src/lib/isCreditCard.js#L4-L12 + const providers: Record = { + american_express: 'amex', + diners_club: 'dinersclub', + discover: 'discover', + jcb: 'jcb', + mastercard: 'mastercard', + unionpay: 'unionpay', + visa: 'visa', + }; + + const knownProvider = providers[value ?? '']; + if (knownProvider == null) { + throw new Error( + `Issuer "${value}" is not a known provider for validatorjs. Because of that the validity of it's patterns can not be verified.` + ); + } + + return knownProvider; + } + + const localesWithData = Object.entries(allLocales).filter( + ([, data]) => Object.keys(data.finance?.credit_card ?? {}).length > 0 + ); + describe.each(localesWithData)(`%s`, (_localeName, localeData) => { + describe('credit cards', () => { + describe('issuer', () => { + describe.each(Object.entries(localeData.finance?.credit_card ?? {}))( + '%s', + (issuerName, issuerPatterns) => { + function isCreditCardFromIssuer(value: string) { + return isCreditCard(value, { + provider: getKnownProvider(issuerName), + }); + } + + it.each(issuerPatterns)( + 'pattern "%s" should generate a valid credit card number', + (pattern) => { + const result = faker.finance.creditCardNumber(pattern); + expect(result).toSatisfy(isLuhnNumber); + expect(result).toSatisfy(isCreditCardFromIssuer); + } + ); + } + ); + }); + }); + }); +});