diff --git a/.vscode/settings.json b/.vscode/settings.json index 27e08a402475a080ce059bab6e527e467a6a3ffc..e6575e191a54a3d71ef2c5fb1bed84372e71ebc2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -48,6 +48,7 @@ "grandlyon", "nestjs", "permanences", - "photonban" + "photonban", + "spyer" ] } diff --git a/src/admin/admin.controller.spec.ts b/src/admin/admin.controller.spec.ts index 192527d51fcefa17f64c5de92cf55bd3752c4adc..7ae2661b6a64c71465d4ff12668eb5fb97abfd46 100644 --- a/src/admin/admin.controller.spec.ts +++ b/src/admin/admin.controller.spec.ts @@ -2,6 +2,11 @@ import { HttpModule } from '@nestjs/axios'; import { getModelToken } from '@nestjs/mongoose'; import { Test, TestingModule } from '@nestjs/testing'; import { Types } from 'mongoose'; +import { + mockStructure, + mockStructureDocument, + structuresDocumentDataMock, +} from '../../test/mock/data/structures.mock.data'; import { mockJwtAuthGuard } from '../../test/mock/guards/jwt-auth.mock.guard'; import { mockRoleGuard } from '../../test/mock/guards/role.mock.guard'; import { NewsletterServiceMock } from '../../test/mock/services/newsletter.mock.service'; @@ -9,6 +14,8 @@ import { StructuresServiceMock } from '../../test/mock/services/structures.mock. import { UsersServiceMock } from '../../test/mock/services/user.mock.service'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; import { ConfigurationModule } from '../configuration/configuration.module'; +import { EspaceCoopCNFS } from '../espaceCoop/schemas/espaceCoopCNFS.schema'; +import { EspaceCoopService } from '../espaceCoop/services/espaceCoop.service'; import { MailerService } from '../mailer/mailer.service'; import { NewsletterSubscription } from '../newsletter/newsletter-subscription.schema'; import { NewsletterService } from '../newsletter/newsletter.service'; @@ -25,11 +32,9 @@ import { UsersService } from '../users/services/users.service'; import { AdminController } from './admin.controller'; import { AdminService } from './admin.service'; import { PendingStructureDto } from './dto/pending-structure.dto'; -import { EspaceCoopService } from '../espaceCoop/services/espaceCoop.service'; -import { EspaceCoopCNFS } from '../espaceCoop/schemas/espaceCoopCNFS.schema'; describe('AdminController', () => { - let controller: AdminController; + let adminController: AdminController; let userService: UsersService; const mockEmployerSearchService = { @@ -65,6 +70,14 @@ describe('AdminController', () => { mergeJob: jest.fn(), deleteInvalidJob: jest.fn(), }; + + const mockStructureService = { + findOne: jest.fn(), + deleteOne: jest.fn(), + findAll: jest.fn(), + getAllUserCompletedStructures: jest.fn(), + }; + const pendingStructureTest: PendingStructureDto = { structureId: new Types.ObjectId('6093ba0e2ab5775cfc01ed3e'), structureName: 'test', @@ -83,6 +96,7 @@ describe('AdminController', () => { { provide: StructuresService, useClass: StructuresServiceMock, + // useValue: mockStructureService, }, { provide: NewsletterService, @@ -132,28 +146,28 @@ describe('AdminController', () => { .useValue(mockRoleGuard) .compile(); - controller = module.get<AdminController>(AdminController); + adminController = module.get<AdminController>(AdminController); userService = module.get<UsersService>(UsersService); }); it('should be defined', () => { - expect(controller).toBeDefined(); + expect(adminController).toBeDefined(); }); it('should get pending attachments', async () => { - expect((await controller.getPendingAttachments()).length).toBe(2); - expect(Object.keys((await controller.getPendingAttachments())[0]).length).toBe(5); + expect((await adminController.getPendingAttachments()).length).toBe(2); + expect(Object.keys((await adminController.getPendingAttachments())[0]).length).toBe(5); }); describe('Pending structures validation', () => { it('should validate pending structure', async () => { - expect((await controller.validatePendingStructure(pendingStructureTest)).length).toBe(2); - expect(Object.keys((await controller.validatePendingStructure(pendingStructureTest))[0]).length).toBe(5); + expect((await adminController.validatePendingStructure(pendingStructureTest)).length).toBe(2); + expect(Object.keys((await adminController.validatePendingStructure(pendingStructureTest))[0]).length).toBe(5); }); it('should get structure does not exist', async () => { try { - await controller.validatePendingStructure(pendingStructureTest); + await adminController.validatePendingStructure(pendingStructureTest); } catch (e) { expect(e.message).toBe('Structure does not exist'); expect(e.status).toBe(404); @@ -163,13 +177,13 @@ describe('AdminController', () => { describe('Pending structures cancel', () => { it('should refuse pending structure', async () => { - expect((await controller.refusePendingStructure(pendingStructureTest)).length).toBe(2); - expect(Object.keys((await controller.refusePendingStructure(pendingStructureTest))[0]).length).toBe(5); + expect((await adminController.refusePendingStructure(pendingStructureTest)).length).toBe(2); + expect(Object.keys((await adminController.refusePendingStructure(pendingStructureTest))[0]).length).toBe(5); }); it('should get structure does not exist', async () => { try { - await controller.refusePendingStructure(pendingStructureTest); + await adminController.refusePendingStructure(pendingStructureTest); } catch (e) { expect(e.message).toBe('Structure does not exist'); expect(e.status).toBe(404); @@ -179,11 +193,15 @@ describe('AdminController', () => { describe('Delete user', () => { it('should delete user', async () => { - expect((await controller.deleteUser({ id: 'tsfsf6296' })).email).toBe('pauline.dupont@mii.com'); + // jest.spyOn(StructuresServiceMock.prototype, 'findOne').mockResolvedValue(mockStructure); + mockStructureService.deleteOne.mockImplementationOnce(() => mockStructureDocument); + jest.spyOn(StructuresServiceMock.prototype, 'deleteOne').mockImplementationOnce(() => mockStructure); + const user = await adminController.deleteUser({ id: 'tsfsf6296' }); + expect(user.email).toBe('pauline.dupont@mii.com'); }); it('should return unexisting user', async () => { try { - await controller.deleteUser({ id: 'userdoesnotexist' }); + await adminController.deleteUser({ id: 'userdoesnotexist' }); } catch (e) { expect(e.message).toBe('Invalid user id'); expect(e.status).toBe(400); @@ -201,7 +219,7 @@ describe('AdminController', () => { validated: true, }; mockEmployerService.findOne.mockResolvedValueOnce(mockEmployer); - const reply = await controller.setUserEmployer({ + const reply = await adminController.setUserEmployer({ userId: mockUserId, employerId: String(mockEmployer._id), }); @@ -220,7 +238,7 @@ describe('AdminController', () => { }; mockEmployerService.findOne.mockResolvedValueOnce(null); try { - await controller.setUserEmployer({ + await adminController.setUserEmployer({ userId: mockUserId, employerId: String(mockEmployer._id), }); @@ -242,7 +260,7 @@ describe('AdminController', () => { }; mockEmployerService.findOne.mockResolvedValueOnce(mockEmployer); try { - await controller.setUserEmployer({ + await adminController.setUserEmployer({ userId: mockUserId, employerId: String(mockEmployer._id), }); @@ -265,7 +283,7 @@ describe('AdminController', () => { validated: true, }; mockJobService.findOne.mockResolvedValueOnce(mockJob); - const reply = await controller.setUserJob({ + const reply = await adminController.setUserJob({ userId: mockUserId, jobId: String(mockJob._id), }); @@ -284,7 +302,7 @@ describe('AdminController', () => { }; mockJobService.findOne.mockResolvedValueOnce(null); try { - await controller.setUserJob({ + await adminController.setUserJob({ userId: mockUserId, jobId: String(mockJob._id), }); @@ -306,7 +324,7 @@ describe('AdminController', () => { }; mockJobService.findOne.mockResolvedValueOnce(mockJob); try { - await controller.setUserJob({ + await adminController.setUserJob({ userId: mockUserId, jobId: String(mockJob._id), }); @@ -321,28 +339,28 @@ describe('AdminController', () => { describe('Search user', () => { it('should return all users, empty string', async () => { - expect((await controller.searchUsers({ searchString: '' })).length).toBe(2); + expect((await adminController.searchUsers({ searchString: '' })).length).toBe(2); }); it('should return all users, null input', async () => { - expect((await controller.searchUsers({ searchString: null })).length).toBe(2); + expect((await adminController.searchUsers({ searchString: null })).length).toBe(2); }); it('should one user', async () => { - expect((await controller.searchUsers({ searchString: 'a@a.com' })).length).toBe(1); - expect((await controller.searchUsers({ searchString: 'a@a.com' }))[0].email).toBe('a@a.com'); + expect((await adminController.searchUsers({ searchString: 'a@a.com' })).length).toBe(1); + expect((await adminController.searchUsers({ searchString: 'a@a.com' }))[0].email).toBe('a@a.com'); }); it('should no user', async () => { - expect((await controller.searchUsers({ searchString: 'dfqfqsfqfqfa@a.com' })).length).toBe(0); + expect((await adminController.searchUsers({ searchString: 'dfqfqsfqfqfa@a.com' })).length).toBe(0); }); }); describe('Search delete a user subscription', () => { it('should return a deleted object', async () => { - expect((await controller.unsubscribeUserFromNewsletter('a@a.com')).email).toBe('a@a.com'); - expect(Object.keys(await controller.unsubscribeUserFromNewsletter('a@a.com')).length).toBe(4); + expect((await adminController.unsubscribeUserFromNewsletter('a@a.com')).email).toBe('a@a.com'); + expect(Object.keys(await adminController.unsubscribeUserFromNewsletter('a@a.com')).length).toBe(4); }); it('should throw an error', async () => { try { - await controller.unsubscribeUserFromNewsletter('test@test.com'); + await adminController.unsubscribeUserFromNewsletter('test@test.com'); } catch (e) { expect(e.message).toBe('Invalid email'); expect(e.status).toBe(401); @@ -351,27 +369,32 @@ describe('AdminController', () => { }); it('should get pending structure list for admin', async () => { - expect((await controller.getAdminStructuresList()).inClaim.length).toBe(2); - expect((await controller.getAdminStructuresList()).toClaim.length).toEqual(2); - expect((await controller.getAdminStructuresList()).claimed.length).toEqual(0); - expect((await controller.getAdminStructuresList()).incomplete.length).toEqual(2); + expect((await adminController.getAdminStructuresList()).inClaim.length).toBe(2); + expect((await adminController.getAdminStructuresList()).toClaim.length).toEqual(2); + expect((await adminController.getAdminStructuresList()).claimed.length).toEqual(0); + expect((await adminController.getAdminStructuresList()).incomplete.length).toEqual(2); }); it('should find attached users', async () => { - expect((await controller.findAttachedUsers()).length).toBe(0); + jest.spyOn(userService, 'findAllAttached').mockResolvedValue([]); + mockStructureService.getAllUserCompletedStructures.mockResolvedValueOnce([]); + expect((await adminController.findAttachedUsers()).length).toBe(0); }); it('should find unattached users', async () => { - expect((await controller.findUnattachedUsers()).length).toBe(0); + expect((await adminController.findUnattachedUsers()).length).toBe(0); }); it('should find unverified users', async () => { - expect((await controller.findUnVerifiedUsers()).length).toBe(0); + jest.spyOn(userService, 'findAllUnVerified').mockResolvedValue([]); + mockStructureService.getAllUserCompletedStructures.mockResolvedValueOnce([]); + expect((await adminController.findUnVerifiedUsers()).length).toBe(0); }); describe('should test getDeletedStructures()', () => { it('should find getDeletedStructures', async () => { - expect((await controller.getDeletedStructures()).length).toBeGreaterThan(0); + mockStructureService.findAll.mockResolvedValue(structuresDocumentDataMock); + expect((await adminController.getDeletedStructures()).length).toBeGreaterThan(0); }); }); }); diff --git a/src/admin/admin.controller.ts b/src/admin/admin.controller.ts index b79ba2d50ece0bd2535c592a09a97be1d914afef..af375cc2320fc823c11b7f50ec10de3858c3653b 100644 --- a/src/admin/admin.controller.ts +++ b/src/admin/admin.controller.ts @@ -14,6 +14,8 @@ import { import { ApiBearerAuth, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger'; import { validate } from 'class-validator'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; +import { EspaceCoopCNFS } from '../espaceCoop/schemas/espaceCoopCNFS.schema'; +import { EspaceCoopService } from '../espaceCoop/services/espaceCoop.service'; import { NewsletterSubscription } from '../newsletter/newsletter-subscription.schema'; import { NewsletterService } from '../newsletter/newsletter.service'; import { Structure, StructureDocument } from '../structures/schemas/structure.schema'; @@ -28,8 +30,6 @@ import { AdminService } from './admin.service'; import { PendingStructureDto } from './dto/pending-structure.dto'; import { SetUserEmployerDto } from './dto/set-user-employer.dto'; import { SetUserJobDto } from './dto/set-user-job.dto'; -import { EspaceCoopCNFS } from '../espaceCoop/schemas/espaceCoopCNFS.schema'; -import { EspaceCoopService } from '../espaceCoop/services/espaceCoop.service'; @ApiTags('admin') @Controller('admin') diff --git a/src/structures/services/structures.service.spec.ts b/src/structures/services/structures.service.spec.ts index d8e192e9b6ec86ee3dea3c10b7ac3ac45ba68ea3..5404cd41e7603320832b18367d2366585ad1933d 100644 --- a/src/structures/services/structures.service.spec.ts +++ b/src/structures/services/structures.service.spec.ts @@ -8,7 +8,7 @@ import { Types } from 'mongoose'; import { of } from 'rxjs'; import { personalOffersDataMock } from '../../../test/mock/data/personalOffers.mock.data'; import { - mockStructure, + mockStructureDocument, structureMockDto, structuresDocumentDataMock, } from '../../../test/mock/data/structures.mock.data'; @@ -544,7 +544,7 @@ describe('StructuresService', () => { }); it('should report structure Error', () => { - jest.spyOn(structuresService, 'findOne').mockResolvedValue(mockStructure); + jest.spyOn(structuresService, 'findOne').mockResolvedValue(mockStructureDocument); jest.spyOn(MailerService.prototype, 'send').mockImplementation(jest.fn()); let res = structuresService.reportStructureError('6093ba0e2ab5775cfc01ed3e', ''); expect(res).toBeTruthy(); diff --git a/test/mock/data/structures.mock.data.ts b/test/mock/data/structures.mock.data.ts index aca725fd872b3572834fc0bc2463b15aa3a1bf3d..961a24bfc02288af67976ccd4c32c8771cecae76 100644 --- a/test/mock/data/structures.mock.data.ts +++ b/test/mock/data/structures.mock.data.ts @@ -1,5 +1,5 @@ import { StructureDto } from '../../../src/structures/dto/structure.dto'; -import { StructureDocument } from '../../../src/structures/schemas/structure.schema'; +import { Structure, StructureDocument } from '../../../src/structures/schemas/structure.schema'; export const structuresDocumentDataMock: StructureDocument[] = [ { @@ -237,7 +237,7 @@ export const structureMockDto: StructureDto = { dataShareConsentDate: new Date(), }; -export const mockStructure = ({ +export const mockStructureDocument = ({ coord: [4.8498155, 45.7514817], categories: { accessModality: ['accesLibre'], @@ -342,3 +342,113 @@ export const mockStructure = ({ dataShareConsentDate: null, personalOffers: null, } as unknown) as StructureDocument; + +export const mockStructure = { + coord: [4.8498155, 45.7514817], + numero: '', + createdAt: null, + _id: '', + publicsAccompaniment: null, + autresAccompagnements: null, + __v: '', + dataShareConsentDate: null, + deletedAt: null, + personalOffers: [], + remoteAccompaniment: null, + updatedAt: null, + categories: { + accessModality: ['accesLibre'], + labelsQualifications: [ + 'monEspaceSante', + 'numRelay', + 'pix', + 'passNumerique', + 'fabriqueDeTerritoire', + 'aidantsConnect', + 'espacePublicNumeriqueepn', + 'maisonFranceService', + 'conseillerNumFranceServices', + ], + onlineProcedures: [ + 'idDoc', + 'training', + 'health', + 'work', + 'caf', + 'cpam', + 'foreigners', + 'needs', + 'franceConnect', + 'taxes', + 'housing', + 'retirement', + 'scolarity', + 'transport', + 'autres', + ], + selfServiceMaterial: ['wifiEnAccesLibre', 'computer', 'printer', 'scanner'], + solidarityMaterial: [], + baseSkills: ['computer', 'internet'], + advancedSkills: [], + age: ['young', 'family'], + languageAndIlliteracy: ['illettrisme', 'english'], + handicaps: ['physicalDisability'], + genre: ['uniquementFemmes'], + }, + structureType: null, + structureName: 'a', + description: null, + lockdownActivity: null, + address: { + numero: null, + street: 'Rue Alphonse Daudet', + commune: 'Lyon 7ème Arrondissement', + postcode: '69007', + inseeCode: '69387', + }, + contactMail: '', + contactPhone: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + linkedin: null, + hours: { + monday: { + open: false, + time: [], + }, + tuesday: { + open: false, + time: [], + }, + wednesday: { + open: false, + time: [], + }, + thursday: { + open: false, + time: [], + }, + friday: { + open: false, + time: [], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + pmrAccess: false, + exceptionalClosures: null, + otherDescription: null, + nbComputers: 1, + nbPrinters: 1, + nbScanners: 1, + freeWorkShop: 'Non', + accountVerified: true, +} as Structure;