2026-10-08 16:31:46 +00:00
|
|
|
import assert from "node:assert/strict";
|
|
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
CompaniesResponseSchema,
|
|
|
|
|
CompanyLogoResponseSchema,
|
|
|
|
|
CompanyResponseSchema,
|
|
|
|
|
} from "@metis/companies/common";
|
|
|
|
|
|
|
|
|
|
export async function verifyCompanyLogos(
|
|
|
|
|
baseUrl: string,
|
|
|
|
|
companyId: string,
|
|
|
|
|
cookie: string,
|
|
|
|
|
csrfToken: string,
|
|
|
|
|
origin: string
|
|
|
|
|
) {
|
|
|
|
|
const path = `/companies/${companyId}/logo`;
|
|
|
|
|
const headers = {
|
|
|
|
|
cookie,
|
|
|
|
|
origin,
|
|
|
|
|
"x-csrf-token": csrfToken,
|
|
|
|
|
"content-type": "application/octet-stream",
|
|
|
|
|
};
|
|
|
|
|
const png = Buffer.from(
|
|
|
|
|
"iVBORw0KGgoAAAANSUhEUgAAAQAAAACACAIAAABr1yBdAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACrElEQVR4nO3cwQ3EIBAEQVLpBAmIaB2B3/vYkgjg1G5kw87c6T4LgbZqcMZ/gYVANgAJEMgbgAQI5BOIBAjkDEACBHIIJgECuQUiAQK5BiUBApkDkACBDMJIgEAmwSRAIFEIEiCQLBAJEEgYjgQIJA1KAgQShyYBAukDkACBFGJIgEAaYSRAIJVIEiCQTjAJUshWiidBu7eBf4WYfwZWNgAJEMgbgAQI5BOIBAjkDEACBHIIJgECuQUiAQK5BiUBApkDkACBDMJIgEAmwSRAIFEIEiCQLBAJEEgYjgQIJA1KAgQShyYBAukDkACBFGJIgEAaYSRAIJVIEiCQTjAJUkdWiidBu7eBf4WYfwZWNgAJEMgbgAQI5BOIBAjkDEACBHIIJgECuQUiAQK5BiUBApkDkACBDMJIgEAmwSRAIFEIEiCQLBAJEEgYjgQIJA1KAgQShyYBAukDkACBFGJIgEAaYSRAIJVIEiCQTjAJUkdWiidBu7eBf4WYfwZWNgAJEMgbgAQI5BOIBAjkDEACBHIIJgECuQUiAQK5BiUBApkDkACBDMJIgEAmwSRAIFEIEiCQLBAJEEgYjgQIJA1KAgQShyYBAukDkACBFGJIgIBGGAkQeCqRJEDg6QSTAAGleBLc7dvAv0LMPwMrG4AECOQNQAIE8glEAgRyBiABAjkEkwCB3AKRAIFcg5IAgcwBSIBABmEkQCCTYBIgkCgECRBIFogECCQMRwIEkgYlAQKJQ5MAgfQBSIBACjEkQCCNMBIgkEokCRBIJ5gEqSMrxZOg3dvAv0LMPwMrG4AECOQNQAIE8glEAgRyBiABAjkEkwCB3AKRAIFcg5IAgcwBSIBABmEkQCCTYBIgkCgECRBIFogECCQMRwIEkgYlAQKJQ5MAgfQBSIBA/9vgAyvyiK2z3NTsAAAAAElFTkSuQmCC",
|
|
|
|
|
"base64"
|
|
|
|
|
);
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal((await fetch(`${baseUrl}${path}?version=${"a".repeat(64)}`)).status, 401);
|
|
|
|
|
assert.equal(
|
|
|
|
|
(
|
|
|
|
|
await fetch(`${baseUrl}${path}`, {
|
|
|
|
|
method: "POST",
|
|
|
|
|
headers: { ...headers, "x-csrf-token": "invalid" },
|
|
|
|
|
body: png,
|
|
|
|
|
})
|
|
|
|
|
).status,
|
|
|
|
|
403
|
|
|
|
|
);
|
|
|
|
|
assert.equal(
|
|
|
|
|
(
|
|
|
|
|
await fetch(`${baseUrl}${path}`, {
|
|
|
|
|
method: "POST",
|
|
|
|
|
headers,
|
|
|
|
|
body: Buffer.from("invalid image"),
|
|
|
|
|
})
|
|
|
|
|
).status,
|
|
|
|
|
400
|
|
|
|
|
);
|
|
|
|
|
assert.equal(
|
|
|
|
|
(
|
|
|
|
|
await fetch(`${baseUrl}${path}`, {
|
|
|
|
|
method: "POST",
|
|
|
|
|
headers,
|
|
|
|
|
body: Buffer.alloc(2 * 1024 * 1024 + 1),
|
|
|
|
|
})
|
|
|
|
|
).status,
|
|
|
|
|
413
|
|
|
|
|
);
|
|
|
|
|
const upload = await fetch(`${baseUrl}${path}`, { method: "POST", headers, body: png });
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal(upload.status, 200);
|
|
|
|
|
const logo = CompanyLogoResponseSchema.parse(await upload.json());
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.ok(logo.logoVersion);
|
|
|
|
|
const url = `${baseUrl}${path}?version=${logo.logoVersion}`;
|
|
|
|
|
const image = await fetch(url, { headers: { cookie } });
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal(image.status, 200);
|
|
|
|
|
assert.equal(image.headers.get("content-type"), "image/webp");
|
|
|
|
|
assert.match(image.headers.get("cache-control") ?? "", /private/);
|
|
|
|
|
const bytes = Buffer.from(await image.arrayBuffer());
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.ok(bytes.length <= 64 * 1024);
|
|
|
|
|
assert.equal(bytes.subarray(8, 12).toString(), "WEBP");
|
|
|
|
|
assert.equal(
|
|
|
|
|
(await fetch(url, { headers: { cookie, "if-none-match": image.headers.get("etag") ?? "" } }))
|
|
|
|
|
.status,
|
|
|
|
|
304
|
|
|
|
|
);
|
|
|
|
|
assert.equal(
|
|
|
|
|
(await fetch(`${baseUrl}${path}?version=${"b".repeat(64)}`, { headers: { cookie } })).status,
|
|
|
|
|
404
|
|
|
|
|
);
|
|
|
|
|
const repeated = await fetch(`${baseUrl}${path}`, { method: "POST", headers, body: png });
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.deepEqual(CompanyLogoResponseSchema.parse(await repeated.json()), logo);
|
|
|
|
|
const detail = await fetch(`${baseUrl}/companies/${companyId}`, { headers: { cookie } });
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal(
|
|
|
|
|
CompanyResponseSchema.parse(await detail.json()).company.logoVersion,
|
|
|
|
|
logo.logoVersion
|
|
|
|
|
);
|
|
|
|
|
const list = await fetch(`${baseUrl}/companies`, { headers: { cookie } });
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal(
|
|
|
|
|
CompaniesResponseSchema.parse(await list.json()).companies.find((item) => item.id === companyId)
|
|
|
|
|
?.logoVersion,
|
|
|
|
|
logo.logoVersion
|
|
|
|
|
);
|
|
|
|
|
const replacement = await fetch(`${baseUrl}${path}`, {
|
|
|
|
|
method: "POST",
|
|
|
|
|
headers,
|
|
|
|
|
body: Buffer.from(
|
|
|
|
|
"iVBORw0KGgoAAAANSUhEUgAAAQAAAACACAIAAABr1yBdAAAACXBIWXMAAAPoAAAD6AG1e1JrAAACrElEQVR4nO3cwQ3EIBAEQVIgSYLrKB2B3/vYkgjg1G5kw87c6V0LgbZqcMZ/gYVANgAJEMgbgAQI5BOIBAjkDEACBHIIJgECuQUiAQK5BiUBApkDkACBDMJIgEAmwSRAIFEIEiCQLBAJEEgYjgQIJA1KAgQShyYBAukDkACBFGJIgEAaYSRAIJVIEiCQTjAJUshWiidBu7eBf4WYfwZWNgAJEMgbgAQI5BOIBAjkDEACBHIIJgECuQUiAQK5BiUBApkDkACBDMJIgEAmwSRAIFEIEiCQLBAJEEgYjgQIJA1KAgQShyYBAukDkACBFGJIgEAaYSRAIJVIEiCQTjAJUkdWiidBu7eBf4WYfwZWNgAJEMgbgAQI5BOIBAjkDEACBHIIJgECuQUiAQK5BiUBApkDkACBDMJIgEAmwSRAIFEIEiCQLBAJEEgYjgQIJA1KAgQShyYBAukDkACBFGJIgEAaYSRAIJVIEiCQTjAJUkdWiidBu7eBf4WYfwZWNgAJEMgbgAQI5BOIBAjkDEACBHIIJgECuQUiAQK5BiUBApkDkACBDMJIgEAmwSRAIFEIEiCQLBAJEEgYjgQIJA1KAgQShyYBAukDkACBFGJIgIBGGAkQuCqRJEDg6gSTAAGleBK87dvAv0LMPwMrG4AECOQNQAIE8glEAgRyBiABAjkEkwCB3AKRAIFcg5IAgcwBSIBABmEkQCCTYBIgkCgECRBIFogECCQMRwIEkgYlAQKJQ5MAgfQBSIBACjEkQCCNMBIgkEokCRBIJ5gEqSMrxZOg3dvAv0LMPwMrG4AECOQNQAIE8glEAgRyBiABAjkEkwCB3AKRAIFcg5IAgcwBSIBABmEkQCCTYBIgkCgECRBIFogECCQMRwIEkgYlAQKJQ5MAgfQBSIBA/9vgAyJWiHFIq0dWAAAAAElFTkSuQmCC",
|
|
|
|
|
"base64"
|
|
|
|
|
),
|
|
|
|
|
});
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal(replacement.status, 200);
|
|
|
|
|
const replaced = CompanyLogoResponseSchema.parse(await replacement.json());
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.notEqual(replaced.logoVersion, logo.logoVersion);
|
|
|
|
|
assert.equal((await fetch(url, { headers: { cookie } })).status, 404);
|
|
|
|
|
const updatedUrl = `${baseUrl}${path}?version=${replaced.logoVersion}`;
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal((await fetch(updatedUrl, { headers: { cookie } })).status, 200);
|
|
|
|
|
const current = await fetch(`${baseUrl}/companies/${companyId}`, { headers: { cookie } });
|
|
|
|
|
const company = CompanyResponseSchema.parse(await current.json()).company;
|
|
|
|
|
const update = await fetch(`${baseUrl}/companies/${companyId}/update`, {
|
|
|
|
|
method: "POST",
|
|
|
|
|
headers: { ...headers, "content-type": "application/json" },
|
|
|
|
|
body: JSON.stringify({ name: company.name, active: company.active }),
|
|
|
|
|
});
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal(update.status, 200);
|
|
|
|
|
assert.equal(
|
|
|
|
|
CompanyResponseSchema.parse(await update.json()).company.logoVersion,
|
|
|
|
|
replaced.logoVersion
|
|
|
|
|
);
|
|
|
|
|
for (let repeat = 0; repeat < 2; repeat++) {
|
|
|
|
|
const removed = await fetch(`${baseUrl}${path}/remove`, {
|
|
|
|
|
method: "POST",
|
|
|
|
|
headers: { ...headers, "content-type": "application/json" },
|
|
|
|
|
body: "{}",
|
|
|
|
|
});
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal(removed.status, 200);
|
|
|
|
|
assert.equal(CompanyLogoResponseSchema.parse(await removed.json()).logoVersion, null);
|
|
|
|
|
}
|
|
|
|
|
assert.equal((await fetch(url, { headers: { cookie } })).status, 404);
|
|
|
|
|
assert.equal((await fetch(updatedUrl, { headers: { cookie } })).status, 404);
|
|
|
|
|
const cleared = await fetch(`${baseUrl}/companies/${companyId}`, { headers: { cookie } });
|
2026-10-10 10:01:58 +00:00
|
|
|
|
2026-10-08 16:31:46 +00:00
|
|
|
assert.equal(CompanyResponseSchema.parse(await cleared.json()).company.logoVersion, null);
|
|
|
|
|
}
|