@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,271 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Fiscal MCP tools — Wave 6 (7 tools).
|
|
3
|
-
*
|
|
4
|
-
* Uses Node.js built-in test runner (node:test + node:assert).
|
|
5
|
-
* Run: npm test (after build)
|
|
6
|
-
*
|
|
7
|
-
* Coverage:
|
|
8
|
-
* 1. Tool registration — all 7 fiscal tools registered
|
|
9
|
-
* 2. get_modelo_303_summary — success path + period param
|
|
10
|
-
* 3. get_modelo_130_summary — success path
|
|
11
|
-
* 4. get_modelo_390_summary — success path
|
|
12
|
-
* 5. get_modelo_180_summary — success path
|
|
13
|
-
* 6. get_modelo_347_summary — success path
|
|
14
|
-
* 7. verifactu_status — success path
|
|
15
|
-
* 8. verifactu_resubmit — confirm=false gate + confirm=true success
|
|
16
|
-
* 9. API error — 404 propagated as isError=true
|
|
17
|
-
*
|
|
18
|
-
* NOTE: ticketbai_status is tested in einvoice-day4-tools.test.ts (canonical).
|
|
19
|
-
*/
|
|
20
|
-
import { test, describe, beforeEach } from "node:test";
|
|
21
|
-
import assert from "node:assert/strict";
|
|
22
|
-
class StubMcpServer {
|
|
23
|
-
tools = new Map();
|
|
24
|
-
registerTool(name, config, handler) {
|
|
25
|
-
this.tools.set(name, { name, config, handler });
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
// ── Mock data ────────────────────────────────────────────────────────────────
|
|
29
|
-
const MOCK_MODELO_SUMMARY = {
|
|
30
|
-
modeloCode: "303",
|
|
31
|
-
period: "2026-Q1",
|
|
32
|
-
totalsByRate: { "21": 4200.0, "10": 350.0, "4": 80.0 },
|
|
33
|
-
totalDeductible: 1200.0,
|
|
34
|
-
totalDue: 3430.0,
|
|
35
|
-
deadline: "2026-04-20",
|
|
36
|
-
};
|
|
37
|
-
const MOCK_VERIFACTU_STATUS = {
|
|
38
|
-
invoiceId: "inv_abc123",
|
|
39
|
-
lastSubmissionAt: "2026-05-09T10:00:00Z",
|
|
40
|
-
hash: "sha256:abcdef1234567890",
|
|
41
|
-
status: "success",
|
|
42
|
-
aeatResponse: "0000",
|
|
43
|
-
qrUrl: "https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678&numserie=2026-001&fecha=2026-05-09&importe=1210.00",
|
|
44
|
-
};
|
|
45
|
-
const MOCK_TICKETBAI_STATUS = {
|
|
46
|
-
invoiceId: "inv_def456",
|
|
47
|
-
lastSubmissionAt: "2026-05-09T11:00:00Z",
|
|
48
|
-
hash: "sha256:xyz9876543210",
|
|
49
|
-
status: "success",
|
|
50
|
-
aeatResponse: "0000",
|
|
51
|
-
qrUrl: "https://tbai.ehu.eus/qr/...",
|
|
52
|
-
province: "bizkaia",
|
|
53
|
-
};
|
|
54
|
-
// ── Client stubs ─────────────────────────────────────────────────────────────
|
|
55
|
-
function makeSuccessClient() {
|
|
56
|
-
return {
|
|
57
|
-
getFiscalModeloSummary: async (modeloCode, period) => ({
|
|
58
|
-
...MOCK_MODELO_SUMMARY,
|
|
59
|
-
modeloCode,
|
|
60
|
-
period: period ?? "2026-Q1",
|
|
61
|
-
}),
|
|
62
|
-
getVerifactuStatus: async (_invoiceId) => MOCK_VERIFACTU_STATUS,
|
|
63
|
-
resubmitVerifactu: async (_invoiceId) => ({ ...MOCK_VERIFACTU_STATUS, status: "pending" }),
|
|
64
|
-
getTicketbaiStatus: async (_invoiceId) => MOCK_TICKETBAI_STATUS,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
function make404Client() {
|
|
68
|
-
const notFound = () => {
|
|
69
|
-
const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
|
|
70
|
-
return Promise.reject(err);
|
|
71
|
-
};
|
|
72
|
-
return {
|
|
73
|
-
getFiscalModeloSummary: notFound,
|
|
74
|
-
getVerifactuStatus: notFound,
|
|
75
|
-
resubmitVerifactu: notFound,
|
|
76
|
-
getTicketbaiStatus: notFound,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
// ── Helper ───────────────────────────────────────────────────────────────────
|
|
80
|
-
async function makeServer(clientFn) {
|
|
81
|
-
const server = new StubMcpServer();
|
|
82
|
-
const { registerFiscalTools } = await import("../tools/fiscal.js");
|
|
83
|
-
registerFiscalTools(server, clientFn());
|
|
84
|
-
return server;
|
|
85
|
-
}
|
|
86
|
-
// ── Registration tests ───────────────────────────────────────────────────────
|
|
87
|
-
describe("Fiscal Tools — Registration", () => {
|
|
88
|
-
let server;
|
|
89
|
-
beforeEach(async () => {
|
|
90
|
-
server = await makeServer(makeSuccessClient);
|
|
91
|
-
});
|
|
92
|
-
test("registers exactly 7 fiscal tools", () => {
|
|
93
|
-
assert.equal(server.tools.size, 7);
|
|
94
|
-
});
|
|
95
|
-
for (const name of [
|
|
96
|
-
"get_modelo_303_summary",
|
|
97
|
-
"get_modelo_130_summary",
|
|
98
|
-
"get_modelo_390_summary",
|
|
99
|
-
"get_modelo_180_summary",
|
|
100
|
-
"get_modelo_347_summary",
|
|
101
|
-
"verifactu_status",
|
|
102
|
-
"verifactu_resubmit",
|
|
103
|
-
]) {
|
|
104
|
-
test(`registers ${name}`, () => {
|
|
105
|
-
assert.ok(server.tools.has(name), `${name} not registered`);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
// ── Modelo summaries ─────────────────────────────────────────────────────────
|
|
110
|
-
describe("get_modelo_303_summary — success path", () => {
|
|
111
|
-
test("returns summary with totalsDue and period", async () => {
|
|
112
|
-
const server = await makeServer(makeSuccessClient);
|
|
113
|
-
const tool = server.tools.get("get_modelo_303_summary");
|
|
114
|
-
const result = await tool.handler({ period: "2026-Q1" });
|
|
115
|
-
assert.ok(!result.isError);
|
|
116
|
-
const sc = result.structuredContent;
|
|
117
|
-
assert.equal(sc["modeloCode"], "303");
|
|
118
|
-
assert.equal(sc["period"], "2026-Q1");
|
|
119
|
-
assert.equal(sc["totalDue"], 3430.0);
|
|
120
|
-
assert.ok(typeof sc["totalsByRate"] === "object");
|
|
121
|
-
});
|
|
122
|
-
test("content block mentions Modelo 303", async () => {
|
|
123
|
-
const server = await makeServer(makeSuccessClient);
|
|
124
|
-
const tool = server.tools.get("get_modelo_303_summary");
|
|
125
|
-
const result = await tool.handler({});
|
|
126
|
-
assert.ok(result.content[0].text.includes("303"));
|
|
127
|
-
});
|
|
128
|
-
test("404 propagates as isError=true", async () => {
|
|
129
|
-
const server = await makeServer(make404Client);
|
|
130
|
-
const tool = server.tools.get("get_modelo_303_summary");
|
|
131
|
-
const result = await tool.handler({ period: "2026-Q1" });
|
|
132
|
-
assert.ok(result.isError);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
describe("get_modelo_130_summary — success path", () => {
|
|
136
|
-
test("returns modeloCode 130", async () => {
|
|
137
|
-
const server = await makeServer(makeSuccessClient);
|
|
138
|
-
const tool = server.tools.get("get_modelo_130_summary");
|
|
139
|
-
const result = await tool.handler({ period: "2026-Q1" });
|
|
140
|
-
assert.ok(!result.isError);
|
|
141
|
-
assert.equal(result.structuredContent["modeloCode"], "130");
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
describe("get_modelo_390_summary — success path", () => {
|
|
145
|
-
test("returns modeloCode 390", async () => {
|
|
146
|
-
const server = await makeServer(makeSuccessClient);
|
|
147
|
-
const tool = server.tools.get("get_modelo_390_summary");
|
|
148
|
-
const result = await tool.handler({ period: "2025" });
|
|
149
|
-
assert.ok(!result.isError);
|
|
150
|
-
assert.equal(result.structuredContent["modeloCode"], "390");
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
describe("get_modelo_180_summary — success path", () => {
|
|
154
|
-
test("returns modeloCode 180", async () => {
|
|
155
|
-
const server = await makeServer(makeSuccessClient);
|
|
156
|
-
const tool = server.tools.get("get_modelo_180_summary");
|
|
157
|
-
const result = await tool.handler({ period: "2025" });
|
|
158
|
-
assert.ok(!result.isError);
|
|
159
|
-
assert.equal(result.structuredContent["modeloCode"], "180");
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
describe("get_modelo_347_summary — success path", () => {
|
|
163
|
-
test("returns modeloCode 347", async () => {
|
|
164
|
-
const server = await makeServer(makeSuccessClient);
|
|
165
|
-
const tool = server.tools.get("get_modelo_347_summary");
|
|
166
|
-
const result = await tool.handler({ period: "2025" });
|
|
167
|
-
assert.ok(!result.isError);
|
|
168
|
-
assert.equal(result.structuredContent["modeloCode"], "347");
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
// ── verifactu_status ─────────────────────────────────────────────────────────
|
|
172
|
-
describe("verifactu_status — success path", () => {
|
|
173
|
-
test("returns status with hash and qrUrl", async () => {
|
|
174
|
-
const server = await makeServer(makeSuccessClient);
|
|
175
|
-
const tool = server.tools.get("verifactu_status");
|
|
176
|
-
const result = await tool.handler({ invoiceId: "inv_abc123" });
|
|
177
|
-
assert.ok(!result.isError);
|
|
178
|
-
const sc = result.structuredContent;
|
|
179
|
-
assert.equal(sc["invoiceId"], "inv_abc123");
|
|
180
|
-
assert.equal(sc["status"], "success");
|
|
181
|
-
assert.ok(typeof sc["hash"] === "string");
|
|
182
|
-
assert.ok(typeof sc["qrUrl"] === "string");
|
|
183
|
-
});
|
|
184
|
-
test("aeatResponse is present", async () => {
|
|
185
|
-
const server = await makeServer(makeSuccessClient);
|
|
186
|
-
const tool = server.tools.get("verifactu_status");
|
|
187
|
-
const result = await tool.handler({ invoiceId: "inv_abc123" });
|
|
188
|
-
assert.equal(result.structuredContent["aeatResponse"], "0000");
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
// ── verifactu_status — app-level 404 semantics ───────────────────────────────
|
|
192
|
-
// The live endpoint (publicApi GET /fiscal/verifactu/:id/status) IS deployed and
|
|
193
|
-
// uses 404 for two app-level states. Neither may surface as the guard's
|
|
194
|
-
// "backend unavailable" (which tells the user the feature is not enabled — the
|
|
195
|
-
// exact misleading message a fresh invoice produced in the golden flow).
|
|
196
|
-
describe("verifactu_status — 404 'no submission yet' is a normal state, not an error", () => {
|
|
197
|
-
function makeNoSubmissionClient() {
|
|
198
|
-
const noSub = () => {
|
|
199
|
-
const msg = "No VeriFactu submission found for this invoice. Submit first via the VeriFactu submission flow.";
|
|
200
|
-
return Promise.reject(Object.assign(new Error(msg), { statusCode: 404, errorCode: msg }));
|
|
201
|
-
};
|
|
202
|
-
return { getVerifactuStatus: noSub };
|
|
203
|
-
}
|
|
204
|
-
test("maps to status=not_submitted success result (no isError, no backend_unavailable)", async () => {
|
|
205
|
-
const server = await makeServer(makeNoSubmissionClient);
|
|
206
|
-
const tool = server.tools.get("verifactu_status");
|
|
207
|
-
const result = await tool.handler({ invoiceId: "inv_fresh" });
|
|
208
|
-
assert.ok(!result.isError);
|
|
209
|
-
const sc = result.structuredContent;
|
|
210
|
-
assert.equal(sc["invoiceId"], "inv_fresh");
|
|
211
|
-
assert.equal(sc["status"], "not_submitted");
|
|
212
|
-
assert.equal(sc["accepted"], false);
|
|
213
|
-
assert.equal(sc["_backendUnavailable"], undefined);
|
|
214
|
-
// Copy must state it is a normal state — never "feature not enabled".
|
|
215
|
-
assert.ok(result.content[0].text.includes("NOT an error"));
|
|
216
|
-
assert.ok(!result.content[0].text.includes("not available yet"));
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
describe("verifactu_status — 404 'invoice not found' is a real error, not backend_unavailable", () => {
|
|
220
|
-
function makeInvoiceNotFoundClient() {
|
|
221
|
-
const nf = () => {
|
|
222
|
-
const msg = "Invoice 'inv_missing' not found";
|
|
223
|
-
return Promise.reject(Object.assign(new Error(msg), { statusCode: 404, errorCode: msg }));
|
|
224
|
-
};
|
|
225
|
-
return { getVerifactuStatus: nf };
|
|
226
|
-
}
|
|
227
|
-
test("returns isError with invoice_not_found (guides to internal id)", async () => {
|
|
228
|
-
const server = await makeServer(makeInvoiceNotFoundClient);
|
|
229
|
-
const tool = server.tools.get("verifactu_status");
|
|
230
|
-
const result = await tool.handler({ invoiceId: "inv_missing" });
|
|
231
|
-
assert.ok(result.isError);
|
|
232
|
-
const sc = result.structuredContent;
|
|
233
|
-
assert.equal(sc["error"], "invoice_not_found");
|
|
234
|
-
assert.equal(sc["_backendUnavailable"], undefined);
|
|
235
|
-
assert.ok(result.content[0].text.includes("internal invoice id"));
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
describe("verifactu_status — generic 404 still falls through to the backend guard", () => {
|
|
239
|
-
test("plain 'Not Found' body keeps backend_unavailable behavior", async () => {
|
|
240
|
-
const server = await makeServer(make404Client);
|
|
241
|
-
const tool = server.tools.get("verifactu_status");
|
|
242
|
-
const result = await tool.handler({ invoiceId: "inv_abc123" });
|
|
243
|
-
assert.ok(result.isError);
|
|
244
|
-
assert.equal(result.structuredContent["error"], "backend_unavailable");
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
// ── verifactu_resubmit ───────────────────────────────────────────────────────
|
|
248
|
-
describe("verifactu_resubmit — trust area gate", () => {
|
|
249
|
-
test("confirm=false returns isError=true", async () => {
|
|
250
|
-
const server = await makeServer(makeSuccessClient);
|
|
251
|
-
const tool = server.tools.get("verifactu_resubmit");
|
|
252
|
-
const result = await tool.handler({ invoiceId: "inv_abc123", confirm: false });
|
|
253
|
-
assert.ok(result.isError);
|
|
254
|
-
assert.ok(result.content[0].text.includes("confirm=true"));
|
|
255
|
-
});
|
|
256
|
-
test("confirm=true proceeds and returns pending status", async () => {
|
|
257
|
-
const server = await makeServer(makeSuccessClient);
|
|
258
|
-
const tool = server.tools.get("verifactu_resubmit");
|
|
259
|
-
const result = await tool.handler({ invoiceId: "inv_abc123", confirm: true });
|
|
260
|
-
assert.ok(!result.isError);
|
|
261
|
-
assert.equal(result.structuredContent["status"], "pending");
|
|
262
|
-
});
|
|
263
|
-
test("confirm=true with 404 propagates isError=true", async () => {
|
|
264
|
-
const server = await makeServer(make404Client);
|
|
265
|
-
const tool = server.tools.get("verifactu_resubmit");
|
|
266
|
-
const result = await tool.handler({ invoiceId: "inv_missing", confirm: true });
|
|
267
|
-
assert.ok(result.isError);
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
// ticketbai_status is tested in einvoice-day4-tools.test.ts (canonical location).
|
|
271
|
-
//# sourceMappingURL=fiscal-tools.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fiscal-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/fiscal-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for the "Output validation error" bug on every single-object
|
|
3
|
-
* get_* tool (get_invoice, get_expense, get_client, ... ) — root cause fix.
|
|
4
|
-
*
|
|
5
|
-
* BUG: single-object read methods in client.ts (getInvoice, getExpense, etc.)
|
|
6
|
-
* called `this.request(...)` (RAW) instead of `this.requestUnwrapped(...)`.
|
|
7
|
-
* The live Frihet ERP REST API wraps every single-object response in a
|
|
8
|
-
* `{ data: <item>, meta: {...} }` envelope (the same convention documented for
|
|
9
|
-
* the already-fixed `getFiscalModeloSummary`). Because the raw envelope was
|
|
10
|
-
* returned straight into the tool's `structuredContent`, and every get_* tool's
|
|
11
|
-
* `outputSchema` expects the FLAT item (not `{data, meta}`), every single-object
|
|
12
|
-
* get_* tool failed MCP output validation ("Output validation error") the
|
|
13
|
-
* moment a real backend response came back.
|
|
14
|
-
*
|
|
15
|
-
* Unlike `contract.test.ts` (which only proves the *schema* accepts an
|
|
16
|
-
* already-unwrapped fixture, via a hand-rolled `unwrap()` mirror function),
|
|
17
|
-
* THIS file boots a real `node:http` mock backend and points a REAL
|
|
18
|
-
* `FrihetClient` at it — the same pattern as `banking-client-contract.test.ts`.
|
|
19
|
-
* It exercises the actual `request()` → `requestUnwrapped()` wiring, so it
|
|
20
|
-
* would have caught the bug: before the fix, every assertion below that checks
|
|
21
|
-
* `"data" in result` / `"meta" in result` would have failed (the envelope keys
|
|
22
|
-
* would have leaked straight into the tool's structuredContent).
|
|
23
|
-
*
|
|
24
|
-
* Run: npm test (after build)
|
|
25
|
-
*/
|
|
26
|
-
export {};
|
|
27
|
-
//# sourceMappingURL=get-envelope-unwrap-regression.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-envelope-unwrap-regression.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/get-envelope-unwrap-regression.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for the "Output validation error" bug on every single-object
|
|
3
|
-
* get_* tool (get_invoice, get_expense, get_client, ... ) — root cause fix.
|
|
4
|
-
*
|
|
5
|
-
* BUG: single-object read methods in client.ts (getInvoice, getExpense, etc.)
|
|
6
|
-
* called `this.request(...)` (RAW) instead of `this.requestUnwrapped(...)`.
|
|
7
|
-
* The live Frihet ERP REST API wraps every single-object response in a
|
|
8
|
-
* `{ data: <item>, meta: {...} }` envelope (the same convention documented for
|
|
9
|
-
* the already-fixed `getFiscalModeloSummary`). Because the raw envelope was
|
|
10
|
-
* returned straight into the tool's `structuredContent`, and every get_* tool's
|
|
11
|
-
* `outputSchema` expects the FLAT item (not `{data, meta}`), every single-object
|
|
12
|
-
* get_* tool failed MCP output validation ("Output validation error") the
|
|
13
|
-
* moment a real backend response came back.
|
|
14
|
-
*
|
|
15
|
-
* Unlike `contract.test.ts` (which only proves the *schema* accepts an
|
|
16
|
-
* already-unwrapped fixture, via a hand-rolled `unwrap()` mirror function),
|
|
17
|
-
* THIS file boots a real `node:http` mock backend and points a REAL
|
|
18
|
-
* `FrihetClient` at it — the same pattern as `banking-client-contract.test.ts`.
|
|
19
|
-
* It exercises the actual `request()` → `requestUnwrapped()` wiring, so it
|
|
20
|
-
* would have caught the bug: before the fix, every assertion below that checks
|
|
21
|
-
* `"data" in result` / `"meta" in result` would have failed (the envelope keys
|
|
22
|
-
* would have leaked straight into the tool's structuredContent).
|
|
23
|
-
*
|
|
24
|
-
* Run: npm test (after build)
|
|
25
|
-
*/
|
|
26
|
-
import { test, describe, before, after } from "node:test";
|
|
27
|
-
import assert from "node:assert/strict";
|
|
28
|
-
import { createServer } from "node:http";
|
|
29
|
-
import { FrihetClient } from "../client.js";
|
|
30
|
-
import { invoiceItemOutput, expenseItemOutput, clientItemOutput, productItemOutput, quoteItemOutput, vendorItemOutput, webhookItemOutput, depositItemOutput, reservationItemOutput, posSaleItemOutput, kitchenTicketItemOutput, bankAccountItemOutput, timeEntryItemOutput, timeSummaryOutput, recurringInvoiceItemOutput, pdfResultOutput, } from "../tools/shared.js";
|
|
31
|
-
import { eInvoiceStatusOutput } from "../tools/einvoice.js";
|
|
32
|
-
// ── Mock ERP backend: every single-object GET wraps the item in { data, meta } ──
|
|
33
|
-
let server;
|
|
34
|
-
let baseUrl;
|
|
35
|
-
/** Wrap an item exactly like the live CF does for single-object reads. */
|
|
36
|
-
function envelope(item, meta = { source: "test" }) {
|
|
37
|
-
return { data: item, meta };
|
|
38
|
-
}
|
|
39
|
-
const FIXTURES = {
|
|
40
|
-
invoice: { id: "inv_1", clientName: "Acme Corp", items: [{ description: "Consulting", quantity: 1, unitPrice: 100 }], total: 121, status: "sent" },
|
|
41
|
-
expense: { id: "exp_1", description: "AWS", amount: 42.5, category: "software" },
|
|
42
|
-
client: { id: "cli_1", name: "Acme Corp", email: "billing@acme.example" },
|
|
43
|
-
product: { id: "prod_1", name: "Widget", unitPrice: 19.99 },
|
|
44
|
-
quote: { id: "quo_1", clientName: "Acme Corp", items: [{ description: "Design", quantity: 1, unitPrice: 500 }] },
|
|
45
|
-
vendor: { id: "vend_1", name: "AWS Inc" },
|
|
46
|
-
webhook: { id: "wh_1", url: "https://example.com/hook", events: ["invoice.paid"] },
|
|
47
|
-
deposit: { id: "dep_1", clientId: "cli_1", amount: 300 },
|
|
48
|
-
reservation: { id: "res_1", propertyId: "prop_1", status: "confirmed", checkIn: "2026-08-01", checkOut: "2026-08-05", guestCount: 2 },
|
|
49
|
-
sale: { id: "sale_1", terminalId: "term_1", status: "succeeded", amountCents: 1500 },
|
|
50
|
-
kitchenTicket: { id: "kt_1", stationId: "station_1", status: "queued" },
|
|
51
|
-
bankAccount: { id: "acct_1", alias: "Main", ibanLast4: "4321" },
|
|
52
|
-
timeEntry: { id: "te_1", userId: "u_1", hours: 3.5 },
|
|
53
|
-
recurringInvoice: { id: "rec_1", templateName: "Monthly retainer", frequency: "monthly", status: "active" },
|
|
54
|
-
invoicePdf: { id: "inv_1", url: "https://cdn.example.com/inv_1.pdf", contentType: "application/pdf" },
|
|
55
|
-
timeSummary: { from: "2026-06-01", to: "2026-06-30", totalHours: 40, billableHours: 32, nonBillableHours: 8 },
|
|
56
|
-
einvoiceStatus: { status: "succeeded", step: "delivered", ackId: "ack_123" },
|
|
57
|
-
};
|
|
58
|
-
before(async () => {
|
|
59
|
-
server = createServer(async (req, res) => {
|
|
60
|
-
const url = new URL(req.url ?? "/", "http://localhost");
|
|
61
|
-
res.setHeader("Content-Type", "application/json");
|
|
62
|
-
const send = (body) => res.end(JSON.stringify(body));
|
|
63
|
-
if (url.pathname === "/invoices" && req.method === "GET") {
|
|
64
|
-
// List path — must stay as the RAW paginated envelope (requestPaginated).
|
|
65
|
-
return send({ data: [FIXTURES.invoice], total: 1, limit: 20, offset: 0 });
|
|
66
|
-
}
|
|
67
|
-
if (url.pathname === "/invoices/inv_1" && req.method === "GET")
|
|
68
|
-
return send(envelope(FIXTURES.invoice));
|
|
69
|
-
if (url.pathname === "/invoices/inv_1/pdf" && req.method === "GET")
|
|
70
|
-
return send(envelope(FIXTURES.invoicePdf));
|
|
71
|
-
if (url.pathname === "/invoices/inv_1/xml" && req.method === "GET") {
|
|
72
|
-
return send(envelope({ xml: "<Invoice/>", filename: "inv_1.xml", format: "ubl" }));
|
|
73
|
-
}
|
|
74
|
-
if (url.pathname === "/invoices/plain-xml/xml" && req.method === "GET") {
|
|
75
|
-
// `data` present but NOT an object (a bare string) — must NOT be unwrapped.
|
|
76
|
-
return send({ data: "<Invoice/>", meta: {} });
|
|
77
|
-
}
|
|
78
|
-
if (url.pathname === "/expenses/exp_1" && req.method === "GET")
|
|
79
|
-
return send(envelope(FIXTURES.expense));
|
|
80
|
-
if (url.pathname === "/clients/cli_1" && req.method === "GET")
|
|
81
|
-
return send(envelope(FIXTURES.client));
|
|
82
|
-
if (url.pathname === "/products/prod_1" && req.method === "GET")
|
|
83
|
-
return send(envelope(FIXTURES.product));
|
|
84
|
-
if (url.pathname === "/quotes/quo_1" && req.method === "GET")
|
|
85
|
-
return send(envelope(FIXTURES.quote));
|
|
86
|
-
if (url.pathname === "/vendors/vend_1" && req.method === "GET")
|
|
87
|
-
return send(envelope(FIXTURES.vendor));
|
|
88
|
-
if (url.pathname === "/webhooks/wh_1" && req.method === "GET")
|
|
89
|
-
return send(envelope(FIXTURES.webhook));
|
|
90
|
-
if (url.pathname === "/deposits/dep_1" && req.method === "GET")
|
|
91
|
-
return send(envelope(FIXTURES.deposit));
|
|
92
|
-
if (url.pathname === "/stay/reservations/res_1" && req.method === "GET")
|
|
93
|
-
return send(envelope(FIXTURES.reservation));
|
|
94
|
-
if (url.pathname === "/pos/sales/sale_1" && req.method === "GET")
|
|
95
|
-
return send(envelope(FIXTURES.sale));
|
|
96
|
-
if (url.pathname === "/kitchen/tickets/kt_1" && req.method === "GET")
|
|
97
|
-
return send(envelope(FIXTURES.kitchenTicket));
|
|
98
|
-
if (url.pathname === "/banking/accounts/acct_1" && req.method === "GET")
|
|
99
|
-
return send(envelope(FIXTURES.bankAccount));
|
|
100
|
-
if (url.pathname === "/time/entries/te_1" && req.method === "GET")
|
|
101
|
-
return send(envelope(FIXTURES.timeEntry));
|
|
102
|
-
if (url.pathname === "/time/summary" && req.method === "GET")
|
|
103
|
-
return send(envelope(FIXTURES.timeSummary));
|
|
104
|
-
if (url.pathname === "/recurring/invoices/rec_1" && req.method === "GET")
|
|
105
|
-
return send(envelope(FIXTURES.recurringInvoice));
|
|
106
|
-
if (url.pathname === "/einvoice/status/wf_1" && req.method === "GET")
|
|
107
|
-
return send(envelope(FIXTURES.einvoiceStatus));
|
|
108
|
-
res.statusCode = 404;
|
|
109
|
-
return send({ error: "not_found" });
|
|
110
|
-
});
|
|
111
|
-
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
112
|
-
const { port } = server.address();
|
|
113
|
-
baseUrl = `http://127.0.0.1:${port}`;
|
|
114
|
-
});
|
|
115
|
-
after(async () => {
|
|
116
|
-
await new Promise((resolve) => server.close(() => resolve()));
|
|
117
|
-
});
|
|
118
|
-
function makeClient() {
|
|
119
|
-
return new FrihetClient("fri_test_key", baseUrl);
|
|
120
|
-
}
|
|
121
|
-
/** Every fixed getter must (a) unwrap the envelope AND (b) validate against
|
|
122
|
-
* the exact outputSchema the tool declares — the two facts together are what
|
|
123
|
-
* "Output validation error" required to be true before the fix was applied. */
|
|
124
|
-
function assertUnwrappedAndValid(result, schema) {
|
|
125
|
-
assert.equal(typeof result, "object");
|
|
126
|
-
assert.ok(result !== null);
|
|
127
|
-
assert.equal("data" in result, false, "envelope 'data' key must NOT leak into the tool result");
|
|
128
|
-
assert.equal("meta" in result, false, "envelope 'meta' key must NOT leak into the tool result");
|
|
129
|
-
const parsed = schema.safeParse(result);
|
|
130
|
-
assert.equal(parsed.success, true, parsed.success ? "" : JSON.stringify(parsed.error, null, 2));
|
|
131
|
-
}
|
|
132
|
-
describe("client.ts single-object get_* reads unwrap the { data, meta } envelope", () => {
|
|
133
|
-
test("getInvoice unwraps + validates against invoiceItemOutput", async () => {
|
|
134
|
-
const result = await makeClient().getInvoice("inv_1");
|
|
135
|
-
assertUnwrappedAndValid(result, invoiceItemOutput);
|
|
136
|
-
assert.equal(result.id, "inv_1");
|
|
137
|
-
});
|
|
138
|
-
test("getExpense unwraps + validates against expenseItemOutput", async () => {
|
|
139
|
-
const result = await makeClient().getExpense("exp_1");
|
|
140
|
-
assertUnwrappedAndValid(result, expenseItemOutput);
|
|
141
|
-
});
|
|
142
|
-
test("getClient unwraps + validates against clientItemOutput", async () => {
|
|
143
|
-
const result = await makeClient().getClient("cli_1");
|
|
144
|
-
assertUnwrappedAndValid(result, clientItemOutput);
|
|
145
|
-
});
|
|
146
|
-
test("getProduct unwraps + validates against productItemOutput", async () => {
|
|
147
|
-
const result = await makeClient().getProduct("prod_1");
|
|
148
|
-
assertUnwrappedAndValid(result, productItemOutput);
|
|
149
|
-
});
|
|
150
|
-
test("getQuote unwraps + validates against quoteItemOutput", async () => {
|
|
151
|
-
const result = await makeClient().getQuote("quo_1");
|
|
152
|
-
assertUnwrappedAndValid(result, quoteItemOutput);
|
|
153
|
-
});
|
|
154
|
-
test("getVendor unwraps + validates against vendorItemOutput", async () => {
|
|
155
|
-
const result = await makeClient().getVendor("vend_1");
|
|
156
|
-
assertUnwrappedAndValid(result, vendorItemOutput);
|
|
157
|
-
});
|
|
158
|
-
test("getWebhook unwraps + validates against webhookItemOutput", async () => {
|
|
159
|
-
const result = await makeClient().getWebhook("wh_1");
|
|
160
|
-
assertUnwrappedAndValid(result, webhookItemOutput);
|
|
161
|
-
});
|
|
162
|
-
test("getDeposit unwraps + validates against depositItemOutput", async () => {
|
|
163
|
-
const result = await makeClient().getDeposit("dep_1");
|
|
164
|
-
assertUnwrappedAndValid(result, depositItemOutput);
|
|
165
|
-
});
|
|
166
|
-
test("getReservation unwraps + validates against reservationItemOutput", async () => {
|
|
167
|
-
const result = await makeClient().getReservation("res_1");
|
|
168
|
-
assertUnwrappedAndValid(result, reservationItemOutput);
|
|
169
|
-
});
|
|
170
|
-
test("getSale unwraps + validates against posSaleItemOutput", async () => {
|
|
171
|
-
const result = await makeClient().getSale("sale_1");
|
|
172
|
-
assertUnwrappedAndValid(result, posSaleItemOutput);
|
|
173
|
-
});
|
|
174
|
-
test("getKitchenTicket unwraps + validates against kitchenTicketItemOutput", async () => {
|
|
175
|
-
const result = await makeClient().getKitchenTicket("kt_1");
|
|
176
|
-
assertUnwrappedAndValid(result, kitchenTicketItemOutput);
|
|
177
|
-
});
|
|
178
|
-
test("getBankAccount unwraps + validates against bankAccountItemOutput", async () => {
|
|
179
|
-
const result = await makeClient().getBankAccount("acct_1");
|
|
180
|
-
assertUnwrappedAndValid(result, bankAccountItemOutput);
|
|
181
|
-
});
|
|
182
|
-
test("getTimeEntry unwraps + validates against timeEntryItemOutput", async () => {
|
|
183
|
-
const result = await makeClient().getTimeEntry("te_1");
|
|
184
|
-
assertUnwrappedAndValid(result, timeEntryItemOutput);
|
|
185
|
-
});
|
|
186
|
-
test("getTimeSummary unwraps + validates against timeSummaryOutput", async () => {
|
|
187
|
-
const result = await makeClient().getTimeSummary({ from: "2026-06-01", to: "2026-06-30" });
|
|
188
|
-
assertUnwrappedAndValid(result, timeSummaryOutput);
|
|
189
|
-
});
|
|
190
|
-
test("getRecurringInvoice unwraps + validates against recurringInvoiceItemOutput", async () => {
|
|
191
|
-
const result = await makeClient().getRecurringInvoice("rec_1");
|
|
192
|
-
assertUnwrappedAndValid(result, recurringInvoiceItemOutput);
|
|
193
|
-
});
|
|
194
|
-
test("getInvoicePdf unwraps + validates against pdfResultOutput", async () => {
|
|
195
|
-
const result = await makeClient().getInvoicePdf("inv_1");
|
|
196
|
-
assertUnwrappedAndValid(result, pdfResultOutput);
|
|
197
|
-
});
|
|
198
|
-
test("getEInvoiceStatus unwraps + validates against eInvoiceStatusOutput", async () => {
|
|
199
|
-
const result = await makeClient().getEInvoiceStatus("wf_1");
|
|
200
|
-
assertUnwrappedAndValid(result, eInvoiceStatusOutput);
|
|
201
|
-
});
|
|
202
|
-
test("getInvoiceEInvoice unwraps the object-data envelope", async () => {
|
|
203
|
-
const result = (await makeClient().getInvoiceEInvoice("inv_1"));
|
|
204
|
-
assert.equal("data" in result, false);
|
|
205
|
-
assert.equal("meta" in result, false);
|
|
206
|
-
assert.equal(result.xml, "<Invoice/>");
|
|
207
|
-
assert.equal(result.filename, "inv_1.xml");
|
|
208
|
-
});
|
|
209
|
-
test("getInvoiceEInvoice does NOT false-unwrap a non-object 'data' value", async () => {
|
|
210
|
-
// Guards the adversarial-review concern: requestUnwrapped only unwraps when
|
|
211
|
-
// `data` is itself a non-array OBJECT. A bare-string `data` (not an envelope,
|
|
212
|
-
// just a coincidentally-named field) must pass through untouched.
|
|
213
|
-
const result = await makeClient().getInvoiceEInvoice("plain-xml");
|
|
214
|
-
assert.deepEqual(result, { data: "<Invoice/>", meta: {} });
|
|
215
|
-
});
|
|
216
|
-
test("listInvoices is unaffected — keeps the raw { data: [...], total, ... } envelope", async () => {
|
|
217
|
-
const result = await makeClient().listInvoices();
|
|
218
|
-
assert.ok(Array.isArray(result.data), "list reads must keep data as an array");
|
|
219
|
-
assert.equal(result.total, 1);
|
|
220
|
-
assert.equal(result.data[0].id, "inv_1");
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
//# sourceMappingURL=get-envelope-unwrap-regression.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-envelope-unwrap-regression.test.js","sourceRoot":"","sources":["../../src/__tests__/get-envelope-unwrap-regression.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for duplicate_invoice (intelligence.ts).
|
|
3
|
-
*
|
|
4
|
-
* Bug: duplicate_invoice fetched the FULL raw stored invoice (getInvoice returns
|
|
5
|
-
* the entire Firestore doc) and spread it into createInvoice, only blacklisting
|
|
6
|
-
* 6 fields. The create endpoint validates against a Zod `.strict()` schema that
|
|
7
|
-
* REJECTS unknown keys → HTTP 400, so any paid/sent/cancelled/e-invoiced invoice
|
|
8
|
-
* failed to duplicate. Fix: allowlist-PICK only the writable create fields.
|
|
9
|
-
*
|
|
10
|
-
* This test asserts the body sent to createInvoice contains ONLY allowlisted
|
|
11
|
-
* fields (no payments/verifactu/operationType/documentNumber/total/…).
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=intelligence-duplicate-invoice.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intelligence-duplicate-invoice.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/intelligence-duplicate-invoice.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|