Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
172 changes: 171 additions & 1 deletion apps/api/src/server.integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3843,7 +3843,7 @@ describe("@runroot/api integration", () => {
}
});

it("serves acknowledge, list-acknowledged, inspect-acknowledgment, clear-acknowledgment, and apply paths through the network API", async () => {
it("serves acknowledgment and sign-off list, inspect, clear, and apply paths through the network API", async () => {
const workspaceRoot = await mkdtemp(
join(tmpdir(), "runroot-api-checklist-acknowledgment-"),
);
Expand Down Expand Up @@ -4158,21 +4158,58 @@ describe("@runroot/api integration", () => {
method: "POST",
},
);
const signoffResponse = await fetch(
`${ownerAddress}/audit/catalog/${publishedPayload.catalogEntry.entry.id}/sign-off`,
{
body: JSON.stringify({
signoffNote: "Backup signed off the acknowledged follow-up",
items: [
{
item: "Validate queued follow-up",
state: "signed-off",
},
{
item: "Close backup handoff",
state: "unsigned",
},
],
}),
headers: {
"content-type": "application/json",
},
method: "POST",
},
);
const acknowledgedResponse = await fetch(
`${peerAddress}/audit/catalog/acknowledged`,
);
const signedOffResponse = await fetch(
`${peerAddress}/audit/catalog/signed-off`,
);
const inspectResponse = await fetch(
`${peerAddress}/audit/catalog/${publishedPayload.catalogEntry.entry.id}/acknowledgment`,
);
const inspectSignoffResponse = await fetch(
`${peerAddress}/audit/catalog/${publishedPayload.catalogEntry.entry.id}/sign-off`,
);
const applyResponse = await fetch(
`${peerAddress}/audit/catalog/${publishedPayload.catalogEntry.entry.id}/apply`,
);
const clearSignoffResponse = await fetch(
`${ownerAddress}/audit/catalog/${publishedPayload.catalogEntry.entry.id}/sign-off/clear`,
{
method: "POST",
},
);
const clearResponse = await fetch(
`${ownerAddress}/audit/catalog/${publishedPayload.catalogEntry.entry.id}/acknowledgment/clear`,
{
method: "POST",
},
);
const signedOffAfterClearResponse = await fetch(
`${peerAddress}/audit/catalog/signed-off`,
);
const acknowledgedAfterClearResponse = await fetch(
`${peerAddress}/audit/catalog/acknowledged`,
);
Expand Down Expand Up @@ -4202,6 +4239,27 @@ describe("@runroot/api integration", () => {
};
};
};
const signoffPayload = (await signoffResponse.json()) as {
signoff: {
acknowledgment: {
acknowledgment: {
acknowledgmentNote?: string;
};
attestation: {
attestation: {
attestationNote?: string;
};
};
};
signoff: {
signoffNote?: string;
items: Array<{
item: string;
state: "signed-off" | "unsigned";
}>;
};
};
};
const acknowledgedPayload = (await acknowledgedResponse.json()) as {
acknowledged: {
items: Array<{
Expand Down Expand Up @@ -4237,6 +4295,43 @@ describe("@runroot/api integration", () => {
totalCount: number;
};
};
const signedOffPayload = (await signedOffResponse.json()) as {
signedOff: {
items: Array<{
acknowledgment: {
attestation: {
evidence: {
verification: {
resolution: {
blocker: {
progress: {
checklist: {
assignment: {
review: {
visibility: {
catalogEntry: {
entry: {
id: string;
};
};
};
};
};
};
};
};
};
};
};
};
};
signoff: {
signoffNote?: string;
};
}>;
totalCount: number;
};
};
const inspectPayload = (await inspectResponse.json()) as {
acknowledgment: {
acknowledgment: {
Expand All @@ -4248,6 +4343,17 @@ describe("@runroot/api integration", () => {
};
};
};
const inspectSignoffPayload = (await inspectSignoffResponse.json()) as {
signoff: {
signoff: {
signoffNote?: string;
items: Array<{
item: string;
state: "signed-off" | "unsigned";
}>;
};
};
};
const applyPayload = (await applyResponse.json()) as {
application: {
application: {
Expand All @@ -4265,13 +4371,26 @@ describe("@runroot/api integration", () => {
};
};
};
const clearSignoffPayload = (await clearSignoffResponse.json()) as {
signoff: {
signoff: {
signoffNote?: string;
};
};
};
const clearPayload = (await clearResponse.json()) as {
acknowledgment: {
acknowledgment: {
acknowledgmentNote?: string;
};
};
};
const signedOffAfterClearPayload =
(await signedOffAfterClearResponse.json()) as {
signedOff: {
totalCount: number;
};
};
const acknowledgedAfterClearPayload =
(await acknowledgedAfterClearResponse.json()) as {
acknowledged: {
Expand All @@ -4292,6 +4411,7 @@ describe("@runroot/api integration", () => {
expect(evidenceResponse.status).toBe(200);
expect(attestationResponse.status).toBe(200);
expect(acknowledgmentResponse.status).toBe(200);
expect(signoffResponse.status).toBe(200);
expect(
acknowledgmentPayload.acknowledgment.attestation.evidence.verification
.verification.verificationNote,
Expand Down Expand Up @@ -4319,17 +4439,61 @@ describe("@runroot/api integration", () => {
},
],
);
expect(
signoffPayload.signoff.acknowledgment.acknowledgment.acknowledgmentNote,
).toBe("Backup acknowledged the attested follow-up");
expect(
signoffPayload.signoff.acknowledgment.attestation.attestation
.attestationNote,
).toBe("Backup attested the stable follow-up evidence");
expect(signoffPayload.signoff.signoff.signoffNote).toBe(
"Backup signed off the acknowledged follow-up",
);
expect(signoffPayload.signoff.signoff.items).toEqual([
{
item: "Validate queued follow-up",
state: "signed-off",
},
{
item: "Close backup handoff",
state: "unsigned",
},
]);
expect(acknowledgedResponse.status).toBe(200);
expect(acknowledgedPayload.acknowledged.totalCount).toBe(1);
expect(
acknowledgedPayload.acknowledged.items[0]?.attestation.evidence
.verification.resolution.blocker.progress.checklist.assignment.review
.visibility.catalogEntry.entry.id,
).toBe("catalog_entry_acknowledgment_api");
expect(signedOffResponse.status).toBe(200);
expect(signedOffPayload.signedOff.totalCount).toBe(1);
expect(
signedOffPayload.signedOff.items[0]?.acknowledgment.attestation.evidence
.verification.resolution.blocker.progress.checklist.assignment.review
.visibility.catalogEntry.entry.id,
).toBe("catalog_entry_acknowledgment_api");
expect(signedOffPayload.signedOff.items[0]?.signoff.signoffNote).toBe(
"Backup signed off the acknowledged follow-up",
);
expect(inspectResponse.status).toBe(200);
expect(
inspectPayload.acknowledgment.acknowledgment.acknowledgmentNote,
).toBe("Backup acknowledged the attested follow-up");
expect(inspectSignoffResponse.status).toBe(200);
expect(inspectSignoffPayload.signoff.signoff.signoffNote).toBe(
"Backup signed off the acknowledged follow-up",
);
expect(inspectSignoffPayload.signoff.signoff.items).toEqual([
{
item: "Validate queued follow-up",
state: "signed-off",
},
{
item: "Close backup handoff",
state: "unsigned",
},
]);
expect(applyResponse.status).toBe(200);
expect(applyPayload.application.application.savedView.id).toBe(
"saved_view_acknowledgment_api",
Expand All @@ -4338,10 +4502,16 @@ describe("@runroot/api integration", () => {
applyPayload.application.application.navigation.drilldowns[0]?.result
.runId,
).toBe(queuedRun.id);
expect(clearSignoffResponse.status).toBe(200);
expect(clearSignoffPayload.signoff.signoff.signoffNote).toBe(
"Backup signed off the acknowledged follow-up",
);
expect(clearResponse.status).toBe(200);
expect(
clearPayload.acknowledgment.acknowledgment.acknowledgmentNote,
).toBe("Backup acknowledged the attested follow-up");
expect(signedOffAfterClearResponse.status).toBe(200);
expect(signedOffAfterClearPayload.signedOff.totalCount).toBe(0);
expect(acknowledgedAfterClearResponse.status).toBe(200);
expect(acknowledgedAfterClearPayload.acknowledged.totalCount).toBe(0);
} finally {
Expand Down
2 changes: 1 addition & 1 deletion apps/api/src/server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ describe("@runroot/api", () => {
expect(response.json()).toEqual({
status: "ok",
project: "Runroot",
phase: 27,
phase: 28,
});
});

Expand Down
Loading
Loading