@yoryoboy/bi-mcp 1.13.0 → 1.14.2
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/dist/.tsbuildinfo +1 -1
- package/dist/index.js +30 -0
- package/dist/index.js.map +2 -2
- package/dist/mcp-use.json +2 -2
- package/dist/src/services/vtex/__tests__/vtex-payments.test.js +98 -0
- package/dist/src/services/vtex/__tests__/vtex-payments.test.js.map +7 -0
- package/dist/src/services/vtex/vtex-payments-write.js +64 -0
- package/dist/src/services/vtex/vtex-payments-write.js.map +7 -0
- package/dist/src/services/vtex/vtex-payments.js +49 -0
- package/dist/src/services/vtex/vtex-payments.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/commercial-condition-references.test.js +14 -0
- package/dist/src/tools/vtex/__tests__/commercial-condition-references.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js +107 -0
- package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/payment-rules.test.js +254 -0
- package/dist/src/tools/vtex/__tests__/payment-rules.test.js.map +7 -0
- package/dist/src/tools/vtex/catalog-admin-products-skus.js +3 -1
- package/dist/src/tools/vtex/catalog-admin-products-skus.js.map +2 -2
- package/dist/src/tools/vtex/commercial-conditions.js +105 -0
- package/dist/src/tools/vtex/commercial-conditions.js.map +7 -0
- package/dist/src/tools/vtex/create-sku.js +3 -1
- package/dist/src/tools/vtex/create-sku.js.map +2 -2
- package/dist/src/tools/vtex/index.js +2 -0
- package/dist/src/tools/vtex/index.js.map +2 -2
- package/dist/src/tools/vtex/payment-rules.js +272 -0
- package/dist/src/tools/vtex/payment-rules.js.map +7 -0
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +34 -0
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +7 -0
- package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js +151 -0
- package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js.map +7 -0
- package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js +182 -0
- package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js.map +7 -0
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { getVtexApiClients } from "./vtex-api.js";
|
|
2
|
+
function normalizeCommercialConditionId(value) {
|
|
3
|
+
return String(value);
|
|
4
|
+
}
|
|
5
|
+
function normalizePayload(payload) {
|
|
6
|
+
if (payload.commercialConditionId === void 0) {
|
|
7
|
+
return payload;
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
...payload,
|
|
11
|
+
commercialConditionId: normalizeCommercialConditionId(payload.commercialConditionId)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async function createCommercialCondition(profileId, payload) {
|
|
15
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
16
|
+
const response = await vtexApi.post(
|
|
17
|
+
"/api/payments/pvt/commercial-condition",
|
|
18
|
+
payload
|
|
19
|
+
);
|
|
20
|
+
return response.data;
|
|
21
|
+
}
|
|
22
|
+
async function updateCommercialCondition(profileId, commercialConditionId, payload) {
|
|
23
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
24
|
+
const response = await vtexApi.put(
|
|
25
|
+
`/api/payments/pvt/commercial-condition/${normalizeCommercialConditionId(commercialConditionId)}`,
|
|
26
|
+
payload
|
|
27
|
+
);
|
|
28
|
+
return response.data;
|
|
29
|
+
}
|
|
30
|
+
async function deleteCommercialCondition(profileId, commercialConditionId) {
|
|
31
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
32
|
+
await vtexApi.delete(
|
|
33
|
+
`/api/payments/pvt/commercial-condition/${normalizeCommercialConditionId(commercialConditionId)}`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
async function createPaymentRule(profileId, payload) {
|
|
37
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
38
|
+
const response = await vtexApi.post(
|
|
39
|
+
"/api/pvt/rules",
|
|
40
|
+
normalizePayload(payload)
|
|
41
|
+
);
|
|
42
|
+
return response.data;
|
|
43
|
+
}
|
|
44
|
+
async function updatePaymentRule(profileId, ruleId, payload) {
|
|
45
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
46
|
+
const response = await vtexApi.put(
|
|
47
|
+
`/api/pvt/rules/${ruleId}`,
|
|
48
|
+
normalizePayload(payload)
|
|
49
|
+
);
|
|
50
|
+
return response.data;
|
|
51
|
+
}
|
|
52
|
+
async function deletePaymentRule(profileId, ruleId) {
|
|
53
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
54
|
+
await vtexApi.delete(`/api/pvt/rules/${ruleId}`);
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
createCommercialCondition,
|
|
58
|
+
createPaymentRule,
|
|
59
|
+
deleteCommercialCondition,
|
|
60
|
+
deletePaymentRule,
|
|
61
|
+
updateCommercialCondition,
|
|
62
|
+
updatePaymentRule
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=vtex-payments-write.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/services/vtex/vtex-payments-write.ts"],
|
|
4
|
+
"sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type VtexPaymentWriteRecord = Record<string, unknown>;\n\nexport interface VtexPaymentRuleWritePayload extends VtexPaymentWriteRecord {\n commercialConditionId?: number;\n}\n\nfunction normalizeCommercialConditionId(value: number): string {\n return String(value);\n}\n\nfunction normalizePayload(payload: VtexPaymentRuleWritePayload): VtexPaymentWriteRecord {\n if (payload.commercialConditionId === undefined) {\n return payload;\n }\n\n return {\n ...payload,\n commercialConditionId: normalizeCommercialConditionId(payload.commercialConditionId),\n };\n}\n\nexport async function createCommercialCondition(\n profileId: string,\n payload: VtexPaymentWriteRecord\n): Promise<VtexPaymentWriteRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<VtexPaymentWriteRecord>(\n \"/api/payments/pvt/commercial-condition\",\n payload\n );\n\n return response.data;\n}\n\nexport async function updateCommercialCondition(\n profileId: string,\n commercialConditionId: number,\n payload: VtexPaymentWriteRecord\n): Promise<VtexPaymentWriteRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.put<VtexPaymentWriteRecord>(\n `/api/payments/pvt/commercial-condition/${normalizeCommercialConditionId(commercialConditionId)}`,\n payload\n );\n\n return response.data;\n}\n\nexport async function deleteCommercialCondition(\n profileId: string,\n commercialConditionId: number\n): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.delete(\n `/api/payments/pvt/commercial-condition/${normalizeCommercialConditionId(commercialConditionId)}`\n );\n}\n\nexport async function createPaymentRule(\n profileId: string,\n payload: VtexPaymentRuleWritePayload\n): Promise<VtexPaymentWriteRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<VtexPaymentWriteRecord>(\n \"/api/pvt/rules\",\n normalizePayload(payload)\n );\n\n return response.data;\n}\n\nexport async function updatePaymentRule(\n profileId: string,\n ruleId: number,\n payload: VtexPaymentRuleWritePayload\n): Promise<VtexPaymentWriteRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.put<VtexPaymentWriteRecord>(\n `/api/pvt/rules/${ruleId}`,\n normalizePayload(payload)\n );\n\n return response.data;\n}\n\nexport async function deletePaymentRule(profileId: string, ruleId: number): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.delete(`/api/pvt/rules/${ruleId}`);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,yBAAyB;AAQlC,SAAS,+BAA+B,OAAuB;AAC7D,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,iBAAiB,SAA8D;AACtF,MAAI,QAAQ,0BAA0B,QAAW;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,uBAAuB,+BAA+B,QAAQ,qBAAqB;AAAA,EACrF;AACF;AAEA,eAAsB,0BACpB,WACA,SACiC;AACjC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,0BACpB,WACA,uBACA,SACiC;AACjC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,0CAA0C,+BAA+B,qBAAqB,CAAC;AAAA,IAC/F;AAAA,EACF;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,0BACpB,WACA,uBACe;AACf,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,QAAQ;AAAA,IACZ,0CAA0C,+BAA+B,qBAAqB,CAAC;AAAA,EACjG;AACF;AAEA,eAAsB,kBACpB,WACA,SACiC;AACjC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B;AAAA,IACA,iBAAiB,OAAO;AAAA,EAC1B;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,kBACpB,WACA,QACA,SACiC;AACjC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,kBAAkB,MAAM;AAAA,IACxB,iBAAiB,OAAO;AAAA,EAC1B;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,kBAAkB,WAAmB,QAA+B;AACxF,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,QAAQ,OAAO,kBAAkB,MAAM,EAAE;AACjD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { getVtexApiClients } from "./vtex-api.js";
|
|
2
|
+
function toRecordArray(data) {
|
|
3
|
+
if (!Array.isArray(data)) {
|
|
4
|
+
return [];
|
|
5
|
+
}
|
|
6
|
+
return data.filter((item) => item !== null && typeof item === "object");
|
|
7
|
+
}
|
|
8
|
+
function normalizeCommercialConditionId(value) {
|
|
9
|
+
return String(value);
|
|
10
|
+
}
|
|
11
|
+
function matchesCommercialConditionSearch(record, search) {
|
|
12
|
+
if (!search) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
const normalizedSearch = search.trim().toLowerCase();
|
|
16
|
+
const name = [record.name, record.Name].find((value) => typeof value === "string");
|
|
17
|
+
return typeof name === "string" && name.toLowerCase().includes(normalizedSearch);
|
|
18
|
+
}
|
|
19
|
+
async function listCommercialConditions(profileId, search) {
|
|
20
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
21
|
+
const response = await vtexApi.get("/api/catalog_system/pvt/commercialcondition/list");
|
|
22
|
+
return toRecordArray(response.data).filter((record) => matchesCommercialConditionSearch(record, search));
|
|
23
|
+
}
|
|
24
|
+
async function getCommercialCondition(profileId, commercialConditionId) {
|
|
25
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
26
|
+
const response = await vtexApi.get(
|
|
27
|
+
`/api/catalog_system/pvt/commercialcondition/${normalizeCommercialConditionId(commercialConditionId)}`
|
|
28
|
+
);
|
|
29
|
+
return response.data;
|
|
30
|
+
}
|
|
31
|
+
async function listPaymentRules(profileId, filters) {
|
|
32
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
33
|
+
const response = await vtexApi.get("/api/pvt/rules", {
|
|
34
|
+
params: filters?.commercialConditionId === void 0 ? void 0 : { commercialConditionId: normalizeCommercialConditionId(filters.commercialConditionId) }
|
|
35
|
+
});
|
|
36
|
+
return toRecordArray(response.data);
|
|
37
|
+
}
|
|
38
|
+
async function getPaymentRule(profileId, ruleId) {
|
|
39
|
+
const { vtexApi } = await getVtexApiClients(profileId);
|
|
40
|
+
const response = await vtexApi.get(`/api/pvt/rules/${ruleId}`);
|
|
41
|
+
return response.data;
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
getCommercialCondition,
|
|
45
|
+
getPaymentRule,
|
|
46
|
+
listCommercialConditions,
|
|
47
|
+
listPaymentRules
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=vtex-payments.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/services/vtex/vtex-payments.ts"],
|
|
4
|
+
"sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type VtexPaymentRecord = Record<string, unknown>;\n\nfunction toRecordArray(data: unknown): VtexPaymentRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.filter((item): item is VtexPaymentRecord => item !== null && typeof item === \"object\");\n}\n\nfunction normalizeCommercialConditionId(value: number): string {\n return String(value);\n}\n\nfunction matchesCommercialConditionSearch(record: VtexPaymentRecord, search?: string): boolean {\n if (!search) {\n return true;\n }\n\n const normalizedSearch = search.trim().toLowerCase();\n const name = [record.name, record.Name].find((value): value is string => typeof value === \"string\");\n\n return typeof name === \"string\" && name.toLowerCase().includes(normalizedSearch);\n}\n\nexport async function listCommercialConditions(\n profileId: string,\n search?: string\n): Promise<VtexPaymentRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/commercialcondition/list\");\n\n return toRecordArray(response.data).filter((record) => matchesCommercialConditionSearch(record, search));\n}\n\nexport async function getCommercialCondition(\n profileId: string,\n commercialConditionId: number\n): Promise<VtexPaymentRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<VtexPaymentRecord>(\n `/api/catalog_system/pvt/commercialcondition/${normalizeCommercialConditionId(commercialConditionId)}`\n );\n\n return response.data;\n}\n\nexport async function listPaymentRules(\n profileId: string,\n filters?: { commercialConditionId?: number }\n): Promise<VtexPaymentRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/pvt/rules\", {\n params:\n filters?.commercialConditionId === undefined\n ? undefined\n : { commercialConditionId: normalizeCommercialConditionId(filters.commercialConditionId) },\n });\n\n return toRecordArray(response.data);\n}\n\nexport async function getPaymentRule(profileId: string, ruleId: number): Promise<VtexPaymentRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<VtexPaymentRecord>(`/api/pvt/rules/${ruleId}`);\n\n return response.data;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,yBAAyB;AAIlC,SAAS,cAAc,MAAoC;AACzD,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,KAAK,OAAO,CAAC,SAAoC,SAAS,QAAQ,OAAO,SAAS,QAAQ;AACnG;AAEA,SAAS,+BAA+B,OAAuB;AAC7D,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,iCAAiC,QAA2B,QAA0B;AAC7F,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,OAAO,KAAK,EAAE,YAAY;AACnD,QAAM,OAAO,CAAC,OAAO,MAAM,OAAO,IAAI,EAAE,KAAK,CAAC,UAA2B,OAAO,UAAU,QAAQ;AAElG,SAAO,OAAO,SAAS,YAAY,KAAK,YAAY,EAAE,SAAS,gBAAgB;AACjF;AAEA,eAAsB,yBACpB,WACA,QAC8B;AAC9B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,kDAAkD;AAE9F,SAAO,cAAc,SAAS,IAAI,EAAE,OAAO,CAAC,WAAW,iCAAiC,QAAQ,MAAM,CAAC;AACzG;AAEA,eAAsB,uBACpB,WACA,uBAC4B;AAC5B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,+CAA+C,+BAA+B,qBAAqB,CAAC;AAAA,EACtG;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,iBACpB,WACA,SAC8B;AAC9B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,kBAAkB;AAAA,IAC5D,QACE,SAAS,0BAA0B,SAC/B,SACA,EAAE,uBAAuB,+BAA+B,QAAQ,qBAAqB,EAAE;AAAA,EAC/F,CAAC;AAED,SAAO,cAAc,SAAS,IAAI;AACpC;AAEA,eAAsB,eAAe,WAAmB,QAA4C;AAClG,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAuB,kBAAkB,MAAM,EAAE;AAEhF,SAAO,SAAS;AAClB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
const createSkuModule = await import("../create-sku.js");
|
|
3
|
+
const updateSkuModule = await import("../catalog-admin-products-skus.js");
|
|
4
|
+
describe("commercial condition field references", () => {
|
|
5
|
+
it("points SKU commercialConditionId fields to the action-based management tools", () => {
|
|
6
|
+
const createDescription = createSkuModule.createSkuSchema.shape.commercialConditionId.description;
|
|
7
|
+
const updateDescription = updateSkuModule.updateSkuBasicFieldsSchema.shape.commercialConditionId.description;
|
|
8
|
+
expect(createDescription).toContain("vtex_commercial_conditions");
|
|
9
|
+
expect(createDescription).toContain("vtex_payment_rules");
|
|
10
|
+
expect(updateDescription).toContain("vtex_commercial_conditions");
|
|
11
|
+
expect(updateDescription).toContain("vtex_payment_rules");
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=commercial-condition-references.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/tools/vtex/__tests__/commercial-condition-references.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\nconst createSkuModule = await import(\"../create-sku.js\");\nconst updateSkuModule = await import(\"../catalog-admin-products-skus.js\");\n\ndescribe(\"commercial condition field references\", () => {\n it(\"points SKU commercialConditionId fields to the action-based management tools\", () => {\n const createDescription = createSkuModule.createSkuSchema.shape.commercialConditionId.description;\n const updateDescription = updateSkuModule.updateSkuBasicFieldsSchema.shape.commercialConditionId.description;\n\n expect(createDescription).toContain(\"vtex_commercial_conditions\");\n expect(createDescription).toContain(\"vtex_payment_rules\");\n expect(updateDescription).toContain(\"vtex_commercial_conditions\");\n expect(updateDescription).toContain(\"vtex_payment_rules\");\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,MAAM,kBAAkB,MAAM,OAAO,kBAAkB;AACvD,MAAM,kBAAkB,MAAM,OAAO,mCAAmC;AAExE,SAAS,yCAAyC,MAAM;AACtD,KAAG,gFAAgF,MAAM;AACvF,UAAM,oBAAoB,gBAAgB,gBAAgB,MAAM,sBAAsB;AACtF,UAAM,oBAAoB,gBAAgB,2BAA2B,MAAM,sBAAsB;AAEjG,WAAO,iBAAiB,EAAE,UAAU,4BAA4B;AAChE,WAAO,iBAAiB,EAAE,UAAU,oBAAoB;AACxD,WAAO,iBAAiB,EAAE,UAAU,4BAA4B;AAChE,WAAO,iBAAiB,EAAE,UAAU,oBAAoB;AAAA,EAC1D,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
const objectMock = vi.fn((value) => ({ kind: "object", value }));
|
|
4
|
+
const errorMock = vi.fn((message) => ({ kind: "error", message }));
|
|
5
|
+
const listCommercialConditionsMock = vi.fn();
|
|
6
|
+
const getCommercialConditionMock = vi.fn();
|
|
7
|
+
vi.mock("mcp-use/server", () => ({
|
|
8
|
+
object: objectMock,
|
|
9
|
+
error: errorMock
|
|
10
|
+
}));
|
|
11
|
+
vi.mock("../../../services/vtex/vtex-payments.js", () => ({
|
|
12
|
+
listCommercialConditions: listCommercialConditionsMock,
|
|
13
|
+
getCommercialCondition: getCommercialConditionMock
|
|
14
|
+
}));
|
|
15
|
+
vi.mock("../write-helpers.js", () => ({
|
|
16
|
+
vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe("profile")
|
|
17
|
+
}));
|
|
18
|
+
const module = await import("../commercial-conditions.js");
|
|
19
|
+
describe("vtex_commercial_conditions tool", () => {
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
vi.clearAllMocks();
|
|
22
|
+
});
|
|
23
|
+
it("requires profileId and validates numeric commercialConditionId across actions", () => {
|
|
24
|
+
expect(() => module.commercialConditionsSchema.parse({ action: "list" })).toThrow();
|
|
25
|
+
expect(
|
|
26
|
+
() => module.commercialConditionsSchema.parse({
|
|
27
|
+
action: "get",
|
|
28
|
+
profileId: "profile-1",
|
|
29
|
+
commercialConditionId: 1.5
|
|
30
|
+
})
|
|
31
|
+
).toThrow();
|
|
32
|
+
expect(
|
|
33
|
+
module.commercialConditionsSchema.parse({
|
|
34
|
+
action: "list",
|
|
35
|
+
profileId: "profile-1",
|
|
36
|
+
search: "9 cuotas"
|
|
37
|
+
})
|
|
38
|
+
).toEqual({
|
|
39
|
+
action: "list",
|
|
40
|
+
profileId: "profile-1",
|
|
41
|
+
search: "9 cuotas"
|
|
42
|
+
});
|
|
43
|
+
expect(
|
|
44
|
+
module.commercialConditionsSchema.parse({
|
|
45
|
+
action: "get",
|
|
46
|
+
profileId: "profile-1",
|
|
47
|
+
commercialConditionId: 10
|
|
48
|
+
})
|
|
49
|
+
).toEqual({
|
|
50
|
+
action: "get",
|
|
51
|
+
profileId: "profile-1",
|
|
52
|
+
commercialConditionId: 10
|
|
53
|
+
});
|
|
54
|
+
expect(
|
|
55
|
+
() => module.commercialConditionsSchema.parse({
|
|
56
|
+
action: "create",
|
|
57
|
+
profileId: "profile-1",
|
|
58
|
+
name: "9 cuotas"
|
|
59
|
+
})
|
|
60
|
+
).toThrow();
|
|
61
|
+
});
|
|
62
|
+
it("returns compact list responses for commercial conditions", async () => {
|
|
63
|
+
listCommercialConditionsMock.mockResolvedValue([
|
|
64
|
+
{ id: 10, name: "9 cuotas", isActive: true },
|
|
65
|
+
{ id: 11, name: "12 cuotas", IsActive: false }
|
|
66
|
+
]);
|
|
67
|
+
const result = await module.commercialConditionsHandler({
|
|
68
|
+
action: "list",
|
|
69
|
+
profileId: "profile-1",
|
|
70
|
+
search: "cuotas"
|
|
71
|
+
});
|
|
72
|
+
expect(listCommercialConditionsMock).toHaveBeenCalledWith("profile-1", "cuotas");
|
|
73
|
+
expect(result).toEqual({
|
|
74
|
+
kind: "object",
|
|
75
|
+
value: {
|
|
76
|
+
metadata: {
|
|
77
|
+
total: 2,
|
|
78
|
+
profile_id: "profile-1",
|
|
79
|
+
search: "cuotas"
|
|
80
|
+
},
|
|
81
|
+
conditions_schema: ["id", "name", "is_active"],
|
|
82
|
+
conditions: [
|
|
83
|
+
[10, "9 cuotas", true],
|
|
84
|
+
[11, "12 cuotas", false]
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
it("gets commercial conditions through the service layer", async () => {
|
|
90
|
+
getCommercialConditionMock.mockResolvedValueOnce({ id: 10, name: "9 cuotas", isActive: true });
|
|
91
|
+
const fetched = await module.commercialConditionsHandler({
|
|
92
|
+
action: "get",
|
|
93
|
+
profileId: "profile-1",
|
|
94
|
+
commercialConditionId: 10
|
|
95
|
+
});
|
|
96
|
+
expect(getCommercialConditionMock).toHaveBeenCalledWith("profile-1", 10);
|
|
97
|
+
expect(fetched).toEqual({
|
|
98
|
+
kind: "object",
|
|
99
|
+
value: {
|
|
100
|
+
profile_id: "profile-1",
|
|
101
|
+
commercial_condition_id: 10,
|
|
102
|
+
condition: { id: 10, name: "9 cuotas", is_active: true }
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=commercial-conditions.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/tools/vtex/__tests__/commercial-conditions.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\nconst listCommercialConditionsMock = vi.fn();\nconst getCommercialConditionMock = vi.fn();\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-payments.js\", () => ({\n listCommercialConditions: listCommercialConditionsMock,\n getCommercialCondition: getCommercialConditionMock,\n}));\n\nvi.mock(\"../write-helpers.js\", () => ({\n vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe(\"profile\"),\n}));\n\nconst module = await import(\"../commercial-conditions.js\");\n\ndescribe(\"vtex_commercial_conditions tool\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"requires profileId and validates numeric commercialConditionId across actions\", () => {\n expect(() => module.commercialConditionsSchema.parse({ action: \"list\" })).toThrow();\n expect(() =>\n module.commercialConditionsSchema.parse({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 1.5,\n })\n ).toThrow();\n\n expect(\n module.commercialConditionsSchema.parse({\n action: \"list\",\n profileId: \"profile-1\",\n search: \"9 cuotas\",\n })\n ).toEqual({\n action: \"list\",\n profileId: \"profile-1\",\n search: \"9 cuotas\",\n });\n\n expect(\n module.commercialConditionsSchema.parse({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n })\n ).toEqual({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n\n expect(() =>\n module.commercialConditionsSchema.parse({\n action: \"create\",\n profileId: \"profile-1\",\n name: \"9 cuotas\",\n })\n ).toThrow();\n });\n\n it(\"returns compact list responses for commercial conditions\", async () => {\n listCommercialConditionsMock.mockResolvedValue([\n { id: 10, name: \"9 cuotas\", isActive: true },\n { id: 11, name: \"12 cuotas\", IsActive: false },\n ]);\n\n const result = await module.commercialConditionsHandler({\n action: \"list\",\n profileId: \"profile-1\",\n search: \"cuotas\",\n });\n\n expect(listCommercialConditionsMock).toHaveBeenCalledWith(\"profile-1\", \"cuotas\");\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 2,\n profile_id: \"profile-1\",\n search: \"cuotas\",\n },\n conditions_schema: [\"id\", \"name\", \"is_active\"],\n conditions: [\n [10, \"9 cuotas\", true],\n [11, \"12 cuotas\", false],\n ],\n },\n });\n });\n\n it(\"gets commercial conditions through the service layer\", async () => {\n getCommercialConditionMock.mockResolvedValueOnce({ id: 10, name: \"9 cuotas\", isActive: true });\n\n const fetched = await module.commercialConditionsHandler({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n\n expect(getCommercialConditionMock).toHaveBeenCalledWith(\"profile-1\", 10);\n expect(fetched).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n commercial_condition_id: 10,\n condition: { id: 10, name: \"9 cuotas\", is_active: true },\n },\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,SAAS;AAClB,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AAErD,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,EAAE,MAAM,UAAU,MAAM,EAAE;AAC/D,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,EAAE,MAAM,SAAS,QAAQ,EAAE;AACjE,MAAM,+BAA+B,GAAG,GAAG;AAC3C,MAAM,6BAA6B,GAAG,GAAG;AAEzC,GAAG,KAAK,kBAAkB,OAAO;AAAA,EAC/B,QAAQ;AAAA,EACR,OAAO;AACT,EAAE;AAEF,GAAG,KAAK,2CAA2C,OAAO;AAAA,EACxD,0BAA0B;AAAA,EAC1B,wBAAwB;AAC1B,EAAE;AAEF,GAAG,KAAK,uBAAuB,OAAO;AAAA,EACpC,0BAA0B,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,SAAS;AAClF,EAAE;AAEF,MAAM,SAAS,MAAM,OAAO,6BAA6B;AAEzD,SAAS,mCAAmC,MAAM;AAChD,aAAW,MAAM;AACf,OAAG,cAAc;AAAA,EACnB,CAAC;AAED,KAAG,iFAAiF,MAAM;AACxF,WAAO,MAAM,OAAO,2BAA2B,MAAM,EAAE,QAAQ,OAAO,CAAC,CAAC,EAAE,QAAQ;AAClF;AAAA,MAAO,MACL,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,uBAAuB;AAAA,MACzB,CAAC;AAAA,IACH,EAAE,QAAQ;AAEV;AAAA,MACE,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAED;AAAA,MACE,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,uBAAuB;AAAA,MACzB,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,uBAAuB;AAAA,IACzB,CAAC;AAED;AAAA,MAAO,MACL,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,MACR,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,EACZ,CAAC;AAED,KAAG,4DAA4D,YAAY;AACzE,iCAA6B,kBAAkB;AAAA,MAC7C,EAAE,IAAI,IAAI,MAAM,YAAY,UAAU,KAAK;AAAA,MAC3C,EAAE,IAAI,IAAI,MAAM,aAAa,UAAU,MAAM;AAAA,IAC/C,CAAC;AAED,UAAM,SAAS,MAAM,OAAO,4BAA4B;AAAA,MACtD,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,4BAA4B,EAAE,qBAAqB,aAAa,QAAQ;AAC/E,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU;AAAA,UACR,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,QAAQ;AAAA,QACV;AAAA,QACA,mBAAmB,CAAC,MAAM,QAAQ,WAAW;AAAA,QAC7C,YAAY;AAAA,UACV,CAAC,IAAI,YAAY,IAAI;AAAA,UACrB,CAAC,IAAI,aAAa,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,KAAG,wDAAwD,YAAY;AACrE,+BAA2B,sBAAsB,EAAE,IAAI,IAAI,MAAM,YAAY,UAAU,KAAK,CAAC;AAE7F,UAAM,UAAU,MAAM,OAAO,4BAA4B;AAAA,MACvD,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,uBAAuB;AAAA,IACzB,CAAC;AAED,WAAO,0BAA0B,EAAE,qBAAqB,aAAa,EAAE;AACvE,WAAO,OAAO,EAAE,QAAQ;AAAA,MACtB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,yBAAyB;AAAA,QACzB,WAAW,EAAE,IAAI,IAAI,MAAM,YAAY,WAAW,KAAK;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
const objectMock = vi.fn((value) => ({ kind: "object", value }));
|
|
4
|
+
const errorMock = vi.fn((message) => ({ kind: "error", message }));
|
|
5
|
+
const listPaymentRulesMock = vi.fn();
|
|
6
|
+
const getPaymentRuleMock = vi.fn();
|
|
7
|
+
const createPaymentRuleMock = vi.fn();
|
|
8
|
+
const updatePaymentRuleMock = vi.fn();
|
|
9
|
+
const deletePaymentRuleMock = vi.fn();
|
|
10
|
+
const resolveVtexWriteProfileMock = vi.fn();
|
|
11
|
+
const buildWriteSuccessResponseMock = vi.fn((value) => ({ kind: "write", value }));
|
|
12
|
+
const handleVtexWriteErrorMock = vi.fn((_err, fallback) => ({ kind: "error", message: fallback }));
|
|
13
|
+
const requireExplicitConfirmationMock = vi.fn();
|
|
14
|
+
vi.mock("mcp-use/server", () => ({
|
|
15
|
+
object: objectMock,
|
|
16
|
+
error: errorMock
|
|
17
|
+
}));
|
|
18
|
+
vi.mock("../../../services/vtex/vtex-payments.js", () => ({
|
|
19
|
+
listPaymentRules: listPaymentRulesMock,
|
|
20
|
+
getPaymentRule: getPaymentRuleMock
|
|
21
|
+
}));
|
|
22
|
+
vi.mock("../../../services/vtex/vtex-payments-write.js", () => ({
|
|
23
|
+
createPaymentRule: createPaymentRuleMock,
|
|
24
|
+
updatePaymentRule: updatePaymentRuleMock,
|
|
25
|
+
deletePaymentRule: deletePaymentRuleMock
|
|
26
|
+
}));
|
|
27
|
+
vi.mock("../write-helpers.js", () => ({
|
|
28
|
+
vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe("profile"),
|
|
29
|
+
confirmationSchemaField: z.boolean().optional().describe("confirmed"),
|
|
30
|
+
resolveVtexWriteProfile: resolveVtexWriteProfileMock,
|
|
31
|
+
buildWriteSuccessResponse: buildWriteSuccessResponseMock,
|
|
32
|
+
handleVtexWriteError: handleVtexWriteErrorMock,
|
|
33
|
+
requireExplicitConfirmation: requireExplicitConfirmationMock
|
|
34
|
+
}));
|
|
35
|
+
const module = await import("../payment-rules.js");
|
|
36
|
+
describe("vtex_payment_rules tool", () => {
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
vi.clearAllMocks();
|
|
39
|
+
resolveVtexWriteProfileMock.mockResolvedValue({
|
|
40
|
+
ok: true,
|
|
41
|
+
value: { profileId: "profile-1" }
|
|
42
|
+
});
|
|
43
|
+
requireExplicitConfirmationMock.mockReturnValue(null);
|
|
44
|
+
});
|
|
45
|
+
it("requires profileId and validates payment rule action payloads", () => {
|
|
46
|
+
expect(() => module.paymentRulesSchema.parse({ action: "list" })).toThrow();
|
|
47
|
+
expect(
|
|
48
|
+
() => module.paymentRulesSchema.parse({
|
|
49
|
+
action: "create",
|
|
50
|
+
profileId: "profile-1",
|
|
51
|
+
commercialConditionId: 10,
|
|
52
|
+
paymentSystem: "2"
|
|
53
|
+
})
|
|
54
|
+
).toThrow(/installments/i);
|
|
55
|
+
expect(
|
|
56
|
+
module.paymentRulesSchema.parse({
|
|
57
|
+
action: "create",
|
|
58
|
+
profileId: "profile-1",
|
|
59
|
+
commercialConditionId: 10,
|
|
60
|
+
paymentSystem: "2",
|
|
61
|
+
salesChannel: "1",
|
|
62
|
+
restrictedByCondition: true,
|
|
63
|
+
installments: [
|
|
64
|
+
{ count: 9, interest: false },
|
|
65
|
+
{ count: 12, interest: true }
|
|
66
|
+
]
|
|
67
|
+
})
|
|
68
|
+
).toEqual({
|
|
69
|
+
action: "create",
|
|
70
|
+
profileId: "profile-1",
|
|
71
|
+
commercialConditionId: 10,
|
|
72
|
+
paymentSystem: "2",
|
|
73
|
+
salesChannel: "1",
|
|
74
|
+
restrictedByCondition: true,
|
|
75
|
+
installments: [
|
|
76
|
+
{ count: 9, interest: false },
|
|
77
|
+
{ count: 12, interest: true }
|
|
78
|
+
]
|
|
79
|
+
});
|
|
80
|
+
expect(
|
|
81
|
+
module.paymentRulesSchema.parse({
|
|
82
|
+
action: "delete",
|
|
83
|
+
profileId: "profile-1",
|
|
84
|
+
ruleId: 77,
|
|
85
|
+
confirmed: true
|
|
86
|
+
})
|
|
87
|
+
).toEqual({
|
|
88
|
+
action: "delete",
|
|
89
|
+
profileId: "profile-1",
|
|
90
|
+
ruleId: 77,
|
|
91
|
+
confirmed: true
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
it("returns compact list responses for payment rules", async () => {
|
|
95
|
+
listPaymentRulesMock.mockResolvedValue([
|
|
96
|
+
{
|
|
97
|
+
id: 51,
|
|
98
|
+
commercialConditionId: 10,
|
|
99
|
+
paymentSystem: "2",
|
|
100
|
+
salesChannel: "1",
|
|
101
|
+
restrictedByCondition: true
|
|
102
|
+
}
|
|
103
|
+
]);
|
|
104
|
+
const result = await module.paymentRulesHandler({
|
|
105
|
+
action: "list",
|
|
106
|
+
profileId: "profile-1",
|
|
107
|
+
commercialConditionId: 10
|
|
108
|
+
});
|
|
109
|
+
expect(listPaymentRulesMock).toHaveBeenCalledWith("profile-1", { commercialConditionId: 10 });
|
|
110
|
+
expect(result).toEqual({
|
|
111
|
+
kind: "object",
|
|
112
|
+
value: {
|
|
113
|
+
metadata: {
|
|
114
|
+
total: 1,
|
|
115
|
+
profile_id: "profile-1",
|
|
116
|
+
filters: { commercial_condition_id: 10 }
|
|
117
|
+
},
|
|
118
|
+
payment_rules_schema: [
|
|
119
|
+
"id",
|
|
120
|
+
"commercial_condition_id",
|
|
121
|
+
"payment_system",
|
|
122
|
+
"sales_channel",
|
|
123
|
+
"restricted_by_condition"
|
|
124
|
+
],
|
|
125
|
+
payment_rules: [[51, 10, "2", "1", true]]
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
it("gets, creates, updates and deletes payment rules through the service layer", async () => {
|
|
130
|
+
getPaymentRuleMock.mockResolvedValue({
|
|
131
|
+
id: 51,
|
|
132
|
+
commercialConditionId: 10,
|
|
133
|
+
paymentSystem: "2",
|
|
134
|
+
installments: [{ count: 9, interest: false }]
|
|
135
|
+
});
|
|
136
|
+
createPaymentRuleMock.mockResolvedValue({ id: 51, paymentSystem: "2" });
|
|
137
|
+
updatePaymentRuleMock.mockResolvedValue({ id: 51, paymentSystem: "2" });
|
|
138
|
+
deletePaymentRuleMock.mockResolvedValue(void 0);
|
|
139
|
+
const fetched = await module.paymentRulesHandler({
|
|
140
|
+
action: "get",
|
|
141
|
+
profileId: "profile-1",
|
|
142
|
+
ruleId: 51
|
|
143
|
+
});
|
|
144
|
+
const created = await module.paymentRulesHandler({
|
|
145
|
+
action: "create",
|
|
146
|
+
profileId: "profile-1",
|
|
147
|
+
commercialConditionId: 10,
|
|
148
|
+
paymentSystem: "2",
|
|
149
|
+
installments: [{ count: 9, interest: false }]
|
|
150
|
+
});
|
|
151
|
+
const updated = await module.paymentRulesHandler({
|
|
152
|
+
action: "update",
|
|
153
|
+
profileId: "profile-1",
|
|
154
|
+
ruleId: 51,
|
|
155
|
+
installments: [{ count: 12, interest: true }]
|
|
156
|
+
});
|
|
157
|
+
const deleted = await module.paymentRulesHandler({
|
|
158
|
+
action: "delete",
|
|
159
|
+
profileId: "profile-1",
|
|
160
|
+
ruleId: 51,
|
|
161
|
+
confirmed: true
|
|
162
|
+
});
|
|
163
|
+
expect(getPaymentRuleMock).toHaveBeenCalledWith("profile-1", 51);
|
|
164
|
+
expect(fetched).toEqual({
|
|
165
|
+
kind: "object",
|
|
166
|
+
value: {
|
|
167
|
+
profile_id: "profile-1",
|
|
168
|
+
rule_id: 51,
|
|
169
|
+
payment_rule: {
|
|
170
|
+
id: 51,
|
|
171
|
+
commercial_condition_id: 10,
|
|
172
|
+
payment_system: "2",
|
|
173
|
+
installments: [{ count: 9, interest: false }]
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
expect(createPaymentRuleMock).toHaveBeenCalledWith("profile-1", {
|
|
178
|
+
commercialConditionId: 10,
|
|
179
|
+
paymentSystem: "2",
|
|
180
|
+
installments: [{ count: 9, interest: false }]
|
|
181
|
+
});
|
|
182
|
+
expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(
|
|
183
|
+
1,
|
|
184
|
+
expect.objectContaining({
|
|
185
|
+
operation: "payment_rules_create",
|
|
186
|
+
resourceId: "51",
|
|
187
|
+
message: "Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience.",
|
|
188
|
+
after: { id: 51, paymentSystem: "2" }
|
|
189
|
+
})
|
|
190
|
+
);
|
|
191
|
+
expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(
|
|
192
|
+
2,
|
|
193
|
+
expect.objectContaining({
|
|
194
|
+
operation: "payment_rules_update",
|
|
195
|
+
resourceId: "51",
|
|
196
|
+
message: "Payment rule updated. Review checkout installments to confirm the expected payment options.",
|
|
197
|
+
after: { id: 51, paymentSystem: "2" }
|
|
198
|
+
})
|
|
199
|
+
);
|
|
200
|
+
expect(updatePaymentRuleMock).toHaveBeenCalledWith("profile-1", 51, {
|
|
201
|
+
installments: [{ count: 12, interest: true }]
|
|
202
|
+
});
|
|
203
|
+
expect(deletePaymentRuleMock).toHaveBeenCalledWith("profile-1", 51);
|
|
204
|
+
expect(created).toMatchObject({
|
|
205
|
+
kind: "write",
|
|
206
|
+
value: {
|
|
207
|
+
operation: "payment_rules_create",
|
|
208
|
+
riskLevel: "medium",
|
|
209
|
+
message: "Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience."
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
expect(updated).toMatchObject({
|
|
213
|
+
kind: "write",
|
|
214
|
+
value: {
|
|
215
|
+
operation: "payment_rules_update",
|
|
216
|
+
riskLevel: "medium",
|
|
217
|
+
message: "Payment rule updated. Review checkout installments to confirm the expected payment options."
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
expect(deleted).toMatchObject({
|
|
221
|
+
kind: "write",
|
|
222
|
+
value: {
|
|
223
|
+
operation: "payment_rules_delete",
|
|
224
|
+
riskLevel: "high",
|
|
225
|
+
warnings: [
|
|
226
|
+
"Deleting a payment rule can immediately remove installment options from checkout for affected shoppers."
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
expect(JSON.stringify(created)).not.toContain("sandbox");
|
|
231
|
+
expect(JSON.stringify(created)).not.toContain("production");
|
|
232
|
+
expect(JSON.stringify(created)).not.toContain("legacy");
|
|
233
|
+
expect(JSON.stringify(updated)).not.toContain("sandbox");
|
|
234
|
+
expect(JSON.stringify(updated)).not.toContain("production");
|
|
235
|
+
expect(JSON.stringify(updated)).not.toContain("legacy");
|
|
236
|
+
});
|
|
237
|
+
it("requires explicit confirmation before deleting a payment rule", async () => {
|
|
238
|
+
requireExplicitConfirmationMock.mockReturnValueOnce({
|
|
239
|
+
kind: "object",
|
|
240
|
+
value: { success: false, risk_level: "high" }
|
|
241
|
+
});
|
|
242
|
+
const result = await module.paymentRulesHandler({
|
|
243
|
+
action: "delete",
|
|
244
|
+
profileId: "profile-1",
|
|
245
|
+
ruleId: 51
|
|
246
|
+
});
|
|
247
|
+
expect(deletePaymentRuleMock).not.toHaveBeenCalled();
|
|
248
|
+
expect(result).toEqual({
|
|
249
|
+
kind: "object",
|
|
250
|
+
value: { success: false, risk_level: "high" }
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
//# sourceMappingURL=payment-rules.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/tools/vtex/__tests__/payment-rules.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\nconst listPaymentRulesMock = vi.fn();\nconst getPaymentRuleMock = vi.fn();\nconst createPaymentRuleMock = vi.fn();\nconst updatePaymentRuleMock = vi.fn();\nconst deletePaymentRuleMock = vi.fn();\nconst resolveVtexWriteProfileMock = vi.fn();\nconst buildWriteSuccessResponseMock = vi.fn((value) => ({ kind: \"write\", value }));\nconst handleVtexWriteErrorMock = vi.fn((_err, fallback) => ({ kind: \"error\", message: fallback }));\nconst requireExplicitConfirmationMock = vi.fn();\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-payments.js\", () => ({\n listPaymentRules: listPaymentRulesMock,\n getPaymentRule: getPaymentRuleMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-payments-write.js\", () => ({\n createPaymentRule: createPaymentRuleMock,\n updatePaymentRule: updatePaymentRuleMock,\n deletePaymentRule: deletePaymentRuleMock,\n}));\n\nvi.mock(\"../write-helpers.js\", () => ({\n vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe(\"profile\"),\n confirmationSchemaField: z.boolean().optional().describe(\"confirmed\"),\n resolveVtexWriteProfile: resolveVtexWriteProfileMock,\n buildWriteSuccessResponse: buildWriteSuccessResponseMock,\n handleVtexWriteError: handleVtexWriteErrorMock,\n requireExplicitConfirmation: requireExplicitConfirmationMock,\n}));\n\nconst module = await import(\"../payment-rules.js\");\n\ndescribe(\"vtex_payment_rules tool\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n resolveVtexWriteProfileMock.mockResolvedValue({\n ok: true,\n value: { profileId: \"profile-1\" },\n });\n requireExplicitConfirmationMock.mockReturnValue(null);\n });\n\n it(\"requires profileId and validates payment rule action payloads\", () => {\n expect(() => module.paymentRulesSchema.parse({ action: \"list\" })).toThrow();\n expect(() =>\n module.paymentRulesSchema.parse({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n })\n ).toThrow(/installments/i);\n\n expect(\n module.paymentRulesSchema.parse({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n salesChannel: \"1\",\n restrictedByCondition: true,\n installments: [\n { count: 9, interest: false },\n { count: 12, interest: true },\n ],\n })\n ).toEqual({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n salesChannel: \"1\",\n restrictedByCondition: true,\n installments: [\n { count: 9, interest: false },\n { count: 12, interest: true },\n ],\n });\n\n expect(\n module.paymentRulesSchema.parse({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 77,\n confirmed: true,\n })\n ).toEqual({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 77,\n confirmed: true,\n });\n });\n\n it(\"returns compact list responses for payment rules\", async () => {\n listPaymentRulesMock.mockResolvedValue([\n {\n id: 51,\n commercialConditionId: 10,\n paymentSystem: \"2\",\n salesChannel: \"1\",\n restrictedByCondition: true,\n },\n ]);\n\n const result = await module.paymentRulesHandler({\n action: \"list\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n\n expect(listPaymentRulesMock).toHaveBeenCalledWith(\"profile-1\", { commercialConditionId: 10 });\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 1,\n profile_id: \"profile-1\",\n filters: { commercial_condition_id: 10 },\n },\n payment_rules_schema: [\n \"id\",\n \"commercial_condition_id\",\n \"payment_system\",\n \"sales_channel\",\n \"restricted_by_condition\",\n ],\n payment_rules: [[51, 10, \"2\", \"1\", true]],\n },\n });\n });\n\n it(\"gets, creates, updates and deletes payment rules through the service layer\", async () => {\n getPaymentRuleMock.mockResolvedValue({\n id: 51,\n commercialConditionId: 10,\n paymentSystem: \"2\",\n installments: [{ count: 9, interest: false }],\n });\n createPaymentRuleMock.mockResolvedValue({ id: 51, paymentSystem: \"2\" });\n updatePaymentRuleMock.mockResolvedValue({ id: 51, paymentSystem: \"2\" });\n deletePaymentRuleMock.mockResolvedValue(undefined);\n\n const fetched = await module.paymentRulesHandler({\n action: \"get\",\n profileId: \"profile-1\",\n ruleId: 51,\n });\n const created = await module.paymentRulesHandler({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n installments: [{ count: 9, interest: false }],\n });\n const updated = await module.paymentRulesHandler({\n action: \"update\",\n profileId: \"profile-1\",\n ruleId: 51,\n installments: [{ count: 12, interest: true }],\n });\n const deleted = await module.paymentRulesHandler({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 51,\n confirmed: true,\n });\n\n expect(getPaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", 51);\n expect(fetched).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n rule_id: 51,\n payment_rule: {\n id: 51,\n commercial_condition_id: 10,\n payment_system: \"2\",\n installments: [{ count: 9, interest: false }],\n },\n },\n });\n expect(createPaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", {\n commercialConditionId: 10,\n paymentSystem: \"2\",\n installments: [{ count: 9, interest: false }],\n });\n expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n operation: \"payment_rules_create\",\n resourceId: \"51\",\n message:\n \"Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience.\",\n after: { id: 51, paymentSystem: \"2\" },\n })\n );\n expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({\n operation: \"payment_rules_update\",\n resourceId: \"51\",\n message:\n \"Payment rule updated. Review checkout installments to confirm the expected payment options.\",\n after: { id: 51, paymentSystem: \"2\" },\n })\n );\n expect(updatePaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", 51, {\n installments: [{ count: 12, interest: true }],\n });\n expect(deletePaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", 51);\n expect(created).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_create\",\n riskLevel: \"medium\",\n message:\n \"Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience.\",\n },\n });\n expect(updated).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_update\",\n riskLevel: \"medium\",\n message:\n \"Payment rule updated. Review checkout installments to confirm the expected payment options.\",\n },\n });\n expect(deleted).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_delete\",\n riskLevel: \"high\",\n warnings: [\n \"Deleting a payment rule can immediately remove installment options from checkout for affected shoppers.\",\n ],\n },\n });\n expect(JSON.stringify(created)).not.toContain(\"sandbox\");\n expect(JSON.stringify(created)).not.toContain(\"production\");\n expect(JSON.stringify(created)).not.toContain(\"legacy\");\n expect(JSON.stringify(updated)).not.toContain(\"sandbox\");\n expect(JSON.stringify(updated)).not.toContain(\"production\");\n expect(JSON.stringify(updated)).not.toContain(\"legacy\");\n });\n\n it(\"requires explicit confirmation before deleting a payment rule\", async () => {\n requireExplicitConfirmationMock.mockReturnValueOnce({\n kind: \"object\",\n value: { success: false, risk_level: \"high\" },\n });\n\n const result = await module.paymentRulesHandler({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 51,\n });\n\n expect(deletePaymentRuleMock).not.toHaveBeenCalled();\n expect(result).toEqual({\n kind: \"object\",\n value: { success: false, risk_level: \"high\" },\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -125,7 +125,9 @@ const updateSkuBasicFieldsSchema = z.object({
|
|
|
125
125
|
measurementUnit: z.string().optional().describe("Measurement unit."),
|
|
126
126
|
unitMultiplier: z.number().positive().optional().describe("Unit multiplier."),
|
|
127
127
|
manufacturerCode: z.string().optional().describe("Manufacturer code."),
|
|
128
|
-
commercialConditionId: z.number().int().positive().optional().describe(
|
|
128
|
+
commercialConditionId: z.number().int().positive().optional().describe(
|
|
129
|
+
"Commercial condition ID. Use vtex_commercial_conditions to inspect available condition IDs and vtex_payment_rules to configure linked installment/payment behavior."
|
|
130
|
+
),
|
|
129
131
|
isActive: z.boolean().optional().describe("Whether the SKU should remain active."),
|
|
130
132
|
activateIfPossible: z.boolean().optional().describe("Whether VTEX should auto-activate the SKU when possible.")
|
|
131
133
|
}).refine(
|