<%~ includeFile('./header.eta') %>

import { Test, TestingModule } from '@nestjs/testing';
import { getRepositoryToken } from '@nestjs/typeorm';
import { <%= it.svcName %> } from './<%= it.entityName %>.service';
import { <%= it.entityName %> } from './<%= it.entityName %>.entity';

describe('<%= it.svcName %>', () => {
  let service: <%= it.svcName %>;
  let mockRepository: any;

  beforeEach(async () => {
    // Mock query builder chain
    const mockQueryBuilder = {
      where: jest.fn().mockReturnThis(),
      andWhere: jest.fn().mockReturnThis(),
      orWhere: jest.fn().mockReturnThis(),
      orderBy: jest.fn().mockReturnThis(),
      addOrderBy: jest.fn().mockReturnThis(),
      skip: jest.fn().mockReturnThis(),
      take: jest.fn().mockReturnThis(),
      select: jest.fn().mockReturnThis(),
      addSelect: jest.fn().mockReturnThis(),
      leftJoin: jest.fn().mockReturnThis(),
      leftJoinAndSelect: jest.fn().mockReturnThis(),
      innerJoin: jest.fn().mockReturnThis(),
      innerJoinAndSelect: jest.fn().mockReturnThis(),
      getMany: jest.fn().mockResolvedValue([]),
      getOne: jest.fn().mockResolvedValue(null),
      getManyAndCount: jest.fn().mockResolvedValue([[], 0]),
      getCount: jest.fn().mockResolvedValue(0),
      getRawMany: jest.fn().mockResolvedValue([]),
      getRawOne: jest.fn().mockResolvedValue(null),
    };

    // Mock repository with manager.connection for TypeOrmCrudService
    mockRepository = {
      find: jest.fn().mockResolvedValue([]),
      findOne: jest.fn().mockResolvedValue(null),
      findOneBy: jest.fn().mockResolvedValue(null),
      save: jest.fn().mockImplementation((entity) => Promise.resolve({ id: 'mock-id', ...entity })),
      create: jest.fn().mockImplementation((dto) => dto),
      update: jest.fn().mockResolvedValue({ affected: 1 }),
      delete: jest.fn().mockResolvedValue({ affected: 1 }),
      remove: jest.fn().mockResolvedValue({}),
      count: jest.fn().mockResolvedValue(0),
      createQueryBuilder: jest.fn(() => mockQueryBuilder),
      target: <%= it.entityName %>,
      metadata: {
        columns: [],
        relations: [],
        primaryColumns: [{ propertyName: 'id' }],
        connection: { options: { type: 'postgres' } },
      },
      manager: {
        connection: {
          options: { type: 'postgres' },
          getMetadata: jest.fn().mockReturnValue({
            columns: [],
            relations: [],
            primaryColumns: [{ propertyName: 'id' }],
          }),
        },
        transaction: jest.fn().mockImplementation((cb) => cb(mockRepository.manager)),
      },
    };

    const module: TestingModule = await Test.createTestingModule({
      providers: [
        <%= it.svcName %>,
        {
          provide: getRepositoryToken(<%= it.entityName %>),
          useValue: mockRepository,
        },
      ],
    }).compile();

    service = module.get<<%= it.svcName %>>(<%= it.svcName %>);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });

  // Add more tests as needed
}); 