33 lines
2.7 KiB
TypeScript
33 lines
2.7 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import { test } from "node:test"
|
|
import { acceptCertificateIssueRequest, IssueRequestError, type IssueRecordInput } from "./certificate-issue-request.js"
|
|
const request = { requestId: "11111111-1111-4111-8111-111111111111", serverId: "1", certName: "cert", domainNames: ["test.example"] }
|
|
function repository() {
|
|
const jobs = new Map<string, IssueRecordInput>(); const queued: string[] = []
|
|
return { jobs, queued, deps: { getServer: async () => ({}), getJob: async (id: string) => jobs.get(id) ?? null, createJob: async (row: IssueRecordInput) => { if (jobs.has(row.id)) return false; jobs.set(row.id, row); return true }, queue: (id: string) => { queued.push(id) } } }
|
|
}
|
|
test("lost acknowledgment retry returns same job without duplicate create or queue", async () => {
|
|
const repo = repository()
|
|
const first = await acceptCertificateIssueRequest(request, repo.deps)
|
|
const second = await acceptCertificateIssueRequest(request, repo.deps)
|
|
assert.deepEqual(first, second); assert.equal(repo.jobs.size, 1); assert.deepEqual(repo.queued, [request.requestId])
|
|
})
|
|
test("concurrent matching requests produce one job and one queue dispatch", async () => {
|
|
const repo = repository(); const results = await Promise.all([acceptCertificateIssueRequest(request, repo.deps), acceptCertificateIssueRequest(request, repo.deps)])
|
|
assert.deepEqual(results[0], results[1]); assert.equal(repo.jobs.size, 1); assert.equal(repo.queued.length, 1)
|
|
})
|
|
test("request ID collision with different target is conflict, never new operation", async () => {
|
|
const repo = repository(); await acceptCertificateIssueRequest(request, repo.deps)
|
|
for (const patch of [{ serverId: "2" }, { certName: "other" }, { domainNames: ["other.example"] }, { keyType: "ec256" as const }, { trustStore: ["api"] as const }]) {
|
|
await assert.rejects(() => acceptCertificateIssueRequest({ ...request, ...patch, ...(patch.trustStore ? { trustStore: [...patch.trustStore] } : {}) }, repo.deps), error => error instanceof IssueRequestError && error.status === 409)
|
|
}
|
|
assert.equal(repo.jobs.size, 1); assert.equal(repo.queued.length, 1)
|
|
})
|
|
test("missing server is rejected; legacy requests without requestId remain independent", async () => {
|
|
const repo = repository(); await assert.rejects(() => acceptCertificateIssueRequest(request, { ...repo.deps, getServer: async () => null }), error => error instanceof IssueRequestError && error.status === 404)
|
|
assert.equal(repo.jobs.size, 0)
|
|
const { requestId: unused, ...legacy } = request; void unused
|
|
const first = await acceptCertificateIssueRequest(legacy, repo.deps), second = await acceptCertificateIssueRequest(legacy, repo.deps)
|
|
assert.notEqual(first.jobId, second.jobId); assert.equal(repo.jobs.size, 2)
|
|
})
|