summaryrefslogtreecommitdiff
path: root/packages/backend/test/e2e/endpoints.ts
diff options
context:
space:
mode:
authorKagami Sascha Rosylight <saschanaz@outlook.com>2023-03-03 03:13:12 +0100
committerGitHub <noreply@github.com>2023-03-03 11:13:12 +0900
commit61215e50ff9e4c84787c8d99c75fd36dafbd8815 (patch)
tree36419e8a3ec97afa0a3a0011d523d80addf8e724 /packages/backend/test/e2e/endpoints.ts
parentfix(server): チャンネルでミュートが正しく機能していない... (diff)
downloadsharkey-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.ts797
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);
+ });
+ });
+});