fix(backend): テストが死んでいるのを修正 (#12738)
* fix test * fix test * fix test * fix test * fix test
This commit is contained in:
parent
79ca93cefb
commit
433d46e57f
3 changed files with 34 additions and 14 deletions
|
@ -3,8 +3,9 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
|
import { Inject, Injectable, OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
||||||
import * as Redis from 'ioredis';
|
import * as Redis from 'ioredis';
|
||||||
|
import { ModuleRef } from '@nestjs/core';
|
||||||
import type { UserListMembershipsRepository } from '@/models/_.js';
|
import type { UserListMembershipsRepository } from '@/models/_.js';
|
||||||
import type { MiUser } from '@/models/User.js';
|
import type { MiUser } from '@/models/User.js';
|
||||||
import type { MiUserList } from '@/models/UserList.js';
|
import type { MiUserList } from '@/models/UserList.js';
|
||||||
|
@ -21,12 +22,15 @@ import { RedisKVCache } from '@/misc/cache.js';
|
||||||
import { RoleService } from '@/core/RoleService.js';
|
import { RoleService } from '@/core/RoleService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class UserListService implements OnApplicationShutdown {
|
export class UserListService implements OnApplicationShutdown, OnModuleInit {
|
||||||
public static TooManyUsersError = class extends Error {};
|
public static TooManyUsersError = class extends Error {};
|
||||||
|
|
||||||
public membersCache: RedisKVCache<Set<string>>;
|
public membersCache: RedisKVCache<Set<string>>;
|
||||||
|
private roleService: RoleService;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
private moduleRef: ModuleRef,
|
||||||
|
|
||||||
@Inject(DI.redis)
|
@Inject(DI.redis)
|
||||||
private redisClient: Redis.Redis,
|
private redisClient: Redis.Redis,
|
||||||
|
|
||||||
|
@ -38,7 +42,6 @@ export class UserListService implements OnApplicationShutdown {
|
||||||
|
|
||||||
private userEntityService: UserEntityService,
|
private userEntityService: UserEntityService,
|
||||||
private idService: IdService,
|
private idService: IdService,
|
||||||
private roleService: RoleService,
|
|
||||||
private globalEventService: GlobalEventService,
|
private globalEventService: GlobalEventService,
|
||||||
private proxyAccountService: ProxyAccountService,
|
private proxyAccountService: ProxyAccountService,
|
||||||
private queueService: QueueService,
|
private queueService: QueueService,
|
||||||
|
@ -54,6 +57,10 @@ export class UserListService implements OnApplicationShutdown {
|
||||||
this.redisForSub.on('message', this.onMessage);
|
this.redisForSub.on('message', this.onMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async onModuleInit() {
|
||||||
|
this.roleService = this.moduleRef.get(RoleService.name);
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async onMessage(_: string, data: string): Promise<void> {
|
private async onMessage(_: string, data: string): Promise<void> {
|
||||||
const obj = JSON.parse(data);
|
const obj = JSON.parse(data);
|
||||||
|
|
|
@ -10,9 +10,8 @@ process.env.NODE_ENV = 'test';
|
||||||
process.env.FORCE_FOLLOW_REMOTE_USER_FOR_TESTING = 'true';
|
process.env.FORCE_FOLLOW_REMOTE_USER_FOR_TESTING = 'true';
|
||||||
|
|
||||||
import * as assert from 'assert';
|
import * as assert from 'assert';
|
||||||
import { signup, api, post, react, startServer, waitFire, sleep, uploadUrl, randomString } from '../utils.js';
|
import { api, post, randomString, signup, sleep, startServer, uploadUrl } from '../utils.js';
|
||||||
import type { INestApplicationContext } from '@nestjs/common';
|
import type { INestApplicationContext } from '@nestjs/common';
|
||||||
import type * as misskey from 'misskey-js';
|
|
||||||
|
|
||||||
function genHost() {
|
function genHost() {
|
||||||
return randomString() + '.example.com';
|
return randomString() + '.example.com';
|
||||||
|
@ -366,8 +365,8 @@ describe('Timelines', () => {
|
||||||
await api('/following/create', { userId: bob.id }, alice);
|
await api('/following/create', { userId: bob.id }, alice);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
const [bobFile, carolFile] = await Promise.all([
|
const [bobFile, carolFile] = await Promise.all([
|
||||||
uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png'),
|
uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png'),
|
||||||
uploadUrl(carol, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png'),
|
uploadUrl(carol, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png'),
|
||||||
]);
|
]);
|
||||||
const bobNote1 = await post(bob, { text: 'hi' });
|
const bobNote1 = await post(bob, { text: 'hi' });
|
||||||
const bobNote2 = await post(bob, { fileIds: [bobFile.id] });
|
const bobNote2 = await post(bob, { fileIds: [bobFile.id] });
|
||||||
|
@ -666,7 +665,7 @@ describe('Timelines', () => {
|
||||||
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
|
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
|
||||||
const [alice, bob] = await Promise.all([signup(), signup()]);
|
const [alice, bob] = await Promise.all([signup(), signup()]);
|
||||||
|
|
||||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
|
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
|
||||||
const bobNote1 = await post(bob, { text: 'hi' });
|
const bobNote1 = await post(bob, { text: 'hi' });
|
||||||
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
||||||
|
|
||||||
|
@ -804,7 +803,7 @@ describe('Timelines', () => {
|
||||||
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
|
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
|
||||||
const [alice, bob] = await Promise.all([signup(), signup()]);
|
const [alice, bob] = await Promise.all([signup(), signup()]);
|
||||||
|
|
||||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
|
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
|
||||||
const bobNote1 = await post(bob, { text: 'hi' });
|
const bobNote1 = await post(bob, { text: 'hi' });
|
||||||
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
||||||
|
|
||||||
|
@ -999,7 +998,7 @@ describe('Timelines', () => {
|
||||||
|
|
||||||
const list = await api('/users/lists/create', { name: 'list' }, alice).then(res => res.body);
|
const list = await api('/users/lists/create', { name: 'list' }, alice).then(res => res.body);
|
||||||
await api('/users/lists/push', { listId: list.id, userId: bob.id }, alice);
|
await api('/users/lists/push', { listId: list.id, userId: bob.id }, alice);
|
||||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
|
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
|
||||||
const bobNote1 = await post(bob, { text: 'hi' });
|
const bobNote1 = await post(bob, { text: 'hi' });
|
||||||
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
||||||
|
|
||||||
|
@ -1158,7 +1157,7 @@ describe('Timelines', () => {
|
||||||
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
|
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
|
||||||
const [alice, bob] = await Promise.all([signup(), signup()]);
|
const [alice, bob] = await Promise.all([signup(), signup()]);
|
||||||
|
|
||||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
|
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
|
||||||
const bobNote1 = await post(bob, { text: 'hi' });
|
const bobNote1 = await post(bob, { text: 'hi' });
|
||||||
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
||||||
|
|
||||||
|
|
|
@ -73,13 +73,21 @@ describe('RoleService', () => {
|
||||||
CacheService,
|
CacheService,
|
||||||
IdService,
|
IdService,
|
||||||
GlobalEventService,
|
GlobalEventService,
|
||||||
|
{
|
||||||
|
provide: NotificationService,
|
||||||
|
useFactory: () => ({
|
||||||
|
createNotification: jest.fn(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
provide: NotificationService.name,
|
||||||
|
useExisting: NotificationService,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
.useMocker((token) => {
|
.useMocker((token) => {
|
||||||
if (token === MetaService) {
|
if (token === MetaService) {
|
||||||
return { fetch: jest.fn() };
|
return { fetch: jest.fn() };
|
||||||
} else if (token === NotificationService) {
|
|
||||||
return { createNotification: jest.fn() };
|
|
||||||
}
|
}
|
||||||
if (typeof token === 'function') {
|
if (typeof token === 'function') {
|
||||||
const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
|
const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
|
||||||
|
@ -98,6 +106,8 @@ describe('RoleService', () => {
|
||||||
|
|
||||||
metaService = app.get<MetaService>(MetaService) as jest.Mocked<MetaService>;
|
metaService = app.get<MetaService>(MetaService) as jest.Mocked<MetaService>;
|
||||||
notificationService = app.get<NotificationService>(NotificationService) as jest.Mocked<NotificationService>;
|
notificationService = app.get<NotificationService>(NotificationService) as jest.Mocked<NotificationService>;
|
||||||
|
|
||||||
|
await roleService.onModuleInit();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
@ -284,10 +294,12 @@ describe('RoleService', () => {
|
||||||
const user = await createUser();
|
const user = await createUser();
|
||||||
const role = await createRole({
|
const role = await createRole({
|
||||||
isPublic: true,
|
isPublic: true,
|
||||||
|
name: 'a',
|
||||||
});
|
});
|
||||||
|
|
||||||
await roleService.assign(user.id, role.id);
|
await roleService.assign(user.id, role.id);
|
||||||
|
|
||||||
|
clock.uninstall();
|
||||||
await sleep(100);
|
await sleep(100);
|
||||||
|
|
||||||
const assignments = await roleAssignmentsRepository.find({
|
const assignments = await roleAssignmentsRepository.find({
|
||||||
|
@ -301,7 +313,7 @@ describe('RoleService', () => {
|
||||||
expect(notificationService.createNotification).toHaveBeenCalled();
|
expect(notificationService.createNotification).toHaveBeenCalled();
|
||||||
expect(notificationService.createNotification.mock.lastCall![0]).toBe(user.id);
|
expect(notificationService.createNotification.mock.lastCall![0]).toBe(user.id);
|
||||||
expect(notificationService.createNotification.mock.lastCall![1]).toBe('roleAssigned');
|
expect(notificationService.createNotification.mock.lastCall![1]).toBe('roleAssigned');
|
||||||
expect(notificationService.createNotification.mock.lastCall![2]).toBe({
|
expect(notificationService.createNotification.mock.lastCall![2]).toEqual({
|
||||||
roleId: role.id,
|
roleId: role.id,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -310,10 +322,12 @@ describe('RoleService', () => {
|
||||||
const user = await createUser();
|
const user = await createUser();
|
||||||
const role = await createRole({
|
const role = await createRole({
|
||||||
isPublic: false,
|
isPublic: false,
|
||||||
|
name: 'a',
|
||||||
});
|
});
|
||||||
|
|
||||||
await roleService.assign(user.id, role.id);
|
await roleService.assign(user.id, role.id);
|
||||||
|
|
||||||
|
clock.uninstall();
|
||||||
await sleep(100);
|
await sleep(100);
|
||||||
|
|
||||||
const assignments = await roleAssignmentsRepository.find({
|
const assignments = await roleAssignmentsRepository.find({
|
||||||
|
|
Loading…
Reference in a new issue