/**
 * 验证模块测试套件
 * 
 * 功能描述：
 * - 测试VerificationModule的模块配置和依赖注入
 * - 验证模块导入、提供者和导出的正确性
 * - 确保验证服务的正确配置
 * - 测试模块间的依赖关系
 * 
 * 测试覆盖范围：
 * - 模块实例化：模块能够正确创建和初始化
 * - 依赖注入：所有服务的正确注入
 * - 服务导出：VerificationService的正确导出
 * - 配置验证：验证码配置的正确性
 * 
 * 最近修改：
 * - 2026-01-12: 功能新增 - 创建VerificationModule测试文件，确保模块配置测试覆盖 (修改者: moyin)
 * 
 * @author moyin
 * @version 1.0.0
 * @since 2026-01-12
 * @lastModified 2026-01-12
 */

import { Test, TestingModule } from '@nestjs/testing';
import { ConfigService } from '@nestjs/config';
import { VerificationModule } from './verification.module';
import { VerificationService } from './verification.service';

describe('VerificationModule', () => {
  let module: TestingModule;
  let verificationService: VerificationService;
  let configService: ConfigService;

  beforeEach(async () => {
    const mockConfigService = {
      get: jest.fn((key: string, defaultValue?: any) => {
        switch (key) {
          case 'VERIFICATION_CODE_LENGTH':
            return 6;
          case 'VERIFICATION_CODE_EXPIRES':
            return 300;
          case 'VERIFICATION_COOLDOWN':
            return 60;
          default:
            return defaultValue;
        }
      }),
    };

    module = await Test.createTestingModule({
      providers: [
        VerificationService,
        {
          provide: ConfigService,
          useValue: mockConfigService,
        },
        {
          provide: 'REDIS_SERVICE',
          useValue: {
            get: jest.fn(),
            set: jest.fn(),
            del: jest.fn(),
            exists: jest.fn(),
          },
        },
      ],
    }).compile();

    verificationService = module.get<VerificationService>(VerificationService);
    configService = module.get<ConfigService>(ConfigService);
  });

  afterEach(async () => {
    if (module) {
      await module.close();
    }
  });

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

  describe('Service Providers', () => {
    it('should provide VerificationService', () => {
      expect(verificationService).toBeDefined();
      expect(verificationService).toBeInstanceOf(VerificationService);
    });

    it('should provide ConfigService', () => {
      expect(configService).toBeDefined();
      expect(configService.get).toBeDefined();
    });
  });

  describe('Module Dependencies', () => {
    it('should import required modules', () => {
      expect(module).toBeDefined();
      expect(verificationService).toBeDefined();
    });

    it('should not have circular dependencies', () => {
      expect(module).toBeDefined();
    });
  });

  describe('Module Exports', () => {
    it('should export VerificationService', () => {
      expect(verificationService).toBeDefined();
      expect(verificationService).toBeInstanceOf(VerificationService);
    });

    it('should make VerificationService available for injection', () => {
      const service = module.get<VerificationService>(VerificationService);
      expect(service).toBe(verificationService);
    });
  });

  describe('Configuration Validation', () => {
    it('should validate verification configuration completeness', () => {
      expect(configService.get('VERIFICATION_CODE_LENGTH')).toBeDefined();
      expect(configService.get('VERIFICATION_CODE_EXPIRES')).toBeDefined();
      expect(configService.get('VERIFICATION_COOLDOWN')).toBeDefined();
    });
  });
});