UNPKG

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
"use strict"; 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