import { describe, expect, it } from "vitest" ;
import {
buildApprovalPendingReplyPayload,
buildApprovalResolvedReplyPayload,
buildPluginApprovalPendingReplyPayload,
buildPluginApprovalResolvedReplyPayload,
} from "./approval-renderers.js" ;
describe("plugin-sdk/approval-renderers" , () => {
it.each([
{
name: "builds shared approval payloads with generic interactive commands" ,
payload: buildApprovalPendingReplyPayload({
approvalId: "plugin:approval-123" ,
approvalSlug: "plugin:a" ,
text: "Approval required @everyone" ,
}),
textExpected: (text: string) => expect(text).toContain("@everyone" ),
interactiveExpected: {
blocks: [
{
type: "buttons" ,
buttons: [
{
label: "Allow Once" ,
value: "/approve plugin:approval-123 allow-once" ,
style: "success" ,
},
{
label: "Allow Always" ,
value: "/approve plugin:approval-123 allow-always" ,
style: "primary" ,
},
{
label: "Deny" ,
value: "/approve plugin:approval-123 deny" ,
style: "danger" ,
},
],
},
],
},
channelDataExpected: undefined,
},
{
name: "builds plugin pending payloads with approval metadata and extra channel data" ,
payload: buildPluginApprovalPendingReplyPayload({
request: {
id: "plugin-approval-123" ,
request: {
title: "Sensitive action" ,
description: "Needs approval" ,
},
createdAtMs: 1 _000 ,
expiresAtMs: 61 _000 ,
},
nowMs: 1 _000 ,
approvalSlug: "custom-slug" ,
channelData: {
telegram: {
quoteText: "quoted" ,
},
},
}),
textExpected: (text: string) => expect(text).toContain("Plugin approval required" ),
interactiveExpected: {
blocks: [
{
type: "buttons" ,
buttons: [
{
label: "Allow Once" ,
value: "/approve plugin-approval-123 allow-once" ,
style: "success" ,
},
{
label: "Allow Always" ,
value: "/approve plugin-approval-123 allow-always" ,
style: "primary" ,
},
{
label: "Deny" ,
value: "/approve plugin-approval-123 deny" ,
style: "danger" ,
},
],
},
],
},
channelDataExpected: {
execApproval: {
agentId: undefined,
approvalId: "plugin-approval-123" ,
approvalKind: "plugin" ,
approvalSlug: "custom-slug" ,
allowedDecisions: ["allow-once" , "allow-always" , "deny" ],
sessionKey: undefined,
state: "pending" ,
},
telegram: {
quoteText: "quoted" ,
},
},
},
{
name: "builds generic resolved payloads with approval metadata" ,
payload: buildApprovalResolvedReplyPayload({
approvalId: "req-123" ,
approvalSlug: "req-123" ,
text: "resolved @everyone" ,
}),
textExpected: (text: string) => expect(text).toBe("resolved @everyone" ),
interactiveExpected: undefined,
channelDataExpected: {
execApproval: {
approvalId: "req-123" ,
approvalSlug: "req-123" ,
state: "resolved" ,
},
},
},
{
name: "builds plugin resolved payloads with optional channel data" ,
payload: buildPluginApprovalResolvedReplyPayload({
resolved: {
id: "plugin-approval-123" ,
decision: "allow-once" ,
resolvedBy: "discord:user:1" ,
ts: 2 _000 ,
},
channelData: {
discord: {
components: [{ type: "container" }],
},
},
}),
textExpected: (text: string) => expect(text).toContain("Plugin approval allowed once" ),
interactiveExpected: undefined,
channelDataExpected: {
execApproval: {
approvalId: "plugin-approval-123" ,
approvalSlug: "plugin-a" ,
state: "resolved" ,
},
discord: {
components: [{ type: "container" }],
},
},
},
])("$name" , ({ payload, textExpected, interactiveExpected, channelDataExpected }) => {
expect(payload.text).toBeDefined();
if (payload.text !== undefined) {
textExpected(payload.text);
}
if (interactiveExpected) {
expect(payload.interactive).toEqual(interactiveExpected);
}
if (channelDataExpected) {
expect(payload.channelData).toEqual(channelDataExpected);
}
});
});
Messung V0.5 in Prozent C=98 H=98 G=97
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland