test: add test of RoleService
This commit is contained in:
		
							parent
							
								
									e8f3c587c9
								
							
						
					
					
						commit
						1f39d1fe26
					
				|  | @ -0,0 +1,145 @@ | ||||||
|  | process.env.NODE_ENV = 'test'; | ||||||
|  | 
 | ||||||
|  | import { jest } from '@jest/globals'; | ||||||
|  | import { ModuleMocker } from 'jest-mock'; | ||||||
|  | import { Test } from '@nestjs/testing'; | ||||||
|  | import { DataSource } from 'typeorm'; | ||||||
|  | import { GlobalModule } from '@/GlobalModule.js'; | ||||||
|  | import { RoleService } from '@/core/RoleService.js'; | ||||||
|  | import type { Role, RolesRepository, RoleAssignmentsRepository, UsersRepository } from '@/models/index.js'; | ||||||
|  | import { DI } from '@/di-symbols.js'; | ||||||
|  | import { CoreModule } from '@/core/CoreModule.js'; | ||||||
|  | import { MetaService } from '@/core/MetaService.js'; | ||||||
|  | import type { TestingModule } from '@nestjs/testing'; | ||||||
|  | import type { MockFunctionMetadata } from 'jest-mock'; | ||||||
|  | 
 | ||||||
|  | const moduleMocker = new ModuleMocker(global); | ||||||
|  | 
 | ||||||
|  | describe('RoleService', () => { | ||||||
|  | 	let app: TestingModule; | ||||||
|  | 	let roleService: RoleService; | ||||||
|  | 	let usersRepository: UsersRepository; | ||||||
|  | 	let rolesRepository: RolesRepository; | ||||||
|  | 	let roleAssignmentsRepository: RoleAssignmentsRepository; | ||||||
|  | 	let metaService: jest.Mocked<MetaService>; | ||||||
|  | 
 | ||||||
|  | 	function createUser() { | ||||||
|  | 		return usersRepository.insert({ | ||||||
|  | 			id: 'a', | ||||||
|  | 			createdAt: new Date(), | ||||||
|  | 			username: 'a', | ||||||
|  | 			usernameLower: 'a', | ||||||
|  | 		}) | ||||||
|  | 			.then(x => usersRepository.findOneByOrFail(x.identifiers[0])); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	function createRole(data: Partial<Role>) { | ||||||
|  | 		return rolesRepository.insert({ | ||||||
|  | 			id: 'a', | ||||||
|  | 			createdAt: new Date(), | ||||||
|  | 			updatedAt: new Date(), | ||||||
|  | 			lastUsedAt: new Date(), | ||||||
|  | 			description: '', | ||||||
|  | 			...data, | ||||||
|  | 		}) | ||||||
|  | 			.then(x => rolesRepository.findOneByOrFail(x.identifiers[0])); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	beforeEach(async () => { | ||||||
|  | 		app = await Test.createTestingModule({ | ||||||
|  | 			imports: [ | ||||||
|  | 				GlobalModule, | ||||||
|  | 			], | ||||||
|  | 			providers: [ | ||||||
|  | 				RoleService, | ||||||
|  | 			], | ||||||
|  | 		}) | ||||||
|  | 			.useMocker((token) => { | ||||||
|  | 				if (token === MetaService) { | ||||||
|  | 					return { fetch: jest.fn() }; | ||||||
|  | 				} | ||||||
|  | 				if (typeof token === 'function') { | ||||||
|  | 					const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>; | ||||||
|  | 					const Mock = moduleMocker.generateFromMetadata(mockMetadata); | ||||||
|  | 					return new Mock(); | ||||||
|  | 				} | ||||||
|  | 			}) | ||||||
|  | 			.compile(); | ||||||
|  | 
 | ||||||
|  | 		app.enableShutdownHooks(); | ||||||
|  | 
 | ||||||
|  | 		roleService = app.get<RoleService>(RoleService); | ||||||
|  | 		usersRepository = app.get<UsersRepository>(DI.usersRepository); | ||||||
|  | 		rolesRepository = app.get<RolesRepository>(DI.rolesRepository); | ||||||
|  | 		roleAssignmentsRepository = app.get<RoleAssignmentsRepository>(DI.roleAssignmentsRepository); | ||||||
|  | 
 | ||||||
|  | 		metaService = app.get<MetaService>(MetaService) as jest.Mocked<MetaService>; | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	afterEach(async () => { | ||||||
|  | 		await Promise.all([ | ||||||
|  | 			app.get(DI.metasRepository).delete({}), | ||||||
|  | 			usersRepository.delete({}), | ||||||
|  | 			rolesRepository.delete({}), | ||||||
|  | 			roleAssignmentsRepository.delete({}), | ||||||
|  | 		]); | ||||||
|  | 		await app.close(); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	describe('getUserPolicies', () => { | ||||||
|  | 		it('instance default policies', async () => {	 | ||||||
|  | 			const user = await createUser(); | ||||||
|  | 			metaService.fetch.mockResolvedValue({ | ||||||
|  | 				policies: { | ||||||
|  | 					canManageCustomEmojis: false, | ||||||
|  | 				}, | ||||||
|  | 			}); | ||||||
|  | 	 | ||||||
|  | 			const result = await roleService.getUserPolicies(user.id); | ||||||
|  | 	 | ||||||
|  | 			expect(result.canManageCustomEmojis).toBe(false); | ||||||
|  | 		}); | ||||||
|  | 	 | ||||||
|  | 		it('instance default policies 2', async () => {	 | ||||||
|  | 			const user = await createUser(); | ||||||
|  | 			metaService.fetch.mockResolvedValue({ | ||||||
|  | 				policies: { | ||||||
|  | 					canManageCustomEmojis: true, | ||||||
|  | 				}, | ||||||
|  | 			}); | ||||||
|  | 	 | ||||||
|  | 			const result = await roleService.getUserPolicies(user.id); | ||||||
|  | 	 | ||||||
|  | 			expect(result.canManageCustomEmojis).toBe(true); | ||||||
|  | 		}); | ||||||
|  | 	 | ||||||
|  | 		it('with role', async () => {	 | ||||||
|  | 			const user = await createUser(); | ||||||
|  | 			const role = await createRole({ | ||||||
|  | 				name: 'a', | ||||||
|  | 				policies: { | ||||||
|  | 					canManageCustomEmojis: { | ||||||
|  | 						useDefault: false, | ||||||
|  | 						priority: 0, | ||||||
|  | 						value: true, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}); | ||||||
|  | 			await roleAssignmentsRepository.insert({ | ||||||
|  | 				id: 'a', | ||||||
|  | 				createdAt: new Date(), | ||||||
|  | 				roleId: role.id, | ||||||
|  | 				userId: user.id, | ||||||
|  | 			}); | ||||||
|  | 			metaService.fetch.mockResolvedValue({ | ||||||
|  | 				policies: { | ||||||
|  | 					canManageCustomEmojis: false, | ||||||
|  | 				}, | ||||||
|  | 			}); | ||||||
|  | 	 | ||||||
|  | 			const result = await roleService.getUserPolicies(user.id); | ||||||
|  | 	 | ||||||
|  | 			expect(result.canManageCustomEmojis).toBe(true); | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
|  | }); | ||||||
		Loading…
	
		Reference in New Issue