@kenniy/godeye-data-contracts
Version:
Enterprise-grade base repository architecture for GOD-EYE microservices with zero overhead and maximum code reuse
179 lines (178 loc) • 7.98 kB
JavaScript
"use strict";
/**
* DTO Tests
* Tests the query DTOs and their ICriteria transformation
*/
Object.defineProperty(exports, "__esModule", { value: true });
const dto_1 = require("../core/dto");
describe('DTO System', () => {
describe('BaseQueryDto', () => {
it('should transform to basic ICriteria', () => {
const dto = new dto_1.BaseQueryDto();
dto.page = 1;
dto.limit = 20;
dto.status = 'active';
const criteria = dto.toICriteria();
expect(criteria.page).toBe(1);
expect(criteria.limit).toBe(20);
expect(criteria.where?.status).toBe('active');
});
it('should parse include parameter into relations and fields', () => {
const dto = new dto_1.BaseQueryDto();
dto.include = 'id,name,email,createdBy,updatedBy';
const criteria = dto.toICriteria();
expect(criteria.relations).toContain('createdBy');
expect(criteria.relations).toContain('updatedBy');
expect(criteria.select).toContain('id');
expect(criteria.select).toContain('name');
expect(criteria.select).toContain('email');
});
it('should parse sort string correctly', () => {
const dto = new dto_1.BaseQueryDto();
dto.sort = 'createdAt:DESC,name:ASC';
const criteria = dto.toICriteria();
expect(criteria.sort?.createdAt).toBe('DESC');
expect(criteria.sort?.name).toBe('ASC');
});
it('should handle search configuration', () => {
const dto = new dto_1.BaseQueryDto();
dto.search = 'john doe';
const criteria = dto.toICriteria();
expect(criteria.search?.term).toBe('john doe');
// Backend determines fields automatically - no frontend control
});
});
describe('FindOneDto', () => {
it('should transform to ICriteria with ID', () => {
const dto = new dto_1.FindOneDto();
dto.include = 'id,name,email';
const criteria = dto.toICriteria('123');
expect(criteria.where?.id).toBe('123');
expect(criteria.select).toContain('id');
expect(criteria.select).toContain('name');
expect(criteria.select).toContain('email');
});
it('should handle empty include parameter', () => {
const dto = new dto_1.FindOneDto();
const criteria = dto.toICriteria('123');
expect(criteria.where?.id).toBe('123');
expect(criteria.relations).toEqual([]);
expect(criteria.select).toEqual([]);
});
});
describe('FindManyDto', () => {
it('should extend BaseQueryDto with additional properties', () => {
const dto = new dto_1.FindManyDto();
dto.limit = 50;
dto.includeTotalCount = false;
expect(dto.limit).toBe(50);
expect(dto.includeTotalCount).toBe(false);
const criteria = dto.toICriteria();
expect(criteria.limit).toBe(50);
});
});
describe('UserQueryDto', () => {
it('should handle user-specific filters', () => {
const dto = new dto_1.UserQueryDto();
dto.userType = 'business';
dto.email = 'test@example.com';
dto.verified = true;
dto.status = 'active';
const criteria = dto.toICriteria();
expect(criteria.where?.userType).toBe('business');
expect(criteria.where?.email).toBe('test@example.com');
expect(criteria.where?.verified).toBe(true);
expect(criteria.where?.status).toBe('active');
});
it('should handle date range filters', () => {
const dto = new dto_1.UserQueryDto();
dto.createdAfter = '2023-01-01';
dto.createdBefore = '2023-12-31';
const criteria = dto.toICriteria();
expect(criteria.where?.createdAt?.$gte).toEqual(new Date('2023-01-01'));
expect(criteria.where?.createdAt?.$lte).toEqual(new Date('2023-12-31'));
});
it('should define user-specific known relations', () => {
const dto = new dto_1.UserQueryDto();
dto.include = 'id,name,profile,business,posts';
const criteria = dto.toICriteria();
expect(criteria.relations).toContain('profile');
expect(criteria.relations).toContain('business');
expect(criteria.relations).toContain('posts');
expect(criteria.select).toContain('id');
expect(criteria.select).toContain('name');
});
});
describe('FileQueryDto', () => {
it('should handle file-specific filters', () => {
const dto = new dto_1.FileQueryDto();
dto.userId = 'user123';
dto.fileType = 'image';
dto.mimeType = 'image/jpeg';
const criteria = dto.toICriteria();
expect(criteria.where?.userId).toBe('user123');
expect(criteria.where?.fileType).toBe('image');
expect(criteria.where?.mimeType).toBe('image/jpeg');
});
it('should handle size range filters', () => {
const dto = new dto_1.FileQueryDto();
dto.minSize = 1000;
dto.maxSize = 5000000;
const criteria = dto.toICriteria();
expect(criteria.where?.size?.$gte).toBe(1000);
expect(criteria.where?.size?.$lte).toBe(5000000);
});
it('should define file-specific known relations', () => {
const dto = new dto_1.FileQueryDto();
dto.include = 'id,name,user,folder,tags';
const criteria = dto.toICriteria();
expect(criteria.relations).toContain('user');
expect(criteria.relations).toContain('folder');
expect(criteria.relations).toContain('tags');
expect(criteria.select).toContain('id');
expect(criteria.select).toContain('name');
});
});
describe('DTO Integration Tests', () => {
it('should work with complex query scenarios', () => {
const dto = new dto_1.UserQueryDto();
dto.page = 2;
dto.limit = 10;
dto.userType = 'business';
dto.verified = true;
dto.search = 'john';
// searchFields removed - backend handles field selection
dto.include = 'id,name,email,profile,business';
dto.sort = 'createdAt:DESC,name:ASC';
dto.createdAfter = '2023-01-01';
const criteria = dto.toICriteria();
// Pagination
expect(criteria.page).toBe(2);
expect(criteria.limit).toBe(10);
// Filters
expect(criteria.where?.userType).toBe('business');
expect(criteria.where?.verified).toBe(true);
expect(criteria.where?.createdAt?.$gte).toEqual(new Date('2023-01-01'));
// Search
expect(criteria.search?.term).toBe('john');
// Backend determines fields automatically
// Include parsing
expect(criteria.relations).toEqual(['profile', 'business']);
expect(criteria.select).toEqual(['id', 'name', 'email']);
// Sorting
expect(criteria.sort?.createdAt).toBe('DESC');
expect(criteria.sort?.name).toBe('ASC');
});
it('should handle minimal query parameters', () => {
const dto = new dto_1.BaseQueryDto();
const criteria = dto.toICriteria();
expect(criteria.page).toBe(1);
expect(criteria.limit).toBe(20);
expect(criteria.relations).toEqual([]);
expect(criteria.select).toEqual([]);
expect(criteria.where).toBeUndefined();
expect(criteria.search).toBeUndefined();
expect(criteria.sort).toBeUndefined();
});
});
});