@frihet/mcp-server 1.16.2 → 1.16.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/openai-profile.js +1 -1
- package/package.json +7 -4
- package/scripts/postinstall.js +30 -8
- package/dist/__tests__/audit-server-version.test.d.ts +0 -13
- package/dist/__tests__/audit-server-version.test.d.ts.map +0 -1
- package/dist/__tests__/audit-server-version.test.js +0 -96
- package/dist/__tests__/audit-server-version.test.js.map +0 -1
- package/dist/__tests__/banking-client-contract.test.d.ts +0 -20
- package/dist/__tests__/banking-client-contract.test.d.ts.map +0 -1
- package/dist/__tests__/banking-client-contract.test.js +0 -133
- package/dist/__tests__/banking-client-contract.test.js.map +0 -1
- package/dist/__tests__/banking-tools.test.d.ts +0 -18
- package/dist/__tests__/banking-tools.test.d.ts.map +0 -1
- package/dist/__tests__/banking-tools.test.js +0 -252
- package/dist/__tests__/banking-tools.test.js.map +0 -1
- package/dist/__tests__/contract.test.d.ts +0 -33
- package/dist/__tests__/contract.test.d.ts.map +0 -1
- package/dist/__tests__/contract.test.js +0 -208
- package/dist/__tests__/contract.test.js.map +0 -1
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts +0 -13
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts.map +0 -1
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js +0 -420
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js.map +0 -1
- package/dist/__tests__/demo-mode.test.d.ts +0 -11
- package/dist/__tests__/demo-mode.test.d.ts.map +0 -1
- package/dist/__tests__/demo-mode.test.js +0 -119
- package/dist/__tests__/demo-mode.test.js.map +0 -1
- package/dist/__tests__/einvoice-day4-tools.test.d.ts +0 -16
- package/dist/__tests__/einvoice-day4-tools.test.d.ts.map +0 -1
- package/dist/__tests__/einvoice-day4-tools.test.js +0 -421
- package/dist/__tests__/einvoice-day4-tools.test.js.map +0 -1
- package/dist/__tests__/einvoice-integration.test.d.ts +0 -24
- package/dist/__tests__/einvoice-integration.test.d.ts.map +0 -1
- package/dist/__tests__/einvoice-integration.test.js +0 -142
- package/dist/__tests__/einvoice-integration.test.js.map +0 -1
- package/dist/__tests__/einvoice-tools.test.d.ts +0 -16
- package/dist/__tests__/einvoice-tools.test.d.ts.map +0 -1
- package/dist/__tests__/einvoice-tools.test.js +0 -411
- package/dist/__tests__/einvoice-tools.test.js.map +0 -1
- package/dist/__tests__/fiscal-tools.test.d.ts +0 -21
- package/dist/__tests__/fiscal-tools.test.d.ts.map +0 -1
- package/dist/__tests__/fiscal-tools.test.js +0 -271
- package/dist/__tests__/fiscal-tools.test.js.map +0 -1
- package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts +0 -27
- package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts.map +0 -1
- package/dist/__tests__/get-envelope-unwrap-regression.test.js +0 -223
- package/dist/__tests__/get-envelope-unwrap-regression.test.js.map +0 -1
- package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts +0 -14
- package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts.map +0 -1
- package/dist/__tests__/intelligence-duplicate-invoice.test.js +0 -108
- package/dist/__tests__/intelligence-duplicate-invoice.test.js.map +0 -1
- package/dist/__tests__/kitchen-tools.test.d.ts +0 -18
- package/dist/__tests__/kitchen-tools.test.d.ts.map +0 -1
- package/dist/__tests__/kitchen-tools.test.js +0 -399
- package/dist/__tests__/kitchen-tools.test.js.map +0 -1
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts +0 -30
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts.map +0 -1
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js +0 -164
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js.map +0 -1
- package/dist/__tests__/observability-redaction.test.d.ts +0 -13
- package/dist/__tests__/observability-redaction.test.d.ts.map +0 -1
- package/dist/__tests__/observability-redaction.test.js +0 -94
- package/dist/__tests__/observability-redaction.test.js.map +0 -1
- package/dist/__tests__/openai-grouped-compose.test.d.ts +0 -26
- package/dist/__tests__/openai-grouped-compose.test.d.ts.map +0 -1
- package/dist/__tests__/openai-grouped-compose.test.js +0 -245
- package/dist/__tests__/openai-grouped-compose.test.js.map +0 -1
- package/dist/__tests__/openai-profile.test.d.ts +0 -10
- package/dist/__tests__/openai-profile.test.d.ts.map +0 -1
- package/dist/__tests__/openai-profile.test.js +0 -168
- package/dist/__tests__/openai-profile.test.js.map +0 -1
- package/dist/__tests__/pagination-cursor-param.test.d.ts +0 -27
- package/dist/__tests__/pagination-cursor-param.test.d.ts.map +0 -1
- package/dist/__tests__/pagination-cursor-param.test.js +0 -96
- package/dist/__tests__/pagination-cursor-param.test.js.map +0 -1
- package/dist/__tests__/pos-tools.test.d.ts +0 -16
- package/dist/__tests__/pos-tools.test.d.ts.map +0 -1
- package/dist/__tests__/pos-tools.test.js +0 -244
- package/dist/__tests__/pos-tools.test.js.map +0 -1
- package/dist/__tests__/recurring-tools.test.d.ts +0 -23
- package/dist/__tests__/recurring-tools.test.d.ts.map +0 -1
- package/dist/__tests__/recurring-tools.test.js +0 -352
- package/dist/__tests__/recurring-tools.test.js.map +0 -1
- package/dist/__tests__/schema-envelope-guard.test.d.ts +0 -18
- package/dist/__tests__/schema-envelope-guard.test.d.ts.map +0 -1
- package/dist/__tests__/schema-envelope-guard.test.js +0 -56
- package/dist/__tests__/schema-envelope-guard.test.js.map +0 -1
- package/dist/__tests__/stay-tools.test.d.ts +0 -17
- package/dist/__tests__/stay-tools.test.d.ts.map +0 -1
- package/dist/__tests__/stay-tools.test.js +0 -259
- package/dist/__tests__/stay-tools.test.js.map +0 -1
- package/dist/__tests__/team-tools.test.d.ts +0 -18
- package/dist/__tests__/team-tools.test.d.ts.map +0 -1
- package/dist/__tests__/team-tools.test.js +0 -228
- package/dist/__tests__/team-tools.test.js.map +0 -1
- package/dist/__tests__/time-tools.test.d.ts +0 -19
- package/dist/__tests__/time-tools.test.d.ts.map +0 -1
- package/dist/__tests__/time-tools.test.js +0 -286
- package/dist/__tests__/time-tools.test.js.map +0 -1
- package/dist/__tests__/tool-exposure.test.d.ts +0 -11
- package/dist/__tests__/tool-exposure.test.d.ts.map +0 -1
- package/dist/__tests__/tool-exposure.test.js +0 -264
- package/dist/__tests__/tool-exposure.test.js.map +0 -1
- package/dist/client-interface.d.ts.map +0 -1
- package/dist/client-interface.js.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/demo-client.d.ts.map +0 -1
- package/dist/demo-client.js.map +0 -1
- package/dist/demo-fixtures.d.ts.map +0 -1
- package/dist/demo-fixtures.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/metrics.d.ts.map +0 -1
- package/dist/metrics.js.map +0 -1
- package/dist/observability.d.ts.map +0 -1
- package/dist/observability.js.map +0 -1
- package/dist/openai-profile.d.ts.map +0 -1
- package/dist/openai-profile.js.map +0 -1
- package/dist/prompts/register-all.d.ts.map +0 -1
- package/dist/prompts/register-all.js.map +0 -1
- package/dist/redaction.d.ts.map +0 -1
- package/dist/redaction.js.map +0 -1
- package/dist/resources/register-all.d.ts.map +0 -1
- package/dist/resources/register-all.js.map +0 -1
- package/dist/tool-exposure.d.ts.map +0 -1
- package/dist/tool-exposure.js.map +0 -1
- package/dist/tools/accountingClose.d.ts.map +0 -1
- package/dist/tools/accountingClose.js.map +0 -1
- package/dist/tools/audit_gl.d.ts.map +0 -1
- package/dist/tools/audit_gl.js.map +0 -1
- package/dist/tools/backend-availability.d.ts.map +0 -1
- package/dist/tools/backend-availability.js.map +0 -1
- package/dist/tools/bank_rules.d.ts.map +0 -1
- package/dist/tools/bank_rules.js.map +0 -1
- package/dist/tools/banking.d.ts.map +0 -1
- package/dist/tools/banking.js.map +0 -1
- package/dist/tools/clients.d.ts.map +0 -1
- package/dist/tools/clients.js.map +0 -1
- package/dist/tools/crm.d.ts.map +0 -1
- package/dist/tools/crm.js.map +0 -1
- package/dist/tools/deposits.d.ts.map +0 -1
- package/dist/tools/deposits.js.map +0 -1
- package/dist/tools/einvoice.d.ts.map +0 -1
- package/dist/tools/einvoice.js.map +0 -1
- package/dist/tools/expenses.d.ts.map +0 -1
- package/dist/tools/expenses.js.map +0 -1
- package/dist/tools/fiscal.d.ts.map +0 -1
- package/dist/tools/fiscal.js.map +0 -1
- package/dist/tools/gestoria.d.ts.map +0 -1
- package/dist/tools/gestoria.js.map +0 -1
- package/dist/tools/hr.d.ts.map +0 -1
- package/dist/tools/hr.js.map +0 -1
- package/dist/tools/igic.d.ts.map +0 -1
- package/dist/tools/igic.js.map +0 -1
- package/dist/tools/impuesto_sociedades.d.ts.map +0 -1
- package/dist/tools/impuesto_sociedades.js.map +0 -1
- package/dist/tools/intelligence.d.ts.map +0 -1
- package/dist/tools/intelligence.js.map +0 -1
- package/dist/tools/invoices.d.ts.map +0 -1
- package/dist/tools/invoices.js.map +0 -1
- package/dist/tools/kitchen.d.ts.map +0 -1
- package/dist/tools/kitchen.js.map +0 -1
- package/dist/tools/onboard_vies.d.ts.map +0 -1
- package/dist/tools/onboard_vies.js.map +0 -1
- package/dist/tools/onboarding.d.ts.map +0 -1
- package/dist/tools/onboarding.js.map +0 -1
- package/dist/tools/payroll.d.ts.map +0 -1
- package/dist/tools/payroll.js.map +0 -1
- package/dist/tools/permissions.d.ts.map +0 -1
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/portal_domain.d.ts.map +0 -1
- package/dist/tools/portal_domain.js.map +0 -1
- package/dist/tools/pos.d.ts.map +0 -1
- package/dist/tools/pos.js.map +0 -1
- package/dist/tools/products.d.ts.map +0 -1
- package/dist/tools/products.js.map +0 -1
- package/dist/tools/quotes.d.ts.map +0 -1
- package/dist/tools/quotes.js.map +0 -1
- package/dist/tools/recurring.d.ts.map +0 -1
- package/dist/tools/recurring.js.map +0 -1
- package/dist/tools/register-all.d.ts.map +0 -1
- package/dist/tools/register-all.js.map +0 -1
- package/dist/tools/shared.d.ts.map +0 -1
- package/dist/tools/shared.js.map +0 -1
- package/dist/tools/stay.d.ts.map +0 -1
- package/dist/tools/stay.js.map +0 -1
- package/dist/tools/team.d.ts.map +0 -1
- package/dist/tools/team.js.map +0 -1
- package/dist/tools/time.d.ts.map +0 -1
- package/dist/tools/time.js.map +0 -1
- package/dist/tools/vendors.d.ts.map +0 -1
- package/dist/tools/vendors.js.map +0 -1
- package/dist/tools/webhooks.d.ts.map +0 -1
- package/dist/tools/webhooks.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/scripts/audit-mcp-refs.mjs +0 -402
- package/scripts/no-public-leak.sh +0 -60
- package/scripts/test-openai-grouped-compose.mjs +0 -173
|
@@ -1,420 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for D4-B megasprint MCP tools — HR + Webhook test + Payroll + Onboarding + Permissions + Period close (20 tools).
|
|
3
|
-
*
|
|
4
|
-
* Uses Node.js built-in test runner (node:test + node:assert). Run: npm test (after build).
|
|
5
|
-
*
|
|
6
|
-
* Coverage:
|
|
7
|
-
* - Tool registration counts per module
|
|
8
|
-
* - Happy path for every tool (mock client returns fixture)
|
|
9
|
-
* - Error path: 404 propagated as isError=true
|
|
10
|
-
* - Trust-area gates: confirm=false for period_close / period_reopen returns isError
|
|
11
|
-
*/
|
|
12
|
-
import { test, describe, beforeEach } from "node:test";
|
|
13
|
-
import assert from "node:assert/strict";
|
|
14
|
-
class StubMcpServer {
|
|
15
|
-
tools = new Map();
|
|
16
|
-
registerTool(name, config, handler) {
|
|
17
|
-
this.tools.set(name, { name, config, handler });
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
// ── Mock fixtures ────────────────────────────────────────────────────────────
|
|
21
|
-
const MOCK_LEAVE = {
|
|
22
|
-
id: "leave_001",
|
|
23
|
-
employeeId: "emp_001",
|
|
24
|
-
type: "vacation",
|
|
25
|
-
startDate: "2026-06-01",
|
|
26
|
-
endDate: "2026-06-15",
|
|
27
|
-
durationDays: 15,
|
|
28
|
-
status: "pending",
|
|
29
|
-
reason: "Summer break",
|
|
30
|
-
createdAt: "2026-05-16T08:00:00Z",
|
|
31
|
-
};
|
|
32
|
-
const MOCK_LEAVES_LIST = { data: [MOCK_LEAVE], total: 1, limit: 20, offset: 0 };
|
|
33
|
-
const MOCK_ATTENDANCE = {
|
|
34
|
-
id: "att_001",
|
|
35
|
-
employeeId: "emp_001",
|
|
36
|
-
clockInAt: "2026-05-16T09:00:00Z",
|
|
37
|
-
status: "open",
|
|
38
|
-
};
|
|
39
|
-
const MOCK_OVERTIME = {
|
|
40
|
-
period: "2026-05",
|
|
41
|
-
totalRegularHours: 160,
|
|
42
|
-
totalOvertimeHours: 12,
|
|
43
|
-
estimatedCostEur: 480,
|
|
44
|
-
byEmployee: [],
|
|
45
|
-
};
|
|
46
|
-
const MOCK_ANOMALY = {
|
|
47
|
-
id: "anom_001",
|
|
48
|
-
type: "overtime_spike",
|
|
49
|
-
severity: "medium",
|
|
50
|
-
subjectId: "emp_001",
|
|
51
|
-
detectedAt: "2026-05-16T10:00:00Z",
|
|
52
|
-
status: "open",
|
|
53
|
-
};
|
|
54
|
-
const MOCK_ANOMALIES_LIST = { data: [MOCK_ANOMALY], total: 1, limit: 20, offset: 0 };
|
|
55
|
-
const MOCK_WEBHOOK_TEST = {
|
|
56
|
-
webhookId: "wh_abc",
|
|
57
|
-
delivered: true,
|
|
58
|
-
statusCode: 200,
|
|
59
|
-
responseTimeMs: 142,
|
|
60
|
-
eventType: "webhook.test",
|
|
61
|
-
attemptedAt: "2026-05-16T10:30:00Z",
|
|
62
|
-
};
|
|
63
|
-
const MOCK_PAYROLL_EXPORT = {
|
|
64
|
-
format: "a3",
|
|
65
|
-
month: "2026-05",
|
|
66
|
-
fileUrl: "https://files.frihet.io/payroll/2026-05-a3.csv",
|
|
67
|
-
filename: "payroll-2026-05.csv",
|
|
68
|
-
rowCount: 12,
|
|
69
|
-
generatedAt: "2026-05-16T10:00:00Z",
|
|
70
|
-
};
|
|
71
|
-
const MOCK_PAYROLL_CHECKLIST = {
|
|
72
|
-
month: "2026-05",
|
|
73
|
-
totalEmployees: 12,
|
|
74
|
-
readyEmployees: 10,
|
|
75
|
-
missingEmployees: 2,
|
|
76
|
-
employees: [],
|
|
77
|
-
};
|
|
78
|
-
const MOCK_ONBOARDING_STATUS = {
|
|
79
|
-
workspaceId: "ws_001",
|
|
80
|
-
persona: "empresa",
|
|
81
|
-
completedSteps: ["create_workspace", "set_persona"],
|
|
82
|
-
pendingSteps: ["connect_bank", "invite_team"],
|
|
83
|
-
percentComplete: 50,
|
|
84
|
-
};
|
|
85
|
-
const MOCK_ONBOARDING_PERSONA_RESULT = {
|
|
86
|
-
workspaceId: "ws_001",
|
|
87
|
-
persona: "gestoria",
|
|
88
|
-
updatedAt: "2026-05-16T10:00:00Z",
|
|
89
|
-
};
|
|
90
|
-
const MOCK_PERMISSIONS_MATRIX = {
|
|
91
|
-
roles: [{ role: "admin", permissions: ["invoices.*", "expenses.*"] }],
|
|
92
|
-
resources: ["invoices", "expenses"],
|
|
93
|
-
};
|
|
94
|
-
const MOCK_PERMISSIONS_ME = {
|
|
95
|
-
userId: "user_001",
|
|
96
|
-
role: "admin",
|
|
97
|
-
permissions: ["invoices.read", "invoices.write"],
|
|
98
|
-
workspaceId: "ws_001",
|
|
99
|
-
};
|
|
100
|
-
const MOCK_PERIOD = {
|
|
101
|
-
id: "period_2026_q2",
|
|
102
|
-
type: "quarterly",
|
|
103
|
-
status: "open",
|
|
104
|
-
startDate: "2026-04-01",
|
|
105
|
-
endDate: "2026-06-30",
|
|
106
|
-
};
|
|
107
|
-
const MOCK_PERIOD_CLOSED = { ...MOCK_PERIOD, status: "closed", closedAt: "2026-05-16T10:00:00Z" };
|
|
108
|
-
// ── Client stubs ─────────────────────────────────────────────────────────────
|
|
109
|
-
function makeSuccessClient() {
|
|
110
|
-
return {
|
|
111
|
-
// HR
|
|
112
|
-
listLeaves: async () => MOCK_LEAVES_LIST,
|
|
113
|
-
createLeaveRequest: async (d) => ({ ...MOCK_LEAVE, ...d }),
|
|
114
|
-
approveLeave: async (id) => ({ ...MOCK_LEAVE, id, status: "approved" }),
|
|
115
|
-
rejectLeave: async (id, d) => ({ ...MOCK_LEAVE, id, status: "rejected", decisionReason: d["reason"] }),
|
|
116
|
-
cancelLeave: async (id) => ({ ...MOCK_LEAVE, id, status: "cancelled" }),
|
|
117
|
-
attendanceClockIn: async (d) => ({ ...MOCK_ATTENDANCE, ...d }),
|
|
118
|
-
attendanceClockOut: async (id) => ({ ...MOCK_ATTENDANCE, id, clockOutAt: "2026-05-16T17:00:00Z", status: "closed", durationMinutes: 480 }),
|
|
119
|
-
getOvertimeReport: async () => MOCK_OVERTIME,
|
|
120
|
-
listAnomalies: async () => MOCK_ANOMALIES_LIST,
|
|
121
|
-
// Webhook test (existing webhooks methods need stubs too for registerWebhookTools to call them)
|
|
122
|
-
listWebhooks: async () => ({ data: [], total: 0, limit: 20, offset: 0 }),
|
|
123
|
-
getWebhook: async () => ({ id: "wh_abc" }),
|
|
124
|
-
createWebhook: async (d) => ({ id: "wh_new", ...d }),
|
|
125
|
-
updateWebhook: async (id, d) => ({ id, ...d }),
|
|
126
|
-
deleteWebhook: async () => undefined,
|
|
127
|
-
testWebhook: async () => MOCK_WEBHOOK_TEST,
|
|
128
|
-
// Payroll
|
|
129
|
-
exportPayroll: async () => MOCK_PAYROLL_EXPORT,
|
|
130
|
-
getPayrollChecklist: async () => MOCK_PAYROLL_CHECKLIST,
|
|
131
|
-
// Onboarding
|
|
132
|
-
getOnboardingStatus: async () => MOCK_ONBOARDING_STATUS,
|
|
133
|
-
setOnboardingPersona: async (d) => ({ ...MOCK_ONBOARDING_PERSONA_RESULT, persona: d["persona"] }),
|
|
134
|
-
// Permissions
|
|
135
|
-
getPermissionsMatrix: async () => MOCK_PERMISSIONS_MATRIX,
|
|
136
|
-
getMyPermissions: async () => MOCK_PERMISSIONS_ME,
|
|
137
|
-
// Period close
|
|
138
|
-
getCurrentPeriod: async () => MOCK_PERIOD,
|
|
139
|
-
closePeriod: async () => MOCK_PERIOD_CLOSED,
|
|
140
|
-
reopenPeriod: async (d) => ({ ...MOCK_PERIOD, status: "reopened", reopenReason: d["reason"] }),
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
function make404Client() {
|
|
144
|
-
const notFound = () => {
|
|
145
|
-
const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
|
|
146
|
-
return Promise.reject(err);
|
|
147
|
-
};
|
|
148
|
-
return new Proxy({}, { get: () => notFound });
|
|
149
|
-
}
|
|
150
|
-
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
151
|
-
async function makeHrServer(clientFn) {
|
|
152
|
-
const server = new StubMcpServer();
|
|
153
|
-
const { registerHrTools } = await import("../tools/hr.js");
|
|
154
|
-
registerHrTools(server, clientFn());
|
|
155
|
-
return server;
|
|
156
|
-
}
|
|
157
|
-
async function makeWebhookServer(clientFn) {
|
|
158
|
-
const server = new StubMcpServer();
|
|
159
|
-
const { registerWebhookTools } = await import("../tools/webhooks.js");
|
|
160
|
-
registerWebhookTools(server, clientFn());
|
|
161
|
-
return server;
|
|
162
|
-
}
|
|
163
|
-
async function makePayrollServer(clientFn) {
|
|
164
|
-
const server = new StubMcpServer();
|
|
165
|
-
const { registerPayrollTools } = await import("../tools/payroll.js");
|
|
166
|
-
registerPayrollTools(server, clientFn());
|
|
167
|
-
return server;
|
|
168
|
-
}
|
|
169
|
-
async function makeOnboardingServer(clientFn) {
|
|
170
|
-
const server = new StubMcpServer();
|
|
171
|
-
const { registerOnboardingTools } = await import("../tools/onboarding.js");
|
|
172
|
-
registerOnboardingTools(server, clientFn());
|
|
173
|
-
return server;
|
|
174
|
-
}
|
|
175
|
-
async function makePermissionsServer(clientFn) {
|
|
176
|
-
const server = new StubMcpServer();
|
|
177
|
-
const { registerPermissionsTools } = await import("../tools/permissions.js");
|
|
178
|
-
registerPermissionsTools(server, clientFn());
|
|
179
|
-
return server;
|
|
180
|
-
}
|
|
181
|
-
async function makeAccountingCloseServer(clientFn) {
|
|
182
|
-
const server = new StubMcpServer();
|
|
183
|
-
const { registerAccountingCloseTools } = await import("../tools/accountingClose.js");
|
|
184
|
-
registerAccountingCloseTools(server, clientFn());
|
|
185
|
-
return server;
|
|
186
|
-
}
|
|
187
|
-
// ── Registration tests ───────────────────────────────────────────────────────
|
|
188
|
-
describe("D4-B Registration counts", () => {
|
|
189
|
-
test("HR tools — 9 registered", async () => {
|
|
190
|
-
const s = await makeHrServer(makeSuccessClient);
|
|
191
|
-
assert.equal(s.tools.size, 9);
|
|
192
|
-
for (const name of [
|
|
193
|
-
"leave_request_create",
|
|
194
|
-
"leave_approve",
|
|
195
|
-
"leave_reject",
|
|
196
|
-
"leave_cancel",
|
|
197
|
-
"leave_list",
|
|
198
|
-
"attendance_clock_in",
|
|
199
|
-
"attendance_clock_out",
|
|
200
|
-
"overtime_report",
|
|
201
|
-
"anomaly_list",
|
|
202
|
-
]) {
|
|
203
|
-
assert.ok(s.tools.has(name), `missing tool ${name}`);
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
test("Webhook tools — 6 registered (5 existing + 1 test_webhook)", async () => {
|
|
207
|
-
const s = await makeWebhookServer(makeSuccessClient);
|
|
208
|
-
assert.equal(s.tools.size, 6);
|
|
209
|
-
assert.ok(s.tools.has("test_webhook"));
|
|
210
|
-
});
|
|
211
|
-
test("Payroll tools — 2 registered", async () => {
|
|
212
|
-
const s = await makePayrollServer(makeSuccessClient);
|
|
213
|
-
assert.equal(s.tools.size, 2);
|
|
214
|
-
assert.ok(s.tools.has("payroll_export"));
|
|
215
|
-
assert.ok(s.tools.has("payroll_checklist"));
|
|
216
|
-
});
|
|
217
|
-
test("Onboarding tools — 2 registered", async () => {
|
|
218
|
-
const s = await makeOnboardingServer(makeSuccessClient);
|
|
219
|
-
assert.equal(s.tools.size, 2);
|
|
220
|
-
assert.ok(s.tools.has("onboarding_status"));
|
|
221
|
-
assert.ok(s.tools.has("onboarding_persona_set"));
|
|
222
|
-
});
|
|
223
|
-
test("Permissions tools — 2 registered", async () => {
|
|
224
|
-
const s = await makePermissionsServer(makeSuccessClient);
|
|
225
|
-
assert.equal(s.tools.size, 2);
|
|
226
|
-
assert.ok(s.tools.has("permissions_matrix"));
|
|
227
|
-
assert.ok(s.tools.has("permissions_me"));
|
|
228
|
-
});
|
|
229
|
-
test("Period close tools — 3 registered", async () => {
|
|
230
|
-
const s = await makeAccountingCloseServer(makeSuccessClient);
|
|
231
|
-
assert.equal(s.tools.size, 3);
|
|
232
|
-
assert.ok(s.tools.has("period_close_status"));
|
|
233
|
-
assert.ok(s.tools.has("period_close"));
|
|
234
|
-
assert.ok(s.tools.has("period_reopen"));
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
// ── HR happy-path tests ──────────────────────────────────────────────────────
|
|
238
|
-
describe("HR Tools — happy path", () => {
|
|
239
|
-
let server;
|
|
240
|
-
beforeEach(async () => { server = await makeHrServer(makeSuccessClient); });
|
|
241
|
-
test("leave_request_create returns pending leave", async () => {
|
|
242
|
-
const r = await server.tools.get("leave_request_create").handler({
|
|
243
|
-
employeeId: "emp_001", type: "vacation", startDate: "2026-06-01", endDate: "2026-06-15",
|
|
244
|
-
});
|
|
245
|
-
assert.ok(!r.isError);
|
|
246
|
-
assert.equal(r.structuredContent["status"], "pending");
|
|
247
|
-
assert.equal(r.structuredContent["employeeId"], "emp_001");
|
|
248
|
-
});
|
|
249
|
-
test("leave_approve sets status approved", async () => {
|
|
250
|
-
const r = await server.tools.get("leave_approve").handler({ leaveId: "leave_001" });
|
|
251
|
-
assert.ok(!r.isError);
|
|
252
|
-
assert.equal(r.structuredContent["status"], "approved");
|
|
253
|
-
});
|
|
254
|
-
test("leave_reject requires reason and sets rejected", async () => {
|
|
255
|
-
const r = await server.tools.get("leave_reject").handler({ leaveId: "leave_001", reason: "Coverage conflict" });
|
|
256
|
-
assert.ok(!r.isError);
|
|
257
|
-
assert.equal(r.structuredContent["status"], "rejected");
|
|
258
|
-
assert.equal(r.structuredContent["decisionReason"], "Coverage conflict");
|
|
259
|
-
});
|
|
260
|
-
test("leave_cancel sets status cancelled", async () => {
|
|
261
|
-
const r = await server.tools.get("leave_cancel").handler({ leaveId: "leave_001" });
|
|
262
|
-
assert.ok(!r.isError);
|
|
263
|
-
assert.equal(r.structuredContent["status"], "cancelled");
|
|
264
|
-
});
|
|
265
|
-
test("leave_list returns paginated leaves", async () => {
|
|
266
|
-
const r = await server.tools.get("leave_list").handler({ status: "pending" });
|
|
267
|
-
assert.ok(!r.isError);
|
|
268
|
-
assert.equal(r.structuredContent["data"].length, 1);
|
|
269
|
-
assert.equal(r.structuredContent["total"], 1);
|
|
270
|
-
});
|
|
271
|
-
test("attendance_clock_in returns open entry", async () => {
|
|
272
|
-
const r = await server.tools.get("attendance_clock_in").handler({ employeeId: "emp_001", mood: "ok" });
|
|
273
|
-
assert.ok(!r.isError);
|
|
274
|
-
assert.equal(r.structuredContent["status"], "open");
|
|
275
|
-
});
|
|
276
|
-
test("attendance_clock_out closes entry with duration", async () => {
|
|
277
|
-
const r = await server.tools.get("attendance_clock_out").handler({ entryId: "att_001" });
|
|
278
|
-
assert.ok(!r.isError);
|
|
279
|
-
assert.equal(r.structuredContent["status"], "closed");
|
|
280
|
-
assert.equal(r.structuredContent["durationMinutes"], 480);
|
|
281
|
-
});
|
|
282
|
-
test("overtime_report returns aggregated hours", async () => {
|
|
283
|
-
const r = await server.tools.get("overtime_report").handler({ period: "2026-05" });
|
|
284
|
-
assert.ok(!r.isError);
|
|
285
|
-
assert.equal(r.structuredContent["totalOvertimeHours"], 12);
|
|
286
|
-
});
|
|
287
|
-
test("anomaly_list returns paginated anomalies", async () => {
|
|
288
|
-
const r = await server.tools.get("anomaly_list").handler({ severity: "medium" });
|
|
289
|
-
assert.ok(!r.isError);
|
|
290
|
-
assert.equal(r.structuredContent["data"].length, 1);
|
|
291
|
-
});
|
|
292
|
-
});
|
|
293
|
-
// ── Webhook test happy-path + error ──────────────────────────────────────────
|
|
294
|
-
describe("Webhook test_webhook", () => {
|
|
295
|
-
test("happy path returns delivered=true", async () => {
|
|
296
|
-
const server = await makeWebhookServer(makeSuccessClient);
|
|
297
|
-
const r = await server.tools.get("test_webhook").handler({ id: "wh_abc", eventType: "invoice.paid" });
|
|
298
|
-
assert.ok(!r.isError);
|
|
299
|
-
assert.equal(r.structuredContent["delivered"], true);
|
|
300
|
-
assert.equal(r.structuredContent["statusCode"], 200);
|
|
301
|
-
});
|
|
302
|
-
test("404 propagates as isError=true", async () => {
|
|
303
|
-
const server = await makeWebhookServer(make404Client);
|
|
304
|
-
const r = await server.tools.get("test_webhook").handler({ id: "wh_missing" });
|
|
305
|
-
assert.ok(r.isError);
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
// ── Payroll ──────────────────────────────────────────────────────────────────
|
|
309
|
-
describe("Payroll Tools", () => {
|
|
310
|
-
test("payroll_export returns CSV URL for A3 format", async () => {
|
|
311
|
-
const server = await makePayrollServer(makeSuccessClient);
|
|
312
|
-
const r = await server.tools.get("payroll_export").handler({ format: "a3", month: "2026-05" });
|
|
313
|
-
assert.ok(!r.isError);
|
|
314
|
-
assert.equal(r.structuredContent["format"], "a3");
|
|
315
|
-
assert.equal(r.structuredContent["rowCount"], 12);
|
|
316
|
-
});
|
|
317
|
-
test("payroll_checklist returns readiness counts", async () => {
|
|
318
|
-
const server = await makePayrollServer(makeSuccessClient);
|
|
319
|
-
const r = await server.tools.get("payroll_checklist").handler({ month: "2026-05" });
|
|
320
|
-
assert.ok(!r.isError);
|
|
321
|
-
assert.equal(r.structuredContent["readyEmployees"], 10);
|
|
322
|
-
assert.equal(r.structuredContent["missingEmployees"], 2);
|
|
323
|
-
});
|
|
324
|
-
test("payroll_export 404 → isError", async () => {
|
|
325
|
-
const server = await makePayrollServer(make404Client);
|
|
326
|
-
const r = await server.tools.get("payroll_export").handler({ format: "a3", month: "2026-05" });
|
|
327
|
-
assert.ok(r.isError);
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
// ── Onboarding ───────────────────────────────────────────────────────────────
|
|
331
|
-
describe("Onboarding Tools", () => {
|
|
332
|
-
test("onboarding_status returns persona + steps", async () => {
|
|
333
|
-
const server = await makeOnboardingServer(makeSuccessClient);
|
|
334
|
-
const r = await server.tools.get("onboarding_status").handler({});
|
|
335
|
-
assert.ok(!r.isError);
|
|
336
|
-
assert.equal(r.structuredContent["persona"], "empresa");
|
|
337
|
-
assert.equal(r.structuredContent["percentComplete"], 50);
|
|
338
|
-
});
|
|
339
|
-
test("onboarding_persona_set updates persona", async () => {
|
|
340
|
-
const server = await makeOnboardingServer(makeSuccessClient);
|
|
341
|
-
const r = await server.tools.get("onboarding_persona_set").handler({ persona: "gestoria" });
|
|
342
|
-
assert.ok(!r.isError);
|
|
343
|
-
assert.equal(r.structuredContent["persona"], "gestoria");
|
|
344
|
-
});
|
|
345
|
-
});
|
|
346
|
-
// ── Permissions ──────────────────────────────────────────────────────────────
|
|
347
|
-
describe("Permissions Tools", () => {
|
|
348
|
-
test("permissions_matrix returns roles + resources", async () => {
|
|
349
|
-
const server = await makePermissionsServer(makeSuccessClient);
|
|
350
|
-
const r = await server.tools.get("permissions_matrix").handler({});
|
|
351
|
-
assert.ok(!r.isError);
|
|
352
|
-
assert.ok(Array.isArray(r.structuredContent["roles"]));
|
|
353
|
-
});
|
|
354
|
-
test("permissions_me returns caller role", async () => {
|
|
355
|
-
const server = await makePermissionsServer(makeSuccessClient);
|
|
356
|
-
const r = await server.tools.get("permissions_me").handler({});
|
|
357
|
-
assert.ok(!r.isError);
|
|
358
|
-
assert.equal(r.structuredContent["role"], "admin");
|
|
359
|
-
});
|
|
360
|
-
});
|
|
361
|
-
// ── Period close (TRUST AREA) ────────────────────────────────────────────────
|
|
362
|
-
describe("Period Close Tools", () => {
|
|
363
|
-
test("period_close_status returns open period", async () => {
|
|
364
|
-
const server = await makeAccountingCloseServer(makeSuccessClient);
|
|
365
|
-
const r = await server.tools.get("period_close_status").handler({});
|
|
366
|
-
assert.ok(!r.isError);
|
|
367
|
-
assert.equal(r.structuredContent["status"], "open");
|
|
368
|
-
});
|
|
369
|
-
test("period_close confirm=false returns isError without calling API", async () => {
|
|
370
|
-
const server = await makeAccountingCloseServer(makeSuccessClient);
|
|
371
|
-
const r = await server.tools.get("period_close").handler({ type: "quarterly", confirm: false });
|
|
372
|
-
assert.ok(r.isError);
|
|
373
|
-
assert.ok(r.content[0].text.includes("confirm=true"));
|
|
374
|
-
});
|
|
375
|
-
test("period_close confirm=true closes period", async () => {
|
|
376
|
-
const server = await makeAccountingCloseServer(makeSuccessClient);
|
|
377
|
-
const r = await server.tools.get("period_close").handler({ type: "quarterly", confirm: true });
|
|
378
|
-
assert.ok(!r.isError);
|
|
379
|
-
assert.equal(r.structuredContent["status"], "closed");
|
|
380
|
-
});
|
|
381
|
-
test("period_reopen confirm=false returns isError", async () => {
|
|
382
|
-
const server = await makeAccountingCloseServer(makeSuccessClient);
|
|
383
|
-
const r = await server.tools.get("period_reopen").handler({ periodId: "period_2026_q2", reason: "Audit correction", confirm: false });
|
|
384
|
-
assert.ok(r.isError);
|
|
385
|
-
assert.ok(r.content[0].text.includes("confirm=true"));
|
|
386
|
-
});
|
|
387
|
-
test("period_reopen confirm=true with reason reopens period", async () => {
|
|
388
|
-
const server = await makeAccountingCloseServer(makeSuccessClient);
|
|
389
|
-
const r = await server.tools.get("period_reopen").handler({ periodId: "period_2026_q2", reason: "Audit correction", confirm: true });
|
|
390
|
-
assert.ok(!r.isError);
|
|
391
|
-
assert.equal(r.structuredContent["status"], "reopened");
|
|
392
|
-
assert.equal(r.structuredContent["reopenReason"], "Audit correction");
|
|
393
|
-
});
|
|
394
|
-
test("period_close 404 → isError", async () => {
|
|
395
|
-
const server = await makeAccountingCloseServer(make404Client);
|
|
396
|
-
const r = await server.tools.get("period_close").handler({ type: "monthly", confirm: true });
|
|
397
|
-
assert.ok(r.isError);
|
|
398
|
-
});
|
|
399
|
-
});
|
|
400
|
-
// ── HR error paths ───────────────────────────────────────────────────────────
|
|
401
|
-
describe("HR Tools — error paths", () => {
|
|
402
|
-
test("leave_list 404 → isError", async () => {
|
|
403
|
-
const server = await makeHrServer(make404Client);
|
|
404
|
-
const r = await server.tools.get("leave_list").handler({});
|
|
405
|
-
assert.ok(r.isError);
|
|
406
|
-
});
|
|
407
|
-
test("leave_request_create 404 → isError", async () => {
|
|
408
|
-
const server = await makeHrServer(make404Client);
|
|
409
|
-
const r = await server.tools.get("leave_request_create").handler({
|
|
410
|
-
employeeId: "emp_001", type: "vacation", startDate: "2026-06-01", endDate: "2026-06-15",
|
|
411
|
-
});
|
|
412
|
-
assert.ok(r.isError);
|
|
413
|
-
});
|
|
414
|
-
test("attendance_clock_out 404 → isError", async () => {
|
|
415
|
-
const server = await makeHrServer(make404Client);
|
|
416
|
-
const r = await server.tools.get("attendance_clock_out").handler({ entryId: "att_missing" });
|
|
417
|
-
assert.ok(r.isError);
|
|
418
|
-
});
|
|
419
|
-
});
|
|
420
|
-
//# sourceMappingURL=d4b-hr-payroll-onboarding-tools.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"d4b-hr-payroll-onboarding-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/d4b-hr-payroll-onboarding-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Demo mode (`FRIHET_DEMO=1`) — DemoFrihetClient contract + fixture PII safety.
|
|
3
|
-
*
|
|
4
|
-
* Verifies the fixture-backed client serves stamped example data with ZERO
|
|
5
|
-
* network calls, simulates writes with a demo id, labels fiscal actions as
|
|
6
|
-
* simulated, and that no fixture email leaks a non-@example.com domain.
|
|
7
|
-
*
|
|
8
|
-
* Run: npm test (after build)
|
|
9
|
-
*/
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=demo-mode.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo-mode.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/demo-mode.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Demo mode (`FRIHET_DEMO=1`) — DemoFrihetClient contract + fixture PII safety.
|
|
3
|
-
*
|
|
4
|
-
* Verifies the fixture-backed client serves stamped example data with ZERO
|
|
5
|
-
* network calls, simulates writes with a demo id, labels fiscal actions as
|
|
6
|
-
* simulated, and that no fixture email leaks a non-@example.com domain.
|
|
7
|
-
*
|
|
8
|
-
* Run: npm test (after build)
|
|
9
|
-
*/
|
|
10
|
-
import { test, describe } from "node:test";
|
|
11
|
-
import assert from "node:assert/strict";
|
|
12
|
-
import { DemoFrihetClient } from "../demo-client.js";
|
|
13
|
-
import * as fixtures from "../demo-fixtures.js";
|
|
14
|
-
describe("DemoFrihetClient — reads", () => {
|
|
15
|
-
test("listInvoices returns a non-empty stamped PaginatedResponse", async () => {
|
|
16
|
-
const client = new DemoFrihetClient();
|
|
17
|
-
const res = await client.listInvoices();
|
|
18
|
-
assert.ok(Array.isArray(res.data), "data is an array");
|
|
19
|
-
assert.ok(res.data.length > 0, "data is non-empty");
|
|
20
|
-
assert.equal(res.total, res.data.length);
|
|
21
|
-
assert.equal(res._demo, true);
|
|
22
|
-
assert.ok(res._demoNotice, "_demoNotice present");
|
|
23
|
-
});
|
|
24
|
-
test("getInvoice(<fixture id>) returns the fixture stamped _demo:true", async () => {
|
|
25
|
-
const client = new DemoFrihetClient();
|
|
26
|
-
const firstId = fixtures.demoInvoices[0].id;
|
|
27
|
-
const res = await client.getInvoice(firstId);
|
|
28
|
-
assert.equal(res.id, firstId);
|
|
29
|
-
assert.equal(res._demo, true);
|
|
30
|
-
assert.ok(res._demoNotice, "_demoNotice present");
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
describe("DemoFrihetClient — writes are simulated", () => {
|
|
34
|
-
test("createInvoice returns _demo:true with a demo_-prefixed id, purely", async () => {
|
|
35
|
-
const client = new DemoFrihetClient();
|
|
36
|
-
const res = await client.createInvoice({
|
|
37
|
-
clientName: "Test Client",
|
|
38
|
-
items: [{ description: "Work", quantity: 2, unitPrice: 100 }],
|
|
39
|
-
taxRate: 21,
|
|
40
|
-
});
|
|
41
|
-
assert.equal(res._demo, true);
|
|
42
|
-
assert.equal(typeof res.id, "string");
|
|
43
|
-
assert.ok(res.id.startsWith("demo_"), `id "${res.id}" starts with demo_`);
|
|
44
|
-
// Echoes input + computes totals.
|
|
45
|
-
assert.equal(res.clientName, "Test Client");
|
|
46
|
-
assert.equal(res.subtotal, 200);
|
|
47
|
-
assert.equal(res.taxAmount, 42);
|
|
48
|
-
assert.equal(res.total, 242);
|
|
49
|
-
// WRITE notice communicates non-persistence.
|
|
50
|
-
assert.match(res._demoNotice, /Simulated — not persisted/);
|
|
51
|
-
});
|
|
52
|
-
test("createInvoice is a pure function — no throw, no network, repeatable", async () => {
|
|
53
|
-
const client = new DemoFrihetClient();
|
|
54
|
-
// Called twice back-to-back; neither throws nor hangs on a socket.
|
|
55
|
-
const a = await client.createInvoice({ clientName: "A", items: [] });
|
|
56
|
-
const b = await client.createInvoice({ clientName: "B", items: [] });
|
|
57
|
-
assert.equal(a._demo, true);
|
|
58
|
-
assert.equal(b._demo, true);
|
|
59
|
-
assert.notEqual(a.id, b.id, "ids are distinct across calls");
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
describe("DemoFrihetClient — fiscal actions are simulated only", () => {
|
|
63
|
-
test("sendEInvoice returns _demo:true + a simulated queued status, never throws", async () => {
|
|
64
|
-
const client = new DemoFrihetClient();
|
|
65
|
-
const res = await client.sendEInvoice({ invoiceId: "demo_inv_001", format: "facturae", dispatchMode: "peppol" });
|
|
66
|
-
assert.equal(res.status, "queued");
|
|
67
|
-
assert.equal(typeof res.workflowRunId, "string");
|
|
68
|
-
assert.equal(res._demo, true);
|
|
69
|
-
const notice = res._demoNotice;
|
|
70
|
-
assert.ok(notice, "_demoNotice present");
|
|
71
|
-
assert.match(notice, /no submission was made to any tax authority/);
|
|
72
|
-
});
|
|
73
|
-
test("faceSubmit + ticketbaiSubmit are labeled simulated, never real submissions", async () => {
|
|
74
|
-
const client = new DemoFrihetClient();
|
|
75
|
-
const face = await client.faceSubmit({ invoiceId: "demo_inv_001", mode: "sandbox" });
|
|
76
|
-
assert.equal(face.status, "submitted");
|
|
77
|
-
assert.equal(face._demo, true);
|
|
78
|
-
const tbai = await client.ticketbaiSubmit({ invoiceId: "demo_inv_001", sandbox: true });
|
|
79
|
-
assert.equal(tbai._demo, true);
|
|
80
|
-
assert.match(tbai._demoNotice, /no submission was made to any tax authority/);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
describe("demo fixtures — PII safety", () => {
|
|
84
|
-
test("every email string in the fixtures ends with @example.com", () => {
|
|
85
|
-
// Collect every string value that looks like an email across all fixture
|
|
86
|
-
// exports; assert none uses a domain other than example.com.
|
|
87
|
-
const emailRe = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g;
|
|
88
|
-
const emails = [];
|
|
89
|
-
const seen = new Set();
|
|
90
|
-
const walk = (val) => {
|
|
91
|
-
if (val == null)
|
|
92
|
-
return;
|
|
93
|
-
if (typeof val === "string") {
|
|
94
|
-
const matches = val.match(emailRe);
|
|
95
|
-
if (matches)
|
|
96
|
-
emails.push(...matches);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
if (typeof val !== "object")
|
|
100
|
-
return;
|
|
101
|
-
if (seen.has(val))
|
|
102
|
-
return;
|
|
103
|
-
seen.add(val);
|
|
104
|
-
for (const v of Object.values(val))
|
|
105
|
-
walk(v);
|
|
106
|
-
};
|
|
107
|
-
walk(fixtures);
|
|
108
|
-
assert.ok(emails.length > 0, "fixtures contain at least one email (sanity)");
|
|
109
|
-
for (const email of emails) {
|
|
110
|
-
assert.ok(email.endsWith("@example.com"), `email "${email}" must be under @example.com`);
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
test("fixtures use the ECBS/AEAT test IBAN, not a real one", () => {
|
|
114
|
-
assert.equal(fixtures.DEMO_TEST_IBAN, "ES9121000418450200051332");
|
|
115
|
-
const account = fixtures.demoBankAccounts[0];
|
|
116
|
-
assert.equal(account.iban, fixtures.DEMO_TEST_IBAN);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
//# sourceMappingURL=demo-mode.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"demo-mode.test.js","sourceRoot":"","sources":["../../src/__tests__/demo-mode.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Day 4 e-invoice MCP tools — FACe, TicketBAI, KSeF, einvoice_export.
|
|
3
|
-
*
|
|
4
|
-
* Uses Node.js built-in test runner (node:test + node:assert) — no extra deps.
|
|
5
|
-
* Run: npm test (after build: node --test dist/__tests__/einvoice-day4-tools.test.js)
|
|
6
|
-
*
|
|
7
|
-
* Coverage:
|
|
8
|
-
* 1. Tool registration — all 6 Day 4 tools registered (127→133)
|
|
9
|
-
* 2. 404-fallback path — CF endpoint not yet deployed → stub fires
|
|
10
|
-
* 3. Success path — live client data passed through correctly
|
|
11
|
-
* 4. Error paths — 403/422/500 are rethrown (not swallowed)
|
|
12
|
-
* 5. ksef_submit stub — always returns _notImplemented=true
|
|
13
|
-
* 6. Stub response shapes match declared outputSchema fields
|
|
14
|
-
*/
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=einvoice-day4-tools.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"einvoice-day4-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/einvoice-day4-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|