qmemory
Version:
A comprehensive production-ready Node.js utility library with MongoDB document operations, user ownership enforcement, Express.js HTTP utilities, environment-aware logging, and in-memory storage. Features 96%+ test coverage with comprehensive error handli
171 lines (148 loc) • 6.1 kB
JavaScript
/**
* Schema Generation Tests
* Tests for the comprehensive schema generation functionality
*/
const {
generateMongoSchema
} = require('../../lib/mongoose-mapper');
describe('Schema Generation Module', () => {
describe('generateMongoSchema', () => {
test('should generate schema from single function metadata', () => {
const functions = [
{
name: 'createUser',
parameters: [
{ name: 'userName', type: 'string', required: true },
{ name: 'userEmail', type: 'string', required: true },
{ name: 'age', type: 'number', required: false }
]
}
];
const result = generateMongoSchema(functions);
expect(result).toHaveProperty('create_users');
expect(result.create_users).toEqual({
_id: { type: 'ObjectId', auto: true },
createdAt: { type: 'Date', default: 'Date.now' },
updatedAt: { type: 'Date', default: 'Date.now' },
user_name: { type: 'String', required: true },
user_email: {
type: 'String',
required: true,
validate: {
validator: 'function(v) { return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v); }',
message: 'Invalid email format'
}
},
age: { type: 'Number', required: false }
});
});
test('should generate schemas from multiple function metadata', () => {
const functions = [
{
name: 'createUser',
parameters: [
{ name: 'userName', type: 'string', required: true },
{ name: 'email', type: 'string', required: true }
]
},
{
name: 'createProduct',
parameters: [
{ name: 'productName', type: 'string', required: true },
{ name: 'price', type: 'number', required: true },
{ name: 'isActive', type: 'boolean', required: false }
]
}
];
const result = generateMongoSchema(functions);
expect(result).toHaveProperty('create_users');
expect(result).toHaveProperty('create_products');
expect(result.create_users.user_name).toEqual({ type: 'String', required: true });
expect(result.create_products.product_name).toEqual({ type: 'String', required: true });
expect(result.create_products.price).toEqual({ type: 'Number', required: true });
expect(result.create_products.is_active).toEqual({ type: 'Boolean', required: false });
});
test('should handle duplicate field names across functions', () => {
const functions = [
{
name: 'createUser',
parameters: [
{ name: 'userName', type: 'string', required: true },
{ name: 'email', type: 'string', required: true }
]
},
{
name: 'updateUser',
parameters: [
{ name: 'userName', type: 'string', required: false },
{ name: 'phone', type: 'string', required: false }
]
}
];
const result = generateMongoSchema(functions);
// Both functions should map to the same collection (users)
expect(Object.keys(result)).toHaveLength(2);
expect(result).toHaveProperty('create_users');
expect(result).toHaveProperty('update_users');
// First function should set the field
expect(result.create_users.user_name).toEqual({ type: 'String', required: true });
expect(result.update_users.user_name).toEqual({ type: 'String', required: false });
});
test('should avoid field overwrites within same collection', () => {
const functions = [
{
name: 'createUser',
parameters: [
{ name: 'userName', type: 'string', required: true },
{ name: 'userName', type: 'string', required: false } // Duplicate param
]
}
];
const result = generateMongoSchema(functions);
// Should only have one user_name field with first definition
expect(result.create_users.user_name).toEqual({ type: 'String', required: true });
});
test('should handle functions with no parameters', () => {
const functions = [
{
name: 'getUsers',
parameters: []
}
];
const result = generateMongoSchema(functions);
expect(result).toHaveProperty('get_users');
expect(result.get_users).toEqual({
_id: { type: 'ObjectId', auto: true },
createdAt: { type: 'Date', default: 'Date.now' },
updatedAt: { type: 'Date', default: 'Date.now' }
});
});
test('should handle special field names with validation', () => {
const functions = [
{
name: 'createContact',
parameters: [
{ name: 'contactEmail', type: 'string', required: true },
{ name: 'websiteUrl', type: 'string', required: false },
{ name: 'profileData', type: 'object', required: true }
]
}
];
const result = generateMongoSchema(functions);
expect(result.create_contacts.contact_email.validate).toBeDefined();
expect(result.create_contacts.website_url.validate).toBeDefined();
expect(result.create_contacts.profile_data).toEqual({ type: 'Object', required: true });
});
test('should throw error for invalid input', () => {
expect(() => generateMongoSchema(null)).toThrow('Functions must be an array');
expect(() => generateMongoSchema('not an array')).toThrow('Functions must be an array');
expect(() => generateMongoSchema([null])).toThrow('Function metadata must be an object');
expect(() => generateMongoSchema([{}])).toThrow('Function name must be a non-empty string');
expect(() => generateMongoSchema([{ name: 'test' }])).toThrow('Function parameters must be an array');
});
test('should handle empty functions array', () => {
const result = generateMongoSchema([]);
expect(result).toEqual({});
});
});
});