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.
447 lines • 18.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const vitest_1 = require("vitest");
const mock_runtime_1 = require("./mock-runtime");
(0, vitest_1.describe)('Custom Mock Runtime', () => {
(0, vitest_1.describe)('generateMock', () => {
(0, vitest_1.it)('generates mock from simple string schema', () => {
const schema = { type: 'string' };
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
});
(0, vitest_1.it)('generates mock from number schema', () => {
const schema = { type: 'number' };
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('number');
});
(0, vitest_1.it)('generates mock from boolean schema', () => {
const schema = { type: 'boolean' };
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('boolean');
});
(0, vitest_1.it)('generates mock from object schema', () => {
const schema = {
type: 'object',
properties: {
name: { type: 'string' },
age: { type: 'number' },
},
required: ['name'],
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toHaveProperty('name');
(0, vitest_1.expect)(typeof result.name).toBe('string');
});
(0, vitest_1.it)('generates mock from array schema', () => {
const schema = {
type: 'array',
items: { type: 'string' },
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(Array.isArray(result)).toBe(true);
});
(0, vitest_1.it)('respects enum values', () => {
const schema = {
type: 'string',
enum: ['active', 'inactive'],
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(['active', 'inactive']).toContain(result);
});
(0, vitest_1.it)('uses default value when useDefault is true', () => {
const schema = {
type: 'string',
default: 'default-value',
};
const result = (0, mock_runtime_1.generateMock)(schema, { useDefault: true });
(0, vitest_1.expect)(result).toBe('default-value');
});
(0, vitest_1.it)('uses example value when useExamples is true', () => {
const schema = {
type: 'string',
examples: ['example-value'],
};
const result = (0, mock_runtime_1.generateMock)(schema, { useExamples: true });
(0, vitest_1.expect)(result).toBe('example-value');
});
(0, vitest_1.it)('respects minLength for strings', () => {
const schema = {
type: 'string',
minLength: 10,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result.length).toBeGreaterThanOrEqual(10);
});
(0, vitest_1.it)('respects maxLength for strings', () => {
const schema = {
type: 'string',
maxLength: 5,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result.length).toBeLessThanOrEqual(5);
});
(0, vitest_1.it)('respects minimum for numbers', () => {
const schema = {
type: 'number',
minimum: 10,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toBeGreaterThanOrEqual(10);
});
(0, vitest_1.it)('respects maximum for numbers', () => {
const schema = {
type: 'number',
maximum: 100,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toBeLessThanOrEqual(100);
});
(0, vitest_1.it)('handles requiredOnly option', () => {
const schema = {
type: 'object',
properties: {
required1: { type: 'string' },
optional1: { type: 'string' },
},
required: ['required1'],
};
const result = (0, mock_runtime_1.generateMock)(schema, { requiredOnly: true });
(0, vitest_1.expect)(result).toHaveProperty('required1');
});
(0, vitest_1.it)('generates consistent types for schemas', () => {
const schema = {
type: 'object',
properties: {
id: { type: 'string', format: 'uuid' },
email: { type: 'string', format: 'email' },
count: { type: 'integer' },
},
required: ['id', 'email', 'count'],
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result.id).toBe('string');
(0, vitest_1.expect)(typeof result.email).toBe('string');
(0, vitest_1.expect)(typeof result.count).toBe('number');
});
(0, vitest_1.it)('handles nested objects', () => {
const schema = {
type: 'object',
properties: {
user: {
type: 'object',
properties: {
name: { type: 'string' },
},
required: ['name'],
},
},
required: ['user'],
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toHaveProperty('user');
(0, vitest_1.expect)(result.user).toHaveProperty('name');
});
(0, vitest_1.it)('handles arrays of objects', () => {
const schema = {
type: 'array',
items: {
type: 'object',
properties: {
name: { type: 'string' },
},
required: ['name'],
},
minItems: 1,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(Array.isArray(result)).toBe(true);
(0, vitest_1.expect)(result.length).toBeGreaterThanOrEqual(1);
(0, vitest_1.expect)(result[0]).toHaveProperty('name');
});
(0, vitest_1.it)('handles null type', () => {
const schema = { type: 'null' };
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toBe(null);
});
(0, vitest_1.it)('handles oneOf schemas', () => {
const schema = {
oneOf: [{ type: 'string' }, { type: 'number' }],
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(['string', 'number']).toContain(typeof result);
});
(0, vitest_1.it)('handles anyOf schemas', () => {
const schema = {
anyOf: [{ type: 'string' }, { type: 'number' }],
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(['string', 'number']).toContain(typeof result);
});
(0, vitest_1.it)('handles allOf schemas with merging', () => {
const schema = {
allOf: [
{
type: 'object',
properties: {
name: { type: 'string' },
},
required: ['name'],
},
{
type: 'object',
properties: {
age: { type: 'number' },
},
},
],
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toHaveProperty('name');
(0, vitest_1.expect)(typeof result.name).toBe('string');
});
(0, vitest_1.it)('respects minItems for arrays', () => {
const schema = {
type: 'array',
items: { type: 'string' },
minItems: 5,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(Array.isArray(result)).toBe(true);
(0, vitest_1.expect)(result.length).toBeGreaterThanOrEqual(5);
});
(0, vitest_1.it)('respects maxItems for arrays', () => {
const schema = {
type: 'array',
items: { type: 'string' },
maxItems: 2,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(Array.isArray(result)).toBe(true);
(0, vitest_1.expect)(result.length).toBeLessThanOrEqual(2);
});
(0, vitest_1.it)('handles integer type specifically', () => {
const schema = {
type: 'integer',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('number');
(0, vitest_1.expect)(Number.isInteger(result)).toBe(true);
});
(0, vitest_1.it)('respects minimum for numbers', () => {
const schema = {
type: 'number',
minimum: 100,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toBeGreaterThanOrEqual(100);
});
(0, vitest_1.it)('respects maximum for numbers', () => {
const schema = {
type: 'number',
maximum: 10,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toBeLessThanOrEqual(10);
});
(0, vitest_1.it)('respects minLength for strings', () => {
const schema = {
type: 'string',
minLength: 20,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
(0, vitest_1.expect)(result.length).toBeGreaterThanOrEqual(20);
});
(0, vitest_1.it)('respects maxLength for strings', () => {
const schema = {
type: 'string',
maxLength: 5,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
(0, vitest_1.expect)(result.length).toBeLessThanOrEqual(5);
});
(0, vitest_1.it)('handles pattern for strings with placeholder', () => {
const schema = {
type: 'string',
pattern: '^[0-9]{3}$',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
(0, vitest_1.expect)(result).toMatch(/^x+$/);
});
(0, vitest_1.it)('handles uuid format with placeholder', () => {
const schema = {
type: 'string',
format: 'uuid',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
(0, vitest_1.expect)(result).toBe('00000000-0000-0000-0000-000000000000');
});
(0, vitest_1.it)('handles email format', () => {
const schema = {
type: 'string',
format: 'email',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
(0, vitest_1.expect)(result).toMatch(/@/);
});
(0, vitest_1.it)('handles uri format', () => {
const schema = {
type: 'string',
format: 'uri',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
(0, vitest_1.expect)(result).toMatch(/^https?:\/\//);
});
(0, vitest_1.it)('handles date-time format', () => {
const schema = {
type: 'string',
format: 'date-time',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
(0, vitest_1.expect)(!isNaN(Date.parse(result))).toBe(true);
});
(0, vitest_1.it)('handles date format', () => {
const schema = {
type: 'string',
format: 'date',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
(0, vitest_1.expect)(/^\d{4}-\d{2}-\d{2}$/.test(result)).toBe(true);
});
(0, vitest_1.it)('handles time format', () => {
const schema = {
type: 'string',
format: 'time',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
(0, vitest_1.expect)(/^\d{2}:\d{2}:\d{2}/.test(result)).toBe(true);
});
(0, vitest_1.it)('applies overrides to nested properties', () => { });
(0, vitest_1.it)('handles schemas with const value', () => {
const schema = {
type: 'string',
const: 'fixed-value',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toBe('fixed-value');
});
(0, vitest_1.it)('handles schemas with default value', () => {
const schema = {
type: 'string',
default: 'default-value',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
});
(0, vitest_1.it)('handles schemas with examples', () => {
const schema = {
type: 'string',
examples: ['example1', 'example2'],
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('string');
});
(0, vitest_1.it)('handles deeply nested structures', () => {
const schema = {
type: 'object',
properties: {
level1: {
type: 'object',
properties: {
level2: {
type: 'object',
properties: {
level3: {
type: 'string',
},
},
required: ['level3'],
},
},
required: ['level2'],
},
},
required: ['level1'],
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result.level1.level2.level3).toBeDefined();
(0, vitest_1.expect)(typeof result.level1.level2.level3).toBe('string');
});
(0, vitest_1.it)('handles array within object within array', () => {
const schema = {
type: 'array',
items: {
type: 'object',
properties: {
tags: {
type: 'array',
items: { type: 'string' },
},
},
required: ['tags'],
},
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(Array.isArray(result)).toBe(true);
(0, vitest_1.expect)(result.length).toBeGreaterThan(0);
(0, vitest_1.expect)(Array.isArray(result[0].tags)).toBe(true);
});
(0, vitest_1.it)('returns null for unknown schema type', () => {
const schema = {
type: 'unknown-type',
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toBeNull();
});
(0, vitest_1.it)('handles exclusiveMinimum', () => {
const schema = {
type: 'number',
exclusiveMinimum: 10,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toBeGreaterThan(10);
});
(0, vitest_1.it)('handles exclusiveMaximum', () => {
const schema = {
type: 'number',
exclusiveMaximum: 10,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result).toBeLessThan(10);
});
(0, vitest_1.it)('handles multipleOf constraint', () => {
const schema = {
type: 'number',
multipleOf: 5,
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(result % 5).toBe(0);
});
(0, vitest_1.it)('handles empty object schema', () => {
const schema = {
type: 'object',
properties: {},
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(typeof result).toBe('object');
(0, vitest_1.expect)(result).toEqual({});
});
(0, vitest_1.it)('handles empty array items', () => {
const schema = {
type: 'array',
items: {},
};
const result = (0, mock_runtime_1.generateMock)(schema);
(0, vitest_1.expect)(Array.isArray(result)).toBe(true);
});
});
});
//# sourceMappingURL=mock-runtime.test.js.map