hey-api-builders
Version:
A custom plugin for @hey-api/openapi-ts that generates mock data builders with a lightweight custom runtime, Zod integration, or static mock generation.
192 lines • 9.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const vitest_1 = require("vitest");
const builder_generator_1 = require("./builder-generator");
(0, vitest_1.describe)('Builder Generator', () => {
(0, vitest_1.describe)('generateEnumBuilder', () => {
const enumMeta = {
typeName: 'Status',
constName: 'StatusSchema',
isEnum: true,
schema: { enum: ['active', 'inactive'] },
isObject: false,
};
(0, vitest_1.it)('generates basic enum builder structure', () => {
const result = (0, builder_generator_1.generateEnumBuilder)(enumMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('export class StatusBuilder');
(0, vitest_1.expect)(result).toContain('private options: BuilderOptions');
(0, vitest_1.expect)(result).toContain('setOptions(o: BuilderOptions)');
(0, vitest_1.expect)(result).toContain('build(): types.Status');
});
(0, vitest_1.it)('generates custom runtime build method by default', () => {
const result = (0, builder_generator_1.generateEnumBuilder)(enumMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('generateMock');
(0, vitest_1.expect)(result).toContain('schemas.StatusSchema');
(0, vitest_1.expect)(result).toContain('useDefault');
(0, vitest_1.expect)(result).toContain('useExamples');
});
(0, vitest_1.it)('generates static mock build method when mockStrategy is static', () => {
const result = (0, builder_generator_1.generateEnumBuilder)(enumMeta, {
mockStrategy: 'static',
});
(0, vitest_1.expect)(result).not.toContain('generateMock');
(0, vitest_1.expect)(result).toContain('return');
(0, vitest_1.expect)(result).toContain('as types.Status');
});
(0, vitest_1.it)('generates Zod build method when mockStrategy is zod', () => {
const result = (0, builder_generator_1.generateEnumBuilder)(enumMeta, {
mockStrategy: 'zod',
});
(0, vitest_1.expect)(result).toContain('generateMockFromZodSchema');
(0, vitest_1.expect)(result).toContain('zodSchemaString');
(0, vitest_1.expect)(result).toContain('useDefault');
(0, vitest_1.expect)(result).toContain('alwaysIncludeOptionals');
});
(0, vitest_1.it)('includes all builder option properties', () => {
const result = (0, builder_generator_1.generateEnumBuilder)(enumMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('useDefault');
(0, vitest_1.expect)(result).toContain('useExamples');
(0, vitest_1.expect)(result).toContain('alwaysIncludeOptionals');
(0, vitest_1.expect)(result).toContain('optionalsProbability');
(0, vitest_1.expect)(result).toContain('omitNulls');
});
});
(0, vitest_1.describe)('generateObjectBuilder', () => {
const objectMeta = {
typeName: 'User',
constName: 'UserSchema',
isEnum: false,
schema: {
type: 'object',
properties: {
name: { type: 'string' },
email: { type: 'string', format: 'email' },
age: { type: 'number' },
},
required: ['name', 'email'],
},
isObject: true,
};
(0, vitest_1.it)('generates basic object builder structure', () => {
const result = (0, builder_generator_1.generateObjectBuilder)(objectMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('export class UserBuilder');
(0, vitest_1.expect)(result).toContain('private overrides: Partial<types.User>');
(0, vitest_1.expect)(result).toContain('private options: BuilderOptions');
(0, vitest_1.expect)(result).toContain('build(): types.User');
});
(0, vitest_1.it)('generates with methods for properties', () => {
const result = (0, builder_generator_1.generateObjectBuilder)(objectMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('withName');
(0, vitest_1.expect)(result).toContain('withEmail');
(0, vitest_1.expect)(result).toContain('withAge');
});
(0, vitest_1.it)('generates runtime build method with override merging', () => {
const result = (0, builder_generator_1.generateObjectBuilder)(objectMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('const mock = generateMock');
(0, vitest_1.expect)(result).toContain('for (const k in this.overrides)');
(0, vitest_1.expect)(result).toContain('Object.prototype.hasOwnProperty.call');
(0, vitest_1.expect)(result).toContain('return mock');
});
(0, vitest_1.it)('generates static mock build method when mockStrategy is static', () => {
const result = (0, builder_generator_1.generateObjectBuilder)(objectMeta, {
mockStrategy: 'static',
});
(0, vitest_1.expect)(result).toContain('const baseMock =');
(0, vitest_1.expect)(result).toContain('{ ...baseMock, ...this.overrides }');
(0, vitest_1.expect)(result).not.toContain('generateMock');
});
(0, vitest_1.it)('generates Zod build method when mockStrategy is zod', () => {
const result = (0, builder_generator_1.generateObjectBuilder)(objectMeta, {
mockStrategy: 'zod',
});
(0, vitest_1.expect)(result).toContain('generateMockFromZodSchema');
(0, vitest_1.expect)(result).toContain('this.overrides');
(0, vitest_1.expect)(result).not.toContain('for (const k in this.overrides)');
});
(0, vitest_1.it)('handles objects without properties', () => {
const emptyMeta = {
typeName: 'Empty',
constName: 'EmptySchema',
isEnum: false,
schema: { type: 'object' },
isObject: true,
};
const result = (0, builder_generator_1.generateObjectBuilder)(emptyMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('export class EmptyBuilder');
(0, vitest_1.expect)(result).toContain('build(): types.Empty');
});
(0, vitest_1.it)('preserves type safety in generated code', () => {
const result = (0, builder_generator_1.generateObjectBuilder)(objectMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('types.User');
(0, vitest_1.expect)(result).toContain('Partial<types.User>');
(0, vitest_1.expect)(result).toContain('types.User["name"]');
});
(0, vitest_1.it)('includes setOptions method', () => {
const result = (0, builder_generator_1.generateObjectBuilder)(objectMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('setOptions(o: BuilderOptions): this');
(0, vitest_1.expect)(result).toContain('this.options = o || {}');
(0, vitest_1.expect)(result).toContain('return this');
});
(0, vitest_1.it)('uses correct schema reference in runtime mode', () => {
const result = (0, builder_generator_1.generateObjectBuilder)(objectMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('schemas.UserSchema');
});
(0, vitest_1.it)('generates type-safe override assignment', () => {
const result = (0, builder_generator_1.generateObjectBuilder)(objectMeta, {
mockStrategy: 'runtime',
});
(0, vitest_1.expect)(result).toContain('const typedMock = mock as Record<string, unknown>');
(0, vitest_1.expect)(result).toContain('const typedOverrides = this.overrides as Record<string, unknown>');
(0, vitest_1.expect)(result).toContain('typedMock[k] = typedOverrides[k]');
});
});
(0, vitest_1.describe)('Builder Options', () => {
(0, vitest_1.it)('generates consistent builder options across all modes', () => {
const meta = {
typeName: 'Test',
constName: 'TestSchema',
isEnum: false,
schema: { type: 'object' },
isObject: true,
};
const runtimeResult = (0, builder_generator_1.generateObjectBuilder)(meta, {
mockStrategy: 'runtime',
});
const zodResult = (0, builder_generator_1.generateObjectBuilder)(meta, {
mockStrategy: 'zod',
});
const options = [
'useDefault',
'useExamples',
'alwaysIncludeOptionals',
'optionalsProbability',
'omitNulls',
];
options.forEach((option) => {
(0, vitest_1.expect)(runtimeResult).toContain(option);
(0, vitest_1.expect)(zodResult).toContain(option);
});
});
});
});
//# sourceMappingURL=builder-generator.test.js.map