|
1 | 1 | import isCreditCard from 'validator/lib/isCreditCard';
|
| 2 | +import isLuhnNumber from 'validator/lib/isLuhnNumber'; |
2 | 3 | import { describe, expect, it } from 'vitest';
|
3 |
| -import { faker, fakerZH_CN } from '../../src'; |
| 4 | +import { allLocales, faker, fakerZH_CN } from '../../src'; |
4 | 5 | import { FakerError } from '../../src/errors/faker-error';
|
5 | 6 | import {
|
6 | 7 | BitcoinAddressFamily,
|
@@ -597,3 +598,63 @@ describe('finance', () => {
|
597 | 598 | }
|
598 | 599 | );
|
599 | 600 | });
|
| 601 | + |
| 602 | +describe('finance locale data', () => { |
| 603 | + // Dedicated type for readability purposes |
| 604 | + type KnownProvider = Exclude< |
| 605 | + Parameters<typeof isCreditCard>[1], |
| 606 | + undefined |
| 607 | + >['provider']; |
| 608 | + |
| 609 | + function getKnownProvider(value: string | undefined): KnownProvider { |
| 610 | + // taken from definitions of validatorjs: |
| 611 | + // https://github.com/validatorjs/validator.js/blob/72573b3d1d8ab2e6575e6bba1cbe2b01f95f4935/src/lib/isCreditCard.js#L4-L12 |
| 612 | + const providers: Record<string, KnownProvider> = { |
| 613 | + american_express: 'amex', |
| 614 | + diners_club: 'dinersclub', |
| 615 | + discover: 'discover', |
| 616 | + jcb: 'jcb', |
| 617 | + mastercard: 'mastercard', |
| 618 | + unionpay: 'unionpay', |
| 619 | + visa: 'visa', |
| 620 | + }; |
| 621 | + |
| 622 | + const knownProvider = providers[value ?? '']; |
| 623 | + if (knownProvider == null) { |
| 624 | + throw new Error( |
| 625 | + `Issuer "${value}" is not a known provider for validatorjs. Because of that the validity of it's patterns can not be verified.` |
| 626 | + ); |
| 627 | + } |
| 628 | + |
| 629 | + return knownProvider; |
| 630 | + } |
| 631 | + |
| 632 | + const localesWithData = Object.entries(allLocales).filter( |
| 633 | + ([, data]) => Object.keys(data.finance?.credit_card ?? {}).length > 0 |
| 634 | + ); |
| 635 | + describe.each(localesWithData)(`%s`, (_localeName, localeData) => { |
| 636 | + describe('credit cards', () => { |
| 637 | + describe('issuer', () => { |
| 638 | + describe.each(Object.entries(localeData.finance?.credit_card ?? {}))( |
| 639 | + '%s', |
| 640 | + (issuerName, issuerPatterns) => { |
| 641 | + function isCreditCardFromIssuer(value: string) { |
| 642 | + return isCreditCard(value, { |
| 643 | + provider: getKnownProvider(issuerName), |
| 644 | + }); |
| 645 | + } |
| 646 | + |
| 647 | + it.each(issuerPatterns)( |
| 648 | + 'pattern "%s" should generate a valid credit card number', |
| 649 | + (pattern) => { |
| 650 | + const result = faker.finance.creditCardNumber(pattern); |
| 651 | + expect(result).toSatisfy(isLuhnNumber); |
| 652 | + expect(result).toSatisfy(isCreditCardFromIssuer); |
| 653 | + } |
| 654 | + ); |
| 655 | + } |
| 656 | + ); |
| 657 | + }); |
| 658 | + }); |
| 659 | + }); |
| 660 | +}); |
0 commit comments