331 lines
7.2 KiB
JavaScript
331 lines
7.2 KiB
JavaScript
const test = require("node:test");
|
|
const assert = require("node:assert/strict");
|
|
const { once } = require("events");
|
|
|
|
const sharp = require("sharp");
|
|
|
|
const app = require("../src/server");
|
|
|
|
async function createTestImage() {
|
|
const width = 200;
|
|
const height = 200;
|
|
|
|
const pixels = Buffer.alloc(
|
|
width * height * 4
|
|
);
|
|
|
|
for (
|
|
let i = 0;
|
|
i < pixels.length;
|
|
i += 4
|
|
) {
|
|
pixels[i] = 128;
|
|
pixels[i + 1] = 128;
|
|
pixels[i + 2] = 128;
|
|
pixels[i + 3] = 255;
|
|
}
|
|
|
|
return sharp(pixels, {
|
|
raw: {
|
|
width,
|
|
height,
|
|
channels: 4
|
|
}
|
|
})
|
|
.png()
|
|
.toBuffer();
|
|
}
|
|
|
|
async function createServer() {
|
|
const server = app.listen(0);
|
|
|
|
await once(server, "listening");
|
|
|
|
const address = server.address();
|
|
|
|
return {
|
|
server,
|
|
baseUrl: `http://127.0.0.1:${address.port}`
|
|
};
|
|
}
|
|
|
|
test("GET /api/health", async () => {
|
|
const {
|
|
server,
|
|
baseUrl
|
|
} = await createServer();
|
|
|
|
try {
|
|
const response = await fetch(
|
|
`${baseUrl}/api/health`
|
|
);
|
|
|
|
assert.equal(
|
|
response.status,
|
|
200
|
|
);
|
|
|
|
const body = await response.json();
|
|
|
|
assert.deepEqual(body, {
|
|
status: "ok"
|
|
});
|
|
} finally {
|
|
server.close();
|
|
}
|
|
});
|
|
|
|
test(
|
|
"encode and decode a message through the API",
|
|
async () => {
|
|
const {
|
|
server,
|
|
baseUrl
|
|
} = await createServer();
|
|
|
|
try {
|
|
const image =
|
|
await createTestImage();
|
|
|
|
const encodeForm =
|
|
new FormData();
|
|
|
|
encodeForm.append(
|
|
"image",
|
|
new Blob(
|
|
[image],
|
|
{
|
|
type: "image/png"
|
|
}
|
|
),
|
|
"test.png"
|
|
);
|
|
|
|
encodeForm.append(
|
|
"message",
|
|
"Hello from the integration test!"
|
|
);
|
|
|
|
encodeForm.append(
|
|
"password",
|
|
"test-password"
|
|
);
|
|
|
|
const encodedResponse =
|
|
await fetch(
|
|
`${baseUrl}/api/encode`,
|
|
{
|
|
method: "POST",
|
|
body: encodeForm
|
|
}
|
|
);
|
|
|
|
assert.equal(
|
|
encodedResponse.status,
|
|
200
|
|
);
|
|
|
|
assert.equal(
|
|
encodedResponse.headers.get(
|
|
"content-type"
|
|
),
|
|
"image/png"
|
|
);
|
|
|
|
const encodedImage =
|
|
Buffer.from(
|
|
await encodedResponse.arrayBuffer()
|
|
);
|
|
|
|
assert.ok(
|
|
encodedImage.length > 0
|
|
);
|
|
|
|
const decodeForm =
|
|
new FormData();
|
|
|
|
decodeForm.append(
|
|
"image",
|
|
new Blob(
|
|
[encodedImage],
|
|
{
|
|
type: "image/png"
|
|
}
|
|
),
|
|
"encoded.png"
|
|
);
|
|
|
|
decodeForm.append(
|
|
"password",
|
|
"test-password"
|
|
);
|
|
|
|
const decodedResponse =
|
|
await fetch(
|
|
`${baseUrl}/api/decode`,
|
|
{
|
|
method: "POST",
|
|
body: decodeForm
|
|
}
|
|
);
|
|
|
|
assert.equal(
|
|
decodedResponse.status,
|
|
200
|
|
);
|
|
|
|
const result =
|
|
await decodedResponse.json();
|
|
|
|
assert.deepEqual(
|
|
result,
|
|
{
|
|
type: "message",
|
|
message:
|
|
"Hello from the integration test!"
|
|
}
|
|
);
|
|
} finally {
|
|
server.close();
|
|
}
|
|
}
|
|
);
|
|
|
|
test(
|
|
"encode and decode a file through the API",
|
|
async () => {
|
|
const {
|
|
server,
|
|
baseUrl
|
|
} = await createServer();
|
|
|
|
try {
|
|
const image =
|
|
await createTestImage();
|
|
|
|
const originalFile =
|
|
Buffer.from(
|
|
"This is a secret file.\n"
|
|
);
|
|
|
|
const encodeForm =
|
|
new FormData();
|
|
|
|
encodeForm.append(
|
|
"image",
|
|
new Blob(
|
|
[image],
|
|
{
|
|
type: "image/png"
|
|
}
|
|
),
|
|
"test.png"
|
|
);
|
|
|
|
encodeForm.append(
|
|
"file",
|
|
new Blob(
|
|
[originalFile],
|
|
{
|
|
type: "text/plain"
|
|
}
|
|
),
|
|
"secret.txt"
|
|
);
|
|
|
|
encodeForm.append(
|
|
"password",
|
|
"test-password"
|
|
);
|
|
|
|
const encodedResponse =
|
|
await fetch(
|
|
`${baseUrl}/api/encode`,
|
|
{
|
|
method: "POST",
|
|
body: encodeForm
|
|
}
|
|
);
|
|
|
|
assert.equal(
|
|
encodedResponse.status,
|
|
200
|
|
);
|
|
|
|
assert.equal(
|
|
encodedResponse.headers.get(
|
|
"content-type"
|
|
),
|
|
"image/png"
|
|
);
|
|
|
|
const encodedImage =
|
|
Buffer.from(
|
|
await encodedResponse.arrayBuffer()
|
|
);
|
|
|
|
assert.ok(
|
|
encodedImage.length > 0
|
|
);
|
|
|
|
const decodeForm =
|
|
new FormData();
|
|
|
|
decodeForm.append(
|
|
"image",
|
|
new Blob(
|
|
[encodedImage],
|
|
{
|
|
type: "image/png"
|
|
}
|
|
),
|
|
"encoded.png"
|
|
);
|
|
|
|
decodeForm.append(
|
|
"password",
|
|
"test-password"
|
|
);
|
|
|
|
const decodedResponse =
|
|
await fetch(
|
|
`${baseUrl}/api/decode`,
|
|
{
|
|
method: "POST",
|
|
body: decodeForm
|
|
}
|
|
);
|
|
|
|
assert.equal(
|
|
decodedResponse.status,
|
|
200
|
|
);
|
|
|
|
const decodedFile =
|
|
Buffer.from(
|
|
await decodedResponse.arrayBuffer()
|
|
);
|
|
|
|
assert.deepEqual(
|
|
decodedFile,
|
|
originalFile
|
|
);
|
|
|
|
assert.equal(
|
|
decodedResponse.headers.get(
|
|
"content-type"
|
|
),
|
|
"text/plain"
|
|
);
|
|
|
|
assert.match(
|
|
decodedResponse.headers.get(
|
|
"content-disposition"
|
|
),
|
|
/secret\.txt/
|
|
);
|
|
} finally {
|
|
server.close();
|
|
}
|
|
}
|
|
); |