arkos 1.0.3-alpha → 1.0.4-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -32
- package/package.json +1 -1
- package/dist/cjs/modules/auth/__tests__/auth.controller.test.js +0 -494
- package/dist/cjs/modules/auth/__tests__/auth.controller.test.js.map +0 -1
- package/dist/cjs/modules/auth/__tests__/auth.service.test.js +0 -470
- package/dist/cjs/modules/auth/__tests__/auth.service.test.js.map +0 -1
- package/dist/cjs/modules/auth/utils/helpers/__tests__/auth.helpers.test.js +0 -43
- package/dist/cjs/modules/auth/utils/helpers/__tests__/auth.helpers.test.js.map +0 -1
- package/dist/cjs/modules/base/utils/helpers/__tests__/base.helpers.test.js +0 -754
- package/dist/cjs/modules/base/utils/helpers/__tests__/base.helpers.test.js.map +0 -1
- package/dist/cjs/modules/file-upload/file-upload.controller.js +0 -226
- package/dist/cjs/modules/file-upload/file-upload.controller.js.map +0 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js +0 -50
- package/dist/cjs/modules/file-upload/file-upload.router.js.map +0 -1
- package/dist/cjs/modules/file-upload/file-upload.service.js +0 -353
- package/dist/cjs/modules/file-upload/file-upload.service.js.map +0 -1
- package/dist/cjs/modules/file-uploader/__tests__/file-uploader.service.test.js +0 -402
- package/dist/cjs/modules/file-uploader/__tests__/file-uploader.service.test.js.map +0 -1
- package/dist/cjs/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.js +0 -164
- package/dist/cjs/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.js.map +0 -1
- package/dist/es2020/modules/file-upload/file-upload.controller.js +0 -220
- package/dist/es2020/modules/file-upload/file-upload.controller.js.map +0 -1
- package/dist/es2020/modules/file-upload/file-upload.router.js +0 -44
- package/dist/es2020/modules/file-upload/file-upload.router.js.map +0 -1
- package/dist/es2020/modules/file-upload/file-upload.service.js +0 -345
- package/dist/es2020/modules/file-upload/file-upload.service.js.map +0 -1
- package/dist/types/modules/file-upload/file-upload.controller.d.ts +0 -3
- package/dist/types/modules/file-upload/file-upload.router.d.ts +0 -3
- package/dist/types/modules/file-upload/file-upload.service.d.ts +0 -30
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const multer_1 = __importDefault(require("multer"));
|
|
16
|
-
const path_1 = __importDefault(require("path"));
|
|
17
|
-
const fs_1 = __importDefault(require("fs"));
|
|
18
|
-
const util_1 = require("util");
|
|
19
|
-
const sharp_1 = __importDefault(require("sharp"));
|
|
20
|
-
const file_uploader_service_1 = require("../file-uploader.service");
|
|
21
|
-
const app_error_1 = __importDefault(require("../../error-handler/utils/app-error"));
|
|
22
|
-
const server_1 = require("../../../server");
|
|
23
|
-
jest.mock("multer");
|
|
24
|
-
jest.mock("path");
|
|
25
|
-
jest.mock("fs");
|
|
26
|
-
jest.mock("sharp");
|
|
27
|
-
jest.mock("util");
|
|
28
|
-
jest.mock("../../../server");
|
|
29
|
-
jest.mock("../../error-handler/utils/app-error");
|
|
30
|
-
jest.mock("../../../utils/helpers/prisma.helpers");
|
|
31
|
-
jest.mock("../../../utils/helpers/models.helpers");
|
|
32
|
-
describe("FileUploaderService", () => {
|
|
33
|
-
let mockReq;
|
|
34
|
-
let mockRes;
|
|
35
|
-
let mockNext;
|
|
36
|
-
let fileUploaderService;
|
|
37
|
-
let mockStorage;
|
|
38
|
-
let mockUploader;
|
|
39
|
-
let mockSharp;
|
|
40
|
-
let mockUnlink = jest.fn().mockResolvedValue(undefined);
|
|
41
|
-
let mockStat = jest.fn().mockResolvedValue({ isFile: () => true });
|
|
42
|
-
let mockRename = jest.fn().mockResolvedValue(undefined);
|
|
43
|
-
beforeEach(() => {
|
|
44
|
-
jest.resetAllMocks();
|
|
45
|
-
mockReq = {
|
|
46
|
-
get: jest.fn((key) => {
|
|
47
|
-
if (key === "host")
|
|
48
|
-
return "localhost:3000";
|
|
49
|
-
return null;
|
|
50
|
-
}),
|
|
51
|
-
query: {},
|
|
52
|
-
files: [],
|
|
53
|
-
file: null,
|
|
54
|
-
};
|
|
55
|
-
mockRes = {
|
|
56
|
-
status: jest.fn().mockReturnThis(),
|
|
57
|
-
json: jest.fn(),
|
|
58
|
-
};
|
|
59
|
-
mockNext = jest.fn();
|
|
60
|
-
fs_1.default.existsSync.mockReturnValue(false);
|
|
61
|
-
fs_1.default.mkdirSync.mockReturnValue(undefined);
|
|
62
|
-
const mockPromisify = jest.fn((fn) => fn);
|
|
63
|
-
util_1.promisify.mockImplementation(mockPromisify);
|
|
64
|
-
fs_1.default.stat = jest
|
|
65
|
-
.fn()
|
|
66
|
-
.mockReturnValue({ isFile: () => true });
|
|
67
|
-
fs_1.default.unlink = jest.fn();
|
|
68
|
-
fs_1.default.access = jest
|
|
69
|
-
.fn()
|
|
70
|
-
.mockReturnValue({ isFile: () => true });
|
|
71
|
-
mockUnlink = jest.fn().mockResolvedValue(undefined);
|
|
72
|
-
mockStat = jest.fn().mockResolvedValue({ isFile: () => true });
|
|
73
|
-
util_1.promisify.mockImplementation((fn) => {
|
|
74
|
-
if (fn === fs_1.default.unlink)
|
|
75
|
-
return mockUnlink;
|
|
76
|
-
if (fn === fs_1.default.stat)
|
|
77
|
-
return mockStat;
|
|
78
|
-
if (fn === fs_1.default.rename)
|
|
79
|
-
return mockRename;
|
|
80
|
-
return jest.fn();
|
|
81
|
-
});
|
|
82
|
-
path_1.default.join.mockImplementation((...args) => args.join("/"));
|
|
83
|
-
path_1.default.extname.mockImplementation((filePath) => ".jpg");
|
|
84
|
-
path_1.default.basename.mockImplementation((filePath, ext) => {
|
|
85
|
-
return ext ? filePath.replace(ext, "") : filePath;
|
|
86
|
-
});
|
|
87
|
-
path_1.default.dirname.mockImplementation((filePath) => {
|
|
88
|
-
const parts = filePath.split("/");
|
|
89
|
-
return parts.slice(0, -1).join("/");
|
|
90
|
-
});
|
|
91
|
-
mockStorage = {
|
|
92
|
-
destination: jest.fn(),
|
|
93
|
-
filename: jest.fn(),
|
|
94
|
-
};
|
|
95
|
-
multer_1.default.diskStorage.mockReturnValue(mockStorage);
|
|
96
|
-
mockUploader = {
|
|
97
|
-
single: jest
|
|
98
|
-
.fn()
|
|
99
|
-
.mockReturnValue((req, res, next) => next()),
|
|
100
|
-
array: jest
|
|
101
|
-
.fn()
|
|
102
|
-
.mockReturnValue((req, res, next) => next()),
|
|
103
|
-
};
|
|
104
|
-
multer_1.default.mockReturnValue(mockUploader);
|
|
105
|
-
server_1.getArkosConfig.mockReturnValue({
|
|
106
|
-
fileUpload: {
|
|
107
|
-
baseRoute: "/api/uploads",
|
|
108
|
-
baseUploadDir: "/uploads",
|
|
109
|
-
restrictions: {
|
|
110
|
-
images: {
|
|
111
|
-
maxCount: 30,
|
|
112
|
-
maxSize: 15 * 1024 * 1024,
|
|
113
|
-
supportedFilesRegex: /jpeg|jpg|png/,
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
mockSharp = {
|
|
119
|
-
metadata: jest.fn().mockResolvedValue({ width: 800, height: 600 }),
|
|
120
|
-
resize: jest.fn().mockReturnThis(),
|
|
121
|
-
toFormat: jest.fn().mockReturnThis(),
|
|
122
|
-
toFile: jest.fn().mockResolvedValue({}),
|
|
123
|
-
};
|
|
124
|
-
sharp_1.default.mockReturnValue(mockSharp);
|
|
125
|
-
fileUploaderService = new file_uploader_service_1.FileUploaderService("uploads/images", 5 * 1024 * 1024, /jpeg|jpg|png/, 30);
|
|
126
|
-
});
|
|
127
|
-
describe("constructor", () => {
|
|
128
|
-
it("should initialize with default parameters when not provided", () => {
|
|
129
|
-
const service = new file_uploader_service_1.FileUploaderService("uploads/images");
|
|
130
|
-
expect(service["uploadDir"]).toBe("./uploads/images/");
|
|
131
|
-
expect(service["fileSizeLimit"]).toBe(5 * 1024 * 1024);
|
|
132
|
-
expect(service["allowedFileTypes"]).toEqual(/.*/);
|
|
133
|
-
expect(service["maxCount"]).toBe(30);
|
|
134
|
-
});
|
|
135
|
-
it("should create the upload directory if it doesn't exist", () => {
|
|
136
|
-
expect(fs_1.default.existsSync).toHaveBeenCalledWith("./uploads/images/");
|
|
137
|
-
expect(fs_1.default.mkdirSync).toHaveBeenCalledWith("./uploads/images/", {
|
|
138
|
-
recursive: true,
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
it("should configure multer storage with correct destination and filename", () => {
|
|
142
|
-
const mockDestinationFn = jest.fn();
|
|
143
|
-
const mockFilenameFn = jest.fn();
|
|
144
|
-
multer_1.default.diskStorage.mockReturnValue({
|
|
145
|
-
destination: mockDestinationFn,
|
|
146
|
-
filename: mockFilenameFn,
|
|
147
|
-
});
|
|
148
|
-
new file_uploader_service_1.FileUploaderService("uploads/images");
|
|
149
|
-
const destinationCallback = multer_1.default.diskStorage.mock
|
|
150
|
-
.calls[0][0].destination;
|
|
151
|
-
const cb = jest.fn();
|
|
152
|
-
destinationCallback({}, {}, cb);
|
|
153
|
-
expect(cb).toHaveBeenCalledWith(null, "./uploads/images/");
|
|
154
|
-
const filenameCallback = multer_1.default.diskStorage.mock
|
|
155
|
-
.calls[0][0].filename;
|
|
156
|
-
const fileCb = jest.fn();
|
|
157
|
-
const mockFile = { originalname: "test.jpg" };
|
|
158
|
-
filenameCallback({}, mockFile, fileCb);
|
|
159
|
-
expect(fileCb).toHaveBeenCalledWith(null, expect.stringMatching(/\d+-\d+\.jpg/));
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
describe("fileFilter", () => {
|
|
163
|
-
it("should accept valid file types", () => {
|
|
164
|
-
const fileFilter = fileUploaderService["fileFilter"];
|
|
165
|
-
const cb = jest.fn();
|
|
166
|
-
const mockFile = {
|
|
167
|
-
originalname: "test.jpg",
|
|
168
|
-
mimetype: "image/jpeg",
|
|
169
|
-
};
|
|
170
|
-
fileFilter({}, mockFile, cb);
|
|
171
|
-
expect(cb).toHaveBeenCalledWith(null, true);
|
|
172
|
-
});
|
|
173
|
-
it("should reject invalid file types", () => {
|
|
174
|
-
fileUploaderService["allowedFileTypes"] = /jpeg|jpg|png/;
|
|
175
|
-
const fileFilter = fileUploaderService["fileFilter"];
|
|
176
|
-
const cb = jest.fn();
|
|
177
|
-
const mockFile = {
|
|
178
|
-
originalname: "test.pdf",
|
|
179
|
-
mimetype: "application/pdf",
|
|
180
|
-
};
|
|
181
|
-
path_1.default.extname.mockReturnValueOnce(".pdf");
|
|
182
|
-
fileFilter({}, mockFile, cb);
|
|
183
|
-
expect(cb).toHaveBeenCalledWith(expect.any(app_error_1.default));
|
|
184
|
-
expect(app_error_1.default).toHaveBeenCalledWith("Invalid file type", 400);
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
describe("getUploader", () => {
|
|
188
|
-
it("should return multer instance with correct configuration", () => {
|
|
189
|
-
const uploader = fileUploaderService.getUploader();
|
|
190
|
-
expect(multer_1.default).toHaveBeenCalledWith({
|
|
191
|
-
storage: mockStorage,
|
|
192
|
-
fileFilter: expect.any(Function),
|
|
193
|
-
limits: { fileSize: 5 * 1024 * 1024 },
|
|
194
|
-
});
|
|
195
|
-
expect(uploader).toBe(mockUploader);
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
describe("handleSingleUpload", () => {
|
|
199
|
-
it("should call next() if upload is successful", () => {
|
|
200
|
-
const middleware = fileUploaderService.handleSingleUpload();
|
|
201
|
-
middleware(mockReq, mockRes, mockNext);
|
|
202
|
-
expect(mockUploader.single).toHaveBeenCalledWith(expect.any(String));
|
|
203
|
-
expect(mockNext).toHaveBeenCalled();
|
|
204
|
-
});
|
|
205
|
-
it("should delete old file if oldFilePath is provided", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
206
|
-
mockUploader.single.mockReturnValueOnce((req, res, next) => next());
|
|
207
|
-
const middleware = fileUploaderService.handleSingleUpload("old22/path/to/file.jpg");
|
|
208
|
-
yield middleware(mockReq, mockRes, () => { });
|
|
209
|
-
expect(mockStat).toHaveBeenCalledWith("old22/path/to/file.jpg");
|
|
210
|
-
expect(mockUnlink).toHaveBeenCalledWith("old22/path/to/file.jpg");
|
|
211
|
-
}));
|
|
212
|
-
it("should pass multer errors to next", () => {
|
|
213
|
-
const multerError = new multer_1.default.MulterError("LIMIT_FILE_SIZE", "fieldname");
|
|
214
|
-
mockUploader.single.mockReturnValueOnce((req, res, next) => next(multerError));
|
|
215
|
-
const middleware = fileUploaderService.handleSingleUpload();
|
|
216
|
-
middleware(mockReq, mockRes, mockNext);
|
|
217
|
-
expect(mockNext).toHaveBeenCalledWith(multerError);
|
|
218
|
-
});
|
|
219
|
-
it("should pass regular errors to next", () => {
|
|
220
|
-
const regularError = new Error("Some other error");
|
|
221
|
-
mockUploader.single.mockReturnValueOnce((req, res, next) => next(regularError));
|
|
222
|
-
const middleware = fileUploaderService.handleSingleUpload();
|
|
223
|
-
middleware(mockReq, mockRes, mockNext);
|
|
224
|
-
expect(mockNext).toHaveBeenCalledWith(regularError);
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
describe("handleMultipleUpload", () => {
|
|
228
|
-
it("should call next() if multiple upload is successful", () => {
|
|
229
|
-
const middleware = fileUploaderService.handleMultipleUpload();
|
|
230
|
-
middleware(mockReq, mockRes, mockNext);
|
|
231
|
-
expect(mockUploader.array).toHaveBeenCalledWith(expect.any(String), 30);
|
|
232
|
-
expect(mockNext).toHaveBeenCalled();
|
|
233
|
-
});
|
|
234
|
-
it("should pass multer errors to next", () => {
|
|
235
|
-
const multerError = new multer_1.default.MulterError("LIMIT_FILE_COUNT", "fieldname");
|
|
236
|
-
mockUploader.array.mockReturnValueOnce((req, res, next) => next(multerError));
|
|
237
|
-
const middleware = fileUploaderService.handleMultipleUpload();
|
|
238
|
-
middleware(mockReq, mockRes, mockNext);
|
|
239
|
-
expect(mockNext).toHaveBeenCalledWith(multerError);
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
describe("handleDeleteSingleFile", () => {
|
|
243
|
-
it("should delete the file if it exists", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
244
|
-
const middleware = fileUploaderService.handleDeleteSingleFile("path/to/file.jpg");
|
|
245
|
-
yield middleware(mockReq, mockRes, mockNext);
|
|
246
|
-
expect(mockStat).toHaveBeenCalledWith("path/to/file.jpg");
|
|
247
|
-
expect(mockUnlink).toHaveBeenCalledWith("path/to/file.jpg");
|
|
248
|
-
expect(mockNext).toHaveBeenCalled();
|
|
249
|
-
}));
|
|
250
|
-
it("should call next even if file doesn't exist", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
251
|
-
const middleware = fileUploaderService.handleDeleteSingleFile("nonexistent/file.jpg");
|
|
252
|
-
yield middleware(mockReq, mockRes, mockNext);
|
|
253
|
-
expect(mockNext).toHaveBeenCalled();
|
|
254
|
-
}));
|
|
255
|
-
});
|
|
256
|
-
describe("deleteFileByUrl", () => {
|
|
257
|
-
it("should delete a file by its URL", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
258
|
-
const result = yield fileUploaderService.deleteFileByUrl("http://localhost:3000/api/uploads/images/file.jpg");
|
|
259
|
-
expect(mockStat).toHaveBeenCalled();
|
|
260
|
-
expect(mockUnlink).toHaveBeenCalled();
|
|
261
|
-
expect(result).toBe(true);
|
|
262
|
-
}));
|
|
263
|
-
it("should throw AppError if file URL is invalid", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
264
|
-
yield expect(fileUploaderService.deleteFileByUrl("http://localhost:3000/invalid/path")).rejects.toBeInstanceOf(app_error_1.default);
|
|
265
|
-
expect(app_error_1.default).toHaveBeenCalledWith("Invalid file URL: base route not found", 400);
|
|
266
|
-
}));
|
|
267
|
-
it("should throw AppError if file doesn't exist", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
268
|
-
const enoentError = new Error("File not found");
|
|
269
|
-
enoentError.code = "ENOENT";
|
|
270
|
-
mockStat.mockImplementationOnce((path, mode, cb) => {
|
|
271
|
-
throw enoentError;
|
|
272
|
-
});
|
|
273
|
-
yield expect(fileUploaderService.deleteFileByUrl("http://localhost:3000/api/uploads/images/nonexistent.jpg")).rejects.toBeInstanceOf(app_error_1.default);
|
|
274
|
-
expect(app_error_1.default).toHaveBeenCalledWith("File not found", 404);
|
|
275
|
-
}));
|
|
276
|
-
});
|
|
277
|
-
describe("upload", () => {
|
|
278
|
-
beforeEach(() => {
|
|
279
|
-
mockReq.query = { multiple: "false" };
|
|
280
|
-
mockReq.file = {
|
|
281
|
-
path: "test.jpg",
|
|
282
|
-
originalname: "test.jpg",
|
|
283
|
-
};
|
|
284
|
-
});
|
|
285
|
-
it("should handle single file upload successfully", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
286
|
-
mockUploader.single.mockReturnValueOnce((req, res, next) => {
|
|
287
|
-
req.file = mockReq.file;
|
|
288
|
-
next();
|
|
289
|
-
});
|
|
290
|
-
const result = yield fileUploaderService.upload(mockReq, mockRes);
|
|
291
|
-
expect(result).toBe("http://localhost:3000/api/uploads/images/test.jpg");
|
|
292
|
-
}));
|
|
293
|
-
it("should handle multiple file uploads successfully", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
294
|
-
mockReq.query = { multiple: "true" };
|
|
295
|
-
mockReq.files = [
|
|
296
|
-
{ path: "test1.jpg", originalname: "test1.jpg" },
|
|
297
|
-
{ path: "test2.jpg", originalname: "test2.jpg" },
|
|
298
|
-
];
|
|
299
|
-
mockReq.file = null;
|
|
300
|
-
mockUploader.array.mockReturnValueOnce((req, res, next) => {
|
|
301
|
-
req.files = mockReq.files;
|
|
302
|
-
next();
|
|
303
|
-
});
|
|
304
|
-
const result = yield fileUploaderService.upload(mockReq, mockRes);
|
|
305
|
-
expect(Array.isArray(result)).toBe(true);
|
|
306
|
-
expect(result).toHaveLength(2);
|
|
307
|
-
expect(result[0]).toBe("http://localhost:3000/api/uploads/images/test1.jpg");
|
|
308
|
-
expect(result[1]).toBe("http://localhost:3000/api/uploads/images/test2.jpg");
|
|
309
|
-
}));
|
|
310
|
-
it("should process images with Sharp when uploading image files", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
311
|
-
mockReq.file = {
|
|
312
|
-
path: "test.jpg",
|
|
313
|
-
originalname: "test.jpg",
|
|
314
|
-
};
|
|
315
|
-
fileUploaderService["uploadDir"] = "/uploads/images/";
|
|
316
|
-
const imageUploaderService = new file_uploader_service_1.FileUploaderService("uploads/images");
|
|
317
|
-
mockUploader.single.mockReturnValueOnce((req, res, next) => {
|
|
318
|
-
req.file = mockReq.file;
|
|
319
|
-
next();
|
|
320
|
-
});
|
|
321
|
-
const result = yield imageUploaderService.upload(mockReq, mockRes, {
|
|
322
|
-
width: 300,
|
|
323
|
-
height: 200,
|
|
324
|
-
format: "webp",
|
|
325
|
-
});
|
|
326
|
-
expect(sharp_1.default).toHaveBeenCalledWith("test.jpg");
|
|
327
|
-
expect(mockSharp.resize).toHaveBeenCalledWith(300, 200, expect.any(Object));
|
|
328
|
-
expect(mockSharp.toFormat).toHaveBeenCalledWith("webp");
|
|
329
|
-
expect(mockSharp.toFile).toHaveBeenCalled();
|
|
330
|
-
expect(mockRename).toHaveBeenCalled();
|
|
331
|
-
expect(result).toBe("http://localhost:3000/api/uploads/images/test.jpg");
|
|
332
|
-
}));
|
|
333
|
-
it("should throw AppError if no file is uploaded", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
334
|
-
mockReq.file = null;
|
|
335
|
-
mockReq.files = null;
|
|
336
|
-
mockUploader.single.mockReturnValueOnce((req, res, next) => next());
|
|
337
|
-
yield expect(fileUploaderService.upload(mockReq, mockRes)).rejects.toBeInstanceOf(app_error_1.default);
|
|
338
|
-
expect(app_error_1.default).toHaveBeenCalledWith("No file uploaded", 400);
|
|
339
|
-
}));
|
|
340
|
-
it("should handle upload errors", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
341
|
-
const uploadError = new Error("Upload failed");
|
|
342
|
-
mockUploader.single.mockReturnValueOnce((req, res, next) => next(uploadError));
|
|
343
|
-
yield expect(fileUploaderService.upload(mockReq, mockRes)).rejects.toEqual(uploadError);
|
|
344
|
-
}));
|
|
345
|
-
it("should handle image processing errors", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
346
|
-
mockReq.file = {
|
|
347
|
-
path: "uploads/images/test.jpg",
|
|
348
|
-
originalname: "test.jpg",
|
|
349
|
-
};
|
|
350
|
-
fileUploaderService["uploadDir"] = "./uploads/images/";
|
|
351
|
-
mockUploader.single.mockReturnValueOnce((req, res, next) => {
|
|
352
|
-
req.file = mockReq.file;
|
|
353
|
-
next();
|
|
354
|
-
});
|
|
355
|
-
const processingError = new Error("Image processing failed");
|
|
356
|
-
mockSharp.toFile.mockRejectedValueOnce(processingError);
|
|
357
|
-
yield expect(fileUploaderService.upload(mockReq, mockRes, { format: "webp" })).rejects.toEqual(processingError);
|
|
358
|
-
}));
|
|
359
|
-
});
|
|
360
|
-
describe("getFileUploaderServices", () => {
|
|
361
|
-
it("should return all file uploader services", () => {
|
|
362
|
-
const services = (0, file_uploader_service_1.getFileUploaderServices)();
|
|
363
|
-
expect(services).toHaveProperty("imageUploaderService");
|
|
364
|
-
expect(services).toHaveProperty("videoUploaderService");
|
|
365
|
-
expect(services).toHaveProperty("documentUploaderService");
|
|
366
|
-
expect(services).toHaveProperty("fileUploaderService");
|
|
367
|
-
expect(services.imageUploaderService).toBeInstanceOf(file_uploader_service_1.FileUploaderService);
|
|
368
|
-
expect(services.videoUploaderService).toBeInstanceOf(file_uploader_service_1.FileUploaderService);
|
|
369
|
-
expect(services.documentUploaderService).toBeInstanceOf(file_uploader_service_1.FileUploaderService);
|
|
370
|
-
expect(services.fileUploaderService).toBeInstanceOf(file_uploader_service_1.FileUploaderService);
|
|
371
|
-
});
|
|
372
|
-
it("should use config values when available", () => {
|
|
373
|
-
server_1.getArkosConfig.mockReturnValue({
|
|
374
|
-
fileUpload: {
|
|
375
|
-
baseRoute: "/custom/api/uploads",
|
|
376
|
-
baseUploadDir: "/custom/uploads",
|
|
377
|
-
restrictions: {
|
|
378
|
-
images: {
|
|
379
|
-
maxCount: 50,
|
|
380
|
-
maxSize: 20 * 1024 * 1024,
|
|
381
|
-
supportedFilesRegex: /custom-regex/,
|
|
382
|
-
},
|
|
383
|
-
},
|
|
384
|
-
},
|
|
385
|
-
});
|
|
386
|
-
const services = (0, file_uploader_service_1.getFileUploaderServices)();
|
|
387
|
-
expect(services.imageUploaderService["uploadDir"]).toBe("./custom/uploads/images/");
|
|
388
|
-
expect(services.imageUploaderService["maxCount"]).toBe(50);
|
|
389
|
-
expect(services.imageUploaderService["fileSizeLimit"]).toBe(20 * 1024 * 1024);
|
|
390
|
-
expect(services.imageUploaderService["allowedFileTypes"]).toEqual(/custom-regex/);
|
|
391
|
-
});
|
|
392
|
-
it("should use default values when config is not available", () => {
|
|
393
|
-
server_1.getArkosConfig.mockReturnValue({});
|
|
394
|
-
const services = (0, file_uploader_service_1.getFileUploaderServices)();
|
|
395
|
-
expect(services.imageUploaderService["uploadDir"]).toBe("./uploads/images/");
|
|
396
|
-
expect(services.videoUploaderService["uploadDir"]).toBe("./uploads/videos/");
|
|
397
|
-
expect(services.documentUploaderService["uploadDir"]).toBe("./uploads/documents/");
|
|
398
|
-
expect(services.fileUploaderService["uploadDir"]).toBe("./uploads/files/");
|
|
399
|
-
});
|
|
400
|
-
});
|
|
401
|
-
});
|
|
402
|
-
//# sourceMappingURL=file-uploader.service.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-uploader.service.test.js","sourceRoot":"","sources":["../../../../../src/modules/file-uploader/__tests__/file-uploader.service.test.ts"],"names":[],"mappings":"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","sourcesContent":["import multer from \"multer\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { promisify } from \"util\";\nimport sharp from \"sharp\";\nimport {\n FileUploaderService,\n getFileUploaderServices,\n} from \"../file-uploader.service\";\nimport AppError from \"../../error-handler/utils/app-error\";\nimport { getArkosConfig } from \"../../../server\";\n\n// Mock dependencies\njest.mock(\"multer\");\njest.mock(\"path\");\njest.mock(\"fs\");\njest.mock(\"sharp\");\njest.mock(\"util\");\njest.mock(\"../../../server\");\njest.mock(\"../../error-handler/utils/app-error\");\njest.mock(\"../../../utils/helpers/prisma.helpers\");\njest.mock(\"../../../utils/helpers/models.helpers\");\n\ndescribe(\"FileUploaderService\", () => {\n let mockReq: any;\n let mockRes: any;\n let mockNext: any;\n let fileUploaderService: FileUploaderService;\n let mockStorage: any;\n let mockUploader: any;\n let mockSharp: any;\n let mockUnlink = jest.fn().mockResolvedValue(undefined);\n\n let mockStat = jest.fn().mockResolvedValue({ isFile: () => true });\n\n let mockRename = jest.fn().mockResolvedValue(undefined);\n\n beforeEach(() => {\n // Reset all mocks\n jest.resetAllMocks();\n\n // Setup mock request, response, and next function\n mockReq = {\n get: jest.fn((key) => {\n if (key === \"host\") return \"localhost:3000\";\n return null;\n }),\n query: {},\n files: [],\n file: null,\n };\n\n mockRes = {\n status: jest.fn().mockReturnThis(),\n json: jest.fn(),\n };\n\n mockNext = jest.fn();\n\n (fs.existsSync as any as jest.Mock).mockReturnValue(false);\n (fs.mkdirSync as any as jest.Mock).mockReturnValue(undefined);\n\n const mockPromisify = jest.fn((fn) => fn);\n (promisify as any as jest.Mock).mockImplementation(mockPromisify);\n\n (fs.stat as any as jest.Mock) = jest\n .fn()\n .mockReturnValue({ isFile: () => true });\n\n (fs.unlink as any as jest.Mock) = jest.fn();\n\n (fs.access as any as jest.Mock) = jest\n .fn()\n .mockReturnValue({ isFile: () => true });\n\n // (fs.rename as any as jest.Mock) = jest\n // .fn()\n // .mockReturnValue({ isFile: () => true });\n\n mockUnlink = jest.fn().mockResolvedValue(undefined);\n\n mockStat = jest.fn().mockResolvedValue({ isFile: () => true });\n\n (promisify as any as jest.Mock).mockImplementation((fn) => {\n if (fn === fs.unlink) return mockUnlink;\n if (fn === fs.stat) return mockStat;\n if (fn === fs.rename) return mockRename;\n return jest.fn();\n });\n\n // Setup mock for path operations\n (path.join as any as jest.Mock).mockImplementation((...args) =>\n args.join(\"/\")\n );\n (path.extname as any as jest.Mock).mockImplementation((filePath) => \".jpg\");\n (path.basename as any as jest.Mock).mockImplementation((filePath, ext) => {\n return ext ? filePath.replace(ext, \"\") : filePath;\n });\n (path.dirname as any as jest.Mock).mockImplementation((filePath) => {\n const parts = filePath.split(\"/\");\n return parts.slice(0, -1).join(\"/\");\n });\n\n // Setup mock for multer storage\n mockStorage = {\n destination: jest.fn(),\n filename: jest.fn(),\n };\n\n (multer.diskStorage as any as jest.Mock).mockReturnValue(mockStorage);\n\n // Setup mock for multer uploader\n mockUploader = {\n single: jest\n .fn()\n .mockReturnValue((req: any, res: any, next: any) => next()),\n array: jest\n .fn()\n .mockReturnValue((req: any, res: any, next: any) => next()),\n };\n\n (multer as unknown as any as jest.Mock).mockReturnValue(mockUploader);\n\n // Setup mock for getArkosConfig\n (getArkosConfig as any as jest.Mock).mockReturnValue({\n fileUpload: {\n baseRoute: \"/api/uploads\",\n baseUploadDir: \"/uploads\",\n restrictions: {\n images: {\n maxCount: 30,\n maxSize: 15 * 1024 * 1024,\n supportedFilesRegex: /jpeg|jpg|png/,\n },\n },\n },\n });\n\n // Setup mock for sharp\n mockSharp = {\n metadata: jest.fn().mockResolvedValue({ width: 800, height: 600 }),\n resize: jest.fn().mockReturnThis(),\n toFormat: jest.fn().mockReturnThis(),\n toFile: jest.fn().mockResolvedValue({}),\n };\n\n (sharp as unknown as any as jest.Mock).mockReturnValue(mockSharp);\n\n // Initialize the service\n fileUploaderService = new FileUploaderService(\n \"uploads/images\",\n 5 * 1024 * 1024,\n /jpeg|jpg|png/,\n 30\n );\n });\n\n describe(\"constructor\", () => {\n it(\"should initialize with default parameters when not provided\", () => {\n const service = new FileUploaderService(\"uploads/images\");\n\n expect(service[\"uploadDir\"]).toBe(\"./uploads/images/\");\n expect(service[\"fileSizeLimit\"]).toBe(5 * 1024 * 1024); // Default 5MB\n expect(service[\"allowedFileTypes\"]).toEqual(/.*/);\n expect(service[\"maxCount\"]).toBe(30);\n });\n\n it(\"should create the upload directory if it doesn't exist\", () => {\n expect(fs.existsSync).toHaveBeenCalledWith(\"./uploads/images/\");\n expect(fs.mkdirSync).toHaveBeenCalledWith(\"./uploads/images/\", {\n recursive: true,\n });\n });\n\n it(\"should configure multer storage with correct destination and filename\", () => {\n const mockDestinationFn = jest.fn();\n const mockFilenameFn = jest.fn();\n\n (multer.diskStorage as jest.Mock).mockReturnValue({\n destination: mockDestinationFn,\n filename: mockFilenameFn,\n });\n\n new FileUploaderService(\"uploads/images\");\n\n const destinationCallback = (multer.diskStorage as jest.Mock).mock\n .calls[0][0].destination;\n\n const cb = jest.fn();\n destinationCallback({}, {}, cb);\n expect(cb).toHaveBeenCalledWith(null, \"./uploads/images/\");\n\n const filenameCallback = (multer.diskStorage as jest.Mock).mock\n .calls[0][0].filename;\n\n const fileCb = jest.fn();\n const mockFile = { originalname: \"test.jpg\" };\n filenameCallback({}, mockFile, fileCb);\n expect(fileCb).toHaveBeenCalledWith(\n null,\n expect.stringMatching(/\\d+-\\d+\\.jpg/)\n );\n });\n });\n\n describe(\"fileFilter\", () => {\n it(\"should accept valid file types\", () => {\n const fileFilter = fileUploaderService[\"fileFilter\"];\n const cb = jest.fn();\n const mockFile = {\n originalname: \"test.jpg\",\n mimetype: \"image/jpeg\",\n };\n\n fileFilter({}, mockFile, cb);\n\n expect(cb).toHaveBeenCalledWith(null, true);\n });\n\n it(\"should reject invalid file types\", () => {\n // Override the regex for this test\n fileUploaderService[\"allowedFileTypes\"] = /jpeg|jpg|png/;\n\n const fileFilter = fileUploaderService[\"fileFilter\"];\n const cb = jest.fn();\n const mockFile = {\n originalname: \"test.pdf\",\n mimetype: \"application/pdf\",\n };\n\n // Mock path.extname to return .pdf\n (path.extname as any as jest.Mock).mockReturnValueOnce(\".pdf\");\n\n fileFilter({}, mockFile, cb);\n\n expect(cb).toHaveBeenCalledWith(expect.any(AppError));\n expect(AppError).toHaveBeenCalledWith(\"Invalid file type\", 400);\n });\n });\n\n describe(\"getUploader\", () => {\n it(\"should return multer instance with correct configuration\", () => {\n const uploader = fileUploaderService.getUploader();\n\n expect(multer).toHaveBeenCalledWith({\n storage: mockStorage,\n fileFilter: expect.any(Function),\n limits: { fileSize: 5 * 1024 * 1024 },\n });\n\n expect(uploader).toBe(mockUploader);\n });\n });\n\n describe(\"handleSingleUpload\", () => {\n it(\"should call next() if upload is successful\", () => {\n const middleware = fileUploaderService.handleSingleUpload();\n\n middleware(mockReq, mockRes, mockNext);\n\n expect(mockUploader.single).toHaveBeenCalledWith(expect.any(String));\n expect(mockNext).toHaveBeenCalled();\n });\n\n it(\"should delete old file if oldFilePath is provided\", async () => {\n // Make promisify return our specific mocks when called with the right functions\n\n // Override multer implementation\n mockUploader.single.mockReturnValueOnce((req: any, res: any, next: any) =>\n next()\n );\n\n const middleware = fileUploaderService.handleSingleUpload(\n \"old22/path/to/file.jpg\"\n );\n\n await middleware(mockReq, mockRes, () => {});\n\n expect(mockStat).toHaveBeenCalledWith(\"old22/path/to/file.jpg\");\n expect(mockUnlink).toHaveBeenCalledWith(\"old22/path/to/file.jpg\");\n });\n\n it(\"should pass multer errors to next\", () => {\n const multerError = new multer.MulterError(\n \"LIMIT_FILE_SIZE\",\n \"fieldname\"\n );\n\n mockUploader.single.mockReturnValueOnce((req: any, res: any, next: any) =>\n next(multerError)\n );\n\n const middleware = fileUploaderService.handleSingleUpload();\n\n middleware(mockReq, mockRes, mockNext);\n\n expect(mockNext).toHaveBeenCalledWith(multerError);\n });\n\n it(\"should pass regular errors to next\", () => {\n const regularError = new Error(\"Some other error\");\n\n mockUploader.single.mockReturnValueOnce((req: any, res: any, next: any) =>\n next(regularError)\n );\n\n const middleware = fileUploaderService.handleSingleUpload();\n\n middleware(mockReq, mockRes, mockNext);\n\n expect(mockNext).toHaveBeenCalledWith(regularError);\n });\n });\n\n describe(\"handleMultipleUpload\", () => {\n it(\"should call next() if multiple upload is successful\", () => {\n const middleware = fileUploaderService.handleMultipleUpload();\n\n middleware(mockReq, mockRes, mockNext);\n\n expect(mockUploader.array).toHaveBeenCalledWith(expect.any(String), 30);\n expect(mockNext).toHaveBeenCalled();\n });\n\n it(\"should pass multer errors to next\", () => {\n const multerError = new multer.MulterError(\n \"LIMIT_FILE_COUNT\",\n \"fieldname\"\n );\n\n mockUploader.array.mockReturnValueOnce((req: any, res: any, next: any) =>\n next(multerError)\n );\n\n const middleware = fileUploaderService.handleMultipleUpload();\n\n middleware(mockReq, mockRes, mockNext);\n\n expect(mockNext).toHaveBeenCalledWith(multerError);\n });\n });\n\n describe(\"handleDeleteSingleFile\", () => {\n it(\"should delete the file if it exists\", async () => {\n const middleware =\n fileUploaderService.handleDeleteSingleFile(\"path/to/file.jpg\");\n\n await middleware(mockReq, mockRes, mockNext);\n\n expect(mockStat).toHaveBeenCalledWith(\"path/to/file.jpg\");\n expect(mockUnlink).toHaveBeenCalledWith(\"path/to/file.jpg\");\n expect(mockNext).toHaveBeenCalled();\n });\n\n it(\"should call next even if file doesn't exist\", async () => {\n const middleware = fileUploaderService.handleDeleteSingleFile(\n \"nonexistent/file.jpg\"\n );\n\n await middleware(mockReq, mockRes, mockNext);\n\n expect(mockNext).toHaveBeenCalled();\n });\n });\n\n describe(\"deleteFileByUrl\", () => {\n it(\"should delete a file by its URL\", async () => {\n const result = await fileUploaderService.deleteFileByUrl(\n \"http://localhost:3000/api/uploads/images/file.jpg\"\n );\n\n expect(mockStat).toHaveBeenCalled();\n expect(mockUnlink).toHaveBeenCalled();\n expect(result).toBe(true);\n });\n\n it(\"should throw AppError if file URL is invalid\", async () => {\n await expect(\n fileUploaderService.deleteFileByUrl(\n \"http://localhost:3000/invalid/path\"\n )\n ).rejects.toBeInstanceOf(AppError);\n\n expect(AppError).toHaveBeenCalledWith(\n \"Invalid file URL: base route not found\",\n 400\n );\n });\n\n it(\"should throw AppError if file doesn't exist\", async () => {\n // Setup fs.access to fail with ENOENT error\n const enoentError = new Error(\"File not found\");\n (enoentError as any).code = \"ENOENT\";\n mockStat.mockImplementationOnce((path, mode, cb) => {\n throw enoentError;\n });\n\n await expect(\n fileUploaderService.deleteFileByUrl(\n \"http://localhost:3000/api/uploads/images/nonexistent.jpg\"\n )\n ).rejects.toBeInstanceOf(AppError);\n\n expect(AppError).toHaveBeenCalledWith(\"File not found\", 404);\n });\n });\n\n describe(\"upload\", () => {\n beforeEach(() => {\n // Setup base test environment\n mockReq.query = { multiple: \"false\" };\n mockReq.file = {\n path: \"test.jpg\",\n originalname: \"test.jpg\",\n };\n });\n\n it(\"should handle single file upload successfully\", async () => {\n // Setup mocks\n mockUploader.single.mockReturnValueOnce(\n (req: any, res: any, next: Function) => {\n req.file = mockReq.file;\n next();\n }\n );\n\n const result = await fileUploaderService.upload(mockReq, mockRes);\n\n expect(result).toBe(\"http://localhost:3000/api/uploads/images/test.jpg\");\n });\n\n it(\"should handle multiple file uploads successfully\", async () => {\n // Setup mocks for multiple files\n mockReq.query = { multiple: \"true\" };\n mockReq.files = [\n { path: \"test1.jpg\", originalname: \"test1.jpg\" },\n { path: \"test2.jpg\", originalname: \"test2.jpg\" },\n ];\n mockReq.file = null;\n\n mockUploader.array.mockReturnValueOnce(\n (req: any, res: any, next: Function) => {\n req.files = mockReq.files;\n next();\n }\n );\n\n const result = await fileUploaderService.upload(mockReq, mockRes);\n\n expect(Array.isArray(result)).toBe(true);\n expect(result).toHaveLength(2);\n expect(result![0]).toBe(\n \"http://localhost:3000/api/uploads/images/test1.jpg\"\n );\n expect(result![1]).toBe(\n \"http://localhost:3000/api/uploads/images/test2.jpg\"\n );\n });\n\n it(\"should process images with Sharp when uploading image files\", async () => {\n // Setup specific mock for image processing\n mockReq.file = {\n path: \"test.jpg\",\n originalname: \"test.jpg\",\n };\n\n // Mock that we're using the image uploader\n fileUploaderService[\"uploadDir\"] = \"/uploads/images/\";\n // console.log(fileUploaderService.uploadDir);\n const imageUploaderService = new FileUploaderService(\"uploads/images\");\n\n mockUploader.single.mockReturnValueOnce(\n (req: any, res: any, next: Function) => {\n req.file = mockReq.file;\n next();\n }\n );\n\n const result = await imageUploaderService.upload(mockReq, mockRes, {\n width: 300,\n height: 200,\n format: \"webp\",\n });\n\n expect(sharp).toHaveBeenCalledWith(\"test.jpg\");\n expect(mockSharp.resize).toHaveBeenCalledWith(\n 300,\n 200,\n expect.any(Object)\n );\n expect(mockSharp.toFormat).toHaveBeenCalledWith(\"webp\");\n expect(mockSharp.toFile).toHaveBeenCalled();\n expect(mockRename).toHaveBeenCalled();\n expect(result).toBe(\"http://localhost:3000/api/uploads/images/test.jpg\");\n });\n\n it(\"should throw AppError if no file is uploaded\", async () => {\n // Setup no files\n mockReq.file = null;\n mockReq.files = null;\n\n mockUploader.single.mockReturnValueOnce(\n (req: any, res: any, next: Function) => next()\n );\n\n await expect(\n fileUploaderService.upload(mockReq, mockRes)\n ).rejects.toBeInstanceOf(AppError);\n expect(AppError).toHaveBeenCalledWith(\"No file uploaded\", 400);\n });\n\n it(\"should handle upload errors\", async () => {\n const uploadError = new Error(\"Upload failed\");\n\n mockUploader.single.mockReturnValueOnce(\n (req: any, res: any, next: Function) => next(uploadError)\n );\n\n await expect(\n fileUploaderService.upload(mockReq, mockRes)\n ).rejects.toEqual(uploadError);\n });\n\n it(\"should handle image processing errors\", async () => {\n mockReq.file = {\n path: \"uploads/images/test.jpg\",\n originalname: \"test.jpg\",\n };\n\n // Mock that we're using the image uploader\n fileUploaderService[\"uploadDir\"] = \"./uploads/images/\";\n\n mockUploader.single.mockReturnValueOnce(\n (req: any, res: any, next: Function) => {\n req.file = mockReq.file;\n next();\n }\n );\n\n // Setup Sharp to throw an error\n const processingError = new Error(\"Image processing failed\");\n mockSharp.toFile.mockRejectedValueOnce(processingError);\n\n await expect(\n fileUploaderService.upload(mockReq, mockRes, { format: \"webp\" })\n ).rejects.toEqual(processingError);\n });\n });\n\n describe(\"getFileUploaderServices\", () => {\n it(\"should return all file uploader services\", () => {\n const services = getFileUploaderServices();\n\n expect(services).toHaveProperty(\"imageUploaderService\");\n expect(services).toHaveProperty(\"videoUploaderService\");\n expect(services).toHaveProperty(\"documentUploaderService\");\n expect(services).toHaveProperty(\"fileUploaderService\");\n\n expect(services.imageUploaderService).toBeInstanceOf(FileUploaderService);\n expect(services.videoUploaderService).toBeInstanceOf(FileUploaderService);\n expect(services.documentUploaderService).toBeInstanceOf(\n FileUploaderService\n );\n expect(services.fileUploaderService).toBeInstanceOf(FileUploaderService);\n });\n\n it(\"should use config values when available\", () => {\n // Setup config with custom values\n (getArkosConfig as any as jest.Mock).mockReturnValue({\n fileUpload: {\n baseRoute: \"/custom/api/uploads\",\n baseUploadDir: \"/custom/uploads\",\n restrictions: {\n images: {\n maxCount: 50,\n maxSize: 20 * 1024 * 1024,\n supportedFilesRegex: /custom-regex/,\n },\n },\n },\n });\n\n const services = getFileUploaderServices();\n\n // Test that the custom config values were used\n expect(services.imageUploaderService[\"uploadDir\"]).toBe(\n \"./custom/uploads/images/\"\n );\n expect(services.imageUploaderService[\"maxCount\"]).toBe(50);\n expect(services.imageUploaderService[\"fileSizeLimit\"]).toBe(\n 20 * 1024 * 1024\n );\n expect(services.imageUploaderService[\"allowedFileTypes\"]).toEqual(\n /custom-regex/\n );\n });\n\n it(\"should use default values when config is not available\", () => {\n // Setup empty config\n (getArkosConfig as any as jest.Mock).mockReturnValue({});\n\n const services = getFileUploaderServices();\n\n // Test that default values were used\n expect(services.imageUploaderService[\"uploadDir\"]).toBe(\n \"./uploads/images/\"\n );\n expect(services.videoUploaderService[\"uploadDir\"]).toBe(\n \"./uploads/videos/\"\n );\n expect(services.documentUploaderService[\"uploadDir\"]).toBe(\n \"./uploads/documents/\"\n );\n expect(services.fileUploaderService[\"uploadDir\"]).toBe(\n \"./uploads/files/\"\n );\n });\n });\n});\n"]}
|
package/dist/cjs/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.js
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const fs_1 = __importDefault(require("fs"));
|
|
16
|
-
const path_1 = __importDefault(require("path"));
|
|
17
|
-
const sharp_1 = __importDefault(require("sharp"));
|
|
18
|
-
const util_1 = require("util");
|
|
19
|
-
const file_uploader_helpers_1 = require("../file-uploader.helpers");
|
|
20
|
-
const server_1 = require("../../../../../server");
|
|
21
|
-
jest.mock("fs");
|
|
22
|
-
jest.mock("path");
|
|
23
|
-
jest.mock("sharp");
|
|
24
|
-
jest.mock("util");
|
|
25
|
-
jest.mock("../../../../../server");
|
|
26
|
-
describe("File Uploader Helpers", () => {
|
|
27
|
-
let mockBaseURL = "https://example.com";
|
|
28
|
-
let mockBaseRoute = "/files";
|
|
29
|
-
let mockFileType = "images";
|
|
30
|
-
beforeEach(() => {
|
|
31
|
-
jest.clearAllMocks();
|
|
32
|
-
server_1.getArkosConfig.mockReturnValue({
|
|
33
|
-
fileUpload: {
|
|
34
|
-
baseUploadDir: "/uploads",
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
path_1.default.join.mockImplementation((...args) => args.join("/"));
|
|
38
|
-
path_1.default.basename.mockImplementation((filePath, ext) => {
|
|
39
|
-
const base = filePath.split("/").pop();
|
|
40
|
-
return ext ? base.replace(ext, "") : base;
|
|
41
|
-
});
|
|
42
|
-
path_1.default.dirname.mockImplementation((filePath) => {
|
|
43
|
-
return filePath.substring(0, filePath.lastIndexOf("/"));
|
|
44
|
-
});
|
|
45
|
-
path_1.default.extname.mockImplementation((filePath) => {
|
|
46
|
-
const parts = filePath.split(".");
|
|
47
|
-
return parts.length > 1 ? `.${parts.pop()}` : "";
|
|
48
|
-
});
|
|
49
|
-
jest.spyOn(process, "cwd").mockReturnValue("/app");
|
|
50
|
-
util_1.promisify.mockImplementation((fn) => fn);
|
|
51
|
-
});
|
|
52
|
-
describe("processFile", () => {
|
|
53
|
-
it("should process a file with internal upload directory", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
54
|
-
const mockFilePath = "test.pdf";
|
|
55
|
-
mockFileType = "documents";
|
|
56
|
-
const result = yield (0, file_uploader_helpers_1.processFile)(mockFilePath, mockBaseURL, mockBaseRoute, mockFileType);
|
|
57
|
-
expect(result).toBe("https://example.com/files/documents/test.pdf");
|
|
58
|
-
}));
|
|
59
|
-
it("should process a file with external upload directory", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
-
server_1.getArkosConfig.mockReturnValue({
|
|
61
|
-
fileUpload: {
|
|
62
|
-
baseUploadDir: "../uploads",
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
const mockFilePath = "../uploads/documents/test.pdf";
|
|
66
|
-
const result = yield (0, file_uploader_helpers_1.processFile)(mockFilePath, mockBaseURL, mockBaseRoute, mockFileType);
|
|
67
|
-
expect(path_1.default.basename).toHaveBeenCalledWith(mockFilePath);
|
|
68
|
-
expect(path_1.default.join).toHaveBeenCalledWith(mockFileType, "test.pdf");
|
|
69
|
-
expect(result).toBe("https://example.com/files/documents/test.pdf");
|
|
70
|
-
}));
|
|
71
|
-
});
|
|
72
|
-
describe("processImage", () => {
|
|
73
|
-
beforeEach(() => {
|
|
74
|
-
const mockTransformer = {
|
|
75
|
-
metadata: jest.fn().mockResolvedValue({ width: 1000, height: 800 }),
|
|
76
|
-
resize: jest.fn().mockReturnThis(),
|
|
77
|
-
toFormat: jest.fn().mockReturnThis(),
|
|
78
|
-
toFile: jest.fn().mockResolvedValue(undefined),
|
|
79
|
-
};
|
|
80
|
-
sharp_1.default.mockReturnValue(mockTransformer);
|
|
81
|
-
fs_1.default.rename = jest
|
|
82
|
-
.fn()
|
|
83
|
-
.mockImplementation((tempPath, origPath) => {
|
|
84
|
-
return true;
|
|
85
|
-
});
|
|
86
|
-
fs_1.default.stat = jest
|
|
87
|
-
.fn()
|
|
88
|
-
.mockReturnValue({ isFile: () => true });
|
|
89
|
-
fs_1.default.unlink = jest
|
|
90
|
-
.fn()
|
|
91
|
-
.mockImplementation((path, callback) => {
|
|
92
|
-
callback(null);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
it("should process a non-image file without transformations", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
96
|
-
const mockFilePath = "test.pdf";
|
|
97
|
-
const options = {};
|
|
98
|
-
mockFileType = "documents";
|
|
99
|
-
const result = yield (0, file_uploader_helpers_1.processImage)(mockFilePath, mockBaseURL, mockBaseRoute, options, mockFileType);
|
|
100
|
-
expect(sharp_1.default).not.toHaveBeenCalled();
|
|
101
|
-
expect(result).toBe("https://example.com/files/documents/test.pdf");
|
|
102
|
-
}));
|
|
103
|
-
it("should process an image file with resizeTo option", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
104
|
-
const mockFilePath = "test.jpg";
|
|
105
|
-
const options = { resizeTo: 500 };
|
|
106
|
-
mockFileType = "images";
|
|
107
|
-
const result = yield (0, file_uploader_helpers_1.processImage)(mockFilePath, mockBaseURL, mockBaseRoute, options, mockFileType);
|
|
108
|
-
expect(sharp_1.default).toHaveBeenCalledWith(mockFilePath);
|
|
109
|
-
expect((0, sharp_1.default)().resize).toHaveBeenCalledWith(625, 500);
|
|
110
|
-
expect((0, sharp_1.default)().toFile).toHaveBeenCalled();
|
|
111
|
-
expect(fs_1.default.rename).toHaveBeenCalled();
|
|
112
|
-
expect(result).toBe("https://example.com/files/images/test.jpg");
|
|
113
|
-
}));
|
|
114
|
-
it("should process an image file with width and height options", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
115
|
-
const mockFilePath = "test.png";
|
|
116
|
-
const options = { width: 300, height: 200 };
|
|
117
|
-
mockFileType = "images";
|
|
118
|
-
const result = yield (0, file_uploader_helpers_1.processImage)(mockFilePath, mockBaseURL, mockBaseRoute, options, mockFileType);
|
|
119
|
-
expect(sharp_1.default).toHaveBeenCalledWith(mockFilePath);
|
|
120
|
-
expect((0, sharp_1.default)().resize).toHaveBeenCalledWith(300, 200, { fit: "inside" });
|
|
121
|
-
expect(result).toBe("https://example.com/files/images/test.png");
|
|
122
|
-
}));
|
|
123
|
-
it("should convert image format to webp if requested", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
124
|
-
const mockFilePath = "test.jpg";
|
|
125
|
-
const options = { format: "webp" };
|
|
126
|
-
mockFileType = "images";
|
|
127
|
-
const result = yield (0, file_uploader_helpers_1.processImage)(mockFilePath, mockBaseURL, mockBaseRoute, options, mockFileType);
|
|
128
|
-
expect(sharp_1.default).toHaveBeenCalledWith(mockFilePath);
|
|
129
|
-
expect((0, sharp_1.default)().toFormat).toHaveBeenCalledWith("webp");
|
|
130
|
-
expect(result).toBe("https://example.com/files/images/test.jpg");
|
|
131
|
-
}));
|
|
132
|
-
it("should convert image format to jpeg if requested", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
133
|
-
const mockFilePath = "test.png";
|
|
134
|
-
const options = { format: "jpeg" };
|
|
135
|
-
mockFileType = "images";
|
|
136
|
-
const result = yield (0, file_uploader_helpers_1.processImage)(mockFilePath, mockBaseURL, mockBaseRoute, options, mockFileType);
|
|
137
|
-
expect(sharp_1.default).toHaveBeenCalledWith(mockFilePath);
|
|
138
|
-
expect((0, sharp_1.default)().toFormat).toHaveBeenCalledWith("jpeg");
|
|
139
|
-
expect(result).toBe("https://example.com/files/images/test.png");
|
|
140
|
-
}));
|
|
141
|
-
it("should handle errors and clean up temp files", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
142
|
-
const mockFilePath = "test.jpg";
|
|
143
|
-
const options = {};
|
|
144
|
-
const error = new Error("Image processing failed");
|
|
145
|
-
(0, sharp_1.default)().toFile.mockRejectedValue(error);
|
|
146
|
-
yield expect((0, file_uploader_helpers_1.processImage)(mockFilePath, mockBaseURL, mockBaseRoute, options, mockFileType)).rejects.toThrow(error);
|
|
147
|
-
expect(fs_1.default.stat).toHaveBeenCalled();
|
|
148
|
-
expect(fs_1.default.unlink).toHaveBeenCalled();
|
|
149
|
-
}));
|
|
150
|
-
it("should handle non-existent temp files gracefully", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
151
|
-
const mockFilePath = "/app/uploads/images/test.jpg";
|
|
152
|
-
const options = {};
|
|
153
|
-
const error = new Error("Image processing failed");
|
|
154
|
-
(0, sharp_1.default)().toFile.mockRejectedValue(error);
|
|
155
|
-
fs_1.default.stat.mockImplementation((path, callback) => {
|
|
156
|
-
callback(new Error("File not found"), null);
|
|
157
|
-
});
|
|
158
|
-
yield expect((0, file_uploader_helpers_1.processImage)(mockFilePath, mockBaseURL, mockBaseRoute, options, mockFileType)).rejects.toThrow(error);
|
|
159
|
-
expect(fs_1.default.stat).toHaveBeenCalled();
|
|
160
|
-
expect(fs_1.default.unlink).not.toHaveBeenCalled();
|
|
161
|
-
}));
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
//# sourceMappingURL=file-uploader.helpers.test.js.map
|