From f50364b100d4aa573d85f643eb7e75ba8d3b9688 Mon Sep 17 00:00:00 2001 From: tamaina Date: Wed, 16 Jul 2025 21:33:39 +0900 Subject: [PATCH] update test --- packages/backend/test/e2e/timelines.ts | 71 ++++++++++++------- .../backend/test/unit/UserSuspendService.ts | 54 ++++++++++++++ 2 files changed, 100 insertions(+), 25 deletions(-) diff --git a/packages/backend/test/e2e/timelines.ts b/packages/backend/test/e2e/timelines.ts index b6728c6c33..c1400a2cff 100644 --- a/packages/backend/test/e2e/timelines.ts +++ b/packages/backend/test/e2e/timelines.ts @@ -9,8 +9,8 @@ import * as assert from 'assert'; import { setTimeout } from 'node:timers/promises'; import { Redis } from 'ioredis'; -import { SignupResponse, Role, Note } from 'misskey-js/entities.js'; -import { api, post, randomString, sendEnvUpdateRequest, signup, uploadUrl, role } from '../utils.js'; +import { SignupResponse, Note, UserList } from 'misskey-js/entities.js'; +import { api, post, randomString, sendEnvUpdateRequest, signup, uploadUrl } from '../utils.js'; import { loadConfig } from '@/config.js'; function genHost() { @@ -667,12 +667,12 @@ describe('Timelines', () => { carolNote = await post(carol, { text: 'kon\'nichiwa' }); await waitForPushToTl(); + + await api('admin/suspend-user', { userId: carol.id }, root); + await setTimeout(100); }); test('凍結後に凍結されたユーザーのノートは見えなくなる', async () => { - await api('admin/suspend-user', { userId: carol.id }, root); - await setTimeout(100); - const res = await api('notes/timeline', { limit: 100 }, alice); assert.strictEqual(res.body.length, 2); assert.strictEqual(res.body.some(note => note.id === aliceNote.id), true); @@ -709,12 +709,12 @@ describe('Timelines', () => { carolNote = await post(carol, { text: 'kon\'nichiwa' }); await waitForPushToTl(); + + await api('admin/suspend-user', { userId: carol.id }, root); + await setTimeout(100); }); test('凍結後に凍結されたユーザーのノートは見えなくなる', async () => { - await api('admin/suspend-user', { userId: carol.id }, root); - await setTimeout(100); - const res = await api('notes/timeline', { limit: 100 }, alice); assert.strictEqual(res.body.length, 2); assert.strictEqual(res.body.some(note => note.id === aliceNote.id), true); @@ -1253,14 +1253,14 @@ describe('Timelines', () => { await api('following/create', { userId: elle.id }, alice); await waitForPushToTl(); - }); - test('凍結後に凍結されたユーザーのノートは見えなくなる', async () => { await api('admin/suspend-user', { userId: carol.id }, root); await api('admin/suspend-user', { userId: dave.id }, root); await api('admin/suspend-user', { userId: elle.id }, root); await setTimeout(250); + }); + test('凍結後に凍結されたユーザーのノートは見えなくなる', async () => { const res = await api('notes/hybrid-timeline', { limit: 100 }, alice); assert.strictEqual(res.body.some(note => note.id === aliceNote.id), true); @@ -1531,26 +1531,47 @@ describe('Timelines', () => { assert.strictEqual(res.body.some(note => note.id === bobNote.id), false); }); - test('凍結: 凍結後に凍結されたユーザーのノートは見えなくなる', async () => { - const [alice, bob, carol] = await Promise.all([signup(), signup(), signup()]); - 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: carol.id }, alice); - const aliceNote = await post(alice, { text: 'hi' }); - const bobNote = await post(bob, { text: 'yo' }); - const carolNote = await post(carol, { text: 'kon\'nichiwa' }); + describe('凍結', () => { + let alice: SignupResponse, bob: SignupResponse, carol: SignupResponse; + let aliceNote: Note, bobNote: Note, carolNote: Note; + let list: UserList; - await waitForPushToTl(); + beforeAll(async () => { + [alice, bob, carol] = await Promise.all([signup(), signup(), signup()]); - await api('admin/suspend-user', { userId: carol.id }, root); + 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: carol.id }, alice); - await setTimeout(250); + aliceNote = await post(alice, { text: 'hi' }); + bobNote = await post(bob, { text: 'yo' }); + carolNote = await post(carol, { text: 'kon\'nichiwa' }); - const res = await api('notes/user-list-timeline', { listId: list.id }, alice); - assert.strictEqual(res.body.length, 1); - assert.strictEqual(res.body.some(note => note.id === bobNote.id), true); - assert.strictEqual(res.body.some(note => note.id === carolNote.id), false); + await waitForPushToTl(); + + await api('admin/suspend-user', { userId: carol.id }, root); + await setTimeout(100); + }); + + test('凍結後に凍結されたユーザーのノートは見えなくなる', async () => { + const res = await api('notes/user-list-timeline', { listId: list.id }, alice); + + assert.strictEqual(res.body.some(note => note.id === aliceNote.id), false); + assert.strictEqual(res.body.some(note => note.id === bobNote.id), true); + assert.strictEqual(res.body.some(note => note.id === carolNote.id), false); + }); + + test('凍結解除後に凍結されていたユーザーのノートは見えるようになる', async () => { + await api('admin/unsuspend-user', { userId: carol.id }, root); + await setTimeout(100); + + const res = await api('notes/user-list-timeline', { listId: list.id }, alice); + + assert.strictEqual(res.body.some(note => note.id === aliceNote.id), false); + assert.strictEqual(res.body.some(note => note.id === bobNote.id), true); + assert.strictEqual(res.body.some(note => note.id === carolNote.id), true); + }); }); }); diff --git a/packages/backend/test/unit/UserSuspendService.ts b/packages/backend/test/unit/UserSuspendService.ts index ce8d35f408..8d6b01b730 100644 --- a/packages/backend/test/unit/UserSuspendService.ts +++ b/packages/backend/test/unit/UserSuspendService.ts @@ -25,6 +25,11 @@ import { GlobalEventService } from '@/core/GlobalEventService.js'; import { ApRendererService } from '@/core/activitypub/ApRendererService.js'; import { ModerationLogService } from '@/core/ModerationLogService.js'; import { secureRndstr } from '@/misc/secure-rndstr.js'; +import { randomString } from '../utils.js'; + +function genHost() { + return randomString() + '.example.com'; +} describe('UserSuspendService', () => { let app: TestingModule; @@ -359,4 +364,53 @@ describe('UserSuspendService', () => { expect(queueService.deliver).not.toHaveBeenCalled(); }); }); + + describe('remote user suspension', () => { + test('should suspend remote user without AP delivery', async () => { + const remoteUser = await createUser({ host: genHost() }); + const moderator = await createUser(); + + await userSuspendService.suspend(remoteUser, moderator); + await setTimeout(250); + + // ユーザーが凍結されているかチェック + const suspendedUser = await usersRepository.findOneBy({ id: remoteUser.id }); + expect(suspendedUser?.isSuspended).toBe(true); + + // モデレーションログが記録されているかチェック + expect(moderationLogService.log).toHaveBeenCalledWith(moderator, 'suspend', { + userId: remoteUser.id, + userUsername: remoteUser.username, + userHost: remoteUser.host, + }); + + // ActivityPub配信が呼ばれていないことを確認 + expect(queueService.deliver).not.toHaveBeenCalled(); + }); + }); + + describe('remote user unsuspension', () => { + test('should unsuspend remote user without AP delivery', async () => { + const remoteUser = await createUser({ host: genHost(), isSuspended: true }); + const moderator = await createUser(); + + await userSuspendService.unsuspend(remoteUser, moderator); + + await setTimeout(250); + + // ユーザーの凍結が解除されているかチェック + const unsuspendedUser = await usersRepository.findOneBy({ id: remoteUser.id }); + expect(unsuspendedUser?.isSuspended).toBe(false); + + // モデレーションログが記録されているかチェック + expect(moderationLogService.log).toHaveBeenCalledWith(moderator, 'unsuspend', { + userId: remoteUser.id, + userUsername: remoteUser.username, + userHost: remoteUser.host, + }); + + // ActivityPub配信が呼ばれていないことを確認 + expect(queueService.deliver).not.toHaveBeenCalled(); + }); + }); });