|
|
|
@@ -8,12 +8,13 @@ process.env.NODE_ENV = 'test';
|
|
|
|
|
import * as assert from 'assert';
|
|
|
|
|
import { MiNote } from '@/models/Note.js';
|
|
|
|
|
import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
|
|
|
|
|
import { api, initTestDb, post, signup, uploadFile, uploadUrl } from '../utils.js';
|
|
|
|
|
import { api, initTestDb, post, role, signup, uploadFile, uploadUrl } from '../utils.js';
|
|
|
|
|
import type * as misskey from 'misskey-js';
|
|
|
|
|
|
|
|
|
|
describe('Note', () => {
|
|
|
|
|
let Notes: any;
|
|
|
|
|
|
|
|
|
|
let root: misskey.entities.SignupResponse;
|
|
|
|
|
let alice: misskey.entities.SignupResponse;
|
|
|
|
|
let bob: misskey.entities.SignupResponse;
|
|
|
|
|
let tom: misskey.entities.SignupResponse;
|
|
|
|
@@ -21,6 +22,7 @@ describe('Note', () => {
|
|
|
|
|
beforeAll(async () => {
|
|
|
|
|
const connection = await initTestDb(true);
|
|
|
|
|
Notes = connection.getRepository(MiNote);
|
|
|
|
|
root = await signup({ username: 'root' });
|
|
|
|
|
alice = await signup({ username: 'alice' });
|
|
|
|
|
bob = await signup({ username: 'bob' });
|
|
|
|
|
tom = await signup({ username: 'tom', host: 'example.com' });
|
|
|
|
@@ -473,14 +475,14 @@ describe('Note', () => {
|
|
|
|
|
value: true,
|
|
|
|
|
},
|
|
|
|
|
} as any,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(res.status, 200);
|
|
|
|
|
|
|
|
|
|
const assign = await api('admin/roles/assign', {
|
|
|
|
|
userId: alice.id,
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(assign.status, 204);
|
|
|
|
|
assert.strictEqual(file.body!.isSensitive, false);
|
|
|
|
@@ -508,11 +510,11 @@ describe('Note', () => {
|
|
|
|
|
await api('admin/roles/unassign', {
|
|
|
|
|
userId: alice.id,
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
});
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
await api('admin/roles/delete', {
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@@ -644,7 +646,7 @@ describe('Note', () => {
|
|
|
|
|
sensitiveWords: [
|
|
|
|
|
'test',
|
|
|
|
|
],
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(sensitive.status, 204);
|
|
|
|
|
|
|
|
|
@@ -663,7 +665,7 @@ describe('Note', () => {
|
|
|
|
|
sensitiveWords: [
|
|
|
|
|
'/Test/i',
|
|
|
|
|
],
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(sensitive.status, 204);
|
|
|
|
|
|
|
|
|
@@ -680,7 +682,7 @@ describe('Note', () => {
|
|
|
|
|
sensitiveWords: [
|
|
|
|
|
'Test hoge',
|
|
|
|
|
],
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(sensitive.status, 204);
|
|
|
|
|
|
|
|
|
@@ -697,7 +699,7 @@ describe('Note', () => {
|
|
|
|
|
prohibitedWords: [
|
|
|
|
|
'test',
|
|
|
|
|
],
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(prohibited.status, 204);
|
|
|
|
|
|
|
|
|
@@ -716,7 +718,7 @@ describe('Note', () => {
|
|
|
|
|
prohibitedWords: [
|
|
|
|
|
'/Test/i',
|
|
|
|
|
],
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(prohibited.status, 204);
|
|
|
|
|
|
|
|
|
@@ -733,7 +735,7 @@ describe('Note', () => {
|
|
|
|
|
prohibitedWords: [
|
|
|
|
|
'Test hoge',
|
|
|
|
|
],
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(prohibited.status, 204);
|
|
|
|
|
|
|
|
|
@@ -750,7 +752,7 @@ describe('Note', () => {
|
|
|
|
|
prohibitedWords: [
|
|
|
|
|
'test',
|
|
|
|
|
],
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(prohibited.status, 204);
|
|
|
|
|
|
|
|
|
@@ -785,7 +787,7 @@ describe('Note', () => {
|
|
|
|
|
value: 0,
|
|
|
|
|
},
|
|
|
|
|
} as any,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(res.status, 200);
|
|
|
|
|
|
|
|
|
@@ -794,7 +796,7 @@ describe('Note', () => {
|
|
|
|
|
const assign = await api('admin/roles/assign', {
|
|
|
|
|
userId: alice.id,
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(assign.status, 204);
|
|
|
|
|
|
|
|
|
@@ -810,11 +812,11 @@ describe('Note', () => {
|
|
|
|
|
await api('admin/roles/unassign', {
|
|
|
|
|
userId: alice.id,
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
});
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
await api('admin/roles/delete', {
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('ダイレクト投稿もエラーになる', async () => {
|
|
|
|
@@ -839,7 +841,7 @@ describe('Note', () => {
|
|
|
|
|
value: 0,
|
|
|
|
|
},
|
|
|
|
|
} as any,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(res.status, 200);
|
|
|
|
|
|
|
|
|
@@ -848,7 +850,7 @@ describe('Note', () => {
|
|
|
|
|
const assign = await api('admin/roles/assign', {
|
|
|
|
|
userId: alice.id,
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(assign.status, 204);
|
|
|
|
|
|
|
|
|
@@ -866,11 +868,11 @@ describe('Note', () => {
|
|
|
|
|
await api('admin/roles/unassign', {
|
|
|
|
|
userId: alice.id,
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
});
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
await api('admin/roles/delete', {
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('ダイレクトの宛先とメンションが同じ場合は重複してカウントしない', async () => {
|
|
|
|
@@ -895,7 +897,7 @@ describe('Note', () => {
|
|
|
|
|
value: 1,
|
|
|
|
|
},
|
|
|
|
|
} as any,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(res.status, 200);
|
|
|
|
|
|
|
|
|
@@ -904,7 +906,7 @@ describe('Note', () => {
|
|
|
|
|
const assign = await api('admin/roles/assign', {
|
|
|
|
|
userId: alice.id,
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(assign.status, 204);
|
|
|
|
|
|
|
|
|
@@ -921,11 +923,11 @@ describe('Note', () => {
|
|
|
|
|
await api('admin/roles/unassign', {
|
|
|
|
|
userId: alice.id,
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
});
|
|
|
|
|
}, root);
|
|
|
|
|
|
|
|
|
|
await api('admin/roles/delete', {
|
|
|
|
|
roleId: res.body.id,
|
|
|
|
|
}, alice);
|
|
|
|
|
}, root);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@@ -960,4 +962,61 @@ describe('Note', () => {
|
|
|
|
|
assert.strictEqual(mainNote.repliesCount, 0);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
describe('notes/translate', () => {
|
|
|
|
|
describe('翻訳機能の利用が許可されていない場合', () => {
|
|
|
|
|
let cannotTranslateRole: misskey.entities.Role;
|
|
|
|
|
|
|
|
|
|
beforeAll(async () => {
|
|
|
|
|
cannotTranslateRole = await role(root, {}, { canUseTranslator: false });
|
|
|
|
|
await api('admin/roles/assign', { roleId: cannotTranslateRole.id, userId: alice.id }, root);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('翻訳機能の利用が許可されていない場合翻訳できない', async () => {
|
|
|
|
|
const aliceNote = await post(alice, { text: 'Hello' });
|
|
|
|
|
const res = await api('notes/translate', {
|
|
|
|
|
noteId: aliceNote.id,
|
|
|
|
|
targetLang: 'ja',
|
|
|
|
|
}, alice);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(res.status, 400);
|
|
|
|
|
assert.strictEqual(res.body.error.code, 'UNAVAILABLE');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
afterAll(async () => {
|
|
|
|
|
await api('admin/roles/unassign', { roleId: cannotTranslateRole.id, userId: alice.id }, root);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('存在しないノートは翻訳できない', async () => {
|
|
|
|
|
const res = await api('notes/translate', { noteId: 'foo', targetLang: 'ja' }, alice);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(res.status, 400);
|
|
|
|
|
assert.strictEqual(res.body.error.code, 'NO_SUCH_NOTE');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('不可視なノートは翻訳できない', async () => {
|
|
|
|
|
const aliceNote = await post(alice, { visibility: 'followers', text: 'Hello' });
|
|
|
|
|
const bobTranslateAttempt = await api('notes/translate', { noteId: aliceNote.id, targetLang: 'ja' }, bob);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(bobTranslateAttempt.status, 400);
|
|
|
|
|
assert.strictEqual(bobTranslateAttempt.body.error.code, 'CANNOT_TRANSLATE_INVISIBLE_NOTE');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('text: null なノートを翻訳すると空のレスポンスが返ってくる', async () => {
|
|
|
|
|
const aliceNote = await post(alice, { text: null, poll: { choices: ['kinoko', 'takenoko'] } });
|
|
|
|
|
const res = await api('notes/translate', { noteId: aliceNote.id, targetLang: 'ja' }, alice);
|
|
|
|
|
|
|
|
|
|
assert.strictEqual(res.status, 204);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('サーバーに DeepL 認証キーが登録されていない場合翻訳できない', async () => {
|
|
|
|
|
const aliceNote = await post(alice, { text: 'Hello' });
|
|
|
|
|
const res = await api('notes/translate', { noteId: aliceNote.id, targetLang: 'ja' }, alice);
|
|
|
|
|
|
|
|
|
|
// NOTE: デフォルトでは登録されていないので落ちる
|
|
|
|
|
assert.strictEqual(res.status, 400);
|
|
|
|
|
assert.strictEqual(res.body.error.code, 'UNAVAILABLE');
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|