import { AppModule } from './app.module';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ApiKeyGuard } from './common/guards/api-key/api-key.guard';

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

  it('should have AppController', () => {
    expect(AppController).toBeDefined();
  });

  it('should have AppService', () => {
    expect(AppService).toBeDefined();
  });

  it('should have ApiKeyGuard', () => {
    expect(ApiKeyGuard).toBeDefined();
  });

  it('should have correct module structure', () => {
    const moduleMetadata = Reflect.getMetadata('imports', AppModule);
    const controllerMetadata = Reflect.getMetadata('controllers', AppModule);
    const providerMetadata = Reflect.getMetadata('providers', AppModule);

    expect(moduleMetadata).toBeDefined();
    expect(controllerMetadata).toBeDefined();
    expect(providerMetadata).toBeDefined();
  });

  it('should have required imports', () => {
    const moduleMetadata = Reflect.getMetadata('imports', AppModule);

    expect(moduleMetadata).toBeDefined();
    expect(moduleMetadata.length).toBeGreaterThan(0);
  });

  it('should have correct controllers', () => {
    const controllerMetadata = Reflect.getMetadata('controllers', AppModule);

    expect(controllerMetadata).toContain(AppController);
  });

  it('should have correct providers', () => {
    const providerMetadata = Reflect.getMetadata('providers', AppModule);

    expect(providerMetadata).toContain(AppService);
    expect(providerMetadata).toContain(ApiKeyGuard);
  });
});
