summaryrefslogtreecommitdiff
path: root/packages/backend
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2024-02-29 11:47:30 +0000
committertamaina <tamaina@hotmail.co.jp>2024-02-29 11:47:30 +0000
commitb9bcceddfc2cf6a00e8886e9e5b6edff72d5ee98 (patch)
treec0d1eec330326a7345148b3679ff81c00e859243 /packages/backend
parentfix(client): use colorizeEmoji when unicodeEmojisMap.get (diff)
parentNew Crowdin updates (#13359) (diff)
downloadsharkey-b9bcceddfc2cf6a00e8886e9e5b6edff72d5ee98.tar.gz
sharkey-b9bcceddfc2cf6a00e8886e9e5b6edff72d5ee98.tar.bz2
sharkey-b9bcceddfc2cf6a00e8886e9e5b6edff72d5ee98.zip
Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop
Diffstat (limited to 'packages/backend')
-rw-r--r--packages/backend/src/server/api/endpoints/notes/create.ts8
-rw-r--r--packages/backend/test/e2e/note.ts81
-rw-r--r--packages/backend/test/e2e/streaming.ts40
3 files changed, 129 insertions, 0 deletions
diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts
index 2fa0bd099f..27463577fe 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.ts
@@ -85,6 +85,12 @@ export const meta = {
id: '3ac74a84-8fd5-4bb0-870f-01804f82ce15',
},
+ cannotReplyToSpecifiedVisibilityNoteWithExtendedVisibility: {
+ message: 'You cannot reply to a specified visibility note with extended visibility.',
+ code: 'CANNOT_REPLY_TO_SPECIFIED_VISIBILITY_NOTE_WITH_EXTENDED_VISIBILITY',
+ id: 'ed940410-535c-4d5e-bfa3-af798671e93c',
+ },
+
cannotCreateAlreadyExpiredPoll: {
message: 'Poll is already expired.',
code: 'CANNOT_CREATE_ALREADY_EXPIRED_POLL',
@@ -313,6 +319,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
throw new ApiError(meta.errors.cannotReplyToPureRenote);
} else if (!await this.noteEntityService.isVisibleForMe(reply, me.id)) {
throw new ApiError(meta.errors.cannotReplyToInvisibleNote);
+ } else if (reply.visibility === 'specified' && ps.visibility !== 'specified') {
+ throw new ApiError(meta.errors.cannotReplyToSpecifiedVisibilityNoteWithExtendedVisibility);
}
// Check blocking
diff --git a/packages/backend/test/e2e/note.ts b/packages/backend/test/e2e/note.ts
index a5742d6e77..23de94889d 100644
--- a/packages/backend/test/e2e/note.ts
+++ b/packages/backend/test/e2e/note.ts
@@ -176,6 +176,87 @@ describe('Note', () => {
assert.strictEqual(deleteRes.status, 204);
});
+ test('visibility: followersなノートに対してフォロワーはリプライできる', async () => {
+ await api('/following/create', {
+ userId: alice.id,
+ }, bob);
+
+ const aliceNote = await api('/notes/create', {
+ text: 'direct note to bob',
+ visibility: 'followers',
+ }, alice);
+
+ assert.strictEqual(aliceNote.status, 200);
+
+ const replyId = aliceNote.body.createdNote.id;
+ const bobReply = await api('/notes/create', {
+ text: 'reply to alice note',
+ replyId,
+ }, bob);
+
+ assert.strictEqual(bobReply.status, 200);
+ assert.strictEqual(bobReply.body.createdNote.replyId, replyId);
+
+ await api('/following/delete', {
+ userId: alice.id,
+ }, bob);
+ });
+
+ test('visibility: followersなノートに対してフォロワーでないユーザーがリプライしようとすると怒られる', async () => {
+ const aliceNote = await api('/notes/create', {
+ text: 'direct note to bob',
+ visibility: 'followers',
+ }, alice);
+
+ assert.strictEqual(aliceNote.status, 200);
+
+ const bobReply = await api('/notes/create', {
+ text: 'reply to alice note',
+ replyId: aliceNote.body.createdNote.id,
+ }, bob);
+
+ assert.strictEqual(bobReply.status, 400);
+ assert.strictEqual(bobReply.body.error.code, 'CANNOT_REPLY_TO_AN_INVISIBLE_NOTE');
+ });
+
+ test('visibility: specifiedなノートに対してvisibility: specifiedで返信できる', async () => {
+ const aliceNote = await api('/notes/create', {
+ text: 'direct note to bob',
+ visibility: 'specified',
+ visibleUserIds: [bob.id],
+ }, alice);
+
+ assert.strictEqual(aliceNote.status, 200);
+
+ const bobReply = await api('/notes/create', {
+ text: 'reply to alice note',
+ replyId: aliceNote.body.createdNote.id,
+ visibility: 'specified',
+ visibleUserIds: [alice.id],
+ }, bob);
+
+ assert.strictEqual(bobReply.status, 200);
+ });
+
+ test('visibility: specifiedなノートに対してvisibility: follwersで返信しようとすると怒られる', async () => {
+ const aliceNote = await api('/notes/create', {
+ text: 'direct note to bob',
+ visibility: 'specified',
+ visibleUserIds: [bob.id],
+ }, alice);
+
+ assert.strictEqual(aliceNote.status, 200);
+
+ const bobReply = await api('/notes/create', {
+ text: 'reply to alice note with visibility: followers',
+ replyId: aliceNote.body.createdNote.id,
+ visibility: 'followers',
+ }, bob);
+
+ assert.strictEqual(bobReply.status, 400);
+ assert.strictEqual(bobReply.body.error.code, 'CANNOT_REPLY_TO_SPECIFIED_VISIBILITY_NOTE_WITH_EXTENDED_VISIBILITY');
+ });
+
test('文字数ぎりぎりで怒られない', async () => {
const post = {
text: '!'.repeat(MAX_NOTE_TEXT_LENGTH), // 3000文字
diff --git a/packages/backend/test/e2e/streaming.ts b/packages/backend/test/e2e/streaming.ts
index 13d5a683ba..57ce73ba60 100644
--- a/packages/backend/test/e2e/streaming.ts
+++ b/packages/backend/test/e2e/streaming.ts
@@ -227,6 +227,46 @@ describe('Streaming', () => {
assert.strictEqual(fired, false);
});
+ /**
+ * TODO: 落ちる
+ * @see https://github.com/misskey-dev/misskey/issues/13474
+ test('visibility: specified なノートで visibleUserIds に自分が含まれているときそのノートへのリプライが流れてくる', async () => {
+ const chitoseToKyokoAndAyano = await post(chitose, { text: 'direct note from chitose to kyoko and ayano', visibility: 'specified', visibleUserIds: [kyoko.id, ayano.id] });
+
+ const fired = await waitFire(
+ ayano, 'homeTimeline', // ayano:home
+ () => api('notes/create', { text: 'direct reply from kyoko to chitose and ayano', replyId: chitoseToKyokoAndAyano.id, visibility: 'specified', visibleUserIds: [chitose.id, ayano.id] }, kyoko),
+ msg => msg.type === 'note' && msg.body.userId === kyoko.id,
+ );
+
+ assert.strictEqual(fired, true);
+ });
+ */
+
+ test('visibility: specified な投稿に対するリプライで visibleUserIds が拡張されたとき、その拡張されたユーザーの HTL にはそのリプライが流れない', async () => {
+ const chitoseToKyoko = await post(chitose, { text: 'direct note from chitose to kyoko', visibility: 'specified', visibleUserIds: [kyoko.id] });
+
+ const fired = await waitFire(
+ ayano, 'homeTimeline', // ayano:home
+ () => api('notes/create', { text: 'direct reply from kyoko to chitose and ayano', replyId: chitoseToKyoko.id, visibility: 'specified', visibleUserIds: [chitose.id, ayano.id] }, kyoko),
+ msg => msg.type === 'note' && msg.body.userId === kyoko.id,
+ );
+
+ assert.strictEqual(fired, false);
+ });
+
+ test('visibility: specified な投稿に対するリプライで visibleUserIds が収縮されたとき、その収縮されたユーザーの HTL にはそのリプライが流れない', async () => {
+ const chitoseToKyokoAndAyano = await post(chitose, { text: 'direct note from chitose to kyoko and ayano', visibility: 'specified', visibleUserIds: [kyoko.id, ayano.id] });
+
+ const fired = await waitFire(
+ ayano, 'homeTimeline', // ayano:home
+ () => api('notes/create', { text: 'direct reply from kyoko to chitose', replyId: chitoseToKyokoAndAyano.id, visibility: 'specified', visibleUserIds: [chitose.id] }, kyoko),
+ msg => msg.type === 'note' && msg.body.userId === kyoko.id,
+ );
+
+ assert.strictEqual(fired, false);
+ });
+
test('withRenotes: false のときリノートが流れない', async () => {
const fired = await waitFire(
ayano, 'homeTimeline', // ayano:home