37 lines
1.4 KiB
JavaScript
37 lines
1.4 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import path from 'node:path';
|
|
import test from 'node:test';
|
|
import {
|
|
buildRelativeImagePath,
|
|
isPrivateAddress,
|
|
resolveImagePath,
|
|
} from '../src/services/image-storage.service.js';
|
|
|
|
test('이미지는 recipe ID 기준 상대 경로로만 저장한다', () => {
|
|
assert.equal(
|
|
buildRelativeImagePath('0879bf0f-2b64-49fc-a13f-b11b56031993'),
|
|
'recipes/0879bf0f-2b64-49fc-a13f-b11b56031993/cover.webp',
|
|
);
|
|
assert.throws(() => buildRelativeImagePath('../outside'), /recipe ID/);
|
|
});
|
|
|
|
test('동일한 이미지 상대경로를 Windows와 Linux 파일 경로로 해석한다', () => {
|
|
const relativePath = 'recipes/recipe-1/cover.webp';
|
|
|
|
assert.equal(
|
|
resolveImagePath('D:\\project\\our_recipe_atlas\\data\\images', relativePath, path.win32),
|
|
'D:\\project\\our_recipe_atlas\\data\\images\\recipes\\recipe-1\\cover.webp',
|
|
);
|
|
assert.equal(
|
|
resolveImagePath('/mnt/recipe-ssd/our_recipe_atlas/images', relativePath, path.posix),
|
|
'/mnt/recipe-ssd/our_recipe_atlas/images/recipes/recipe-1/cover.webp',
|
|
);
|
|
});
|
|
|
|
test('SSRF에 사용될 수 있는 사설 및 loopback 주소를 판별한다', () => {
|
|
assert.equal(isPrivateAddress('127.0.0.1'), true);
|
|
assert.equal(isPrivateAddress('192.168.0.250'), true);
|
|
assert.equal(isPrivateAddress('::1'), true);
|
|
assert.equal(isPrivateAddress('8.8.8.8'), false);
|
|
});
|