call app.init, app.enableShutdownHooks, and app.close in more tests

This commit is contained in:
Hazelnoot 2025-10-01 11:54:07 -04:00
parent 7d6732bf96
commit 92892338f3
11 changed files with 66 additions and 53 deletions

View file

@ -149,6 +149,9 @@ describe('AbuseReportNotificationService', () => {
})
.compile();
await app.init();
app.enableShutdownHooks();
usersRepository = app.get(DI.usersRepository);
userProfilesRepository = app.get(DI.userProfilesRepository);
systemWebhooksRepository = app.get(DI.systemWebhooksRepository);
@ -159,8 +162,10 @@ describe('AbuseReportNotificationService', () => {
roleService = app.get(RoleService) as jest.Mocked<RoleService>;
emailService = app.get<EmailService>(EmailService) as jest.Mocked<EmailService>;
webhookService = app.get<SystemWebhookService>(SystemWebhookService) as jest.Mocked<SystemWebhookService>;
});
app.enableShutdownHooks();
afterAll(async () => {
await app.close();
});
beforeEach(async () => {
@ -185,10 +190,6 @@ describe('AbuseReportNotificationService', () => {
await abuseReportNotificationRecipientRepository.delete({});
});
afterAll(async () => {
await app.close();
});
// --------------------------------------------------------------------------------------
describe('createRecipient', () => {

View file

@ -45,6 +45,7 @@ describe('CaptchaService', () => {
],
}).compile();
await app.init();
app.enableShutdownHooks();
service = app.get(CaptchaService);

View file

@ -44,6 +44,8 @@ describe('CustomEmojiService', () => {
],
})
.compile();
await app.init();
app.enableShutdownHooks();
service = app.get<CustomEmojiService>(CustomEmojiService);

View file

@ -27,20 +27,22 @@ describe('DriveService', () => {
beforeAll(async () => {
app = await Test.createTestingModule({
imports: [GlobalModule, CoreModule],
providers: [DriveService],
}).compile();
app.enableShutdownHooks();
driveService = app.get<DriveService>(DriveService);
});
beforeEach(async () => {
s3Mock.reset();
await app.init();
app.enableShutdownHooks();
driveService = app.get<DriveService>(DriveService);
});
afterAll(async () => {
await app.close();
});
beforeEach(async () => {
s3Mock.reset();
});
describe('Object storage', () => {
test('delete a file', async () => {
s3Mock.on(DeleteObjectCommand)

View file

@ -56,6 +56,7 @@ describe('FileInfoService', () => {
})
.compile();
await app.init();
app.enableShutdownHooks();
fileInfoService = app.get<FileInfoService>(FileInfoService);

View file

@ -9,7 +9,9 @@ import { FlashService } from '@/core/FlashService.js';
import { IdService } from '@/core/IdService.js';
import { FlashsRepository, MiFlash, MiUser, UserProfilesRepository, UsersRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js';
import { CacheManagementService } from '@/core/CacheManagementService.js';
import { GlobalModule } from '@/GlobalModule.js';
import { CoreModule } from '@/core/CoreModule.js';
describe('FlashService', () => {
let app: TestingModule;
@ -21,6 +23,7 @@ describe('FlashService', () => {
let usersRepository: UsersRepository;
let userProfilesRepository: UserProfilesRepository;
let idService: IdService;
let cacheManagementService: CacheManagementService;
// --------------------------------------------------------------------------------------
@ -61,16 +64,15 @@ describe('FlashService', () => {
// --------------------------------------------------------------------------------------
beforeEach(async () => {
beforeAll(async () => {
app = await Test.createTestingModule({
imports: [
GlobalModule,
],
providers: [
FlashService,
IdService,
CoreModule,
],
}).compile();
await app.init();
app.enableShutdownHooks();
service = app.get(FlashService);
@ -79,7 +81,14 @@ describe('FlashService', () => {
usersRepository = app.get(DI.usersRepository);
userProfilesRepository = app.get(DI.userProfilesRepository);
idService = app.get(IdService);
cacheManagementService = app.get(CacheManagementService);
});
afterAll(async () => {
await app.close();
});
beforeEach(async () => {
root = await createUser({ username: 'root', usernameLower: 'root' });
alice = await createUser({ username: 'alice', usernameLower: 'alice' });
bob = await createUser({ username: 'bob', usernameLower: 'bob' });
@ -89,10 +98,7 @@ describe('FlashService', () => {
await usersRepository.delete({});
await userProfilesRepository.delete({});
await flashsRepository.delete({});
});
afterAll(async () => {
await app.close();
cacheManagementService.clear();
});
// --------------------------------------------------------------------------------------

View file

@ -27,6 +27,7 @@ describe('MetaService', () => {
],
}).compile();
await app.init();
app.enableShutdownHooks();
metaService = app.get<MetaService>(MetaService, { strict: false });

View file

@ -52,6 +52,7 @@ describe('RelayService', () => {
})
.compile();
await app.init();
app.enableShutdownHooks();
relayService = app.get<RelayService>(RelayService);

View file

@ -37,6 +37,8 @@ describe('S3Service', () => {
})
.overrideProvider(InternalEventService).useClass(FakeInternalEventService)
.compile();
await app.init();
app.enableShutdownHooks();
});

View file

@ -10,6 +10,7 @@ import { FastifyReply, FastifyRequest } from 'fastify';
import { AuthenticationResponseJSON } from '@simplewebauthn/types';
import { HttpHeader } from 'fastify/types/utils.js';
import { MockFunctionMetadata, ModuleMocker } from 'jest-mock';
import { FakeSkRateLimiterService } from '../misc/FakeSkRateLimiterService.js';
import { MiUser } from '@/models/User.js';
import { MiUserProfile, UserProfilesRepository, UsersRepository } from '@/models/_.js';
import { IdService } from '@/core/IdService.js';
@ -21,23 +22,11 @@ import { WebAuthnService } from '@/core/WebAuthnService.js';
import { SigninService } from '@/server/api/SigninService.js';
import { IdentifiableError } from '@/misc/identifiable-error.js';
import { SkRateLimiterService } from '@/server/SkRateLimiterService.js';
import { LimitInfo } from '@/misc/rate-limit-utils.js';
import { CacheManagementService } from '@/core/CacheManagementService.js';
import { ServerModule } from '@/server/ServerModule.js';
const moduleMocker = new ModuleMocker(global);
class FakeLimiter {
public async limit(): Promise<LimitInfo> {
return {
blocked: false,
remaining: Number.MAX_SAFE_INTEGER,
resetMs: 0,
resetSec: 0,
fullResetMs: 0,
fullResetSec: 0,
};
}
}
class FakeSigninService {
public signin(..._args: any): any {
return true;
@ -52,6 +41,7 @@ class DummyFastifyReply {
header(_key: HttpHeader, _value: any): void {
}
}
class DummyFastifyRequest {
public ip: string;
public body: { credential: any, context: string };
@ -76,44 +66,46 @@ describe('SigninWithPasskeyApiService', () => {
let userProfilesRepository: UserProfilesRepository;
let webAuthnService: WebAuthnService;
let idService: IdService;
let cacheManagementService: CacheManagementService;
let FakeWebauthnVerify: ()=>Promise<string>;
async function createUser(data: Partial<MiUser> = {}) {
const user = await usersRepository
.save({
...data,
});
return user;
await usersRepository.insert(data);
return await usersRepository.findOneByOrFail({ id: data.id });
}
async function createUserProfile(data: Partial<MiUserProfile> = {}) {
const userProfile = await userProfilesRepository
.save({ ...data },
);
return userProfile;
await userProfilesRepository.insert(data);
return await userProfilesRepository.findOneByOrFail({ userId: data.userId });
}
beforeAll(async () => {
app = await Test.createTestingModule({
imports: [GlobalModule, CoreModule],
providers: [
SigninWithPasskeyApiService,
{ provide: SkRateLimiterService, useClass: FakeLimiter },
{ provide: SigninService, useClass: FakeSigninService },
],
imports: [GlobalModule, CoreModule, ServerModule],
}).useMocker((token) => {
if (typeof token === 'function') {
const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
const Mock = moduleMocker.generateFromMetadata(mockMetadata);
return new Mock();
}
}).compile();
})
.overrideProvider(SkRateLimiterService).useClass(FakeSkRateLimiterService)
.overrideProvider(SigninService).useClass(FakeSigninService)
.compile();
await app.init();
app.enableShutdownHooks();
passkeyApiService = app.get<SigninWithPasskeyApiService>(SigninWithPasskeyApiService);
usersRepository = app.get<UsersRepository>(DI.usersRepository);
userProfilesRepository = app.get<UserProfilesRepository>(DI.userProfilesRepository);
webAuthnService = app.get<WebAuthnService>(WebAuthnService);
idService = app.get<IdService>(IdService);
cacheManagementService = app.get(CacheManagementService);
});
afterAll(async () => {
await app.close();
});
beforeEach(async () => {
@ -125,7 +117,7 @@ describe('SigninWithPasskeyApiService', () => {
const dummyUser = {
id: uid, username: uid, usernameLower: uid.toLowerCase(), uri: null, host: null,
};
};
const dummyProfile = {
userId: uid,
password: 'qwerty',
@ -135,8 +127,10 @@ describe('SigninWithPasskeyApiService', () => {
await createUserProfile(dummyProfile);
});
afterAll(async () => {
await app.close();
afterEach(async () => {
await userProfilesRepository.delete({});
await usersRepository.delete({});
cacheManagementService.clear();
});
describe('Get Passkey Options', () => {

View file

@ -32,6 +32,8 @@ describe('/drive/files/create', () => {
module = await Test.createTestingModule({
imports: [GlobalModule, CoreModule, ServerModule],
}).compile();
await module.init();
module.enableShutdownHooks();
const serverService = module.get<ServerService>(ServerService);