Skip to content
Snippets Groups Projects
structures.controller.spec.ts 12.5 KiB
Newer Older
import { HttpService } from '@nestjs/axios';
import { HttpStatus } from '@nestjs/common';
import { Test } from '@nestjs/testing';
import { of } from 'rxjs';
import { PhotonResponseMock } from '../../test/mock/data/dataPhoton.mock.data';
import { structureDtoMock } from '../../test/mock/data/structure.mock.dto';
import { CategoriesServiceMock } from '../../test/mock/services/categories.mock.service';
import { UsersServiceMock } from '../../test/mock/services/user.mock.service';
import { CategoriesService } from '../categories/services/categories.service';
import { PersonalOffersService } from '../personal-offers/personal-offers.service';
import { TempUserService } from '../temp-user/temp-user.service';
import { UserRole } from '../users/enum/user-role.enum';
Hugo SUBTIL's avatar
Hugo SUBTIL committed
import { UsersService } from '../users/services/users.service';
import { CreateStructureDto } from './dto/create-structure.dto';
import { StructuresService } from './services/structures.service';
import { StructuresController } from './structures.controller';
import { mockDeletedStructure, mockStructure } from '../../test/mock/data/structures.mock.data';
import { mockUser } from '../../test/mock/data/users.mock.data';
import { StructuresExportService } from './services/structures-export.service';
import {
  StructuresExportServiceMock,
  mockFormattedStructures,
} from '../../test/mock/services/structures-export.mock.service';
import { StructureFormatted } from './interfaces/structure-formatted.interface';
import { JobDocument } from '../users/schemas/job.schema';
import { getModelToken } from '@nestjs/mongoose';
import { Structure } from './schemas/structure.schema';
describe('StructuresController', () => {
  let structuresController: StructuresController;
  let structuresExportService: StructuresExportService;

  const mockHttpService = {
    get: jest.fn(),
  };

  const mockStructureService = {
    cancelDelete: jest.fn(),
    create: jest.fn(),
    deleteOne: jest.fn(),
    findAll: jest.fn(),
    findAllUnclaimed: jest.fn(),
    findOne: jest.fn(),
    findWithOwners: jest.fn(),
    getAllUserCompletedStructures: jest.fn(),
    initiateStructureIndex: jest.fn(),
    reportStructureError: jest.fn(),
    searchAddress: jest.fn(),
    searchForStructures: jest.fn(),
    update: jest.fn(),
    updateAllDenormalizedFields: jest.fn(),
  };

  const mockTempUserService = {
    findOne: jest.fn(),
    findById: jest.fn(),
    sendUserMail: jest.fn(),
    create: jest.fn(),
    removeFromStructureLinked: jest.fn(),
  };

  const mockUsersService = {
    updateStructureLinkedClaim: jest.fn(),
    findById: jest.fn(),
    removeFromStructureLinked: jest.fn(),
    getPersonalOfferInStructure: jest.fn(),
    getStructureOwners: jest.fn(),
    verifyUserExist: jest.fn(),
  };

  const mockPersonalOffersService = { delete: jest.fn() };

  beforeEach(async () => {
    const module = await Test.createTestingModule({
      imports: [],
      controllers: [StructuresController],
      providers: [
        {
          provide: HttpService,
          useValue: mockHttpService,
        },
        {
          provide: StructuresService,
          useValue: mockStructureService,
        },
        {
          provide: UsersService,
          useValue: mockUsersService,
        {
          provide: PersonalOffersService,
          useValue: mockPersonalOffersService,
        {
          provide: TempUserService,
          useValue: mockTempUserService,
          provide: CategoriesService,
          useClass: CategoriesServiceMock,
        {
          provide: StructuresExportService,
          useClass: StructuresExportServiceMock,
        },
        {
          provide: getModelToken(Structure.name),
          useValue: {},
        },
      ],
    }).compile();
    structuresController = module.get<StructuresController>(StructuresController);
    structuresExportService = module.get<StructuresExportService>(StructuresExportService);
    jest.clearAllMocks();
  });

  it('should be defined', () => {
    expect(structuresController).toBeDefined();
  it('should get structure coordinates', async () => {
    mockHttpService.get.mockImplementationOnce(() => of(PhotonResponseMock));
    const coords = await structuresController.getCoordinates('Lyon');
    expect(coords).toBeTruthy();
  });

  it('should create structure', async () => {
    const structure: CreateStructureDto = {
      userEmail: 'admin@admin.com',
      structure: structureDtoMock,
    await structuresController.create(structure);
    expect(mockStructureService.create).toHaveBeenCalled();
  });

  it('should update structure', async () => {
    await structuresController.update('azerty', {
      dataShareConsentDate: null,
    expect(mockStructureService.update).toHaveBeenCalled();
  it('should findAll', async () => {
    mockStructureService.findAll.mockResolvedValueOnce([{ structureName: 'a' }, { structureName: 'b' }]);
    const res = await structuresController.findAll();
  it('should findAllFormatted', async () => {
    const mockResult: StructureFormatted[] = mockFormattedStructures;
    jest.spyOn(structuresExportService, 'exportFormatted').mockResolvedValueOnce(mockResult);

    const result: StructureFormatted[] = await structuresController.findAllFormatted();
  });

  it('should search structure', async () => {
    await structuresController.search({ query: 'test', filters: [] }, null);
    expect(mockStructureService.searchForStructures).toHaveBeenCalled();
  });

  it('should reset Search Index', async () => {
    await structuresController.resetES();
    expect(mockStructureService.updateAllDenormalizedFields).toHaveBeenCalled();
    expect(mockStructureService.initiateStructureIndex).toHaveBeenCalled();
  });

  it('should claim structure', async () => {
    const userMock = new UsersServiceMock();
    const user = userMock.findOne('pauline.dupont@mii.com');
    const res = structuresController.claim('1', {
      phone: null,
      resetPasswordToken: null,
      changeEmailToken: null,
      newEmail: null,
      pendingStructuresLink: null,
      structuresLink: null,
      structureOutdatedMailSent: null,
      email: user.email,
      name: user.name,
      surname: user.surname,
      emailVerified: true,
      createdAt: new Date('2022-05-25T09:48:28.824Z'),
      password: user.password,
      validationToken: null,
      role: null,
Hugo SUBTIL's avatar
Hugo SUBTIL committed
      employer: {
        name: 'test',
        validated: true,
      },
      job: {
        name: 'test',
        validated: true,
        hasPersonalOffer: false,
        jobsGroup: null,
    });
    expect(res).toBeTruthy();
  });

  it('should search an address', async () => {
    await structuresController.searchAddress({ searchQuery: 'Rue Alphonse Daudet' });
    expect(mockStructureService.searchAddress).toHaveBeenCalled();
  describe('find(structureId)', () => {
    it('should find structure', async () => {
      mockStructureService.findOne.mockResolvedValue(mockStructure);
      const res = await structuresController.find({ user: {} }, '6093ba0e2ab5775cfc01ed3e');
      expect(res).toBeTruthy();
    });

    it('should find deleted structure as an admin', async () => {
      mockStructureService.findOne.mockResolvedValue(mockDeletedStructure);
      const response = await structuresController.find({ user: { role: UserRole.admin } }, '6093ba0e2ab5775cfc01ed33');
      expect(response.deletedAt).toBeTruthy();
    });

    it('should not find deleted structure as anonymous', async () => {
      try {
        await structuresController.find({ user: {} }, '6093ba0e2ab5775cfc01ed33');
        expect(true).toBe(false);
      } catch (error) {
        expect(error.status).toEqual(HttpStatus.NOT_FOUND);
      }
    });
  });

  it('should find struct with owners', async () => {
    await structuresController.findWithOwners('6093ba0e2ab5775cfc01ed3e');
    expect(mockStructureService.findWithOwners).toHaveBeenCalled();
  describe('delete', () => {
    it('should delete structure without owners', async () => {
      mockStructureService.findOne.mockResolvedValue(mockStructure);
      mockUsersService.getStructureOwners.mockResolvedValue([]);
      await structuresController.delete({ user: { _id: 'test' } }, 'test');
      expect(mockStructureService.deleteOne).toHaveBeenCalled();
    });

    // test delete structure with owners
  });

  it('should cancel struct delete', async () => {
    mockStructureService.findOne.mockResolvedValue(mockStructure);
    await structuresController.cancelDelete({ user: { _id: 'id' } }, 'id');
    expect(mockStructureService.cancelDelete).toHaveBeenCalled();
  describe('addOwner', () => {
    // Test if user exists

    // Test if temp user exists

    it('should create temp user if it does not exists', async () => {
      mockStructureService.findOne.mockResolvedValue(mockStructure);
      mockUsersService.verifyUserExist.mockResolvedValue(null);
      await structuresController.addOwner('6093ba0e2ab5775cfc01ed3e', { email: 'pauline.dupont@mii.com' });
      expect(mockTempUserService.create).toHaveBeenCalled();
    });
  describe('removeOwner', () => {
    it('should return invalid structure', async () => {
      mockStructureService.findOne.mockResolvedValueOnce(null);
        await structuresController.removeOwner('invalidstructure', '63639058685ba134c32bc495');
        expect(true).toBe(false);
      } catch (e) {
        expect(e.message).toEqual('Invalid Structure');
        expect(e.status).toEqual(HttpStatus.NOT_FOUND);
      }
    });
    it('should return invalid user', async () => {
      mockStructureService.findOne.mockResolvedValue(mockStructure);
        await structuresController.removeOwner('6093ba0e2ab5775cfc01ed3e', 'invaliduser');
        expect(true).toBe(false);
      } catch (e) {
        expect(e.message).toEqual('Invalid User');
        expect(e.status).toEqual(HttpStatus.NOT_FOUND);
      }
    });
    it('should remove structure link without offer', async () => {
      mockStructureService.findOne.mockResolvedValue(mockStructure);
      mockUsersService.findById.mockResolvedValue(mockUser);
      mockUsersService.getPersonalOfferInStructure.mockReturnValue(null);
      await structuresController.removeOwner('6093ba0e2ab5775cfc01ed3e', '63639058685ba134c32bc495');
      expect(mockUsersService.removeFromStructureLinked).toHaveBeenCalledTimes(1);
      expect(mockPersonalOffersService.delete).toHaveBeenCalledTimes(0);
    });

    it('should remove structure link with offer', async () => {
      mockStructureService.findOne.mockResolvedValue(mockStructure);
      mockUsersService.findById.mockResolvedValue(mockUser);
      mockUsersService.getPersonalOfferInStructure.mockReturnValue({
        _id: '2345ba0e2ab5775cfc01ed4d',
        categories: {
          onlineProcedures: ['caf'],
          baseSkills: [],
          advancedSkills: [],
        },
        createdAt: 'Wed Mar 16 2022 14:29:11 GMT+0100 (heure normale d’Europe centrale)',
        updatedAt: 'Wed Mar 16 2022 17:29:11 GMT+0100 (heure normale d’Europe centrale)',
      await structuresController.removeOwner('6093ba0e2ab5775cfc01ed3e', '63639058685ba134c32bc495');
      expect(mockUsersService.removeFromStructureLinked).toHaveBeenCalled();
      expect(mockPersonalOffersService.delete).toHaveBeenCalled();
    it('should remove user from struct', async () => {
      mockStructureService.findOne.mockResolvedValue(mockStructure);
      mockUsersService.findById.mockResolvedValue(mockUser);
      mockUsersService.getPersonalOfferInStructure.mockReturnValue(null);
      await structuresController.removeOwner('6093ba0e2ab5775cfc01ed3e', '63639058685ba134c32bc495');
      expect(mockUsersService.removeFromStructureLinked).toHaveBeenCalled();
    });

    // test personal offers delete
  it('should remove temp user', async () => {
    mockStructureService.findOne.mockResolvedValue(mockStructure);
    mockTempUserService.findById.mockResolvedValue(mockUser);
    // To test manually, might contain a bug with Types.ObjectId
    // await controller.removeTempUser('6093ba0e2ab5775cfc01ed3e', '63639058685ba134c32bc495');
    // expect(mockTempUserService.removeFromStructureLinked).toBeCalled();
  });

  it('should report any structure error', async () => {
    await structuresController.reportStructureError({ structureId: '6093ba0e2ab5775cfc01ed3e', content: null });
    expect(mockStructureService.reportStructureError).toHaveBeenCalled();