import { HttpException, HttpModule, HttpStatus } from '@nestjs/common';
import { getModelToken } from '@nestjs/mongoose';
import { Test, TestingModule } from '@nestjs/testing';
import { ConfigurationModule } from '../configuration/configuration.module';
import { MailerService } from '../mailer/mailer.service';
import { NewsletterSubscription } from '../newsletter/newsletter-subscription.schema';
import { NewsletterService } from '../newsletter/newsletter.service';
import { Structure } from '../structures/schemas/structure.schema';
import { StructuresService } from '../structures/services/structures.service';
import { User } from '../users/schemas/user.schema';
import { UsersService } from '../users/users.service';
import { AdminController } from './admin.controller';
import { PendingStructureDto } from './dto/pending-structure.dto';

describe('AdminController', () => {
  let controller: AdminController;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [ConfigurationModule, HttpModule],
      providers: [
        UsersService,
        StructuresService,
        NewsletterService,
        MailerService,
        {
          provide: getModelToken('User'),
          useValue: User,
        },
        {
          provide: getModelToken('NewsletterSubscription'),
          useValue: NewsletterSubscription,
        },
        {
          provide: getModelToken('Structure'),
          useValue: Structure,
        },
      ],
      controllers: [AdminController],
    }).compile();

    controller = module.get<AdminController>(AdminController);
  });

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

  it('should get pending attachments', async () => {
    const result = [{name: "MJC Route de vienne", address: "14 chemin des platanes"}, {name: "Mairie Lyon 7eme", address: "21 boulevard martin"}];
    jest.spyOn(controller, 'getPendingAttachments').mockImplementation(async (): Promise<any> => result);
    expect(await controller.getPendingAttachments()).toBe(result);
  });

  it('should validate pending structure', async () => {
    const result = [{name: "MJC Route de vienne", address: "14 chemin des platanes"}];
    const structure: PendingStructureDto = {userEmail:"martin@mjc.fr", structureId: "1", structureName:"MJC Route de vienne"};
    jest.spyOn(controller, 'validatePendingStructure').mockImplementation(async (): Promise<any> => result);
    expect(await controller.validatePendingStructure(structure)).toBe(result);
  });

  it('should refuse pending structure', async () => {
    const result = [{name: "MJC Route de vienne", address: "14 chemin des platanes"}, {name: "Mairie Lyon 7eme", address: "21 boulevard martin"}];
    const structure: PendingStructureDto = {userEmail:"martin@mjc.fr", structureId: "1", structureName:"MJC Route de vienne"};
    jest.spyOn(controller, 'refusePendingStructure').mockImplementation(async (): Promise<any> => result);
    expect(await controller.refusePendingStructure(structure)).toBe(result);
  });
});