diff --git a/src/index.ts b/src/index.ts index 0f4b71ba591..d1c2cb1d63f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,6 +27,8 @@ export type { WordDefinitions, } from './definitions'; export type { FakerOptions, UsableLocale, UsedLocales } from './faker'; +export { Gender } from './name'; +export type { GenderType } from './name'; export { Faker }; // since we are requiring the top level of faker, load all locales by default diff --git a/src/name.ts b/src/name.ts index 6b7275692eb..8fac27c4462 100644 --- a/src/name.ts +++ b/src/name.ts @@ -1,5 +1,83 @@ import type { Faker } from '.'; +export enum Gender { + female = 'female', + male = 'male', +} + +// TODO @Shinigami92 21-03-2022: Remove 0 and 1 in v7 +export type GenderType = 'female' | 'male' | 0 | 1; + +/** + * Normalize gender. + * + * @param gender Gender. + * @returns Normalized gender. + */ +function normalizeGender( + gender?: GenderType +): Exclude | undefined { + if (gender == null || typeof gender === 'string') { + // TODO @Shinigami92 21-03-2022: Cast can be removed when we set `strict: true` + return gender as Exclude; + } + + const normalizedGender = gender === 0 ? 'male' : 'female'; + + console.warn( + `Deprecation Warning: Please use '${normalizedGender}' for gender instead of ${gender}` + ); + + return normalizedGender; +} + +/** + * Select a definition based on given gender. + * + * @param faker Faker instance. + * @param gender Gender. + * @param param2 Definitions. + * @param param2.generic Non-gender definitions. + * @param param2.female Female definitions. + * @param param2.male Male definitions. + * @returns Definition based on given gender. + */ +function selectDefinition( + faker: Faker, + gender: GenderType | undefined, + // TODO christopher 21-03-2022: Remove fallback empty object when `strict: true` + { + generic, + female, + male, + }: { generic?: string[]; female?: string[]; male?: string[] } = {} +) { + const normalizedGender = normalizeGender(gender); + + let values: string[] | undefined; + switch (normalizedGender) { + case 'female': + values = female; + break; + case 'male': + values = male; + break; + default: + values = generic; + break; + } + + if (values == null) { + if (female != null && male != null) { + values = faker.random.arrayElement([female, male]); + } else { + values = generic; + } + } + + return faker.random.arrayElement(values); +} + /** * Module to generate people's names and titles. */ @@ -18,131 +96,66 @@ export class Name { * Returns a random first name. * * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.firstName() // 'Antwan' * faker.name.firstName("female") // 'Victoria' - * faker.name.firstName(1) // 'Ashley' * faker.name.firstName("male") // 'Tom' - * faker.name.firstName(0) // 'Ismael' */ - firstName(gender?: string | number): string { - if ( - typeof this.faker.definitions.name.male_first_name !== 'undefined' && - typeof this.faker.definitions.name.female_first_name !== 'undefined' - ) { - // some locale datasets ( like ru ) have first_name split by gender. since the name.first_name field does not exist in these datasets, - // we must randomly pick a name from either gender array so faker.name.firstName will return the correct locale data ( and not fallback ) - - if (typeof gender === 'string') { - if (gender.toLowerCase() === 'male') { - gender = 0; - } else if (gender.toLowerCase() === 'female') { - gender = 1; - } - } - - if (typeof gender !== 'number') { - if (typeof this.faker.definitions.name.first_name === 'undefined') { - gender = this.faker.datatype.number(1); - } else { - // Fall back to non-gendered names if they exist and gender wasn't specified - return this.faker.random.arrayElement( - this.faker.definitions.name.first_name - ); - } - } - if (gender === 0) { - return this.faker.random.arrayElement( - this.faker.definitions.name.male_first_name - ); - } else { - return this.faker.random.arrayElement( - this.faker.definitions.name.female_first_name - ); - } - } + firstName(gender?: GenderType): string { + const { first_name, female_first_name, male_first_name } = + this.faker.definitions.name; - return this.faker.random.arrayElement( - this.faker.definitions.name.first_name - ); + return selectDefinition(this.faker, gender, { + generic: first_name, + female: female_first_name, + male: male_first_name, + }); } /** * Returns a random last name. * * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.lastName() // 'Hauck' * faker.name.lastName("female") // 'Grady' - * faker.name.lastName(1) // 'Kshlerin' * faker.name.lastName("male") // 'Barton' - * faker.name.lastName(0) // 'Lockman' */ - lastName(gender?: string | number): string { - if ( - typeof this.faker.definitions.name.male_last_name !== 'undefined' && - typeof this.faker.definitions.name.female_last_name !== 'undefined' - ) { - // some locale datasets ( like ru ) have last_name split by gender. i have no idea how last names can have genders, but also i do not speak russian - // see above comment of firstName method - if (typeof gender !== 'number') { - gender = this.faker.datatype.number(1); - } - if (gender === 0) { - return this.faker.random.arrayElement( - this.faker.locales[this.faker.locale].name.male_last_name - ); - } else { - return this.faker.random.arrayElement( - this.faker.locales[this.faker.locale].name.female_last_name - ); - } - } + lastName(gender?: GenderType): string { + const { last_name, female_last_name, male_last_name } = + this.faker.definitions.name; - return this.faker.random.arrayElement( - this.faker.definitions.name.last_name - ); + return selectDefinition(this.faker, gender, { + generic: last_name, + female: female_last_name, + male: male_last_name, + }); } /** * Returns a random middle name. * * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.middleName() // 'Доброславівна' * faker.name.middleName("female") // 'Анастасівна' - * faker.name.middleName(1) // 'Анатоліївна' * faker.name.middleName("male") // 'Вікторович' - * faker.name.middleName(0) // 'Стефанович' */ - middleName(gender?: string | number): string { - if ( - typeof this.faker.definitions.name.male_middle_name !== 'undefined' && - typeof this.faker.definitions.name.female_middle_name !== 'undefined' - ) { - if (typeof gender !== 'number') { - gender = this.faker.datatype.number(1); - } - if (gender === 0) { - return this.faker.random.arrayElement( - this.faker.definitions.name.male_middle_name - ); - } else { - return this.faker.random.arrayElement( - this.faker.definitions.name.female_middle_name - ); - } - } + middleName(gender?: GenderType): string { + const { middle_name, female_middle_name, male_middle_name } = + this.faker.definitions.name; - return this.faker.random.arrayElement( - this.faker.definitions.name.middle_name - ); + return selectDefinition(this.faker, gender, { + generic: middle_name, + female: female_middle_name, + male: male_middle_name, + }); } /** @@ -151,35 +164,29 @@ export class Name { * @param firstName The optional first name to use. If not specified a random one will be chosen. * @param lastName The optional last name to use. If not specified a random one will be chosen. * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.findName() // 'Allen Brown' * faker.name.findName('Joann') // 'Joann Osinski' - * faker.name.findName('Marcella', '', 1) // 'Mrs. Marcella Huels' + * faker.name.findName('Marcella', '', 'female') // 'Mrs. Marcella Huels' * faker.name.findName(undefined, 'Beer') // 'Mr. Alfonso Beer' - * faker.name.findName(undefined, undefined, 0) // 'Fernando Schaefer' + * faker.name.findName(undefined, undefined, 'male') // 'Fernando Schaefer' */ - findName( - firstName?: string, - lastName?: string, - gender?: string | number - ): string { - const r = this.faker.datatype.number(8); + findName(firstName?: string, lastName?: string, gender?: GenderType): string { + const variant = this.faker.datatype.number(8); let prefix = ''; let suffix = ''; - // in particular locales first and last names split by gender, - // thus we keep consistency by passing 0 as male and 1 as female - - if (typeof gender !== 'number') { - gender = this.faker.datatype.number(1); - } + const normalizedGender: Exclude = + normalizeGender(gender) ?? + this.faker.random.arrayElement(['female', 'male']); - firstName = firstName || this.faker.name.firstName(gender); - lastName = lastName || this.faker.name.lastName(gender); + firstName = firstName || this.faker.name.firstName(normalizedGender); + lastName = lastName || this.faker.name.lastName(normalizedGender); - switch (r) { + switch (variant) { + // TODO christopher 21-03-2022: Add possibility to have a prefix together with a suffix case 0: prefix = this.faker.name.prefix(gender); if (prefix) { @@ -197,22 +204,6 @@ export class Name { return firstName + ' ' + lastName; } - /** - * Generates a random job title. - * - * @example - * faker.name.jobTitle() // 'Global Accounts Engineer' - */ - jobTitle(): string { - return ( - this.faker.name.jobDescriptor() + - ' ' + - this.faker.name.jobArea() + - ' ' + - this.faker.name.jobType() - ); - } - /** * Return a random gender. * @@ -227,44 +218,30 @@ export class Name { return this.faker.random.arrayElement( this.faker.definitions.name.binary_gender ); - } else { - return this.faker.random.arrayElement(this.faker.definitions.name.gender); } + + return this.faker.random.arrayElement(this.faker.definitions.name.gender); } /** * Returns a random name prefix. * * @param gender The optional gender to use. - * Can be either `'male'` (or `0`) or `'female'` (or `1`). + * Can be either `'female'` or `'male'`. * * @example * faker.name.prefix() // 'Miss' * faker.name.prefix('female') // 'Ms.' - * faker.name.prefix(1) // 'Dr.' * faker.name.prefix('male') // 'Mr.' - * faker.name.prefix(0) // 'Mr.' */ - prefix(gender?: string | number): string { - if ( - typeof this.faker.definitions.name.male_prefix !== 'undefined' && - typeof this.faker.definitions.name.female_prefix !== 'undefined' - ) { - if (typeof gender !== 'number') { - gender = this.faker.datatype.number(1); - } - if (gender === 0) { - return this.faker.random.arrayElement( - this.faker.locales[this.faker.locale].name.male_prefix - ); - } else { - return this.faker.random.arrayElement( - this.faker.locales[this.faker.locale].name.female_prefix - ); - } - } + prefix(gender?: GenderType): string { + const { prefix, female_prefix, male_prefix } = this.faker.definitions.name; - return this.faker.random.arrayElement(this.faker.definitions.name.prefix); + return selectDefinition(this.faker, gender, { + generic: prefix, + female: female_prefix, + male: male_prefix, + }); } /** @@ -274,6 +251,7 @@ export class Name { * faker.name.suffix() // 'DDS' */ suffix(): string { + // TODO christopher 21-03-2022: Add female_suffix and male_suffix return this.faker.random.arrayElement(this.faker.definitions.name.suffix); } @@ -297,6 +275,22 @@ export class Name { return descriptor + ' ' + level + ' ' + job; } + /** + * Generates a random job title. + * + * @example + * faker.name.jobTitle() // 'Global Accounts Engineer' + */ + jobTitle(): string { + return ( + this.faker.name.jobDescriptor() + + ' ' + + this.faker.name.jobArea() + + ' ' + + this.faker.name.jobType() + ); + } + /** * Generates a random job descriptor. * diff --git a/test/helpers.spec.ts b/test/helpers.spec.ts index 64c12df5d7d..cbb541c169e 100644 --- a/test/helpers.spec.ts +++ b/test/helpers.spec.ts @@ -63,7 +63,7 @@ const seededRuns = [ name: 'Weissnat, Wintheiser and MacGyver', }, email: 'Isabel5@gmail.com', - name: 'Lorene Deckow', + name: 'Darnell Deckow', phone: '559.640.8661', posts: [ { @@ -138,7 +138,7 @@ const seededRuns = [ name: 'Langworth - Wyman', }, email: 'Isabel5@gmail.com', - name: 'Lorene Deckow', + name: 'Darnell Deckow', phone: '225-631-0293 x240', username: 'Moses_Satterfield', website: 'sparse-ottoman.biz', @@ -213,7 +213,7 @@ const seededRuns = [ name: 'Armstrong, Smitham and Renner', }, email: 'Darron.Larson@gmail.com', - name: 'Marilyn Effertz', + name: 'Eugene Effertz', phone: '818-698-6199 x848', posts: [ { @@ -287,7 +287,7 @@ const seededRuns = [ name: 'Daugherty - Connelly', }, email: 'Darron.Larson@gmail.com', - name: 'Marilyn Effertz', + name: 'Eugene Effertz', phone: '803.543.5573 x1428', username: 'Dudley.Littel', website: 'queasy-guide.info', @@ -362,7 +362,7 @@ const seededRuns = [ name: 'Jacobi and Sons', }, email: 'Marlen.Effertz35@gmail.com', - name: 'Darrel Sanford', + name: 'Henrietta Sanford', phone: '621-735-9398', posts: [ { @@ -436,7 +436,7 @@ const seededRuns = [ name: 'Fahey LLC', }, email: 'Marlen.Effertz35@gmail.com', - name: 'Darrel Sanford', + name: 'Henrietta Sanford', phone: '469.570.3390', username: 'Dangelo.Christiansen67', website: 'mild-hearth.org', diff --git a/test/name.spec.ts b/test/name.spec.ts index 2b8e9f0a304..7572b3d6ab1 100644 --- a/test/name.spec.ts +++ b/test/name.spec.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { faker } from '../src'; const seededRuns = [ @@ -12,10 +12,10 @@ const seededRuns = [ noArgs: 'Hintz', }, middleName: { - noArgs: 'Owen', + noArgs: 'Greer', }, findName: { - noArgs: 'Lorene Deckow', + noArgs: 'Darnell Deckow', }, jobTitle: { noArgs: 'Regional Data Representative', @@ -53,10 +53,10 @@ const seededRuns = [ noArgs: 'Gibson', }, middleName: { - noArgs: 'Kenji', + noArgs: 'Dakota', }, findName: { - noArgs: 'Marilyn Effertz', + noArgs: 'Eugene Effertz', }, jobTitle: { noArgs: 'Future Infrastructure Liaison', @@ -94,10 +94,10 @@ const seededRuns = [ noArgs: 'Ward', }, middleName: { - noArgs: 'Isla', + noArgs: 'Sawyer', }, findName: { - noArgs: 'Darrel Sanford', + noArgs: 'Henrietta Sanford', }, jobTitle: { noArgs: 'Chief Division Agent', @@ -147,6 +147,7 @@ const functionNames = [ describe('name', () => { afterEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); for (const { seed, expectations } of seededRuns) { @@ -172,6 +173,7 @@ describe('name', () => { describe('firstName()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a random first name', () => { @@ -182,23 +184,47 @@ describe('name', () => { }); it('should return a gender-specific first name when passed a number', () => { + const spy = vi.spyOn(console, 'warn'); + let name = faker.name.firstName(0); expect(faker.definitions.name.male_first_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'male' for gender instead of 0` + ); + name = faker.name.firstName(1); expect(faker.definitions.name.female_first_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'female' for gender instead of 1` + ); + + spy.mockRestore(); }); it('should return a gender-specific first name when passed a string', () => { - let name = faker.name.firstName('male'); - expect(faker.definitions.name.male_first_name).toContain(name); - name = faker.name.firstName('female'); + let name = faker.name.firstName('female'); expect(faker.definitions.name.female_first_name).toContain(name); + + name = faker.name.firstName('male'); + expect(faker.definitions.name.male_first_name).toContain(name); + }); + + it('should return a gender-specific first name when no gender-specific first name was defined', () => { + faker.locale = 'az'; + faker.localeFallback = 'az'; + + const name = faker.name.firstName(); + expect([ + ...faker.definitions.name.female_first_name, + ...faker.definitions.name.male_first_name, + ]).toContain(name); }); }); describe('lastName()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a random last name', () => { @@ -211,29 +237,38 @@ describe('name', () => { it('should return a gender-specific last name when passed a number', () => { faker.locale = 'az'; + const spy = vi.spyOn(console, 'warn'); + let name = faker.name.lastName(0); expect(faker.definitions.name.male_last_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'male' for gender instead of 0` + ); + name = faker.name.lastName(1); expect(faker.definitions.name.female_last_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'female' for gender instead of 1` + ); + + spy.mockRestore(); }); - // TODO @Shinigami92 2022-01-30: There is a bug: https://github.com/faker-js/faker/issues/373 - it.todo( - 'should return a gender-specific last name when passed a string', - () => { - faker.locale = 'az'; + it('should return a gender-specific last name when passed a string', () => { + faker.locale = 'az'; - let name = faker.name.lastName('male'); - expect(faker.definitions.name.male_last_name).toContain(name); - name = faker.name.lastName('female'); - expect(faker.definitions.name.female_last_name).toContain(name); - } - ); + let name = faker.name.lastName('female'); + expect(faker.definitions.name.female_last_name).toContain(name); + + name = faker.name.lastName('male'); + expect(faker.definitions.name.male_last_name).toContain(name); + }); }); describe('middleName()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a random middle name', () => { @@ -243,42 +278,54 @@ describe('name', () => { expect(middle_name.length).greaterThan(0); }); - it.todo('should return a middle name when passed en locale', () => { + it('should return a middle name when passed en locale', () => { faker.locale = 'en'; let name = faker.name.middleName(); expect(faker.definitions.name.middle_name).toContain(name); - name = faker.name.middleName(0); - expect(faker.definitions.name.male_middle_name).toContain(name); - name = faker.name.middleName(1); + + name = faker.name.middleName('female'); expect(faker.definitions.name.female_middle_name).toContain(name); + + name = faker.name.middleName('male'); + expect(faker.definitions.name.male_middle_name).toContain(name); }); it('should return a gender-specific middle name when passed a number', () => { + const spy = vi.spyOn(console, 'warn'); + faker.locale = 'uk'; let name = faker.name.middleName(0); expect(faker.definitions.name.male_middle_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'male' for gender instead of 0` + ); + name = faker.name.middleName(1); expect(faker.definitions.name.female_middle_name).toContain(name); + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'female' for gender instead of 1` + ); + + spy.mockRestore(); }); - it.todo( - 'should return a gender-specific middle name when passed a string', - () => { - faker.locale = 'uk'; + it('should return a gender-specific middle name when passed a string', () => { + faker.locale = 'uk'; + + let name = faker.name.middleName('female'); + expect(faker.definitions.name.female_middle_name).toContain(name); - let name = faker.name.middleName('male'); - expect(faker.definitions.name.male_middle_name).toContain(name); - name = faker.name.middleName('female'); - expect(faker.definitions.name.female_middle_name).toContain(name); - } - ); + name = faker.name.middleName('male'); + expect(faker.definitions.name.male_middle_name).toContain(name); + }); }); describe('findName()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a name with firstName and lastName', () => { @@ -288,24 +335,6 @@ describe('name', () => { expect(fullName).toContain(' '); }); - it('should return a male gender-specific name with firstName and lastName', () => { - faker.locale = 'mk'; - - const male_specific = [ - ...faker.definitions.name.male_prefix, - ...faker.definitions.name.male_first_name, - ...faker.definitions.name.male_last_name, - ...faker.definitions.name.suffix, - ]; - - const fullName = faker.name.findName(undefined, undefined, 0); - - const parts = fullName.split(' '); - for (const part of parts) { - expect(male_specific).toContain(part); - } - }); - it('should return a female gender-specific name with firstName and lastName', () => { faker.locale = 'mk'; @@ -316,7 +345,7 @@ describe('name', () => { ...faker.definitions.name.suffix, ]; - const fullName = faker.name.findName(undefined, undefined, 1); + const fullName = faker.name.findName(undefined, undefined, 'female'); const parts = fullName.split(' '); for (const part of parts) { @@ -324,17 +353,17 @@ describe('name', () => { } }); - it('should return a male gender-specific name with given firstName and lastName', () => { + it('should return a male gender-specific name with firstName and lastName', () => { faker.locale = 'mk'; const male_specific = [ ...faker.definitions.name.male_prefix, - 'firstName', - 'lastName', + ...faker.definitions.name.male_first_name, + ...faker.definitions.name.male_last_name, ...faker.definitions.name.suffix, ]; - const fullName = faker.name.findName('firstName', 'lastName', 0); + const fullName = faker.name.findName(undefined, undefined, 'male'); const parts = fullName.split(' '); for (const part of parts) { @@ -352,36 +381,41 @@ describe('name', () => { ...faker.definitions.name.suffix, ]; - const fullName = faker.name.findName('firstName', 'lastName', 1); + const fullName = faker.name.findName( + 'firstName', + 'lastName', + 'female' + ); const parts = fullName.split(' '); for (const part of parts) { expect(male_specific).toContain(part); } }); - }); - - describe('jobTitle()', () => { - beforeEach(() => { - faker.locale = 'en'; - }); - it('should return a job title consisting of a descriptor, area, and type', () => { - const jobTitle = faker.name.jobTitle(); + it('should return a male gender-specific name with given firstName and lastName', () => { + faker.locale = 'mk'; - expect(jobTitle).toBeTypeOf('string'); + const male_specific = [ + ...faker.definitions.name.male_prefix, + 'firstName', + 'lastName', + ...faker.definitions.name.suffix, + ]; - const [descriptor, level, job] = jobTitle.split(' '); + const fullName = faker.name.findName('firstName', 'lastName', 'male'); - expect(faker.definitions.name.title.descriptor).toContain(descriptor); - expect(faker.definitions.name.title.level).toContain(level); - expect(faker.definitions.name.title.job).toContain(job); + const parts = fullName.split(' '); + for (const part of parts) { + expect(male_specific).toContain(part); + } }); }); describe('gender()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a default gender', () => { @@ -402,6 +436,7 @@ describe('name', () => { describe('prefix()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a prefix', () => { @@ -411,17 +446,16 @@ describe('name', () => { expect(faker.definitions.name.prefix).toContain(prefix); }); - it('should return a male prefix', () => { + it('should return a female prefix with given string', () => { faker.locale = 'mk'; - const prefix = faker.name.prefix(0); + const prefix = faker.name.prefix('female'); expect(prefix).toBeTypeOf('string'); - expect(faker.definitions.name.male_prefix).toContain(prefix); + expect(faker.definitions.name.female_prefix).toContain(prefix); }); - // TODO @Shinigami92 2022-01-31: There is a bug: https://github.com/faker-js/faker/issues/373 - it.todo('should return a male prefix with given string', () => { + it('should return a male prefix with given string', () => { faker.locale = 'mk'; const prefix = faker.name.prefix('male'); @@ -430,29 +464,45 @@ describe('name', () => { expect(faker.definitions.name.male_prefix).toContain(prefix); }); - it('should return a female prefix', () => { + it('should return a male prefix with given number', () => { + const spy = vi.spyOn(console, 'warn'); + faker.locale = 'mk'; - const prefix = faker.name.prefix(1); + const prefix = faker.name.prefix(0); expect(prefix).toBeTypeOf('string'); - expect(faker.definitions.name.female_prefix).toContain(prefix); + expect(faker.definitions.name.male_prefix).toContain(prefix); + + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'male' for gender instead of 0` + ); + + spy.mockRestore(); }); - // TODO @Shinigami92 2022-01-31: There is a bug: https://github.com/faker-js/faker/issues/373 - it.todo('should return a female prefix with given string', () => { + it('should return a female prefix with given number', () => { + const spy = vi.spyOn(console, 'warn'); + faker.locale = 'mk'; - const prefix = faker.name.prefix('female'); + const prefix = faker.name.prefix(1); expect(prefix).toBeTypeOf('string'); expect(faker.definitions.name.female_prefix).toContain(prefix); + + expect(spy).toHaveBeenCalledWith( + `Deprecation Warning: Please use 'female' for gender instead of 1` + ); + + spy.mockRestore(); }); }); describe('suffix()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a suffix', () => { @@ -466,6 +516,7 @@ describe('name', () => { describe('title()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a title consisting of a descriptor, area, and type', () => { @@ -482,9 +533,29 @@ describe('name', () => { }); }); + describe('jobTitle()', () => { + beforeEach(() => { + faker.locale = 'en'; + faker.localeFallback = 'en'; + }); + + it('should return a job title consisting of a descriptor, area, and type', () => { + const jobTitle = faker.name.jobTitle(); + + expect(jobTitle).toBeTypeOf('string'); + + const [descriptor, level, job] = jobTitle.split(' '); + + expect(faker.definitions.name.title.descriptor).toContain(descriptor); + expect(faker.definitions.name.title.level).toContain(level); + expect(faker.definitions.name.title.job).toContain(job); + }); + }); + describe('jobDescriptor()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a descriptor', () => { @@ -499,6 +570,7 @@ describe('name', () => { describe('jobArea()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a level', () => { @@ -513,6 +585,7 @@ describe('name', () => { describe('jobType()', () => { beforeEach(() => { faker.locale = 'en'; + faker.localeFallback = 'en'; }); it('should return a job', () => {