diff options
| author | Kagami Sascha Rosylight <saschanaz@outlook.com> | 2023-03-03 03:13:12 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-03 11:13:12 +0900 |
| commit | 61215e50ff9e4c84787c8d99c75fd36dafbd8815 (patch) | |
| tree | 36419e8a3ec97afa0a3a0011d523d80addf8e724 /packages/backend/test/e2e/endpoints.ts | |
| parent | fix(server): チャンネルでミュートが正しく機能していない... (diff) | |
| download | sharkey-61215e50ff9e4c84787c8d99c75fd36dafbd8815.tar.gz sharkey-61215e50ff9e4c84787c8d99c75fd36dafbd8815.tar.bz2 sharkey-61215e50ff9e4c84787c8d99c75fd36dafbd8815.zip | |
test(backend): APIテストの復活 (#10163)
* Revert 1c5291f8185651c231903129ee7c1cee263f9f03
* APIテストの復活
* apiテストの移行
* moduleNameMapper修正
* simpleGetでthrowしないように
status確認しているので要らない
* longer timeout
* ローカルでは問題ないのになんで
* case sensitive
* Run Nest instance within the current process
* Skip some setIntervals
* wait for 5 seconds
* kill them all!!
* logHeapUsage: true
* detectOpenHandlesがじゃましているらしい
* maxWorkers=1?
* restore drive api tests
* workerIdleMemoryLimit: 500MB
* 1024MiB
* Wait what
Diffstat (limited to 'packages/backend/test/e2e/endpoints.ts')
| -rw-r--r-- | packages/backend/test/e2e/endpoints.ts | 797 |
1 files changed, 797 insertions, 0 deletions
diff --git a/packages/backend/test/e2e/endpoints.ts b/packages/backend/test/e2e/endpoints.ts new file mode 100644 index 0000000000..e864eab6cb --- /dev/null +++ b/packages/backend/test/e2e/endpoints.ts @@ -0,0 +1,797 @@ +process.env.NODE_ENV = 'test'; + +import * as assert from 'assert'; +// node-fetch only supports it's own Blob yet +// https://github.com/node-fetch/node-fetch/pull/1664 +import { Blob } from 'node-fetch'; +import { startServer, signup, post, api, uploadFile } from '../utils.js'; +import type { INestApplicationContext } from '@nestjs/common'; + +describe('Endpoints', () => { + let p: INestApplicationContext; + + let alice: any; + let bob: any; + let carol: any; + let dave: any; + + beforeAll(async () => { + p = await startServer(); + alice = await signup({ username: 'alice' }); + bob = await signup({ username: 'bob' }); + carol = await signup({ username: 'carol' }); + dave = await signup({ username: 'dave' }); + }, 1000 * 60 * 2); + + afterAll(async () => { + await p.close(); + }); + + describe('signup', () => { + test('不正なユーザー名でアカウントが作成できない', async () => { + const res = await api('signup', { + username: 'test.', + password: 'test', + }); + assert.strictEqual(res.status, 400); + }); + + test('空のパスワードでアカウントが作成できない', async () => { + const res = await api('signup', { + username: 'test', + password: '', + }); + assert.strictEqual(res.status, 400); + }); + + test('正しくアカウントが作成できる', async () => { + const me = { + username: 'test1', + password: 'test1', + }; + + const res = await api('signup', me); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.username, me.username); + }); + + test('同じユーザー名のアカウントは作成できない', async () => { + const res = await api('signup', { + username: 'test1', + password: 'test1', + }); + + assert.strictEqual(res.status, 400); + }); + }); + + describe('signin', () => { + test('間違ったパスワードでサインインできない', async () => { + const res = await api('signin', { + username: 'test1', + password: 'bar', + }); + + assert.strictEqual(res.status, 403); + }); + + test('クエリをインジェクションできない', async () => { + const res = await api('signin', { + username: 'test1', + password: { + $gt: '', + }, + }); + + assert.strictEqual(res.status, 400); + }); + + test('正しい情報でサインインできる', async () => { + const res = await api('signin', { + username: 'test1', + password: 'test1', + }); + + assert.strictEqual(res.status, 200); + }); + }); + + describe('i/update', () => { + test('アカウント設定を更新できる', async () => { + const myName = '大室櫻子'; + const myLocation = '七森中'; + const myBirthday = '2000-09-07'; + + const res = await api('/i/update', { + name: myName, + location: myLocation, + birthday: myBirthday, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.name, myName); + assert.strictEqual(res.body.location, myLocation); + assert.strictEqual(res.body.birthday, myBirthday); + }); + + test('名前を空白にできる', async () => { + const res = await api('/i/update', { + name: ' ', + }, alice); + assert.strictEqual(res.status, 200); + assert.strictEqual(res.body.name, ' '); + }); + + test('誕生日の設定を削除できる', async () => { + await api('/i/update', { + birthday: '2000-09-07', + }, alice); + + const res = await api('/i/update', { + birthday: null, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.birthday, null); + }); + + test('不正な誕生日の形式で怒られる', async () => { + const res = await api('/i/update', { + birthday: '2000/09/07', + }, alice); + assert.strictEqual(res.status, 400); + }); + }); + + describe('users/show', () => { + test('ユーザーが取得できる', async () => { + const res = await api('/users/show', { + userId: alice.id, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.id, alice.id); + }); + + test('ユーザーが存在しなかったら怒る', async () => { + const res = await api('/users/show', { + userId: '000000000000000000000000', + }); + assert.strictEqual(res.status, 400); + }); + + test('間違ったIDで怒られる', async () => { + const res = await api('/users/show', { + userId: 'kyoppie', + }); + assert.strictEqual(res.status, 400); + }); + }); + + describe('notes/show', () => { + test('投稿が取得できる', async () => { + const myPost = await post(alice, { + text: 'test', + }); + + const res = await api('/notes/show', { + noteId: myPost.id, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.id, myPost.id); + assert.strictEqual(res.body.text, myPost.text); + }); + + test('投稿が存在しなかったら怒る', async () => { + const res = await api('/notes/show', { + noteId: '000000000000000000000000', + }); + assert.strictEqual(res.status, 400); + }); + + test('間違ったIDで怒られる', async () => { + const res = await api('/notes/show', { + noteId: 'kyoppie', + }); + assert.strictEqual(res.status, 400); + }); + }); + + describe('notes/reactions/create', () => { + test('リアクションできる', async () => { + const bobPost = await post(bob); + + const res = await api('/notes/reactions/create', { + noteId: bobPost.id, + reaction: '🚀', + }, alice); + + assert.strictEqual(res.status, 204); + + const resNote = await api('/notes/show', { + noteId: bobPost.id, + }, alice); + + assert.strictEqual(resNote.status, 200); + assert.strictEqual(resNote.body.reactions['🚀'], 1); + }); + + test('自分の投稿にもリアクションできる', async () => { + const myPost = await post(alice); + + const res = await api('/notes/reactions/create', { + noteId: myPost.id, + reaction: '🚀', + }, alice); + + assert.strictEqual(res.status, 204); + }); + + test('二重にリアクションすると上書きされる', async () => { + const bobPost = await post(bob); + + await api('/notes/reactions/create', { + noteId: bobPost.id, + reaction: '🥰', + }, alice); + + const res = await api('/notes/reactions/create', { + noteId: bobPost.id, + reaction: '🚀', + }, alice); + + assert.strictEqual(res.status, 204); + + const resNote = await api('/notes/show', { + noteId: bobPost.id, + }, alice); + + assert.strictEqual(resNote.status, 200); + assert.deepStrictEqual(resNote.body.reactions, { '🚀': 1 }); + }); + + test('存在しない投稿にはリアクションできない', async () => { + const res = await api('/notes/reactions/create', { + noteId: '000000000000000000000000', + reaction: '🚀', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('空のパラメータで怒られる', async () => { + const res = await api('/notes/reactions/create', {}, alice); + + assert.strictEqual(res.status, 400); + }); + + test('間違ったIDで怒られる', async () => { + const res = await api('/notes/reactions/create', { + noteId: 'kyoppie', + reaction: '🚀', + }, alice); + + assert.strictEqual(res.status, 400); + }); + }); + + describe('following/create', () => { + test('フォローできる', async () => { + const res = await api('/following/create', { + userId: alice.id, + }, bob); + + assert.strictEqual(res.status, 200); + }); + + test('既にフォローしている場合は怒る', async () => { + const res = await api('/following/create', { + userId: alice.id, + }, bob); + + assert.strictEqual(res.status, 400); + }); + + test('存在しないユーザーはフォローできない', async () => { + const res = await api('/following/create', { + userId: '000000000000000000000000', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('自分自身はフォローできない', async () => { + const res = await api('/following/create', { + userId: alice.id, + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('空のパラメータで怒られる', async () => { + const res = await api('/following/create', {}, alice); + + assert.strictEqual(res.status, 400); + }); + + test('間違ったIDで怒られる', async () => { + const res = await api('/following/create', { + userId: 'foo', + }, alice); + + assert.strictEqual(res.status, 400); + }); + }); + + describe('following/delete', () => { + test('フォロー解除できる', async () => { + await api('/following/create', { + userId: alice.id, + }, bob); + + const res = await api('/following/delete', { + userId: alice.id, + }, bob); + + assert.strictEqual(res.status, 200); + }); + + test('フォローしていない場合は怒る', async () => { + const res = await api('/following/delete', { + userId: alice.id, + }, bob); + + assert.strictEqual(res.status, 400); + }); + + test('存在しないユーザーはフォロー解除できない', async () => { + const res = await api('/following/delete', { + userId: '000000000000000000000000', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('自分自身はフォロー解除できない', async () => { + const res = await api('/following/delete', { + userId: alice.id, + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('空のパラメータで怒られる', async () => { + const res = await api('/following/delete', {}, alice); + + assert.strictEqual(res.status, 400); + }); + + test('間違ったIDで怒られる', async () => { + const res = await api('/following/delete', { + userId: 'kyoppie', + }, alice); + + assert.strictEqual(res.status, 400); + }); + }); + + describe('drive', () => { + test('ドライブ情報を取得できる', async () => { + await uploadFile(alice, { + blob: new Blob([new Uint8Array(256)]), + }); + await uploadFile(alice, { + blob: new Blob([new Uint8Array(512)]), + }); + await uploadFile(alice, { + blob: new Blob([new Uint8Array(1024)]), + }); + const res = await api('/drive', {}, alice); + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + expect(res.body).toHaveProperty('usage', 1792); + }); + }); + + describe('drive/files/create', () => { + test('ファイルを作成できる', async () => { + const res = await uploadFile(alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.name, 'Lenna.jpg'); + }); + + test('ファイルに名前を付けられる', async () => { + const res = await uploadFile(alice, { name: 'Belmond.png' }); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.name, 'Belmond.png'); + }); + + test('ファイル無しで怒られる', async () => { + const res = await api('/drive/files/create', {}, alice); + + assert.strictEqual(res.status, 400); + }); + + test('SVGファイルを作成できる', async () => { + const res = await uploadFile(alice, { path: 'image.svg' }); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.name, 'image.svg'); + assert.strictEqual(res.body.type, 'image/svg+xml'); + }); + }); + + describe('drive/files/update', () => { + test('名前を更新できる', async () => { + const file = (await uploadFile(alice)).body; + const newName = 'いちごパスタ.png'; + + const res = await api('/drive/files/update', { + fileId: file.id, + name: newName, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.name, newName); + }); + + test('他人のファイルは更新できない', async () => { + const file = (await uploadFile(alice)).body; + + const res = await api('/drive/files/update', { + fileId: file.id, + name: 'いちごパスタ.png', + }, bob); + + assert.strictEqual(res.status, 400); + }); + + test('親フォルダを更新できる', async () => { + const file = (await uploadFile(alice)).body; + const folder = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + + const res = await api('/drive/files/update', { + fileId: file.id, + folderId: folder.id, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.folderId, folder.id); + }); + + test('親フォルダを無しにできる', async () => { + const file = (await uploadFile(alice)).body; + + const folder = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + + await api('/drive/files/update', { + fileId: file.id, + folderId: folder.id, + }, alice); + + const res = await api('/drive/files/update', { + fileId: file.id, + folderId: null, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.folderId, null); + }); + + test('他人のフォルダには入れられない', async () => { + const file = (await uploadFile(alice)).body; + const folder = (await api('/drive/folders/create', { + name: 'test', + }, bob)).body; + + const res = await api('/drive/files/update', { + fileId: file.id, + folderId: folder.id, + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('存在しないフォルダで怒られる', async () => { + const file = (await uploadFile(alice)).body; + + const res = await api('/drive/files/update', { + fileId: file.id, + folderId: '000000000000000000000000', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('不正なフォルダIDで怒られる', async () => { + const file = (await uploadFile(alice)).body; + + const res = await api('/drive/files/update', { + fileId: file.id, + folderId: 'foo', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('ファイルが存在しなかったら怒る', async () => { + const res = await api('/drive/files/update', { + fileId: '000000000000000000000000', + name: 'いちごパスタ.png', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('間違ったIDで怒られる', async () => { + const res = await api('/drive/files/update', { + fileId: 'kyoppie', + name: 'いちごパスタ.png', + }, alice); + + assert.strictEqual(res.status, 400); + }); + }); + + describe('drive/folders/create', () => { + test('フォルダを作成できる', async () => { + const res = await api('/drive/folders/create', { + name: 'test', + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.name, 'test'); + }); + }); + + describe('drive/folders/update', () => { + test('名前を更新できる', async () => { + const folder = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + + const res = await api('/drive/folders/update', { + folderId: folder.id, + name: 'new name', + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.name, 'new name'); + }); + + test('他人のフォルダを更新できない', async () => { + const folder = (await api('/drive/folders/create', { + name: 'test', + }, bob)).body; + + const res = await api('/drive/folders/update', { + folderId: folder.id, + name: 'new name', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('親フォルダを更新できる', async () => { + const folder = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + const parentFolder = (await api('/drive/folders/create', { + name: 'parent', + }, alice)).body; + + const res = await api('/drive/folders/update', { + folderId: folder.id, + parentId: parentFolder.id, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.parentId, parentFolder.id); + }); + + test('親フォルダを無しに更新できる', async () => { + const folder = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + const parentFolder = (await api('/drive/folders/create', { + name: 'parent', + }, alice)).body; + await api('/drive/folders/update', { + folderId: folder.id, + parentId: parentFolder.id, + }, alice); + + const res = await api('/drive/folders/update', { + folderId: folder.id, + parentId: null, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.parentId, null); + }); + + test('他人のフォルダを親フォルダに設定できない', async () => { + const folder = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + const parentFolder = (await api('/drive/folders/create', { + name: 'parent', + }, bob)).body; + + const res = await api('/drive/folders/update', { + folderId: folder.id, + parentId: parentFolder.id, + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('フォルダが循環するような構造にできない', async () => { + const folder = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + const parentFolder = (await api('/drive/folders/create', { + name: 'parent', + }, alice)).body; + await api('/drive/folders/update', { + folderId: parentFolder.id, + parentId: folder.id, + }, alice); + + const res = await api('/drive/folders/update', { + folderId: folder.id, + parentId: parentFolder.id, + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('フォルダが循環するような構造にできない(再帰的)', async () => { + const folderA = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + const folderB = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + const folderC = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + await api('/drive/folders/update', { + folderId: folderB.id, + parentId: folderA.id, + }, alice); + await api('/drive/folders/update', { + folderId: folderC.id, + parentId: folderB.id, + }, alice); + + const res = await api('/drive/folders/update', { + folderId: folderA.id, + parentId: folderC.id, + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('フォルダが循環するような構造にできない(自身)', async () => { + const folderA = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + + const res = await api('/drive/folders/update', { + folderId: folderA.id, + parentId: folderA.id, + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('存在しない親フォルダを設定できない', async () => { + const folder = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + + const res = await api('/drive/folders/update', { + folderId: folder.id, + parentId: '000000000000000000000000', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('不正な親フォルダIDで怒られる', async () => { + const folder = (await api('/drive/folders/create', { + name: 'test', + }, alice)).body; + + const res = await api('/drive/folders/update', { + folderId: folder.id, + parentId: 'foo', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('存在しないフォルダを更新できない', async () => { + const res = await api('/drive/folders/update', { + folderId: '000000000000000000000000', + }, alice); + + assert.strictEqual(res.status, 400); + }); + + test('不正なフォルダIDで怒られる', async () => { + const res = await api('/drive/folders/update', { + folderId: 'foo', + }, alice); + + assert.strictEqual(res.status, 400); + }); + }); + + describe('notes/replies', () => { + test('自分に閲覧権限のない投稿は含まれない', async () => { + const alicePost = await post(alice, { + text: 'foo', + }); + + await post(bob, { + replyId: alicePost.id, + text: 'bar', + visibility: 'specified', + visibleUserIds: [alice.id], + }); + + const res = await api('/notes/replies', { + noteId: alicePost.id, + }, carol); + + assert.strictEqual(res.status, 200); + assert.strictEqual(Array.isArray(res.body), true); + assert.strictEqual(res.body.length, 0); + }); + }); + + describe('notes/timeline', () => { + test('フォロワー限定投稿が含まれる', async () => { + await api('/following/create', { + userId: carol.id, + }, dave); + + const carolPost = await post(carol, { + text: 'foo', + visibility: 'followers', + }); + + const res = await api('/notes/timeline', {}, dave); + + assert.strictEqual(res.status, 200); + assert.strictEqual(Array.isArray(res.body), true); + assert.strictEqual(res.body.length, 1); + assert.strictEqual(res.body[0].id, carolPost.id); + }); + }); +}); |