@frihet/mcp-server 1.16.3 → 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,421 +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
|
-
import { test, describe, beforeEach } from "node:test";
|
|
16
|
-
import assert from "node:assert/strict";
|
|
17
|
-
class StubMcpServer {
|
|
18
|
-
tools = new Map();
|
|
19
|
-
registerTool(name, config, handler) {
|
|
20
|
-
this.tools.set(name, { name, config, handler });
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
// ── Client stubs ─────────────────────────────────────────────────────────────
|
|
24
|
-
/** Simulates CF endpoint not yet deployed (returns 404). */
|
|
25
|
-
function make404Client() {
|
|
26
|
-
const notFound = () => {
|
|
27
|
-
const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
|
|
28
|
-
return Promise.reject(err);
|
|
29
|
-
};
|
|
30
|
-
return {
|
|
31
|
-
exportEInvoice: notFound,
|
|
32
|
-
faceSubmit: notFound,
|
|
33
|
-
faceStatus: notFound,
|
|
34
|
-
ticketbaiSubmit: notFound,
|
|
35
|
-
ticketbaiStatus: notFound,
|
|
36
|
-
// kSeFSubmit: not wired in client — tool is always-stub
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
/** Simulates a 403 Forbidden error (auth failure — should rethrow, not stub). */
|
|
40
|
-
function make403Client() {
|
|
41
|
-
const forbidden = () => {
|
|
42
|
-
const err = Object.assign(new Error("Forbidden"), { statusCode: 403, errorCode: "forbidden" });
|
|
43
|
-
return Promise.reject(err);
|
|
44
|
-
};
|
|
45
|
-
return {
|
|
46
|
-
exportEInvoice: forbidden,
|
|
47
|
-
faceSubmit: forbidden,
|
|
48
|
-
faceStatus: forbidden,
|
|
49
|
-
ticketbaiSubmit: forbidden,
|
|
50
|
-
ticketbaiStatus: forbidden,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Simulates a 500 from a LIVE CF — e.g. a real FACe/TicketBAI signature or
|
|
55
|
-
* submission failure. COMPLIANCE: must rethrow (isError), NEVER masked as a
|
|
56
|
-
* success stub. This is the case the genuine-404-only fallback contract guards.
|
|
57
|
-
*/
|
|
58
|
-
function make500Client() {
|
|
59
|
-
const serverError = () => {
|
|
60
|
-
const err = Object.assign(new Error("Signature/submission failed"), {
|
|
61
|
-
statusCode: 500,
|
|
62
|
-
errorCode: "signature_failed",
|
|
63
|
-
});
|
|
64
|
-
return Promise.reject(err);
|
|
65
|
-
};
|
|
66
|
-
return {
|
|
67
|
-
exportEInvoice: serverError,
|
|
68
|
-
faceSubmit: serverError,
|
|
69
|
-
faceStatus: serverError,
|
|
70
|
-
ticketbaiSubmit: serverError,
|
|
71
|
-
ticketbaiStatus: serverError,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
/** Simulates CF endpoints live and returning real data. */
|
|
75
|
-
function makeLiveClient() {
|
|
76
|
-
return {
|
|
77
|
-
exportEInvoice: async () => ({
|
|
78
|
-
xmlUrl: "https://storage.frihet.io/live/einvoice/inv_123-facturae.xml",
|
|
79
|
-
filename: "inv_123-facturae.xml",
|
|
80
|
-
format: "facturae",
|
|
81
|
-
signed: true,
|
|
82
|
-
}),
|
|
83
|
-
faceSubmit: async () => ({
|
|
84
|
-
registroFACe: "RCF_LIVE_20260513_001",
|
|
85
|
-
status: "submitted",
|
|
86
|
-
submittedAt: "2026-05-13T10:00:00.000Z",
|
|
87
|
-
mode: "production",
|
|
88
|
-
}),
|
|
89
|
-
faceStatus: async () => ({
|
|
90
|
-
registroFACe: "RCF_LIVE_20260513_001",
|
|
91
|
-
statusCode: "1400",
|
|
92
|
-
statusDescription: "Contabilizada",
|
|
93
|
-
rejectionReason: undefined,
|
|
94
|
-
}),
|
|
95
|
-
ticketbaiSubmit: async () => ({
|
|
96
|
-
tbaiId: "TBAI-00001-20260513-LIVE",
|
|
97
|
-
territory: "bizkaia",
|
|
98
|
-
status: "accepted",
|
|
99
|
-
sandbox: false,
|
|
100
|
-
qrUrl: "https://batuz.eus/QRTBAI/?id=TBAI-00001-20260513-LIVE",
|
|
101
|
-
}),
|
|
102
|
-
ticketbaiStatus: async () => ({
|
|
103
|
-
tbaiId: "TBAI-00001-20260513-LIVE",
|
|
104
|
-
territory: "bizkaia",
|
|
105
|
-
status: "accepted",
|
|
106
|
-
rejectionReason: undefined,
|
|
107
|
-
error: undefined,
|
|
108
|
-
}),
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
// ── Helper to register Day 4 tools on a fresh server ─────────────────────────
|
|
112
|
-
async function makeServer(client) {
|
|
113
|
-
const server = new StubMcpServer();
|
|
114
|
-
const { registerEInvoiceTools } = await import("../tools/einvoice.js");
|
|
115
|
-
registerEInvoiceTools(server, client);
|
|
116
|
-
return server;
|
|
117
|
-
}
|
|
118
|
-
// ── Registration tests ────────────────────────────────────────────────────────
|
|
119
|
-
describe("Day 4 E-Invoice Tools — Registration", () => {
|
|
120
|
-
let server;
|
|
121
|
-
beforeEach(async () => {
|
|
122
|
-
server = await makeServer(make404Client());
|
|
123
|
-
});
|
|
124
|
-
test("registers exactly 10 e-invoice tools (4 original + 6 Day 4)", () => {
|
|
125
|
-
assert.equal(server.tools.size, 10, `Expected 10 tools, got ${server.tools.size}`);
|
|
126
|
-
});
|
|
127
|
-
test("registers einvoice_export", () => {
|
|
128
|
-
assert.ok(server.tools.has("einvoice_export"), "einvoice_export not registered");
|
|
129
|
-
});
|
|
130
|
-
test("registers face_submit", () => {
|
|
131
|
-
assert.ok(server.tools.has("face_submit"), "face_submit not registered");
|
|
132
|
-
});
|
|
133
|
-
test("registers face_status", () => {
|
|
134
|
-
assert.ok(server.tools.has("face_status"), "face_status not registered");
|
|
135
|
-
});
|
|
136
|
-
test("registers ticketbai_submit", () => {
|
|
137
|
-
assert.ok(server.tools.has("ticketbai_submit"), "ticketbai_submit not registered");
|
|
138
|
-
});
|
|
139
|
-
test("registers ticketbai_status", () => {
|
|
140
|
-
assert.ok(server.tools.has("ticketbai_status"), "ticketbai_status not registered");
|
|
141
|
-
});
|
|
142
|
-
test("registers ksef_submit", () => {
|
|
143
|
-
assert.ok(server.tools.has("ksef_submit"), "ksef_submit not registered");
|
|
144
|
-
});
|
|
145
|
-
test("all Day 4 tools have titles", () => {
|
|
146
|
-
const day4 = ["einvoice_export", "face_submit", "face_status", "ticketbai_submit", "ticketbai_status", "ksef_submit"];
|
|
147
|
-
for (const name of day4) {
|
|
148
|
-
const tool = server.tools.get(name);
|
|
149
|
-
assert.ok(tool, `${name} not registered`);
|
|
150
|
-
assert.ok(tool.config.title, `${name} missing title`);
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
// ── einvoice_export tests ─────────────────────────────────────────────────────
|
|
155
|
-
describe("einvoice_export — 404 returns honest unavailable (no fabrication)", () => {
|
|
156
|
-
test("404 → isError + _unavailable, NO _stub, NO fabricated xmlUrl", async () => {
|
|
157
|
-
const server = await makeServer(make404Client());
|
|
158
|
-
const tool = server.tools.get("einvoice_export");
|
|
159
|
-
const result = await tool.handler({ invoiceId: "inv_001", format: "facturae", signed: true });
|
|
160
|
-
assert.equal(result["isError"], true);
|
|
161
|
-
const sc = result.structuredContent;
|
|
162
|
-
assert.equal(sc["_unavailable"], true);
|
|
163
|
-
assert.equal(sc["_stub"], undefined);
|
|
164
|
-
assert.equal(sc["xmlUrl"], undefined, "must not fabricate a download URL");
|
|
165
|
-
assert.equal(sc["tool"], "einvoice_export");
|
|
166
|
-
});
|
|
167
|
-
test("403 error returns isError response (not stub)", async () => {
|
|
168
|
-
const server = await makeServer(make403Client());
|
|
169
|
-
const tool = server.tools.get("einvoice_export");
|
|
170
|
-
const result = await tool.handler({ invoiceId: "inv_003", format: "ubl" });
|
|
171
|
-
// withToolLogging converts non-404 errors to error content — should NOT be a stub
|
|
172
|
-
assert.equal(result["isError"], true, "403 should produce isError response");
|
|
173
|
-
assert.equal(result.structuredContent?.["_stub"], undefined, "403 should not produce a stub");
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
describe("einvoice_export — live client", () => {
|
|
177
|
-
test("live → real xmlUrl from CF, no _stub flag", async () => {
|
|
178
|
-
const server = await makeServer(makeLiveClient());
|
|
179
|
-
const tool = server.tools.get("einvoice_export");
|
|
180
|
-
const result = await tool.handler({ invoiceId: "inv_123", format: "facturae", signed: true });
|
|
181
|
-
const sc = result.structuredContent;
|
|
182
|
-
assert.ok(sc["xmlUrl"].includes("live"));
|
|
183
|
-
assert.equal(sc["format"], "facturae");
|
|
184
|
-
assert.equal(sc["signed"], true);
|
|
185
|
-
assert.equal(sc["_stub"], undefined);
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
// ── face_submit tests ─────────────────────────────────────────────────────────
|
|
189
|
-
describe("face_submit — 404 returns honest unavailable (no fabrication)", () => {
|
|
190
|
-
test("404 → isError + _unavailable, NO _stub, NO fabricated registroFACe", async () => {
|
|
191
|
-
const server = await makeServer(make404Client());
|
|
192
|
-
const tool = server.tools.get("face_submit");
|
|
193
|
-
const result = await tool.handler({ invoiceId: "inv_face_001", mode: "production" });
|
|
194
|
-
assert.equal(result["isError"], true);
|
|
195
|
-
const sc = result.structuredContent;
|
|
196
|
-
assert.equal(sc["_unavailable"], true);
|
|
197
|
-
assert.equal(sc["_stub"], undefined);
|
|
198
|
-
assert.equal(sc["registroFACe"], undefined, "must not fabricate a FACe registro");
|
|
199
|
-
assert.equal(sc["status"], undefined);
|
|
200
|
-
});
|
|
201
|
-
test("403 error returns isError response (not stub)", async () => {
|
|
202
|
-
const server = await makeServer(make403Client());
|
|
203
|
-
const tool = server.tools.get("face_submit");
|
|
204
|
-
const result = await tool.handler({ invoiceId: "inv_face_403", mode: "production" });
|
|
205
|
-
assert.equal(result["isError"], true, "403 should produce isError response");
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
describe("face_submit — live client", () => {
|
|
209
|
-
test("live → real registroFACe, no _stub flag", async () => {
|
|
210
|
-
const server = await makeServer(makeLiveClient());
|
|
211
|
-
const tool = server.tools.get("face_submit");
|
|
212
|
-
const result = await tool.handler({ invoiceId: "inv_face_live", mode: "production" });
|
|
213
|
-
const sc = result.structuredContent;
|
|
214
|
-
assert.equal(sc["registroFACe"], "RCF_LIVE_20260513_001");
|
|
215
|
-
assert.equal(sc["status"], "submitted");
|
|
216
|
-
assert.equal(sc["_stub"], undefined);
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
// ── face_status tests ─────────────────────────────────────────────────────────
|
|
220
|
-
describe("face_status — 404 returns honest unavailable (no fabrication)", () => {
|
|
221
|
-
test("404 → isError + _unavailable, NO fabricated 1200/Registrada", async () => {
|
|
222
|
-
const server = await makeServer(make404Client());
|
|
223
|
-
const tool = server.tools.get("face_status");
|
|
224
|
-
const result = await tool.handler({ invoiceId: "inv_face_001" });
|
|
225
|
-
assert.equal(result["isError"], true);
|
|
226
|
-
const sc = result.structuredContent;
|
|
227
|
-
assert.equal(sc["_unavailable"], true);
|
|
228
|
-
assert.equal(sc["statusCode"], undefined, "must not fabricate a FACe status code");
|
|
229
|
-
assert.equal(sc["registroFACe"], undefined);
|
|
230
|
-
});
|
|
231
|
-
test("403 error returns isError response (not stub)", async () => {
|
|
232
|
-
const server = await makeServer(make403Client());
|
|
233
|
-
const tool = server.tools.get("face_status");
|
|
234
|
-
const result = await tool.handler({ invoiceId: "inv_face_403" });
|
|
235
|
-
assert.equal(result["isError"], true, "403 should produce isError response");
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
describe("face_status — live client", () => {
|
|
239
|
-
test("live → statusCode 1400 (Contabilizada), no _stub", async () => {
|
|
240
|
-
const server = await makeServer(makeLiveClient());
|
|
241
|
-
const tool = server.tools.get("face_status");
|
|
242
|
-
const result = await tool.handler({ invoiceId: "inv_face_live" });
|
|
243
|
-
const sc = result.structuredContent;
|
|
244
|
-
assert.equal(sc["statusCode"], "1400");
|
|
245
|
-
assert.equal(sc["statusDescription"], "Contabilizada");
|
|
246
|
-
assert.equal(sc["_stub"], undefined);
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
// ── ticketbai_submit tests ────────────────────────────────────────────────────
|
|
250
|
-
describe("ticketbai_submit — 404 returns honest unavailable (no fabrication)", () => {
|
|
251
|
-
test("404 → isError + _unavailable, NO fabricated tbaiId / qrUrl", async () => {
|
|
252
|
-
const server = await makeServer(make404Client());
|
|
253
|
-
const tool = server.tools.get("ticketbai_submit");
|
|
254
|
-
const result = await tool.handler({ invoiceId: "inv_tbai_001" });
|
|
255
|
-
assert.equal(result["isError"], true);
|
|
256
|
-
const sc = result.structuredContent;
|
|
257
|
-
assert.equal(sc["_unavailable"], true);
|
|
258
|
-
assert.equal(sc["tbaiId"], undefined, "must not fabricate a TBAI identifier");
|
|
259
|
-
assert.equal(sc["qrUrl"], undefined, "must not fabricate a QR url");
|
|
260
|
-
assert.equal(sc["status"], undefined);
|
|
261
|
-
});
|
|
262
|
-
test("403 error returns isError response (not stub)", async () => {
|
|
263
|
-
const server = await makeServer(make403Client());
|
|
264
|
-
const tool = server.tools.get("ticketbai_submit");
|
|
265
|
-
const result = await tool.handler({ invoiceId: "inv_tbai_403" });
|
|
266
|
-
assert.equal(result["isError"], true, "403 should produce isError response");
|
|
267
|
-
});
|
|
268
|
-
});
|
|
269
|
-
describe("ticketbai_submit — live client", () => {
|
|
270
|
-
test("live → real tbaiId, status=accepted, qrUrl present", async () => {
|
|
271
|
-
const server = await makeServer(makeLiveClient());
|
|
272
|
-
const tool = server.tools.get("ticketbai_submit");
|
|
273
|
-
const result = await tool.handler({ invoiceId: "inv_tbai_live" });
|
|
274
|
-
const sc = result.structuredContent;
|
|
275
|
-
assert.equal(sc["tbaiId"], "TBAI-00001-20260513-LIVE");
|
|
276
|
-
assert.equal(sc["status"], "accepted");
|
|
277
|
-
assert.ok(sc["qrUrl"].includes("TBAI"));
|
|
278
|
-
assert.equal(sc["_stub"], undefined);
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
// ── ticketbai_status tests ────────────────────────────────────────────────────
|
|
282
|
-
describe("ticketbai_status — 404 returns honest unavailable (no fabrication)", () => {
|
|
283
|
-
test("404 → isError + _unavailable, NO fabricated accepted status", async () => {
|
|
284
|
-
const server = await makeServer(make404Client());
|
|
285
|
-
const tool = server.tools.get("ticketbai_status");
|
|
286
|
-
const result = await tool.handler({ invoiceId: "inv_tbai_001" });
|
|
287
|
-
assert.equal(result["isError"], true);
|
|
288
|
-
const sc = result.structuredContent;
|
|
289
|
-
assert.equal(sc["_unavailable"], true);
|
|
290
|
-
assert.equal(sc["status"], undefined, "must not fabricate an accepted status");
|
|
291
|
-
assert.equal(sc["tbaiId"], undefined);
|
|
292
|
-
});
|
|
293
|
-
test("403 error returns isError response (not stub)", async () => {
|
|
294
|
-
const server = await makeServer(make403Client());
|
|
295
|
-
const tool = server.tools.get("ticketbai_status");
|
|
296
|
-
const result = await tool.handler({ invoiceId: "inv_tbai_403" });
|
|
297
|
-
assert.equal(result["isError"], true, "403 should produce isError response");
|
|
298
|
-
});
|
|
299
|
-
});
|
|
300
|
-
describe("ticketbai_status — live client", () => {
|
|
301
|
-
test("live → real tbaiId and accepted status", async () => {
|
|
302
|
-
const server = await makeServer(makeLiveClient());
|
|
303
|
-
const tool = server.tools.get("ticketbai_status");
|
|
304
|
-
const result = await tool.handler({ invoiceId: "inv_tbai_live" });
|
|
305
|
-
const sc = result.structuredContent;
|
|
306
|
-
assert.equal(sc["tbaiId"], "TBAI-00001-20260513-LIVE");
|
|
307
|
-
assert.equal(sc["status"], "accepted");
|
|
308
|
-
assert.equal(sc["_stub"], undefined);
|
|
309
|
-
});
|
|
310
|
-
});
|
|
311
|
-
// ── Compliance smoke: live CF wiring + real-failure-never-masked-as-success ───
|
|
312
|
-
//
|
|
313
|
-
// These 5 tools have a LIVE Cloud Function server-side (Frihet-ERP publicApi.ts).
|
|
314
|
-
// 1. On a live success the tool must return the REAL CF payload (no _stub flag),
|
|
315
|
-
// proving the client method (correct /invoices/:id/{...} path) was hit, not a stub.
|
|
316
|
-
// 2. On a 500 (genuine FACe/TicketBAI signature/submission failure) the tool must
|
|
317
|
-
// surface an error (isError) and MUST NOT emit a success stub. A masked failure
|
|
318
|
-
// would tell the user agent the invoice was submitted/accepted when it was not.
|
|
319
|
-
const LIVE_TOOLS = [
|
|
320
|
-
{
|
|
321
|
-
name: "einvoice_export",
|
|
322
|
-
args: { invoiceId: "inv_smoke", format: "facturae", signed: true },
|
|
323
|
-
liveAssert: (sc) => assert.ok(sc["xmlUrl"].includes("live")),
|
|
324
|
-
},
|
|
325
|
-
{
|
|
326
|
-
name: "face_submit",
|
|
327
|
-
args: { invoiceId: "inv_smoke", mode: "production" },
|
|
328
|
-
liveAssert: (sc) => assert.equal(sc["registroFACe"], "RCF_LIVE_20260513_001"),
|
|
329
|
-
},
|
|
330
|
-
{
|
|
331
|
-
name: "face_status",
|
|
332
|
-
args: { invoiceId: "inv_smoke" },
|
|
333
|
-
liveAssert: (sc) => assert.equal(sc["statusCode"], "1400"),
|
|
334
|
-
},
|
|
335
|
-
{
|
|
336
|
-
name: "ticketbai_submit",
|
|
337
|
-
args: { invoiceId: "inv_smoke" },
|
|
338
|
-
liveAssert: (sc) => assert.equal(sc["tbaiId"], "TBAI-00001-20260513-LIVE"),
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
name: "ticketbai_status",
|
|
342
|
-
args: { invoiceId: "inv_smoke" },
|
|
343
|
-
liveAssert: (sc) => assert.equal(sc["tbaiId"], "TBAI-00001-20260513-LIVE"),
|
|
344
|
-
},
|
|
345
|
-
];
|
|
346
|
-
describe("Compliance smoke — 5 live einvoice tools hit the real CF", () => {
|
|
347
|
-
for (const { name, args, liveAssert } of LIVE_TOOLS) {
|
|
348
|
-
test(`${name}: live → real CF payload, no _stub`, async () => {
|
|
349
|
-
const server = await makeServer(makeLiveClient());
|
|
350
|
-
const tool = server.tools.get(name);
|
|
351
|
-
const result = await tool.handler(args);
|
|
352
|
-
const sc = result.structuredContent;
|
|
353
|
-
assert.equal(sc["_stub"], undefined, `${name} returned a stub on a live CF response`);
|
|
354
|
-
assert.notEqual(result["isError"], true, `${name} reported isError on a live success`);
|
|
355
|
-
liveAssert(sc);
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
describe("Compliance smoke — real CF failure (500) never masked as success", () => {
|
|
360
|
-
for (const { name, args } of LIVE_TOOLS) {
|
|
361
|
-
test(`${name}: 500 → isError, NOT a success stub`, async () => {
|
|
362
|
-
const server = await makeServer(make500Client());
|
|
363
|
-
const tool = server.tools.get(name);
|
|
364
|
-
const result = await tool.handler(args);
|
|
365
|
-
// A genuine signature/submission failure must surface as an error...
|
|
366
|
-
assert.equal(result["isError"], true, `${name} did not surface 500 as an error`);
|
|
367
|
-
// ...and must NOT be dressed up as a successful stub.
|
|
368
|
-
const sc = (result.structuredContent ?? {});
|
|
369
|
-
assert.notEqual(sc["_stub"], true, `${name} masked a 500 failure as a success stub`);
|
|
370
|
-
assert.equal(sc["status"], undefined, `${name} emitted a success status on a 500 failure`);
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
});
|
|
374
|
-
// ── ksef_submit tests ─────────────────────────────────────────────────────────
|
|
375
|
-
describe("ksef_submit — always-stub (endpoint not yet exposed)", () => {
|
|
376
|
-
test("returns _notImplemented=true regardless of client", async () => {
|
|
377
|
-
// Test with both 404 and live clients — ksef_submit is always-stub
|
|
378
|
-
for (const clientFactory of [make404Client, makeLiveClient]) {
|
|
379
|
-
const server = await makeServer(clientFactory());
|
|
380
|
-
const tool = server.tools.get("ksef_submit");
|
|
381
|
-
const result = await tool.handler({ invoiceId: "inv_ksef_001", mode: "production" });
|
|
382
|
-
const sc = result.structuredContent;
|
|
383
|
-
assert.equal(sc["_notImplemented"], true, "_notImplemented should be true");
|
|
384
|
-
assert.ok(typeof sc["_note"] === "string", "_note should be present");
|
|
385
|
-
assert.ok(sc["_note"].includes("infra-ready"), "_note should reflect honest KSeF infra-ready status");
|
|
386
|
-
assert.ok(typeof sc["_plannedEndpoint"] === "string", "_plannedEndpoint should be set");
|
|
387
|
-
}
|
|
388
|
-
});
|
|
389
|
-
test("invoiceId and mode echoed back in structuredContent", async () => {
|
|
390
|
-
const server = await makeServer(make404Client());
|
|
391
|
-
const tool = server.tools.get("ksef_submit");
|
|
392
|
-
const result = await tool.handler({ invoiceId: "inv_ksef_002", mode: "sandbox" });
|
|
393
|
-
const sc = result.structuredContent;
|
|
394
|
-
assert.equal(sc["invoiceId"], "inv_ksef_002");
|
|
395
|
-
assert.equal(sc["mode"], "sandbox");
|
|
396
|
-
});
|
|
397
|
-
test("mode defaults to production when omitted", async () => {
|
|
398
|
-
const server = await makeServer(make404Client());
|
|
399
|
-
const tool = server.tools.get("ksef_submit");
|
|
400
|
-
const result = await tool.handler({ invoiceId: "inv_ksef_003" });
|
|
401
|
-
const sc = result.structuredContent;
|
|
402
|
-
assert.equal(sc["mode"], "production");
|
|
403
|
-
});
|
|
404
|
-
test("content block explains how to work around missing endpoint", async () => {
|
|
405
|
-
const server = await makeServer(make404Client());
|
|
406
|
-
const tool = server.tools.get("ksef_submit");
|
|
407
|
-
const result = await tool.handler({ invoiceId: "inv_ksef_004", mode: "mock" });
|
|
408
|
-
const text = result.content[0].text;
|
|
409
|
-
assert.ok(text.includes("infra-ready"), "Content should reflect honest unavailable/infra-ready status");
|
|
410
|
-
assert.ok(text.includes("einvoice_export"), "Content should suggest einvoice_export as workaround");
|
|
411
|
-
});
|
|
412
|
-
test("does not throw — always returns graceful stub", async () => {
|
|
413
|
-
const server = await makeServer(make404Client());
|
|
414
|
-
const tool = server.tools.get("ksef_submit");
|
|
415
|
-
// Should NOT throw even though endpoint doesn't exist
|
|
416
|
-
const result = await tool.handler({ invoiceId: "inv_ksef_005", mode: "production" });
|
|
417
|
-
assert.ok(result.content.length > 0);
|
|
418
|
-
assert.ok(result.structuredContent);
|
|
419
|
-
});
|
|
420
|
-
});
|
|
421
|
-
//# sourceMappingURL=einvoice-day4-tools.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"einvoice-day4-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/einvoice-day4-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for e-invoice MCP tools against live api.frihet.io.
|
|
3
|
-
*
|
|
4
|
-
* Skipped by default. Runs only when MCP_LIVE_TEST=true.
|
|
5
|
-
*
|
|
6
|
-
* Usage:
|
|
7
|
-
* MCP_LIVE_TEST=true FRIHET_API_KEY=fri_your_key npm test
|
|
8
|
-
*
|
|
9
|
-
* Manual QA path:
|
|
10
|
-
* 1. Set env vars above.
|
|
11
|
-
* 2. Run: npm run build && MCP_LIVE_TEST=true FRIHET_API_KEY=fri_xxx node --test dist/__tests__/einvoice-integration.test.js
|
|
12
|
-
* 3. Verify: each tool returns real data (no _stub flag) OR 404-fallback stub if CF endpoint is pending.
|
|
13
|
-
* 4. For send_einvoice: poll get_einvoice_status with the returned workflowRunId every 5s.
|
|
14
|
-
* 5. For validate_einvoice_xml: pass a minimal valid XRechnung CII document.
|
|
15
|
-
* 6. For export_datev: check the fileUrl is a signed URL valid for 24h.
|
|
16
|
-
*
|
|
17
|
-
* CF endpoint rollout schedule:
|
|
18
|
-
* - /v1/einvoice/send → 2026-04-21
|
|
19
|
-
* - /v1/einvoice/status/:id → 2026-04-21
|
|
20
|
-
* - /v1/einvoice/validate → 2026-04-24
|
|
21
|
-
* - /v1/einvoice/export-datev → 2026-04-28
|
|
22
|
-
*/
|
|
23
|
-
export {};
|
|
24
|
-
//# sourceMappingURL=einvoice-integration.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"einvoice-integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/einvoice-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for e-invoice MCP tools against live api.frihet.io.
|
|
3
|
-
*
|
|
4
|
-
* Skipped by default. Runs only when MCP_LIVE_TEST=true.
|
|
5
|
-
*
|
|
6
|
-
* Usage:
|
|
7
|
-
* MCP_LIVE_TEST=true FRIHET_API_KEY=fri_your_key npm test
|
|
8
|
-
*
|
|
9
|
-
* Manual QA path:
|
|
10
|
-
* 1. Set env vars above.
|
|
11
|
-
* 2. Run: npm run build && MCP_LIVE_TEST=true FRIHET_API_KEY=fri_xxx node --test dist/__tests__/einvoice-integration.test.js
|
|
12
|
-
* 3. Verify: each tool returns real data (no _stub flag) OR 404-fallback stub if CF endpoint is pending.
|
|
13
|
-
* 4. For send_einvoice: poll get_einvoice_status with the returned workflowRunId every 5s.
|
|
14
|
-
* 5. For validate_einvoice_xml: pass a minimal valid XRechnung CII document.
|
|
15
|
-
* 6. For export_datev: check the fileUrl is a signed URL valid for 24h.
|
|
16
|
-
*
|
|
17
|
-
* CF endpoint rollout schedule:
|
|
18
|
-
* - /v1/einvoice/send → 2026-04-21
|
|
19
|
-
* - /v1/einvoice/status/:id → 2026-04-21
|
|
20
|
-
* - /v1/einvoice/validate → 2026-04-24
|
|
21
|
-
* - /v1/einvoice/export-datev → 2026-04-28
|
|
22
|
-
*/
|
|
23
|
-
import { test, describe, before } from "node:test";
|
|
24
|
-
import assert from "node:assert/strict";
|
|
25
|
-
const LIVE = process.env["MCP_LIVE_TEST"] === "true";
|
|
26
|
-
const API_KEY = process.env["FRIHET_API_KEY"] ?? "";
|
|
27
|
-
const skip = (name, fn) => {
|
|
28
|
-
if (!LIVE) {
|
|
29
|
-
test(`[SKIPPED — set MCP_LIVE_TEST=true] ${name}`, () => {
|
|
30
|
-
// intentionally skipped
|
|
31
|
-
});
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
test(name, fn);
|
|
35
|
-
};
|
|
36
|
-
class StubMcpServer {
|
|
37
|
-
tools = new Map();
|
|
38
|
-
registerTool(name, config, handler) {
|
|
39
|
-
this.tools.set(name, { name, config, handler });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// ── Setup ────────────────────────────────────────────────────────────────────
|
|
43
|
-
describe("E-Invoice Integration Tests — live api.frihet.io", () => {
|
|
44
|
-
let tools;
|
|
45
|
-
before(async () => {
|
|
46
|
-
if (!LIVE)
|
|
47
|
-
return;
|
|
48
|
-
if (!API_KEY)
|
|
49
|
-
throw new Error("FRIHET_API_KEY env var required for live tests");
|
|
50
|
-
const { FrihetClient } = await import("../client.js");
|
|
51
|
-
const { registerEInvoiceTools } = await import("../tools/einvoice.js");
|
|
52
|
-
const client = new FrihetClient(API_KEY);
|
|
53
|
-
const server = new StubMcpServer();
|
|
54
|
-
registerEInvoiceTools(server, client);
|
|
55
|
-
tools = server.tools;
|
|
56
|
-
});
|
|
57
|
-
// ── send_einvoice ──
|
|
58
|
-
skip("send_einvoice — dispatches invoice or returns 404-fallback stub", async () => {
|
|
59
|
-
const tool = tools.get("send_einvoice");
|
|
60
|
-
// Use a known test invoice ID from your Frihet sandbox
|
|
61
|
-
const result = await tool.handler({
|
|
62
|
-
invoiceId: process.env["TEST_INVOICE_ID"] ?? "inv_test_integration",
|
|
63
|
-
format: "xrechnung-cii",
|
|
64
|
-
dispatchMode: "download",
|
|
65
|
-
});
|
|
66
|
-
const sc = result.structuredContent;
|
|
67
|
-
if (sc["_stub"]) {
|
|
68
|
-
// CF endpoint not yet deployed — fallback is correct
|
|
69
|
-
assert.equal(sc["_note"], "CF endpoint pending deploy");
|
|
70
|
-
assert.ok(typeof sc["_plannedEndpoint"] === "string");
|
|
71
|
-
console.log("send_einvoice: 404-fallback stub (CF not yet deployed)");
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
// Live response
|
|
75
|
-
assert.ok(typeof sc["workflowRunId"] === "string", "workflowRunId should be string");
|
|
76
|
-
assert.equal(sc["status"], "queued");
|
|
77
|
-
assert.ok(typeof sc["estimatedCompletionSec"] === "number");
|
|
78
|
-
console.log(`send_einvoice: queued workflowRunId=${sc["workflowRunId"]}`);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
// ── get_einvoice_status ──
|
|
82
|
-
skip("get_einvoice_status — polls status or returns 404-fallback stub", async () => {
|
|
83
|
-
const tool = tools.get("get_einvoice_status");
|
|
84
|
-
const result = await tool.handler({
|
|
85
|
-
workflowRunId: process.env["TEST_WORKFLOW_RUN_ID"] ?? "wfr_test_integration",
|
|
86
|
-
});
|
|
87
|
-
const sc = result.structuredContent;
|
|
88
|
-
if (sc["_stub"]) {
|
|
89
|
-
assert.equal(sc["_note"], "CF endpoint pending deploy");
|
|
90
|
-
console.log("get_einvoice_status: 404-fallback stub (CF not yet deployed)");
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
const validStatuses = ["queued", "running", "succeeded", "failed", "cancelled"];
|
|
94
|
-
assert.ok(validStatuses.includes(sc["status"]), `unexpected status: ${sc["status"]}`);
|
|
95
|
-
console.log(`get_einvoice_status: status=${sc["status"]} step=${sc["step"]}`);
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
// ── validate_einvoice_xml ──
|
|
99
|
-
skip("validate_einvoice_xml — validates XML or returns 404-fallback stub", async () => {
|
|
100
|
-
const tool = tools.get("validate_einvoice_xml");
|
|
101
|
-
// Minimal XRechnung CII document (intentionally invalid to test error reporting)
|
|
102
|
-
const minimalXml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
103
|
-
<rsm:CrossIndustryInvoice xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100">
|
|
104
|
-
<rsm:ExchangedDocumentContext/>
|
|
105
|
-
<rsm:ExchangedDocument/>
|
|
106
|
-
<rsm:SupplyChainTradeTransaction/>
|
|
107
|
-
</rsm:CrossIndustryInvoice>`;
|
|
108
|
-
const result = await tool.handler({ xml: minimalXml, format: "xrechnung-cii" });
|
|
109
|
-
const sc = result.structuredContent;
|
|
110
|
-
if (sc["_stub"]) {
|
|
111
|
-
assert.equal(sc["_note"], "CF endpoint pending deploy");
|
|
112
|
-
console.log("validate_einvoice_xml: 404-fallback stub (CF not yet deployed)");
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
assert.ok(typeof sc["valid"] === "boolean");
|
|
116
|
-
assert.ok(Array.isArray(sc["errors"]));
|
|
117
|
-
assert.ok(typeof sc["durationMs"] === "number");
|
|
118
|
-
console.log(`validate_einvoice_xml: valid=${sc["valid"]} errors=${sc["errors"].length} durationMs=${sc["durationMs"]}`);
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
// ── export_datev ──
|
|
122
|
-
skip("export_datev — exports DATEV EXTF or returns 404-fallback stub", async () => {
|
|
123
|
-
const tool = tools.get("export_datev");
|
|
124
|
-
const result = await tool.handler({
|
|
125
|
-
periodStart: "2026-01-01",
|
|
126
|
-
periodEnd: "2026-01-31",
|
|
127
|
-
format: "extf-buchungsstapel",
|
|
128
|
-
});
|
|
129
|
-
const sc = result.structuredContent;
|
|
130
|
-
if (sc["_stub"]) {
|
|
131
|
-
assert.equal(sc["_note"], "CF endpoint pending deploy");
|
|
132
|
-
console.log("export_datev: 404-fallback stub (CF not yet deployed)");
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
assert.ok(typeof sc["fileUrl"] === "string" && sc["fileUrl"].startsWith("https://"));
|
|
136
|
-
assert.equal(sc["encoding"], "cp1252");
|
|
137
|
-
assert.ok(typeof sc["rowCount"] === "number");
|
|
138
|
-
console.log(`export_datev: filename=${sc["filename"]} rowCount=${sc["rowCount"]} fileUrl=${sc["fileUrl"]}`);
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
//# sourceMappingURL=einvoice-integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"einvoice-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/einvoice-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC;AACrD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;AAEpD,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAuB,EAAE,EAAE;IACrD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,CAAC,sCAAsC,IAAI,EAAE,EAAE,GAAG,EAAE;YACtD,wBAAwB;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACjB,CAAC,CAAC;AAuBF,MAAM,aAAa;IACjB,KAAK,GAAgC,IAAI,GAAG,EAAE,CAAC;IAC/C,YAAY,CAAC,IAAY,EAAE,MAAkB,EAAE,OAAoB;QACjE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;CACF;AAED,gFAAgF;AAEhF,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,IAAI,KAAkC,CAAC;IAEvC,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAEhF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,qBAAqB,CACnB,MAAgF,EAChF,MAAM,CACP,CAAC;QACF,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,sBAAsB;IAEtB,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAE,CAAC;QACzC,uDAAuD;QACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAChC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,sBAAsB;YACnE,MAAM,EAAE,eAAe;YACvB,YAAY,EAAE,UAAU;SACzB,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAChB,qDAAqD;YACrD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,4BAA4B,CAAC,CAAC;YACxD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,kBAAkB,CAAC,KAAK,QAAQ,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,gBAAgB;YAChB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,KAAK,QAAQ,EAAE,gCAAgC,CAAC,CAAC;YACrF,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YACrC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,wBAAwB,CAAC,KAAK,QAAQ,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAE5B,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAChC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,sBAAsB;SAC7E,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,4BAA4B,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YAChF,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAW,CAAC,EAAE,sBAAsB,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChG,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAE9B,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAE,CAAC;QACjD,iFAAiF;QACjF,MAAM,UAAU,GAAG;;;;;4BAKK,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QAChF,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,4BAA4B,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;YAC5C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,CAAC,OAAO,CAAC,WAAY,EAAE,CAAC,QAAQ,CAAe,CAAC,MAAM,eAAe,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACzI,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qBAAqB;IAErB,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAChC,WAAW,EAAE,YAAY;YACzB,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,qBAAqB;SAC9B,CAAC,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,4BAA4B,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,KAAK,QAAQ,IAAK,EAAE,CAAC,SAAS,CAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;YACjG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|