Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support locale definitions directly from faker.fake #884

Merged
merged 3 commits into from
May 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions src/modules/fake/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,29 @@ export class Fake {
// split the method into module and function
const parts = method.split('.');

if (this.faker[parts[0]] == null) {
throw new FakerError(`Invalid module: ${parts[0]}`);
let currentModuleOrMethod: unknown = this.faker;
let currentDefinitions: unknown = this.faker.definitions;

// Search for the requested method or definition
for (const part of parts) {
currentModuleOrMethod = currentModuleOrMethod?.[part];
currentDefinitions = currentDefinitions?.[part];
}

if (this.faker[parts[0]][parts[1]] == null) {
throw new FakerError(`Invalid method: ${parts[0]}.${parts[1]}`);
// Make method executable
let fn: (args?: unknown) => unknown;
if (typeof currentModuleOrMethod === 'function') {
fn = currentModuleOrMethod as (args?: unknown) => unknown;
} else if (Array.isArray(currentDefinitions)) {
fn = () =>
this.faker.helpers.arrayElement(currentDefinitions as unknown[]);
} else {
throw new FakerError(`Invalid module method or definition: ${method}
- faker.${method} is not a function
- faker.definitions.${method} is not an array`);
}

// assign the function from the module.function namespace
let fn: (args?: unknown) => string = this.faker[parts[0]][parts[1]];
fn = fn.bind(this);

// If parameters are populated here, they are always going to be of string type
Expand Down
36 changes: 34 additions & 2 deletions test/fake.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,52 @@ describe('fake', () => {

it('does not allow invalid module name', () => {
expect(() => faker.fake('{{foo.bar}}')).toThrowError(
new FakerError('Invalid module: foo')
new FakerError(`Invalid module method or definition: foo.bar
- faker.foo.bar is not a function
- faker.definitions.foo.bar is not an array`)
);
});

it('does not allow missing method name', () => {
expect(() => faker.fake('{{address}}')).toThrowError(
new FakerError(`Invalid module method or definition: address
- faker.address is not a function
- faker.definitions.address is not an array`)
);
});

it('does not allow invalid method name', () => {
expect(() => faker.fake('{{address.foo}}')).toThrowError(
new FakerError('Invalid method: address.foo')
new FakerError(`Invalid module method or definition: address.foo
- faker.address.foo is not a function
- faker.definitions.address.foo is not an array`)
);
});

it('does not allow invalid definitions data', () => {
expect(() => faker.fake('{{finance.credit_card}}')).toThrowError(
new FakerError(`Invalid module method or definition: finance.credit_card
- faker.finance.credit_card is not a function
- faker.definitions.finance.credit_card is not an array`)
);
});

it('should be able to return empty strings', () => {
expect(faker.fake('{{helpers.repeatString}}')).toBe('');
});

it('should be able to return locale definition strings', () => {
expect(faker.definitions.cell_phone.formats).toContain(
faker.fake('{{cell_phone.formats}}')
);
});

it('should be able to return locale definition strings that starts with the name of an existing module', () => {
expect(faker.definitions.address.city_name).toContain(
faker.fake('{{address.city_name}}')
);
});

it('should be able to handle only {{ brackets', () => {
expect(faker.fake('{{hello')).toBe('{{hello');
expect(faker.fake('hello{{')).toBe('hello{{');
Expand Down