globalpayments-api 3.11.1 → 3.11.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/src/Entities/UPA/ScanData.d.ts +17 -0
  3. package/lib/src/Entities/UPA/ScanData.js +22 -0
  4. package/lib/src/Entities/UPA/ScanData.js.map +1 -0
  5. package/lib/src/Entities/UPA/index.d.ts +1 -0
  6. package/lib/src/Entities/UPA/index.js +1 -0
  7. package/lib/src/Entities/UPA/index.js.map +1 -1
  8. package/lib/src/Terminals/Abstractions/IDeviceInterface.d.ts +2 -1
  9. package/lib/src/Terminals/Abstractions/IDeviceResponse.d.ts +1 -0
  10. package/lib/src/Terminals/Builders/TerminalManageBuilder.js +2 -0
  11. package/lib/src/Terminals/Builders/TerminalManageBuilder.js.map +1 -1
  12. package/lib/src/Terminals/DeviceInterface.d.ts +1 -0
  13. package/lib/src/Terminals/DeviceInterface.js +4 -0
  14. package/lib/src/Terminals/DeviceInterface.js.map +1 -1
  15. package/lib/src/Terminals/UPA/Entities/UpaMessageId.d.ts +2 -1
  16. package/lib/src/Terminals/UPA/Entities/UpaMessageId.js +1 -0
  17. package/lib/src/Terminals/UPA/Entities/UpaMessageId.js.map +1 -1
  18. package/lib/src/Terminals/UPA/Reponses/TransactionResponse.d.ts +1 -0
  19. package/lib/src/Terminals/UPA/Reponses/TransactionResponse.js +3 -0
  20. package/lib/src/Terminals/UPA/Reponses/TransactionResponse.js.map +1 -1
  21. package/lib/src/Terminals/UPA/UpaController.js +35 -0
  22. package/lib/src/Terminals/UPA/UpaController.js.map +1 -1
  23. package/lib/src/Terminals/UPA/UpaInterface.d.ts +2 -0
  24. package/lib/src/Terminals/UPA/UpaInterface.js +39 -0
  25. package/lib/src/Terminals/UPA/UpaInterface.js.map +1 -1
  26. package/lib/test/Unit/Terminals/UPA/Reponses/BatchList.test.d.ts +1 -0
  27. package/lib/test/Unit/Terminals/UPA/Reponses/BatchList.test.js +64 -0
  28. package/lib/test/Unit/Terminals/UPA/Reponses/BatchList.test.js.map +1 -0
  29. package/lib/test/Unit/Terminals/UPA/Reponses/BatchReportResponse.test.d.ts +1 -0
  30. package/lib/test/Unit/Terminals/UPA/Reponses/BatchReportResponse.test.js +145 -0
  31. package/lib/test/Unit/Terminals/UPA/Reponses/BatchReportResponse.test.js.map +1 -0
  32. package/lib/test/Unit/Terminals/UPA/Reponses/OpenTabDetailsResponse.test.d.ts +1 -0
  33. package/lib/test/Unit/Terminals/UPA/Reponses/OpenTabDetailsResponse.test.js +70 -0
  34. package/lib/test/Unit/Terminals/UPA/Reponses/OpenTabDetailsResponse.test.js.map +1 -0
  35. package/lib/test/Unit/Terminals/UPA/Reponses/SafReportResponse.test.d.ts +1 -0
  36. package/lib/test/Unit/Terminals/UPA/Reponses/SafReportResponse.test.js +112 -0
  37. package/lib/test/Unit/Terminals/UPA/Reponses/SafReportResponse.test.js.map +1 -0
  38. package/lib/test/Unit/Terminals/UPA/Reponses/UpaEODResponse.test.d.ts +1 -0
  39. package/lib/test/Unit/Terminals/UPA/Reponses/UpaEODResponse.test.js +108 -0
  40. package/lib/test/Unit/Terminals/UPA/Reponses/UpaEODResponse.test.js.map +1 -0
  41. package/lib/test/Unit/Terminals/UPA/Reponses/UpaSAFResponse.test.d.ts +1 -0
  42. package/lib/test/Unit/Terminals/UPA/Reponses/UpaSAFResponse.test.js +95 -0
  43. package/lib/test/Unit/Terminals/UPA/Reponses/UpaSAFResponse.test.js.map +1 -0
  44. package/lib/test/Unit/Terminals/UPA/UpaScan.test.d.ts +1 -0
  45. package/lib/test/Unit/Terminals/UPA/UpaScan.test.js +146 -0
  46. package/lib/test/Unit/Terminals/UPA/UpaScan.test.js.map +1 -0
  47. package/lib/test/Unit/Terminals/UPA/UpaVoid.test.d.ts +1 -0
  48. package/lib/test/Unit/Terminals/UPA/UpaVoid.test.js +225 -0
  49. package/lib/test/Unit/Terminals/UPA/UpaVoid.test.js.map +1 -0
  50. package/package.json +2 -2
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Live-device unit tests for UpaSAFResponse (ISAFResponse contract).
5
+ *
6
+ * Exercises sendStoreAndForward() and deleteSaf() over live MITC and
7
+ * asserts every mapped field on UpaSAFResponse plus every optional
8
+ * bucket declared by ISAFResponse per UPA §12.4.14 / §12.4.15.
9
+ *
10
+ * No mocks — this test only runs against a real device+gateway.
11
+ */
12
+ const src_1 = require("../../../../../src");
13
+ const UpaSAFResponse_1 = require("../../../../../src/Terminals/UPA/Reponses/UpaSAFResponse");
14
+ const UpaHelpertest_1 = require("../UpaHelpertest");
15
+ jest.setTimeout(240000);
16
+ function sleep(delayMs) {
17
+ return new Promise((resolve) => setTimeout(resolve, delayMs));
18
+ }
19
+ async function settleDevice(delayMs = 8000) {
20
+ if (UpaHelpertest_1.useLiveMic) {
21
+ await sleep(delayMs);
22
+ }
23
+ }
24
+ afterEach(async () => {
25
+ await settleDevice();
26
+ });
27
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Response – UpaSAFResponse (all fields, live MITC)", () => {
28
+ let device;
29
+ beforeEach(() => {
30
+ device = (0, UpaHelpertest_1.createTestDevice)();
31
+ });
32
+ test("sendStoreAndForward() populates every IDeviceResponse + ISAFResponse field", async () => {
33
+ const response = (await device.sendStoreAndForward());
34
+ expect(response).toBeInstanceOf(UpaSAFResponse_1.UpaSAFResponse);
35
+ expect(response.command).toBe("SendSAF");
36
+ expect(typeof response.status).toBe("string");
37
+ expect(response.status.length).toBeGreaterThan(0);
38
+ expect(typeof response.deviceResponseCode).toBe("string");
39
+ expect(typeof response.deviceResponseText).toBe("string");
40
+ expect(typeof response.referenceNumber).toBe("string");
41
+ expect(typeof response.version).toBe("string");
42
+ // ISAFResponse-only optional fields — must at least be typed
43
+ expect(response.totalCount === undefined ||
44
+ typeof response.totalCount === "number").toBe(true);
45
+ expect(response.totalAmount === undefined ||
46
+ typeof response.totalAmount === "number").toBe(true);
47
+ expect(response.multipleMessage === undefined ||
48
+ typeof response.multipleMessage === "string").toBe(true);
49
+ });
50
+ test("sendStoreAndForward() populates approved/pending/declined buckets when SAF data exists", async () => {
51
+ const response = (await device.sendStoreAndForward());
52
+ if (response.status !== "Success") {
53
+ console.warn(`sendStoreAndForward() returned ${response.deviceResponseCode} (${response.deviceResponseMessage}). Bucket assertions skipped — device has no SAF records.`);
54
+ return;
55
+ }
56
+ expect(response.deviceResponseCode).toBe("00");
57
+ expect(response.totalCount).toBeDefined();
58
+ expect(response.totalAmount).toBeDefined();
59
+ expect(response.totalCount).toBeGreaterThanOrEqual(0);
60
+ expect(response.totalAmount).toBeGreaterThanOrEqual(0);
61
+ // Bucket dictionaries are optional; when populated their entries must
62
+ // conform to the UpaSafSummaryResponse shape.
63
+ const allBuckets = [response.approved, response.pending, response.declined];
64
+ const populated = allBuckets.filter((b) => b !== undefined);
65
+ if (populated.length === 0) {
66
+ console.warn("sendStoreAndForward() success returned no bucket dictionaries; device reported totals only.");
67
+ return;
68
+ }
69
+ for (const bucket of populated) {
70
+ for (const summary of Object.values(bucket)) {
71
+ expect(summary).toBeDefined();
72
+ expect(typeof summary.summaryType).toBe("number");
73
+ expect([
74
+ src_1.SummaryType.Approved,
75
+ src_1.SummaryType.Pending,
76
+ src_1.SummaryType.Declined,
77
+ ].includes(summary.summaryType)).toBe(true);
78
+ expect(Array.isArray(summary.transactions)).toBe(true);
79
+ expect(typeof summary.count === "number").toBe(true);
80
+ expect(typeof summary.totalAmount === "number").toBe(true);
81
+ }
82
+ }
83
+ });
84
+ test("deleteSaf() returns a fully populated UpaSAFResponse (command = DeleteSAF)", async () => {
85
+ const response = (await device.deleteSaf("NON-EXISTENT-REF", "NON-EXISTENT-TRAN"));
86
+ expect(response).toBeInstanceOf(UpaSAFResponse_1.UpaSAFResponse);
87
+ // requestType tag ensures extractCommand surfaces "DeleteSAF" even when
88
+ // the device echoes back a generic "SendCommand".
89
+ expect(["DeleteSAF", "SendCommand"]).toContain(response.command);
90
+ expect(typeof response.status).toBe("string");
91
+ expect(typeof response.deviceResponseCode).toBe("string");
92
+ expect(typeof response.deviceResponseText).toBe("string");
93
+ });
94
+ });
95
+ //# sourceMappingURL=UpaSAFResponse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpaSAFResponse.test.js","sourceRoot":"","sources":["../../../../../../test/Unit/Terminals/UPA/Reponses/UpaSAFResponse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Live unit tests for the UPA Scan command (spec §12.3.17).
5
+ *
6
+ * every test exercises the real UPA device over Meet-in-the-Cloud (MITC) with
7
+ *
8
+ * These tests require an operator to physically scan a QR code within the
9
+ * configured `timeOut` window. Absent a scan, the device returns
10
+ * APP002 TIMEOUT and the "00 / Success" assertions will fail — the same
11
+ */
12
+ const src_1 = require("../../../../src");
13
+ const UpaHelpertest_1 = require("./UpaHelpertest");
14
+ jest.setTimeout(240000);
15
+ function sleep(delayMs) {
16
+ return new Promise((resolve) => setTimeout(resolve, delayMs));
17
+ }
18
+ async function settleDevice(delayMs = 8000) {
19
+ if (UpaHelpertest_1.useLiveMic) {
20
+ await sleep(delayMs);
21
+ }
22
+ }
23
+ afterEach(async () => {
24
+ await settleDevice();
25
+ });
26
+ // ===========================================================================
27
+ // scan() – request parameter parity over live MITC (spec §12.3.17.1 / .2)
28
+ // ===========================================================================
29
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Scan – request payload (live MITC)", () => {
30
+ let device;
31
+ beforeEach(() => {
32
+ device = (0, UpaHelpertest_1.createTestDevice)();
33
+ });
34
+ test("[UpaAdminTests:Scan] scan(ScanData) with header / prompt1 / displayOption / timeOut", async () => {
35
+ const scanData = new src_1.ScanData();
36
+ scanData.header = "scan";
37
+ scanData.prompt1 = "scan qr code";
38
+ scanData.displayOption = 0; // DisplayOption.NoScreenChange
39
+ scanData.timeOut = 26;
40
+ device.ecrId = "13";
41
+ const response = (await device.scan(scanData));
42
+ expect(response).not.toBeNull();
43
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
44
+ expect(response.command).toBe("Scan");
45
+ expect(response.status).toBe("Success");
46
+ expect(response.deviceResponseCode).toBe("00");
47
+ });
48
+ test("[UpaAdminTests:Scan] scan(ScanData) with all optional fields including prompt2 (spec §12.3.17.2)", async () => {
49
+ const scanData = new src_1.ScanData();
50
+ scanData.header = "Scan";
51
+ scanData.prompt1 = "Scan QR Code";
52
+ scanData.prompt2 = "Align the QR code within the frame to scan";
53
+ scanData.displayOption = 1; // DisplayOption.ReturnToIdleScreen
54
+ scanData.timeOut = 45;
55
+ device.ecrId = "13";
56
+ const response = (await device.scan(scanData));
57
+ expect(response).not.toBeNull();
58
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
59
+ expect(response.command).toBe("Scan");
60
+ expect(response.status).toBe("Success");
61
+ expect(response.deviceResponseCode).toBe("00");
62
+ });
63
+ test("[UpaAdminTests:ScanWithoutParams] scan() with no arguments", async () => {
64
+ device.ecrId = "13";
65
+ const response = (await device.scan());
66
+ expect(response).not.toBeNull();
67
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
68
+ expect(response.command).toBe("Scan");
69
+ expect(response.status).toBe("Success");
70
+ expect(response.deviceResponseCode).toBe("00");
71
+ });
72
+ test("[UpaAdminTests:ScanWithoutParams] scan(ScanData{}) with an empty ScanData", async () => {
73
+ device.ecrId = "13";
74
+ const response = (await device.scan(new src_1.ScanData()));
75
+ expect(response).not.toBeNull();
76
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
77
+ expect(response.command).toBe("Scan");
78
+ expect(response.status).toBe("Success");
79
+ expect(response.deviceResponseCode).toBe("00");
80
+ });
81
+ test("[UpaScan] scan() honors timeOut boundary (999 = max per spec §12.3.17.1)", async () => {
82
+ const scanData = new src_1.ScanData();
83
+ scanData.header = "scan";
84
+ scanData.prompt1 = "scan qr code";
85
+ scanData.timeOut = 999;
86
+ device.ecrId = "13";
87
+ const response = (await device.scan(scanData));
88
+ expect(response).not.toBeNull();
89
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
90
+ expect(response.command).toBe("Scan");
91
+ expect(response.status).toBe("Success");
92
+ expect(response.deviceResponseCode).toBe("00");
93
+ });
94
+ });
95
+ // ===========================================================================
96
+ // scan() – response hydration over live MITC (spec §12.3.17.5 / §12.3.17.6)
97
+ // ===========================================================================
98
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Scan – response parsing (live MITC)", () => {
99
+ let device;
100
+ beforeEach(() => {
101
+ device = (0, UpaHelpertest_1.createTestDevice)();
102
+ });
103
+ test("[UpaScan] scan() surfaces scanData on TransactionResponse for successful scans", async () => {
104
+ const scanData = new src_1.ScanData();
105
+ scanData.header = "scan";
106
+ scanData.prompt1 = "scan qr code";
107
+ scanData.displayOption = 0; // DisplayOption.NoScreenChange
108
+ scanData.timeOut = 26;
109
+ device.ecrId = "13";
110
+ const response = (await device.scan(scanData));
111
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
112
+ expect(response.command).toBe("Scan");
113
+ expect(response.status).toBe("Success");
114
+ expect(response.deviceResponseCode).toBe("00");
115
+ expect(typeof response.scanData).toBe("string");
116
+ expect(response.scanData.length).toBeGreaterThan(0);
117
+ });
118
+ });
119
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Scan – live MITC", () => {
120
+ let device;
121
+ beforeEach(() => {
122
+ device = (0, UpaHelpertest_1.createTestDevice)();
123
+ });
124
+ test("[UpaAdminTests:Scan] Scan() with populated ScanData", async () => {
125
+ const scanData = new src_1.ScanData();
126
+ scanData.header = "scan";
127
+ scanData.prompt1 = "scan qr code";
128
+ scanData.displayOption = 0; // DisplayOption.NoScreenChange
129
+ scanData.timeOut = 26;
130
+ device.ecrId = "13";
131
+ const response = (await device.scan(scanData));
132
+ expect(response).not.toBeNull();
133
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
134
+ expect(response.deviceResponseCode).toBe("00");
135
+ expect(response.status).toBe("Success");
136
+ });
137
+ test("[UpaAdminTests:ScanWithoutParams] Scan() with no parameters", async () => {
138
+ device.ecrId = "13";
139
+ const response = (await device.scan());
140
+ expect(response).not.toBeNull();
141
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
142
+ expect(response.deviceResponseCode).toBe("00");
143
+ expect(response.status).toBe("Success");
144
+ });
145
+ });
146
+ //# sourceMappingURL=UpaScan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpaScan.test.js","sourceRoot":"","sources":["../../../../../test/Unit/Terminals/UPA/UpaScan.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Unit tests for UPA Credit payment methods:
5
+ * sale() with processing indicators, sale() with auth-time lodging,
6
+ * updateLodginDetail(), void()
7
+ *
8
+ */
9
+ const src_1 = require("../../../../src");
10
+ const DeviceService_1 = require("../../../../src/Services/DeviceService");
11
+ const UpaHelpertest_1 = require("./UpaHelpertest");
12
+ jest.setTimeout(240000);
13
+ function sleep(delayMs) {
14
+ return new Promise((resolve) => setTimeout(resolve, delayMs));
15
+ }
16
+ async function settleDevice(delayMs = 8000) {
17
+ if (UpaHelpertest_1.useLiveMic) {
18
+ await sleep(delayMs);
19
+ }
20
+ }
21
+ afterEach(async () => {
22
+ await settleDevice();
23
+ });
24
+ // ===========================================================================
25
+ // sale() – processing indicators serialization
26
+ // ===========================================================================
27
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Credit – sale() processing indicators", () => {
28
+ let device;
29
+ beforeEach(() => {
30
+ device = (0, UpaHelpertest_1.createTestDevice)();
31
+ });
32
+ test("[UpaCreditTests] sale() serializes processing indicators without mocked responses", async () => {
33
+ const saleResponse = await (0, UpaHelpertest_1.createLiveSale)(device);
34
+ expect(saleResponse.status).toBe("Success");
35
+ });
36
+ });
37
+ // ===========================================================================
38
+ // sale() with auth-time lodging
39
+ // ===========================================================================
40
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Credit – sale() with lodging", () => {
41
+ let device;
42
+ beforeEach(() => {
43
+ device = (0, UpaHelpertest_1.createTestDevice)();
44
+ });
45
+ test("[UpaCreditTests:173] sale() serializes auth-time lodging without mocked responses", async () => {
46
+ const controller = src_1.ServicesContainer.instance().getDeviceController();
47
+ const lodging = new src_1.Lodging();
48
+ lodging.folioNumber = "FOLIO-123";
49
+ lodging.extraChargeTypes = [
50
+ src_1.ExtraChargeType.Restaurant,
51
+ src_1.ExtraChargeType.MiniBar,
52
+ ];
53
+ lodging.extraChargeTotal = 12.5;
54
+ lodging.dailyRate = 89.99;
55
+ const builder = await device
56
+ .sale(10)
57
+ .withEcrId(13)
58
+ .withLodging(lodging);
59
+ const request = controller
60
+ .buildProcessTransaction(builder)
61
+ .getJsonRequest();
62
+ expect(request.data.command).toBe("Sale");
63
+ expect(request.data.data.lodging).toMatchObject({
64
+ folioNumber: "FOLIO-123",
65
+ dailyRate: "89.99",
66
+ extraChargeTotal: "12.50",
67
+ extraChargeTypes: [1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
68
+ });
69
+ });
70
+ });
71
+ // ===========================================================================
72
+ // void() — UPA spec §12.4.2
73
+ // Void cancels a transaction in the host batch.
74
+ // Per §12.4.2.1: transaction node must carry ONE of
75
+ // `tranNo` → builder.terminalRefNumber
76
+ // `referenceNumber` → builder.transactionId
77
+ // Both together → VOID004. Neither → VOID003.
78
+ // Optional `clerkId` in params.
79
+ // ===========================================================================
80
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Credit – void() request shape", () => {
81
+ let device;
82
+ beforeEach(() => {
83
+ device = (0, UpaHelpertest_1.createTestDevice)();
84
+ });
85
+ test("[UpaCreditTests] void() with tranNo (terminalRefNumber) serializes matching spec §12.4.2.2", () => {
86
+ const controller = src_1.ServicesContainer.instance().getDeviceController();
87
+ const builder = device
88
+ .void()
89
+ .withTerminalRefNumber("0002")
90
+ .withEcrId(13);
91
+ const request = controller.buildManageTransaction(builder).getJsonRequest();
92
+ expect(request.data.command).toBe("Void");
93
+ expect(request.data.EcrId).toBe("13");
94
+ expect(request.data.data.transaction).toEqual({ tranNo: "0002" });
95
+ // Spec-forbidden fields for Void must not be present:
96
+ expect(request.data.data.transaction.referenceNumber).toBeUndefined();
97
+ expect(request.data.data.transaction.baseAmount).toBeUndefined();
98
+ expect(request.data.data.transaction.amount).toBeUndefined();
99
+ expect(request.data.data.transaction.tipAmount).toBeUndefined();
100
+ expect(request.data.data.transaction.taxAmount).toBeUndefined();
101
+ expect(request.data.data.transaction.taxIndicator).toBeUndefined();
102
+ expect(request.data.data.transaction.invoiceNbr).toBeUndefined();
103
+ expect(request.data.data.transaction.processCPC).toBeUndefined();
104
+ });
105
+ test("[UpaCreditTests] void() with referenceNumber (transactionId) serializes matching spec §12.4.2.2", () => {
106
+ const controller = src_1.ServicesContainer.instance().getDeviceController();
107
+ const builder = device
108
+ .void()
109
+ .withTransactionId("1282447530")
110
+ .withEcrId(13);
111
+ const request = controller.buildManageTransaction(builder).getJsonRequest();
112
+ expect(request.data.command).toBe("Void");
113
+ expect(request.data.data.transaction).toEqual({
114
+ referenceNumber: "1282447530",
115
+ });
116
+ expect(request.data.data.transaction.tranNo).toBeUndefined();
117
+ });
118
+ test("[UpaCreditTests] void() with clerkId serializes params.clerkId per spec §12.4.2.2", () => {
119
+ const controller = src_1.ServicesContainer.instance().getDeviceController();
120
+ const builder = device
121
+ .void()
122
+ .withTerminalRefNumber("0002")
123
+ .withClerkId(1234)
124
+ .withEcrId(13);
125
+ const request = controller.buildManageTransaction(builder).getJsonRequest();
126
+ expect(request.data.data.params).toEqual({ clerkId: 1234 });
127
+ expect(request.data.data.transaction).toEqual({ tranNo: "0002" });
128
+ });
129
+ test("[SdkValidation] void() with both tranNo and referenceNumber throws VOID004 hint", () => {
130
+ const controller = src_1.ServicesContainer.instance().getDeviceController();
131
+ const builder = device
132
+ .void()
133
+ .withTerminalRefNumber("0002")
134
+ .withTransactionId("1282447530")
135
+ .withEcrId(13);
136
+ expect(() => controller.buildManageTransaction(builder)).toThrow(/VOID004/);
137
+ expect(() => controller.buildManageTransaction(builder)).toThrow(src_1.UnsupportedTransactionError);
138
+ });
139
+ test("[SdkValidation] void() with neither tranNo nor referenceNumber throws VOID003 hint", () => {
140
+ const controller = src_1.ServicesContainer.instance().getDeviceController();
141
+ const builder = device.void().withEcrId(13);
142
+ expect(() => controller.buildManageTransaction(builder)).toThrow(/VOID003/);
143
+ expect(() => controller.buildManageTransaction(builder)).toThrow(src_1.UnsupportedTransactionError);
144
+ });
145
+ });
146
+ // ===========================================================================
147
+ // void() live MITC flow
148
+ // Sale → Void by terminalRefNumber → expect Success
149
+ // ===========================================================================
150
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Credit – void() live MITC", () => {
151
+ let device;
152
+ beforeEach(() => {
153
+ device = (0, UpaHelpertest_1.createTestDevice)();
154
+ });
155
+ test("[UpaCreditTests] void() by tranNo cancels a prior sale over live MITC", async () => {
156
+ const saleResponse = await (0, UpaHelpertest_1.createLiveSale)(device);
157
+ if (saleResponse.deviceResponseCode !== "00") {
158
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Sale (Void prereq)"));
159
+ return;
160
+ }
161
+ const response = await device
162
+ .void()
163
+ .withTerminalRefNumber(saleResponse.terminalRefNumber)
164
+ .withEcrId(13)
165
+ .execute();
166
+ expect(response).not.toBeNull();
167
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
168
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
169
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "Void"));
170
+ return;
171
+ }
172
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["Void", "SendCommand"]);
173
+ if (response.transactionType) {
174
+ expect(response.transactionType.toUpperCase()).toContain("VOID");
175
+ }
176
+ });
177
+ test("[LiveNegative] void() with unknown tranNo surfaces REF001 or VOID001", async () => {
178
+ if (!UpaHelpertest_1.useLiveMic) {
179
+ return;
180
+ }
181
+ const response = await device
182
+ .void()
183
+ .withTerminalRefNumber("9999")
184
+ .withEcrId(13)
185
+ .execute();
186
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
187
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
188
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "Void unknown tranNo"));
189
+ return;
190
+ }
191
+ // Spec §12.4.2.4 error codes for an unknown/uncancellable reference.
192
+ if (response.status === "Failed") {
193
+ expect(["REF001", "VOID001", "TRAN001"]).toContain(response.deviceResponseCode);
194
+ return;
195
+ }
196
+ console.warn(`Void with unknown tranNo unexpectedly succeeded on the current terminal (code=${response.deviceResponseCode}). Expected REF001 or VOID001.`);
197
+ });
198
+ test("[LiveNegative] void() with invalid target device surfaces device error", async () => {
199
+ if (!UpaHelpertest_1.useLiveMic) {
200
+ return;
201
+ }
202
+ const unavailableDevice = DeviceService_1.DeviceService.create((0, UpaHelpertest_1.buildConfig)());
203
+ unavailableDevice.ecrId = "99999999";
204
+ try {
205
+ const response = await unavailableDevice
206
+ .void()
207
+ .withEcrId(99999999)
208
+ .withTerminalRefNumber("0001")
209
+ .execute();
210
+ expect(response).toBeInstanceOf(src_1.TransactionResponse);
211
+ // Any Failed status with a non-"00" code satisfies the negative path.
212
+ if (response.status === "Failed") {
213
+ expect(response.deviceResponseCode).not.toBe("00");
214
+ return;
215
+ }
216
+ }
217
+ catch (error) {
218
+ // Gateway routing failures for an inactive terminal surface as thrown
219
+ // GatewayError — that's an equally valid outcome for the negative path.
220
+ expect(error).toBeInstanceOf(Error);
221
+ expect(error.message).toBeTruthy();
222
+ }
223
+ });
224
+ });
225
+ //# sourceMappingURL=UpaVoid.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpaVoid.test.js","sourceRoot":"","sources":["../../../../../test/Unit/Terminals/UPA/UpaVoid.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "globalpayments-api",
3
- "version": "3.11.01",
3
+ "version": "3.11.02",
4
4
  "description": "Global Payments SDK for NodeJS for Global Payments eCommerce gateways",
5
5
  "author": "Global Payments",
6
6
  "license": "GPL-2.0",
@@ -16,7 +16,7 @@
16
16
  "scripts": {
17
17
  "build": "tsc",
18
18
  "test:jest": "jest",
19
- "test:serial": "jest --runInBand --testPathPattern=test/Unit/Terminals/UPA/UpaAdmin.test.ts$ --",
19
+ "test:serial": "jest --runInBand --testPathPattern=test/Unit/Terminals/UPA/UpaVoid.test.ts$ --",
20
20
  "build:netsuite": "webpack --env.GP_NETSUITE_BUILD --config config/webpack.netsuite.js && node bin/netsuite-post.js",
21
21
  "build:clean": "rimraf lib",
22
22
  "docs": "typedoc --mode file --name \"GlobalPayments.Api\" --project tsconfig.json --out docs src",