From 013cb30d9730dca4199fc68f66eab4d4744e49bc Mon Sep 17 00:00:00 2001 From: abdulhakim2902 Date: Fri, 10 Dec 2021 01:41:10 +0700 Subject: [PATCH] fixed testing --- .../user.controller.integration.ts | 6 +- src/__tests__/unit/user.controller.unit.ts | 14 +--- src/controllers/friend.controller.ts | 71 ++++++++++++++++++- 3 files changed, 72 insertions(+), 19 deletions(-) diff --git a/src/__tests__/integration/controllers/user.controller.integration.ts b/src/__tests__/integration/controllers/user.controller.integration.ts index 2dc90d572..a010ab250 100644 --- a/src/__tests__/integration/controllers/user.controller.integration.ts +++ b/src/__tests__/integration/controllers/user.controller.integration.ts @@ -39,11 +39,7 @@ describe('UserControllerIntegration', () => { }); before(async () => { - controller = new UserController( - userRepository, - activityLogRepository, - friendRepository, - ); + controller = new UserController(userRepository, activityLogRepository); }); beforeEach(async () => { diff --git a/src/__tests__/unit/user.controller.unit.ts b/src/__tests__/unit/user.controller.unit.ts index b1d3fdcb3..04d4fe1bf 100644 --- a/src/__tests__/unit/user.controller.unit.ts +++ b/src/__tests__/unit/user.controller.unit.ts @@ -7,17 +7,12 @@ import { } from '@loopback/testlab'; import {UserController} from '../../controllers/user.controller'; import {User} from '../../models'; -import { - ActivityLogRepository, - FriendRepository, - UserRepository, -} from '../../repositories'; +import {ActivityLogRepository, UserRepository} from '../../repositories'; import {givenUser} from '../helpers'; describe('UserController', () => { let userRepository: StubbedInstanceWithSinonAccessor; let activityLogRepository: StubbedInstanceWithSinonAccessor; - let friendRepository: StubbedInstanceWithSinonAccessor; let controller: UserController; let aUser: User; let aUserWithId: User; @@ -85,7 +80,6 @@ describe('UserController', () => { function resetRepositories() { userRepository = createStubInstance(UserRepository); activityLogRepository = createStubInstance(ActivityLogRepository); - friendRepository = createStubInstance(FriendRepository); aUser = givenUser({ bio: 'Hello, my name is Abdul Hakim!', }); @@ -106,10 +100,6 @@ describe('UserController', () => { bio: 'Hello, my name is irman!', }); - controller = new UserController( - userRepository, - activityLogRepository, - friendRepository, - ); + controller = new UserController(userRepository, activityLogRepository); } }); diff --git a/src/controllers/friend.controller.ts b/src/controllers/friend.controller.ts index 73c8aba72..3a98c2166 100644 --- a/src/controllers/friend.controller.ts +++ b/src/controllers/friend.controller.ts @@ -1,5 +1,11 @@ import {intercept} from '@loopback/core'; -import {Filter, FilterExcludingWhere, repository} from '@loopback/repository'; +import { + Count, + CountSchema, + Filter, + FilterExcludingWhere, + repository, +} from '@loopback/repository'; import { del, get, @@ -10,9 +16,10 @@ import { requestBody, response, } from '@loopback/rest'; +import {FriendStatusType} from '../enums'; import {PaginationInterceptor} from '../interceptors'; import {ValidateFriendRequestInterceptor} from '../interceptors/validate-friend-request.interceptor'; -import {Friend} from '../models'; +import {Friend, User} from '../models'; import {FriendRepository} from '../repositories'; // import {authenticate} from '@loopback/authentication'; @@ -112,6 +119,66 @@ export class FriendController { await this.friendRepository.updateById(id, friend); } + @get('/friends/{requestorId}/mutual/{requesteeId}') + @response(200, { + description: 'Count mutual friends', + content: { + 'application/json': { + schema: CountSchema, + }, + }, + }) + async countMutual( + @param.path.string('requestorId') requestorId: string, + @param.path.string('requesteeId') requesteeId: string, + ): Promise { + /* eslint-disable @typescript-eslint/no-explicit-any */ + const collection = ( + this.friendRepository.dataSource.connector as any + ).collection(Friend.modelName); + + const countMutual = await collection + .aggregate([ + { + $match: { + $or: [ + { + requestorId: requestorId, + status: FriendStatusType.APPROVED, + }, + { + requestorId: requesteeId, + status: FriendStatusType.APPROVED, + }, + ], + }, + }, + {$group: {_id: '$requesteeId', count: {$sum: 1}}}, + {$match: {count: 2}}, + {$group: {_id: null, count: {$sum: 1}}}, + {$project: {_id: 0}}, + ]) + .get(); + + if (countMutual.length === 0) return {count: 0}; + return countMutual[0]; + } + + @intercept(PaginationInterceptor.BINDING_KEY) + @get('/friends/{requestorId}/detail/{requesteeId}') + @response(200, { + description: 'Detai Mutual Friends', + content: { + 'application/json': { + schema: User, + }, + }, + }) + mutualDetail( + @param.path.string('requestorId') requestorId: string, + @param.path.string('requesteeId') requesteeId: string, + ) {} + @intercept(ValidateFriendRequestInterceptor.BINDING_KEY) @del('/friends/{id}') @response(204, {