summaryrefslogtreecommitdiff
path: root/packages/backend
diff options
context:
space:
mode:
authorおさむのひと <46447427+samunohito@users.noreply.github.com>2025-05-04 09:38:35 +0900
committerGitHub <noreply@github.com>2025-05-04 09:38:35 +0900
commit8c0c503c6c85c893dceea29c975f3b6b14fc1b52 (patch)
treec128a575c3ec0bfd3516174d9f6081c28d6ac90b /packages/backend
parentperf(frontend): improve MkInstanceTicker rendering performance (diff)
downloadmisskey-8c0c503c6c85c893dceea29c975f3b6b14fc1b52.tar.gz
misskey-8c0c503c6c85c893dceea29c975f3b6b14fc1b52.tar.bz2
misskey-8c0c503c6c85c893dceea29c975f3b6b14fc1b52.zip
refactor: ファイルアップロード時のテストを追加 (#15928)
* refactor: ファイルアップロード時のテストを追加 * なぜかsemverが消えてた
Diffstat (limited to 'packages/backend')
-rw-r--r--packages/backend/package.json4
-rw-r--r--packages/backend/src/server/ServerService.ts9
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/create.ts1
-rw-r--r--packages/backend/test/unit/server/api/drive/files/create.ts164
4 files changed, 176 insertions, 2 deletions
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 0574403ce1..3c6dcc6523 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -223,6 +223,7 @@
"@types/semver": "7.7.0",
"@types/simple-oauth2": "5.0.7",
"@types/sinonjs__fake-timers": "8.1.5",
+ "@types/supertest": "6.0.3",
"@types/tinycolor2": "1.4.6",
"@types/tmp": "0.2.6",
"@types/vary": "1.1.3",
@@ -239,6 +240,7 @@
"jest-mock": "29.7.0",
"nodemon": "3.1.10",
"pid-port": "1.0.2",
- "simple-oauth2": "5.1.0"
+ "simple-oauth2": "5.1.0",
+ "supertest": "7.1.0"
}
}
diff --git a/packages/backend/src/server/ServerService.ts b/packages/backend/src/server/ServerService.ts
index 355d7ca08e..c859f1d82c 100644
--- a/packages/backend/src/server/ServerService.ts
+++ b/packages/backend/src/server/ServerService.ts
@@ -7,7 +7,7 @@ import cluster from 'node:cluster';
import * as fs from 'node:fs';
import { fileURLToPath } from 'node:url';
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
-import Fastify, { FastifyInstance } from 'fastify';
+import Fastify, { type FastifyInstance } from 'fastify';
import fastifyStatic from '@fastify/static';
import fastifyRawBody from 'fastify-raw-body';
import { IsNull } from 'typeorm';
@@ -309,6 +309,13 @@ export class ServerService implements OnApplicationShutdown {
await this.#fastify.close();
}
+ /**
+ * Get the Fastify instance for testing.
+ */
+ public get fastify(): FastifyInstance {
+ return this.#fastify;
+ }
+
@bindThis
async onApplicationShutdown(signal: string): Promise<void> {
await this.dispose();
diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts
index 17face8f82..11c255a361 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/create.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts
@@ -61,6 +61,7 @@ export const meta = {
message: 'Cannot upload the file because it exceeds the maximum file size.',
code: 'MAX_FILE_SIZE_EXCEEDED',
id: 'b9d8c348-33f0-4673-b9a9-5d4da058977a',
+ httpStatusCode: 413,
},
},
} as const;
diff --git a/packages/backend/test/unit/server/api/drive/files/create.ts b/packages/backend/test/unit/server/api/drive/files/create.ts
new file mode 100644
index 0000000000..9b38f4d744
--- /dev/null
+++ b/packages/backend/test/unit/server/api/drive/files/create.ts
@@ -0,0 +1,164 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Test, TestingModule } from '@nestjs/testing';
+import { FastifyInstance } from 'fastify';
+import request from 'supertest';
+import { randomString } from '../../../../../utils.js';
+import { CoreModule } from '@/core/CoreModule.js';
+import { RoleService } from '@/core/RoleService.js';
+import { DI } from '@/di-symbols.js';
+import { GlobalModule } from '@/GlobalModule.js';
+import { DriveFoldersRepository, MiDriveFolder, MiRole, UserProfilesRepository, UsersRepository } from '@/models/_.js';
+import { MiUser } from '@/models/User.js';
+import { ServerModule } from '@/server/ServerModule.js';
+import { ServerService } from '@/server/ServerService.js';
+import { IdService } from '@/core/IdService.js';
+
+describe('/drive/files/create', () => {
+ let module: TestingModule;
+ let server: FastifyInstance;
+ let roleService: RoleService;
+ let idService: IdService;
+
+ let root: MiUser;
+ let role_tinyAttachment: MiRole;
+
+ let folder: MiDriveFolder;
+
+ beforeAll(async () => {
+ module = await Test.createTestingModule({
+ imports: [GlobalModule, CoreModule, ServerModule],
+ }).compile();
+ module.enableShutdownHooks();
+
+ const serverService = module.get<ServerService>(ServerService);
+ await serverService.launch();
+ server = serverService.fastify;
+
+ idService = module.get(IdService);
+
+ const usersRepository = module.get<UsersRepository>(DI.usersRepository);
+ await usersRepository.delete({});
+ root = await usersRepository.insert({
+ id: idService.gen(),
+ username: 'root',
+ usernameLower: 'root',
+ token: '1234567890123456',
+ }).then(x => usersRepository.findOneByOrFail(x.identifiers[0]));
+
+ const userProfilesRepository = module.get<UserProfilesRepository>(DI.userProfilesRepository);
+ await userProfilesRepository.delete({});
+ await userProfilesRepository.insert({
+ userId: root.id,
+ });
+
+ const driveFoldersRepository = module.get<DriveFoldersRepository>(DI.driveFoldersRepository);
+ folder = await driveFoldersRepository.insertOne({
+ id: idService.gen(),
+ name: 'root-folder',
+ parentId: null,
+ userId: root.id,
+ });
+
+ roleService = module.get<RoleService>(RoleService);
+ role_tinyAttachment = await roleService.create({
+ name: 'test-role001',
+ description: 'Test role001 description',
+ target: 'manual',
+ policies: {
+ maxFileSizeMb: {
+ useDefault: false,
+ priority: 1,
+ // 10byte
+ value: 10 / 1024 / 1024,
+ },
+ },
+ });
+ });
+
+ beforeEach(async () => {
+ await roleService.unassign(root.id, role_tinyAttachment.id).catch(() => {
+ });
+ });
+
+ afterAll(async () => {
+ await server.close();
+ await module.close();
+ });
+
+ async function postFile(props: {
+ name: string,
+ comment: string,
+ isSensitive: boolean,
+ force: boolean,
+ fileContent: Buffer | string,
+ }) {
+ const { name, comment, isSensitive, force, fileContent } = props;
+
+ return await request(server.server)
+ .post('/api/drive/files/create')
+ .set('Content-Type', 'multipart/form-data')
+ .attach('file', fileContent)
+ .field('name', name)
+ .field('comment', comment)
+ .field('isSensitive', isSensitive)
+ .field('force', force)
+ .field('folderId', folder.id)
+ .field('i', root.token ?? '');
+ }
+
+ test('200 ok', async () => {
+ const name = randomString();
+ const comment = randomString();
+ const result = await postFile({
+ name: name,
+ comment: comment,
+ isSensitive: true,
+ force: true,
+ fileContent: Buffer.from('a'.repeat(1000 * 1000)),
+ });
+ expect(result.statusCode).toBe(200);
+ expect(result.body.name).toBe(name + '.unknown');
+ expect(result.body.comment).toBe(comment);
+ expect(result.body.isSensitive).toBe(true);
+ expect(result.body.folderId).toBe(folder.id);
+ });
+
+ test('200 ok(with role)', async () => {
+ await roleService.assign(root.id, role_tinyAttachment.id);
+
+ const name = randomString();
+ const comment = randomString();
+ const result = await postFile({
+ name: name,
+ comment: comment,
+ isSensitive: true,
+ force: true,
+ fileContent: Buffer.from('a'.repeat(10)),
+ });
+ expect(result.statusCode).toBe(200);
+ expect(result.body.name).toBe(name + '.unknown');
+ expect(result.body.comment).toBe(comment);
+ expect(result.body.isSensitive).toBe(true);
+ expect(result.body.folderId).toBe(folder.id);
+ });
+
+ test('413 too large', async () => {
+ await roleService.assign(root.id, role_tinyAttachment.id);
+
+ const name = randomString();
+ const comment = randomString();
+ const result = await postFile({
+ name: name,
+ comment: comment,
+ isSensitive: true,
+ force: true,
+ fileContent: Buffer.from('a'.repeat(11)),
+ });
+ expect(result.statusCode).toBe(413);
+ expect(result.body.error.code).toBe('MAX_FILE_SIZE_EXCEEDED');
+ });
+});