diff --git a/package.json b/package.json index 6f103173bc8..3146b70473d 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "@types/node": "~16.11.21", "@typescript-eslint/eslint-plugin": "~5.10.1", "@typescript-eslint/parser": "~5.10.1", + "@types/validator": "~13.7.1", "@vitest/ui": "~0.2.5", "c8": "~7.11.0", "conventional-changelog-cli": "~2.2.2", @@ -109,6 +110,7 @@ "typedoc": "~0.22.11", "typedoc-plugin-missing-exports": "~0.22.6", "typescript": "~4.5.5", + "validator": "~13.7.0", "vite": "~2.7.13", "vitepress": "~0.21.6", "vitest": "~0.2.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da3644f4fe7..70ac0bfa318 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2,6 +2,7 @@ lockfileVersion: 5.3 specifiers: '@types/node': ~16.11.21 + '@types/validator': ~13.7.1 '@typescript-eslint/eslint-plugin': ~5.10.1 '@typescript-eslint/parser': ~5.10.1 '@vitest/ui': ~0.2.5 @@ -24,12 +25,14 @@ specifiers: typedoc: ~0.22.11 typedoc-plugin-missing-exports: ~0.22.6 typescript: ~4.5.5 + validator: ~13.7.0 vite: ~2.7.13 vitepress: ~0.21.6 vitest: ~0.2.5 devDependencies: '@types/node': 16.11.21 + '@types/validator': 13.7.1 '@typescript-eslint/eslint-plugin': 5.10.1_5bb2413551d07429e4087fb9ca3ae3ea '@typescript-eslint/parser': 5.10.1_eslint@8.8.0+typescript@4.5.5 '@vitest/ui': 0.2.5 @@ -52,6 +55,7 @@ devDependencies: typedoc: 0.22.11_typescript@4.5.5 typedoc-plugin-missing-exports: 0.22.6_typedoc@0.22.11 typescript: 4.5.5 + validator: 13.7.0 vite: 2.7.13 vitepress: 0.21.6 vitest: 0.2.5_@vitest+ui@0.2.5+c8@7.11.0 @@ -370,6 +374,10 @@ packages: resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==} dev: true + /@types/validator/13.7.1: + resolution: {integrity: sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q==} + dev: true + /@types/yauzl/2.9.2: resolution: {integrity: sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==} requiresBuild: true @@ -4182,6 +4190,11 @@ packages: spdx-expression-parse: 3.0.1 dev: true + /validator/13.7.0: + resolution: {integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==} + engines: {node: '>= 0.10'} + dev: true + /verror/1.10.0: resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} engines: {'0': node >=0.6.0} diff --git a/src/internet.ts b/src/internet.ts index 2c663d5809f..7b74101f089 100644 --- a/src/internet.ts +++ b/src/internet.ts @@ -325,6 +325,8 @@ export class Internet { domainWord(): string { return (this.faker.word.adjective() + '-' + this.faker.word.noun()) .replace(/([\\~#&*{}/:<>?|\"'])/gi, '') + .replace(/\s/g, '-') + .replace(/-{2,}/g, '-') .toLowerCase(); } @@ -333,6 +335,7 @@ export class Internet { * * @method faker.internet.ip */ + // TODO @Shinigami92 2022-01-23: Add ipv4 alias ip(): string { const randNum = () => { return this.faker.datatype.number(255).toFixed(0); diff --git a/test/internet.spec.ts b/test/internet.spec.ts index e5002cd6b6d..783378665d0 100644 --- a/test/internet.spec.ts +++ b/test/internet.spec.ts @@ -1,7 +1,8 @@ import { describe, expect, it, vi } from 'vitest'; import { faker } from '../dist/cjs'; +import validator from 'validator'; -describe('internet.js', () => { +describe('internet', () => { describe('email()', () => { it('returns an email', () => { const spy_internet_userName = vi @@ -12,6 +13,7 @@ describe('internet.js', () => { const res = email.split('@')[0]; expect(res).toBe('Aiden.Harann55'); + expect(email).satisfy(validator.isEmail); spy_internet_userName.mockRestore(); }); @@ -25,28 +27,48 @@ describe('internet.js', () => { const res = email.split('@')[0]; expect(res).toBe('思源_唐3'); + expect(email).satisfy(validator.isEmail); spy_internet_userName.mockRestore(); }); + + it('email() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const email = faker.internet.email(); + + expect(email).satisfy(validator.isEmail); + } + }); }); - describe('exampleEmail', () => { + describe('exampleEmail()', () => { it('returns an email with the correct name', () => { const spy_internet_userName = vi .spyOn(faker.internet, 'userName') .mockReturnValue('Aiden.Harann55'); - const email = faker.internet.email('Aiden.Harann55'); + const email = faker.internet.exampleEmail('Aiden.Harann55'); const res = email.split('@')[0]; expect(res).toBe('Aiden.Harann55'); + expect(email).satisfy(validator.isEmail); spy_internet_userName.mockRestore(); }); it('uses the example.[org|com|net] host', () => { const email = faker.internet.exampleEmail(); + expect(email).match(/@example\.(org|com|net)$/); + expect(email).satisfy(validator.isEmail); + }); + + it('exampleEmail() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const email = faker.internet.exampleEmail(); + + expect(email).satisfy(validator.isEmail); + } }); }); @@ -100,10 +122,19 @@ describe('internet.js', () => { const domain_name = faker.internet.domainName(); expect(domain_name).toBe('bar.net'); + expect(domain_name).satisfy(validator.isFQDN); spy_internet_domainWord.mockRestore(); spy_internet_domainSuffix.mockRestore(); }); + + it('domainName() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const domainName = faker.internet.domainName(); + + expect(domainName).satisfy(validator.isFQDN); + } + }); }); describe('domainWord()', () => { @@ -136,11 +167,24 @@ describe('internet.js', () => { const domain_word = faker.internet.domainWord(); expect(domain_word).toBe('another-noun'); + expect(domain_word).satisfy((value) => + validator.isFQDN(value, { require_tld: false }) + ); spy_word_adjective.mockRestore(); spy_word_noun.mockRestore(); }); }); + + it('domainWord() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const domainWord = faker.internet.domainWord(); + + expect(domainWord).satisfy((value) => + validator.isFQDN(value, { require_tld: false }) + ); + } + }); }); describe('protocol()', () => { @@ -186,22 +230,51 @@ describe('internet.js', () => { describe('url()', () => { it('returns a valid url', () => { - vi.spyOn(faker.internet, 'protocol').mockReturnValue('http'); - vi.spyOn(faker.internet, 'domainWord').mockReturnValue('bar'); - vi.spyOn(faker.internet, 'domainSuffix').mockReturnValue('net'); + const spy_internet_protocol = vi + .spyOn(faker.internet, 'protocol') + .mockReturnValue('http'); + const spy_internet_domainWord = vi + .spyOn(faker.internet, 'domainWord') + .mockReturnValue('bar'); + const spy_internet_domainSuffix = vi + .spyOn(faker.internet, 'domainSuffix') + .mockReturnValue('net'); const url = faker.internet.url(); expect(url).toBeTruthy(); expect(url).toBe('http://bar.net'); + expect(url).satisfy(validator.isURL); + + spy_internet_protocol.mockRestore(); + spy_internet_domainWord.mockRestore(); + spy_internet_domainSuffix.mockRestore(); + }); + + it('url() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const url = faker.internet.url(); + + expect(url).satisfy(validator.isURL); + } }); }); describe('ip()', () => { - it('returns a random IP address with four parts', () => { + it('returns a random IPv4 address with four parts', () => { const ip = faker.internet.ip(); const parts = ip.split('.'); + expect(parts).toHaveLength(4); + expect(ip).satisfy(validator.isIP); + }); + + it('ip() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const ip = faker.internet.ip(); + + expect(ip).satisfy(validator.isIP); + } }); }); @@ -209,16 +282,36 @@ describe('internet.js', () => { it('returns a random IPv6 address with eight parts', () => { const ip = faker.internet.ipv6(); const parts = ip.split(':'); + expect(parts).toHaveLength(8); + expect(ip).satisfy(validator.isIP); + }); + + it('ipv6() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const ip = faker.internet.ipv6(); + + expect(ip).satisfy(validator.isIP); + } }); }); describe('port()', () => { it('returns a random port number', () => { const port = faker.internet.port(); + expect(Number.isInteger(port)).toBe(true); expect(port).greaterThanOrEqual(0); expect(port).lessThanOrEqual(65535); + expect(String(port)).satisfy(validator.isPort); + }); + + it('port() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const port = faker.internet.port(); + + expect(String(port)).satisfy(validator.isPort); + } }); }); @@ -240,7 +333,16 @@ describe('internet.js', () => { describe('color()', () => { it('returns a valid hex value (like #ffffff)', () => { const color = faker.internet.color(100, 100, 100); - expect(color).match(/^#[a-f0-9]{6}$/); + + expect(color).satisfy(validator.isHexColor); + }); + + it('color() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const color = faker.internet.color(); + + expect(color).satisfy(validator.isHexColor); + } }); }); @@ -267,5 +369,13 @@ describe('internet.js', () => { mac = faker.internet.mac('&'); expect(mac).match(/^([a-f0-9]{2}:){5}[a-f0-9]{2}$/); }); + + it('mac() to return valid values', () => { + for (let i = 0; i < 10000; i++) { + const mac = faker.internet.mac(); + + expect(mac).satisfy(validator.isMACAddress); + } + }); }); });