diff --git a/src/authentication/authentication.module.ts b/src/authentication/authentication.module.ts index e080d73..3deb67b 100644 --- a/src/authentication/authentication.module.ts +++ b/src/authentication/authentication.module.ts @@ -75,7 +75,7 @@ const providers: Provider[] = [ TwilioImplModule, HttpModule, ], - providers: providers, + providers, controllers: [GoogleAuthController], }) export class UserAuthModule {} diff --git a/src/authentication/service/google.service.ts b/src/authentication/service/google.service.ts index 7f195f6..bf0e978 100644 --- a/src/authentication/service/google.service.ts +++ b/src/authentication/service/google.service.ts @@ -1,15 +1,15 @@ -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; import { InvalidPayloadException } from '../exception/userauth.exception'; import User from '../../authorization/entity/user.entity'; import { GoogleUserSchema } from '../validation/user.auth.schema.validation'; -import UserService from '../../authorization/service/user.service'; +import { UserServiceInterface } from '../../authorization/service/user.service.interface'; import { AuthenticationHelper } from '../authentication.helper'; import { GoogleLoginUser } from '../passport/googleStrategy'; @Injectable() export class GoogleAuthService { constructor( - private userService: UserService, + @Inject(UserServiceInterface) private userService: UserServiceInterface, private authenticationHelper: AuthenticationHelper, ) {} private async validateInput( diff --git a/src/authentication/service/otp.auth.service.ts b/src/authentication/service/otp.auth.service.ts index e3d9462..5725f54 100644 --- a/src/authentication/service/otp.auth.service.ts +++ b/src/authentication/service/otp.auth.service.ts @@ -1,7 +1,7 @@ -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; import User from '../../authorization/entity/user.entity'; import { UserNotFoundException } from '../../authorization/exception/user.exception'; -import UserService from '../../authorization/service/user.service'; +import { UserServiceInterface } from '../../authorization/service/user.service.interface'; import { Status, TokenResponse, @@ -20,7 +20,7 @@ import { TokenService } from './token.service'; @Injectable() export default class OTPAuthService implements Authenticatable { constructor( - private userService: UserService, + @Inject(UserServiceInterface) private userService: UserServiceInterface, private tokenService: TokenService, private otpService: OTPVerifiable, ) {} diff --git a/src/authentication/service/password.auth.service.ts b/src/authentication/service/password.auth.service.ts index 09f7b64..6dd99da 100644 --- a/src/authentication/service/password.auth.service.ts +++ b/src/authentication/service/password.auth.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { DataSource } from 'typeorm'; import User from '../../authorization/entity/user.entity'; @@ -6,7 +6,7 @@ import { PasswordAlreadySetException, UserNotFoundException, } from '../../authorization/exception/user.exception'; -import UserService from '../../authorization/service/user.service'; +import { UserServiceInterface } from '../../authorization/service/user.service.interface'; import { InviteTokenResponse, Status, @@ -29,7 +29,7 @@ import { TokenService } from './token.service'; @Injectable() export default class PasswordAuthService implements Authenticatable { constructor( - private userService: UserService, + @Inject(UserServiceInterface) private userService: UserServiceInterface, private tokenService: TokenService, private authenticationHelper: AuthenticationHelper, private dataSource: DataSource, diff --git a/src/authentication/service/token.service.ts b/src/authentication/service/token.service.ts index ada050f..d0826ec 100644 --- a/src/authentication/service/token.service.ts +++ b/src/authentication/service/token.service.ts @@ -1,11 +1,11 @@ -import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { Inject, Injectable, UnauthorizedException } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import User from '../../authorization/entity/user.entity'; import { InviteTokenAlreadyRevokedException, PasswordAlreadySetException, } from '../../authorization/exception/user.exception'; -import UserService from '../../authorization/service/user.service'; +import { UserServiceInterface } from '../../authorization/service/user.service.interface'; import { InviteTokenResponse, TokenResponse, @@ -15,7 +15,7 @@ import { AuthenticationHelper } from '../authentication.helper'; @Injectable() export class TokenService { constructor( - private userService: UserService, + @Inject(UserServiceInterface) private userService: UserServiceInterface, private authenticationHelper: AuthenticationHelper, private configService: ConfigService, ) {} diff --git a/src/authorization/authorization.guard.ts b/src/authorization/authorization.guard.ts index 454893c..4cd0f4d 100644 --- a/src/authorization/authorization.guard.ts +++ b/src/authorization/authorization.guard.ts @@ -1,11 +1,19 @@ -import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; +import { + CanActivate, + ExecutionContext, + Inject, + Injectable, +} from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { GqlExecutionContext } from '@nestjs/graphql'; -import UserService from './service/user.service'; +import { UserServiceInterface } from './service/user.service.interface'; @Injectable() export class AuthorizationGaurd implements CanActivate { - constructor(private userService: UserService, private reflector: Reflector) {} + constructor( + @Inject(UserServiceInterface) private userService: UserServiceInterface, + private reflector: Reflector, + ) {} public async canActivate(context: ExecutionContext): Promise { const ctx = GqlExecutionContext.create(context).getContext(); const permissionsRequired = this.reflector.get( diff --git a/src/authorization/authorization.module.ts b/src/authorization/authorization.module.ts index 6c15c58..b6cc2c7 100644 --- a/src/authorization/authorization.module.ts +++ b/src/authorization/authorization.module.ts @@ -46,8 +46,10 @@ import { RoleServiceInterface } from './service/role.service.interface'; import RoleCacheService from './service/rolecache.service'; import { RoleCacheServiceInterface } from './service/rolecache.service.interface'; import SearchService from './service/search.service'; -import UserService from './service/user.service'; -import UserCacheService from './service/usercache.service'; +import { UserService } from './service/user.service'; +import { UserServiceInterface } from './service/user.service.interface'; +import { UserCacheService } from './service/usercache.service'; +import { UserCacheServiceInterface } from './service/usercache.service.interface'; @Module({ imports: [ @@ -69,11 +71,9 @@ import UserCacheService from './service/usercache.service'; providers: [ GroupResolver, PermissionResolver, - UserService, UserResolver, EntityResolver, RedisCacheService, - UserCacheService, AuthenticationHelper, ConfigService, RoleResolver, @@ -117,7 +117,20 @@ import UserCacheService from './service/usercache.service'; provide: GroupCacheServiceInterface, useClass: GroupCacheService, }, + { + provide: UserServiceInterface, + useClass: UserService, + }, + { + provide: UserCacheServiceInterface, + useClass: UserCacheService, + }, + ], + exports: [ + { + provide: UserServiceInterface, + useClass: UserService, + }, ], - exports: [UserService], }) export class AuthorizationModule {} diff --git a/src/authorization/resolver/user.resolver.ts b/src/authorization/resolver/user.resolver.ts index 7a575dd..820561b 100644 --- a/src/authorization/resolver/user.resolver.ts +++ b/src/authorization/resolver/user.resolver.ts @@ -1,4 +1,4 @@ -import { UseGuards } from '@nestjs/common'; +import { Inject, UseGuards } from '@nestjs/common'; import { ParseUUIDPipe } from '@nestjs/common/pipes'; import { Args, @@ -24,12 +24,14 @@ import { import ValidationPipe from '../../validation/validation.pipe'; import { PermissionsType } from '../constants/authorization.constants'; import { Permissions } from '../permissions.decorator'; -import UserService from '../service/user.service'; +import { UserServiceInterface } from '../service/user.service.interface'; import * as UserSchema from '../validation/user.validation.schema'; @Resolver('User') export class UserResolver { - constructor(private userService: UserService) {} + constructor( + @Inject(UserServiceInterface) private userService: UserServiceInterface, + ) {} @Permissions(PermissionsType.ViewUser) @Query() diff --git a/src/authorization/service/group.service.ts b/src/authorization/service/group.service.ts index 1122a6d..9359538 100644 --- a/src/authorization/service/group.service.ts +++ b/src/authorization/service/group.service.ts @@ -32,7 +32,7 @@ import { UserGroupRepository } from '../repository/userGroup.repository'; import { GroupServiceInterface } from './group.service.interface'; import { GroupCacheServiceInterface } from './groupcache.service.interface'; import SearchService from './search.service'; -import UserCacheService from './usercache.service'; +import { UserCacheServiceInterface } from './usercache.service.interface'; @Injectable() export class GroupService implements GroupServiceInterface { @@ -47,7 +47,8 @@ export class GroupService implements GroupServiceInterface { private dataSource: DataSource, @Inject(GroupCacheServiceInterface) private groupCacheService: GroupCacheServiceInterface, - private userCacheService: UserCacheService, + @Inject(UserCacheServiceInterface) + private userCacheService: UserCacheServiceInterface, private searchService: SearchService, ) {} diff --git a/src/authorization/service/user.service.interface.ts b/src/authorization/service/user.service.interface.ts new file mode 100644 index 0000000..cf1da42 --- /dev/null +++ b/src/authorization/service/user.service.interface.ts @@ -0,0 +1,66 @@ +import User from '../entity/user.entity'; +import { + OperationType, + UpdateUserGroupInput, + UpdateUserInput, + UpdateUserPermissionInput, + UserInputFilter, +} from '../../schema/graphql.schema'; +import Group from '../entity/group.entity'; +import Permission from '../entity/permission.entity'; + +export interface UserServiceInterface { + getAllUsers(input?: UserInputFilter): Promise<[User[], number]>; + + getUserById(id: string): Promise; + + createUser(user: User): Promise; + + updateUser(id: string, user: UpdateUserInput): Promise; + + updateUserGroups(id: string, user: UpdateUserGroupInput): Promise; + + getUserGroups(id: string): Promise; + + updateUserPermissions( + id: string, + request: UpdateUserPermissionInput, + ): Promise; + + getUserPermissions(id: string): Promise; + + deleteUser(id: string): Promise; + + getAllUserpermissionIds(id: string): Promise>; + + permissionsOfUser(id: string): Promise; + + verifyUserPermissions( + id: string, + permissionsToVerify: string[], + operation?: OperationType, + ): Promise; + + verifyDuplicateUser( + email?: string | undefined, + phone?: string | undefined, + ): Promise<{ existingUserDetails?: User | null; duplicate: string }>; + + getUserDetailsByEmailOrPhone( + email?: string | undefined, + phone?: string | undefined, + ): Promise; + + getUserDetailsByUsername( + email?: string | undefined, + phone?: string | undefined, + ): Promise; + + updateField(id: string, field: string, value: any): Promise; + + getActiveUserByPhoneNumber(phone: string): Promise; + + setOtpSecret(user: User, twoFASecret: string): Promise; +} + +export const UserServiceInterface = Symbol('UserServiceInterface'); diff --git a/src/authorization/service/user.service.ts b/src/authorization/service/user.service.ts index c4ab014..4aa563b 100644 --- a/src/authorization/service/user.service.ts +++ b/src/authorization/service/user.service.ts @@ -29,17 +29,19 @@ import { GroupCacheServiceInterface } from './groupcache.service.interface'; import { PermissionCacheServiceInterface } from './permissioncache.service.interface'; import { RoleCacheServiceInterface } from './rolecache.service.interface'; import SearchService from './search.service'; -import UserCacheService from './usercache.service'; +import { UserServiceInterface } from './user.service.interface'; +import { UserCacheServiceInterface } from './usercache.service.interface'; @Injectable() -export default class UserService { +export class UserService implements UserServiceInterface { constructor( private userRepository: UserRepository, private userGroupRepository: UserGroupRepository, private groupRepository: GroupRepository, private userPermissionRepository: UserPermissionRepository, private permissionRepository: PermissionRepository, - private userCacheService: UserCacheService, + @Inject(UserCacheServiceInterface) + private userCacheService: UserCacheServiceInterface, @Inject(GroupCacheServiceInterface) private groupCacheService: GroupCacheServiceInterface, @Inject(PermissionCacheServiceInterface) @@ -263,7 +265,7 @@ export default class UserService { return allPermissionsOfUser; } - public async permissionsOfUser(id: string) { + public async permissionsOfUser(id: string): Promise { const setOfPermissions: Set = await this.getAllUserpermissionIds( id, ); diff --git a/src/authorization/service/usercache.service.interface.ts b/src/authorization/service/usercache.service.interface.ts new file mode 100644 index 0000000..4510565 --- /dev/null +++ b/src/authorization/service/usercache.service.interface.ts @@ -0,0 +1,11 @@ +export interface UserCacheServiceInterface { + getUserGroupsByUserId(userId: string): Promise; + + getUserPermissionsByUserId(userId: string): Promise; + + invalidateUserPermissionsCache(userId: string): Promise; + + invalidateUserGroupsCache(userId: string): Promise; +} + +export const UserCacheServiceInterface = Symbol('UserCacheServiceInterface'); diff --git a/src/authorization/service/usercache.service.ts b/src/authorization/service/usercache.service.ts index cc59aae..7ee5f6f 100644 --- a/src/authorization/service/usercache.service.ts +++ b/src/authorization/service/usercache.service.ts @@ -3,9 +3,10 @@ import { RedisCacheService } from '../../cache/redis-cache/redis-cache.service'; import { UserRepository } from '../repository/user.repository'; import { UserGroupRepository } from '../repository/userGroup.repository'; import { UserPermissionRepository } from '../repository/userPermission.repository'; +import { UserCacheServiceInterface } from './usercache.service.interface'; @Injectable() -export default class UserCacheService { +export class UserCacheService implements UserCacheServiceInterface { constructor( private cacheManager: RedisCacheService, private userGroupRepository: UserGroupRepository, diff --git a/test/authentication/resolver/userauth.resolver.test.ts b/test/authentication/resolver/userauth.resolver.test.ts index 938bc7a..cf71957 100644 --- a/test/authentication/resolver/userauth.resolver.test.ts +++ b/test/authentication/resolver/userauth.resolver.test.ts @@ -1,7 +1,8 @@ import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigService } from '@nestjs/config'; import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; -import UserService from '../../../src/authorization/service/user.service'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; import Substitute, { Arg } from '@fluffy-spoon/substitute'; import User from '../../../src/authorization/entity/user.entity'; import { UserResolver } from '../../../src/authorization/resolver/user.resolver'; @@ -18,12 +19,11 @@ import { } from '../../../src/schema/graphql.schema'; import UserAuthResolver from '../../../src/authentication/resolver/user.auth.resolver'; import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; -import { ConfigService } from '@nestjs/config'; -import UserCacheService from '../../../src/authorization/service/usercache.service'; import { RedisCacheService } from '../../../src/cache/redis-cache/redis-cache.service'; import PasswordAuthService from '../../../src/authentication/service/password.auth.service'; import OTPAuthService from '../../../src/authentication/service/otp.auth.service'; import { TokenService } from '../../../src/authentication/service/token.service'; +import { UserCacheServiceInterface } from '../../../src/authorization/service/usercache.service.interface'; const users: User[] = [ { @@ -40,11 +40,11 @@ const users: User[] = [ const gql = '/graphql'; -const userService = Substitute.for(); +const userService = Substitute.for(); const passwordAuthService = Substitute.for(); const otpAuthService = Substitute.for(); const tokenService = Substitute.for(); -const userCacheService = Substitute.for(); +const userCacheService = Substitute.for(); const redisCacheService = Substitute.for(); describe('Userauth Module', () => { @@ -60,13 +60,13 @@ describe('Userauth Module', () => { UserAuthResolver, ConfigService, AuthenticationHelper, - { provide: 'UserService', useValue: userService }, - { provide: 'TokenService', useValue: tokenService }, - { provide: 'PasswordAuthService', useValue: passwordAuthService }, - { provide: 'OTPAuthService', useValue: otpAuthService }, - { provide: 'ConfigService', useValue: configService }, - { provide: 'UserCacheService', useValue: userCacheService }, - { provide: 'RedisCacheService', useValue: redisCacheService }, + { provide: UserServiceInterface, useValue: userService }, + { provide: TokenService, useValue: tokenService }, + { provide: PasswordAuthService, useValue: passwordAuthService }, + { provide: OTPAuthService, useValue: otpAuthService }, + { provide: ConfigService, useValue: configService }, + { provide: UserCacheServiceInterface, useValue: userCacheService }, + { provide: RedisCacheService, useValue: redisCacheService }, ], }).compile(); authenticationHelper = moduleFixture.get( diff --git a/test/authentication/service/otpauth.service.test.ts b/test/authentication/service/otpauth.service.test.ts index aa700aa..97f66c2 100644 --- a/test/authentication/service/otpauth.service.test.ts +++ b/test/authentication/service/otpauth.service.test.ts @@ -10,7 +10,7 @@ import OTPAuthService from '../../../src/authentication/service/otp.auth.service import { TokenService } from '../../../src/authentication/service/token.service'; import TwilioOTPService from '../../../src/authentication/service/twilio.otp.service'; import User from '../../../src/authorization/entity/user.entity'; -import UserService from '../../../src/authorization/service/user.service'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; import { Status, TokenResponse, @@ -34,7 +34,7 @@ let users: User[] = [ describe('test OTPAuthService', () => { let otpAuthService: OTPAuthService; let authenticationHelper: AuthenticationHelper; - const userService = Substitute.for(); + const userService = Substitute.for(); const configService = Substitute.for(); const otpService = Substitute.for(); const tokenService = Substitute.for(); @@ -46,9 +46,9 @@ describe('test OTPAuthService', () => { imports: [ConfigModule], controllers: [], providers: [ - { provide: 'UserService', useValue: userService }, - { provide: 'ConfigService', useValue: configService }, - { provide: 'TokenService', useValue: tokenService }, + { provide: UserServiceInterface, useValue: userService }, + { provide: ConfigService, useValue: configService }, + { provide: TokenService, useValue: tokenService }, { provide: 'OTPVerifiable', useValue: otpService }, OTPAuthService, AuthenticationHelper, diff --git a/test/authentication/service/passwordauth.service.test.ts b/test/authentication/service/passwordauth.service.test.ts index ccdac7e..89ca024 100644 --- a/test/authentication/service/passwordauth.service.test.ts +++ b/test/authentication/service/passwordauth.service.test.ts @@ -6,7 +6,7 @@ import { AuthenticationHelper } from '../../../src/authentication/authentication import PasswordAuthService from '../../../src/authentication/service/password.auth.service'; import { TokenService } from '../../../src/authentication/service/token.service'; import User from '../../../src/authorization/entity/user.entity'; -import UserService from '../../../src/authorization/service/user.service'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; import { Status } from '../../../src/schema/graphql.schema'; let users: User[] = [ @@ -25,7 +25,7 @@ let users: User[] = [ describe('test PasswordAuthService', () => { let passwordAuthService: PasswordAuthService; let authenticationHelper: AuthenticationHelper; - const userService = Substitute.for(); + const userService = Substitute.for(); const configService = Substitute.for(); const tokenService = Substitute.for(); configService.get('ENV').returns('local'); @@ -43,9 +43,9 @@ describe('test PasswordAuthService', () => { imports: [ConfigModule], controllers: [], providers: [ - { provide: 'UserService', useValue: userService }, - { provide: 'ConfigService', useValue: configService }, - { provide: 'TokenService', useValue: tokenService }, + { provide: UserServiceInterface, useValue: userService }, + { provide: ConfigService, useValue: configService }, + { provide: TokenService, useValue: tokenService }, { provide: DataSource, useValue: mockDataSource, diff --git a/test/authentication/service/token.service.test.ts b/test/authentication/service/token.service.test.ts index ca8a8de..a9590fa 100644 --- a/test/authentication/service/token.service.test.ts +++ b/test/authentication/service/token.service.test.ts @@ -8,12 +8,12 @@ import { import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; import { TokenService } from '../../../src/authentication/service/token.service'; import User from '../../../src/authorization/entity/user.entity'; -import UserService from '../../../src/authorization/service/user.service'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; describe('test TokenService', () => { let tokenService: TokenService; let authenticationHelper: AuthenticationHelper; - const userService = Substitute.for(); + const userService = Substitute.for(); const configService = Substitute.for(); configService.get('ENV').returns('local'); configService.get('JWT_SECRET').returns('s3cr3t1234567890'); @@ -24,8 +24,8 @@ describe('test TokenService', () => { imports: [ConfigModule], controllers: [], providers: [ - { provide: 'UserService', useValue: userService }, - { provide: 'ConfigService', useValue: configService }, + { provide: UserServiceInterface, useValue: userService }, + { provide: ConfigService, useValue: configService }, TokenService, AuthenticationHelper, ], diff --git a/test/authorization/resolver/entity.resolver.test.ts b/test/authorization/resolver/entity.resolver.test.ts index cc6b071..ade13d8 100644 --- a/test/authorization/resolver/entity.resolver.test.ts +++ b/test/authorization/resolver/entity.resolver.test.ts @@ -1,8 +1,14 @@ import Substitute, { Arg } from '@fluffy-spoon/substitute'; import { INestApplication } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; import { Test, TestingModule } from '@nestjs/testing'; -import { AppGraphQLModule } from '../../../src/graphql/graphql.module'; import * as request from 'supertest'; +import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; +import User from '../../../src/authorization/entity/user.entity'; +import { EntityResolver } from '../../../src/authorization/resolver/entity.resolver'; +import { EntityServiceInterface } from '../../../src/authorization/service/entity.service.interface'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; +import { AppGraphQLModule } from '../../../src/graphql/graphql.module'; import { Entity, NewEntityInput, @@ -10,13 +16,7 @@ import { UpdateEntityInput, UpdateEntityPermissionInput, } from '../../../src/schema/graphql.schema'; -import { EntityResolver } from '../../../src/authorization/resolver/entity.resolver'; -import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; -import UserService from '../../../src/authorization/service/user.service'; -import User from '../../../src/authorization/entity/user.entity'; import { mockedConfigService } from '../../utils/mocks/config.service'; -import { EntityServiceInterface } from '../../../src/authorization/service/entity.service.interface'; -import { ConfigService } from '@nestjs/config'; const gql = '/graphql'; @@ -56,7 +56,8 @@ const entities: Entity[] = [ ]; const entityService = Substitute.for(); -const userService = Substitute.for(); +const userService = Substitute.for(); + describe('Entity Module', () => { let app: INestApplication; userService @@ -70,7 +71,7 @@ describe('Entity Module', () => { providers: [ EntityResolver, { provide: EntityServiceInterface, useValue: entityService }, - { provide: UserService, useValue: userService }, + { provide: UserServiceInterface, useValue: userService }, { provide: ConfigService, useValue: mockedConfigService }, AuthenticationHelper, ], diff --git a/test/authorization/resolver/group.resolver.test.ts b/test/authorization/resolver/group.resolver.test.ts index 8d7f138..9329ed5 100644 --- a/test/authorization/resolver/group.resolver.test.ts +++ b/test/authorization/resolver/group.resolver.test.ts @@ -1,25 +1,24 @@ import Substitute, { Arg } from '@fluffy-spoon/substitute'; import { INestApplication } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; import { Test, TestingModule } from '@nestjs/testing'; -import { AppGraphQLModule } from '../../../src/graphql/graphql.module'; +import Permission from 'src/authorization/entity/permission.entity'; +import Role from 'src/authorization/entity/role.entity'; +import * as request from 'supertest'; +import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; import Group from '../../../src/authorization/entity/group.entity'; -import { GroupService } from '../../../src/authorization/service/group.service'; +import User from '../../../src/authorization/entity/user.entity'; import { GroupResolver } from '../../../src/authorization/resolver/group.resolver'; -import * as request from 'supertest'; +import { GroupServiceInterface } from '../../../src/authorization/service/group.service.interface'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; +import { AppGraphQLModule } from '../../../src/graphql/graphql.module'; +import * as GqlSchema from '../../../src/schema/graphql.schema'; import { NewGroupInput, UpdateGroupInput, UpdateGroupPermissionInput, } from '../../../src/schema/graphql.schema'; -import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; -import User from '../../../src/authorization/entity/user.entity'; -import UserService from '../../../src/authorization/service/user.service'; import { mockedConfigService } from '../../utils/mocks/config.service'; -import Role from 'src/authorization/entity/role.entity'; -import * as GqlSchema from '../../../src/schema/graphql.schema'; -import Permission from 'src/authorization/entity/permission.entity'; -import { GroupServiceInterface } from '../../../src/authorization/service/group.service.interface'; -import { ConfigService } from '@nestjs/config'; const gql = '/graphql'; @@ -53,7 +52,7 @@ const groupService = Substitute.for(); describe('Group Module', () => { let app: INestApplication; - const userService = Substitute.for(); + const userService = Substitute.for(); let authenticationHelper: AuthenticationHelper; beforeAll(async () => { userService @@ -65,7 +64,7 @@ describe('Group Module', () => { AuthenticationHelper, GroupResolver, { provide: GroupServiceInterface, useValue: groupService }, - { provide: UserService, useValue: userService }, + { provide: UserServiceInterface, useValue: userService }, { provide: ConfigService, useValue: mockedConfigService }, ], }).compile(); diff --git a/test/authorization/resolver/permission.resolver.test.ts b/test/authorization/resolver/permission.resolver.test.ts index 611169a..0780f43 100644 --- a/test/authorization/resolver/permission.resolver.test.ts +++ b/test/authorization/resolver/permission.resolver.test.ts @@ -2,20 +2,20 @@ import Substitute, { Arg } from '@fluffy-spoon/substitute'; import { INestApplication } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { Test, TestingModule } from '@nestjs/testing'; -import { AppGraphQLModule } from '../../../src/graphql/graphql.module'; import * as request from 'supertest'; +import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; +import Permission from '../../../src/authorization/entity/permission.entity'; +import User from '../../../src/authorization/entity/user.entity'; +import { PermissionResolver } from '../../../src/authorization/resolver/permission.resolver'; +import { PermissionServiceInterface } from '../../../src/authorization/service/permission.service.interface'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; +import { AppGraphQLModule } from '../../../src/graphql/graphql.module'; import { NewPermissionInput, Status, UpdatePermissionInput, } from '../../../src/schema/graphql.schema'; -import Permission from '../../../src/authorization/entity/permission.entity'; -import { PermissionResolver } from '../../../src/authorization/resolver/permission.resolver'; -import UserService from '../../../src/authorization/service/user.service'; import { mockedConfigService } from '../../utils/mocks/config.service'; -import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; -import User from '../../../src/authorization/entity/user.entity'; -import { PermissionServiceInterface } from '../../../src/authorization/service/permission.service.interface'; const gql = '/graphql'; const users: User[] = [ @@ -37,7 +37,8 @@ const permissions: Permission[] = [ }, ]; const permissionService = Substitute.for(); -const userService = Substitute.for(); +const userService = Substitute.for(); + describe('Permission Module', () => { let app: INestApplication; let token: string; @@ -47,7 +48,7 @@ describe('Permission Module', () => { providers: [ PermissionResolver, { provide: PermissionServiceInterface, useValue: permissionService }, - { provide: UserService, useValue: userService }, + { provide: UserServiceInterface, useValue: userService }, { provide: ConfigService, useValue: mockedConfigService }, AuthenticationHelper, ], diff --git a/test/authorization/resolver/role.resolver.test.ts b/test/authorization/resolver/role.resolver.test.ts index f636a61..f90e884 100644 --- a/test/authorization/resolver/role.resolver.test.ts +++ b/test/authorization/resolver/role.resolver.test.ts @@ -1,23 +1,23 @@ import Substitute, { Arg } from '@fluffy-spoon/substitute'; import { INestApplication } from '@nestjs/common'; -import { Test, TestingModule } from '@nestjs/testing'; import { ConfigService } from '@nestjs/config'; -import { AppGraphQLModule } from '../../../src/graphql/graphql.module'; +import { Test, TestingModule } from '@nestjs/testing'; +import Permission from 'src/authorization/entity/permission.entity'; import * as request from 'supertest'; +import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; +import Role from '../../../src/authorization/entity/role.entity'; +import User from '../../../src/authorization/entity/user.entity'; +import { RoleResolver } from '../../../src/authorization/resolver/role.resolver'; +import { RoleServiceInterface } from '../../../src/authorization/service/role.service.interface'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; +import { AppGraphQLModule } from '../../../src/graphql/graphql.module'; +import * as GqlSchema from '../../../src/schema/graphql.schema'; import { NewRoleInput, UpdateRoleInput, UpdateRolePermissionInput, } from '../../../src/schema/graphql.schema'; -import { AuthenticationHelper } from '../../../src/authentication/authentication.helper'; -import User from '../../../src/authorization/entity/user.entity'; -import UserService from '../../../src/authorization/service/user.service'; import { mockedConfigService } from '../../utils/mocks/config.service'; -import { RoleResolver } from '../../../src/authorization/resolver/role.resolver'; -import Role from '../../../src/authorization/entity/role.entity'; -import * as GqlSchema from '../../../src/schema/graphql.schema'; -import Permission from 'src/authorization/entity/permission.entity'; -import { RoleServiceInterface } from '../../../src/authorization/service/role.service.interface'; const gql = '/graphql'; @@ -51,7 +51,7 @@ const roleService = Substitute.for(); describe('Role Module', () => { let app: INestApplication; - const userService = Substitute.for(); + const userService = Substitute.for(); let authenticationHelper: AuthenticationHelper; beforeAll(async () => { userService @@ -63,7 +63,7 @@ describe('Role Module', () => { AuthenticationHelper, RoleResolver, { provide: RoleServiceInterface, useValue: roleService }, - { provide: UserService, useValue: userService }, + { provide: UserServiceInterface, useValue: userService }, { provide: ConfigService, useValue: mockedConfigService }, ], }).compile(); diff --git a/test/authorization/resolver/user.resolver.test.ts b/test/authorization/resolver/user.resolver.test.ts index ed8d8a3..be670cd 100644 --- a/test/authorization/resolver/user.resolver.test.ts +++ b/test/authorization/resolver/user.resolver.test.ts @@ -1,7 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import * as request from 'supertest'; import { INestApplication } from '@nestjs/common'; -import UserService from '../../../src/authorization/service/user.service'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; import Substitute from '@fluffy-spoon/substitute'; import User from '../../../src/authorization/entity/user.entity'; import { UserResolver } from '../../../src/authorization/resolver/user.resolver'; @@ -62,7 +62,7 @@ const groups: Group[] = [ const gql = '/graphql'; -const userService = Substitute.for(); +const userService = Substitute.for(); describe('User Module', () => { let app: INestApplication; @@ -76,8 +76,8 @@ describe('User Module', () => { providers: [ UserResolver, AuthenticationHelper, - { provide: 'ConfigService', useValue: configService }, - { provide: 'UserService', useValue: userService }, + { provide: ConfigService, useValue: configService }, + { provide: UserServiceInterface, useValue: userService }, ], }).compile(); authenticationHelper = moduleFixture.get( diff --git a/test/authorization/service/group.service.test.ts b/test/authorization/service/group.service.test.ts index 0141bf6..1feaf31 100644 --- a/test/authorization/service/group.service.test.ts +++ b/test/authorization/service/group.service.test.ts @@ -18,7 +18,7 @@ import { GroupService } from '../../../src/authorization/service/group.service'; import { GroupServiceInterface } from '../../../src/authorization/service/group.service.interface'; import { GroupCacheServiceInterface } from '../../../src/authorization/service/groupcache.service.interface'; import SearchService from '../../../src/authorization/service/search.service'; -import UserCacheService from '../../../src/authorization/service/usercache.service'; +import { UserCacheServiceInterface } from '../../../src/authorization/service/usercache.service.interface'; import { RedisCacheService } from '../../../src/cache/redis-cache/redis-cache.service'; import { NewGroupInput, @@ -72,7 +72,7 @@ describe('test Group Service', () => { const redisCacheService = Substitute.for(); const groupRoleRepository = Substitute.for>(); const roleRepository = Substitute.for>(); - const userCacheService = Substitute.for(); + const userCacheService = Substitute.for(); const searchService = Substitute.for(); const userQueryBuilder = Substitute.for>(); const permissionQueryBuilder = Substitute.for< @@ -149,7 +149,7 @@ describe('test Group Service', () => { provide: getRepositoryToken(Role), useValue: roleRepository, }, - { provide: UserCacheService, useValue: userCacheService }, + { provide: UserCacheServiceInterface, useValue: userCacheService }, { provide: GroupCacheServiceInterface, useValue: groupCacheService }, { provide: RedisCacheService, useValue: redisCacheService }, { provide: SearchService, useValue: searchService }, diff --git a/test/authorization/service/user.service.test.ts b/test/authorization/service/user.service.test.ts index d875d26..622cd66 100644 --- a/test/authorization/service/user.service.test.ts +++ b/test/authorization/service/user.service.test.ts @@ -18,8 +18,9 @@ import { GroupCacheServiceInterface } from '../../../src/authorization/service/g import { PermissionCacheServiceInterface } from '../../../src/authorization/service/permissioncache.service.interface'; import { RoleCacheServiceInterface } from '../../../src/authorization/service/rolecache.service.interface'; import SearchService from '../../../src/authorization/service/search.service'; -import UserService from '../../../src/authorization/service/user.service'; -import UserCacheService from '../../../src/authorization/service/usercache.service'; +import { UserService } from '../../../src/authorization/service/user.service'; +import { UserServiceInterface } from '../../../src/authorization/service/user.service.interface'; +import { UserCacheServiceInterface } from '../../../src/authorization/service/usercache.service.interface'; import { RedisCacheService } from '../../../src/cache/redis-cache/redis-cache.service'; import { Status } from '../../../src/schema/graphql.schema'; @@ -52,7 +53,7 @@ const groups: Group[] = [ ]; describe('test UserService', () => { - let userService: UserService; + let userService: UserServiceInterface; let userRepository: UserRepository; let createQueryBuilderMock: jest.Mock; @@ -72,7 +73,7 @@ describe('test UserService', () => { >(); const groupRoleRepository = Substitute.for>(); const rolePermissionRepository = Substitute.for>(); - const userCacheService = Substitute.for(); + const userCacheService = Substitute.for(); const groupCacheService = Substitute.for(); const permissionCacheService = Substitute.for(); const redisCacheService = Substitute.for(); @@ -125,7 +126,7 @@ describe('test UserService', () => { provide: getRepositoryToken(RolePermission), useValue: rolePermissionRepository, }, - { provide: UserCacheService, useValue: userCacheService }, + { provide: UserCacheServiceInterface, useValue: userCacheService }, { provide: GroupCacheServiceInterface, useValue: groupCacheService }, { provide: RedisCacheService, useValue: redisCacheService }, { provide: SearchService, useValue: searchService }, @@ -141,7 +142,7 @@ describe('test UserService', () => { }, ], }).compile(); - userService = moduleRef.get(UserService); + userService = moduleRef.get(UserService); userRepository = moduleRef.get(UserRepository); getUserByIdMock = userRepository.getUserById = jest.fn();