globalpayments-api 3.10.14 → 3.11.0

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 (188) hide show
  1. package/CHANGELOG.md +255 -240
  2. package/LICENSE.md +257 -257
  3. package/README.md +148 -148
  4. package/appsec.properties +8 -0
  5. package/lib/src/Builders/BaseBuilder/ValidationClause.d.ts +3 -2
  6. package/lib/src/Builders/BaseBuilder/ValidationClause.js +23 -15
  7. package/lib/src/Builders/BaseBuilder/ValidationClause.js.map +1 -1
  8. package/lib/src/Builders/BaseBuilder/Validations.js +7 -2
  9. package/lib/src/Builders/BaseBuilder/Validations.js.map +1 -1
  10. package/lib/src/Builders/RequestBuilder/GpApi/GpApiSessionInfo.d.ts +11 -2
  11. package/lib/src/Builders/RequestBuilder/GpApi/GpApiSessionInfo.js +44 -5
  12. package/lib/src/Builders/RequestBuilder/GpApi/GpApiSessionInfo.js.map +1 -1
  13. package/lib/src/Builders/RequestBuilder/GpEcom/GpEcomManagementRequestBuilder.js +2 -2
  14. package/lib/src/Builders/RequestBuilder/GpEcom/GpEcomManagementRequestBuilder.js.map +1 -1
  15. package/lib/src/Entities/Enums.d.ts +4 -2
  16. package/lib/src/Entities/Enums.js +3 -1
  17. package/lib/src/Entities/Enums.js.map +1 -1
  18. package/lib/src/Entities/GpApi/PorticoTokenConfig.d.ts +25 -0
  19. package/lib/src/Entities/GpApi/PorticoTokenConfig.js +30 -0
  20. package/lib/src/Entities/GpApi/PorticoTokenConfig.js.map +1 -0
  21. package/lib/src/Entities/GpApi/index.d.ts +1 -0
  22. package/lib/src/Entities/GpApi/index.js +1 -0
  23. package/lib/src/Entities/GpApi/index.js.map +1 -1
  24. package/lib/src/Entities/RecurringEntity.js +2 -2
  25. package/lib/src/Entities/RecurringEntity.js.map +1 -1
  26. package/lib/src/Entities/Transaction.d.ts +2 -0
  27. package/lib/src/Entities/Transaction.js +2 -0
  28. package/lib/src/Entities/Transaction.js.map +1 -1
  29. package/lib/src/Entities/TransactionSummary.d.ts +1 -0
  30. package/lib/src/Entities/TransactionSummary.js +1 -0
  31. package/lib/src/Entities/TransactionSummary.js.map +1 -1
  32. package/lib/src/Entities/UPA/ExtraChargeType.d.ts +8 -0
  33. package/lib/src/Entities/UPA/ExtraChargeType.js +13 -0
  34. package/lib/src/Entities/UPA/ExtraChargeType.js.map +1 -0
  35. package/lib/src/Entities/UPA/Lodging.d.ts +11 -0
  36. package/lib/src/Entities/UPA/Lodging.js +15 -0
  37. package/lib/src/Entities/UPA/Lodging.js.map +1 -0
  38. package/lib/src/Entities/UPA/POSData.d.ts +6 -0
  39. package/lib/src/Entities/UPA/POSData.js +11 -0
  40. package/lib/src/Entities/UPA/POSData.js.map +1 -0
  41. package/lib/src/Entities/UPA/ProcessIndicator.d.ts +1 -1
  42. package/lib/src/Entities/UPA/ProcessIndicator.js.map +1 -1
  43. package/lib/src/Entities/UPA/UpaParam.d.ts +7 -7
  44. package/lib/src/Entities/UPA/UpaParam.js.map +1 -1
  45. package/lib/src/Entities/UPA/UpaTransactionData.d.ts +5 -5
  46. package/lib/src/Entities/UPA/UpaTransactionData.js.map +1 -1
  47. package/lib/src/Entities/UPA/index.d.ts +3 -0
  48. package/lib/src/Entities/UPA/index.js +3 -0
  49. package/lib/src/Entities/UPA/index.js.map +1 -1
  50. package/lib/src/Gateways/GpApiConnector.js +23 -4
  51. package/lib/src/Gateways/GpApiConnector.js.map +1 -1
  52. package/lib/src/Gateways/PorticoConnector.d.ts +1 -1
  53. package/lib/src/Gateways/PorticoConnector.js +2 -0
  54. package/lib/src/Gateways/PorticoConnector.js.map +1 -1
  55. package/lib/src/Mapping/GpApiMapping.js +7 -0
  56. package/lib/src/Mapping/GpApiMapping.js.map +1 -1
  57. package/lib/src/ServiceConfigs/Gateways/GpApiConfig.d.ts +6 -0
  58. package/lib/src/ServiceConfigs/Gateways/GpApiConfig.js +25 -2
  59. package/lib/src/ServiceConfigs/Gateways/GpApiConfig.js.map +1 -1
  60. package/lib/src/Services/GpApiServices.js +4 -1
  61. package/lib/src/Services/GpApiServices.js.map +1 -1
  62. package/lib/src/Terminals/Abstractions/IDeviceInterface.d.ts +23 -2
  63. package/lib/src/Terminals/Abstractions/IDeviceResponse.d.ts +71 -24
  64. package/lib/src/Terminals/Builders/TerminalAuthBuilder.d.ts +54 -22
  65. package/lib/src/Terminals/Builders/TerminalAuthBuilder.js +98 -13
  66. package/lib/src/Terminals/Builders/TerminalAuthBuilder.js.map +1 -1
  67. package/lib/src/Terminals/Builders/TerminalBuilder.d.ts +6 -3
  68. package/lib/src/Terminals/Builders/TerminalBuilder.js +9 -0
  69. package/lib/src/Terminals/Builders/TerminalBuilder.js.map +1 -1
  70. package/lib/src/Terminals/Builders/TerminalManageBuilder.d.ts +16 -6
  71. package/lib/src/Terminals/Builders/TerminalManageBuilder.js +27 -2
  72. package/lib/src/Terminals/Builders/TerminalManageBuilder.js.map +1 -1
  73. package/lib/src/Terminals/Builders/TerminalReportBuilder.d.ts +17 -0
  74. package/lib/src/Terminals/Builders/TerminalReportBuilder.js +57 -0
  75. package/lib/src/Terminals/Builders/TerminalReportBuilder.js.map +1 -0
  76. package/lib/src/Terminals/Builders/index.d.ts +1 -0
  77. package/lib/src/Terminals/Builders/index.js +1 -0
  78. package/lib/src/Terminals/Builders/index.js.map +1 -1
  79. package/lib/src/Terminals/DeviceController.d.ts +6 -5
  80. package/lib/src/Terminals/DeviceController.js.map +1 -1
  81. package/lib/src/Terminals/DeviceInterface.d.ts +23 -3
  82. package/lib/src/Terminals/DeviceInterface.js +68 -0
  83. package/lib/src/Terminals/DeviceInterface.js.map +1 -1
  84. package/lib/src/Terminals/Enums.d.ts +11 -0
  85. package/lib/src/Terminals/Enums.js +14 -1
  86. package/lib/src/Terminals/Enums.js.map +1 -1
  87. package/lib/src/Terminals/TerminalResponse.d.ts +44 -36
  88. package/lib/src/Terminals/TerminalResponse.js +8 -0
  89. package/lib/src/Terminals/TerminalResponse.js.map +1 -1
  90. package/lib/src/Terminals/UPA/Entities/UpaMessageId.d.ts +10 -1
  91. package/lib/src/Terminals/UPA/Entities/UpaMessageId.js +9 -0
  92. package/lib/src/Terminals/UPA/Entities/UpaMessageId.js.map +1 -1
  93. package/lib/src/Terminals/UPA/Entities/UpaModels.d.ts +62 -0
  94. package/lib/src/Terminals/UPA/Entities/UpaModels.js +28 -0
  95. package/lib/src/Terminals/UPA/Entities/UpaModels.js.map +1 -0
  96. package/lib/src/Terminals/UPA/Entities/UpaSearchCriteria.d.ts +7 -0
  97. package/lib/src/Terminals/UPA/Entities/UpaSearchCriteria.js +12 -0
  98. package/lib/src/Terminals/UPA/Entities/UpaSearchCriteria.js.map +1 -0
  99. package/lib/src/Terminals/UPA/Entities/index.d.ts +1 -0
  100. package/lib/src/Terminals/UPA/Entities/index.js +1 -0
  101. package/lib/src/Terminals/UPA/Entities/index.js.map +1 -1
  102. package/lib/src/Terminals/UPA/Interfaces/UpaMicInterface.d.ts +1 -1
  103. package/lib/src/Terminals/UPA/Interfaces/UpaMicInterface.js +7 -5
  104. package/lib/src/Terminals/UPA/Interfaces/UpaMicInterface.js.map +1 -1
  105. package/lib/src/Terminals/UPA/Reponses/BatchList.d.ts +17 -0
  106. package/lib/src/Terminals/UPA/Reponses/BatchList.js +84 -0
  107. package/lib/src/Terminals/UPA/Reponses/BatchList.js.map +1 -0
  108. package/lib/src/Terminals/UPA/Reponses/BatchReportResponse.d.ts +56 -0
  109. package/lib/src/Terminals/UPA/Reponses/BatchReportResponse.js +215 -0
  110. package/lib/src/Terminals/UPA/Reponses/BatchReportResponse.js.map +1 -0
  111. package/lib/src/Terminals/UPA/Reponses/OpenTabDetailsResponse.d.ts +27 -0
  112. package/lib/src/Terminals/UPA/Reponses/OpenTabDetailsResponse.js +113 -0
  113. package/lib/src/Terminals/UPA/Reponses/OpenTabDetailsResponse.js.map +1 -0
  114. package/lib/src/Terminals/UPA/Reponses/SafReportResponse.d.ts +39 -0
  115. package/lib/src/Terminals/UPA/Reponses/SafReportResponse.js +187 -0
  116. package/lib/src/Terminals/UPA/Reponses/SafReportResponse.js.map +1 -0
  117. package/lib/src/Terminals/UPA/Reponses/TransactionResponse.d.ts +48 -25
  118. package/lib/src/Terminals/UPA/Reponses/TransactionResponse.js +151 -15
  119. package/lib/src/Terminals/UPA/Reponses/TransactionResponse.js.map +1 -1
  120. package/lib/src/Terminals/UPA/Reponses/UpaEODResponse.d.ts +21 -0
  121. package/lib/src/Terminals/UPA/Reponses/UpaEODResponse.js +106 -0
  122. package/lib/src/Terminals/UPA/Reponses/UpaEODResponse.js.map +1 -0
  123. package/lib/src/Terminals/UPA/Reponses/UpaGiftCardResponse.d.ts +41 -0
  124. package/lib/src/Terminals/UPA/Reponses/UpaGiftCardResponse.js +93 -0
  125. package/lib/src/Terminals/UPA/Reponses/UpaGiftCardResponse.js.map +1 -0
  126. package/lib/src/Terminals/UPA/Reponses/UpaSAFResponse.d.ts +35 -0
  127. package/lib/src/Terminals/UPA/Reponses/UpaSAFResponse.js +195 -0
  128. package/lib/src/Terminals/UPA/Reponses/UpaSAFResponse.js.map +1 -0
  129. package/lib/src/Terminals/UPA/Reponses/UpaSignatureResponse.d.ts +18 -0
  130. package/lib/src/Terminals/UPA/Reponses/UpaSignatureResponse.js +94 -0
  131. package/lib/src/Terminals/UPA/Reponses/UpaSignatureResponse.js.map +1 -0
  132. package/lib/src/Terminals/UPA/Reponses/index.d.ts +8 -0
  133. package/lib/src/Terminals/UPA/Reponses/index.js +8 -0
  134. package/lib/src/Terminals/UPA/Reponses/index.js.map +1 -1
  135. package/lib/src/Terminals/UPA/UpaController.d.ts +17 -5
  136. package/lib/src/Terminals/UPA/UpaController.js +338 -79
  137. package/lib/src/Terminals/UPA/UpaController.js.map +1 -1
  138. package/lib/src/Terminals/UPA/UpaInterface.d.ts +26 -3
  139. package/lib/src/Terminals/UPA/UpaInterface.js +311 -12
  140. package/lib/src/Terminals/UPA/UpaInterface.js.map +1 -1
  141. package/lib/src/Terminals/index.d.ts +2 -0
  142. package/lib/src/Terminals/index.js +2 -0
  143. package/lib/src/Terminals/index.js.map +1 -1
  144. package/lib/src/Utils/StringUtils.js +1 -1
  145. package/lib/src/Utils/StringUtils.js.map +1 -1
  146. package/lib/test/Integration/Gateways/CI/upa_mitc/UpaFunctionalityTests.test.js +19 -8
  147. package/lib/test/Integration/Gateways/CI/upa_mitc/UpaFunctionalityTests.test.js.map +1 -1
  148. package/lib/test/Integration/Gateways/GpApiConnector/3DS2.test.js +15 -15
  149. package/lib/test/Integration/Gateways/GpApiConnector/3DSecure.test.js +5 -5
  150. package/lib/test/Integration/Gateways/GpApiConnector/AccessTokenPorticoCredentials.test.d.ts +1 -0
  151. package/lib/test/Integration/Gateways/GpApiConnector/AccessTokenPorticoCredentials.test.js +175 -0
  152. package/lib/test/Integration/Gateways/GpApiConnector/AccessTokenPorticoCredentials.test.js.map +1 -0
  153. package/lib/test/Integration/Gateways/GpApiConnector/GpApiCreateTokenWithPorticoCredentialTests.test.d.ts +1 -0
  154. package/lib/test/Integration/Gateways/GpApiConnector/GpApiCreateTokenWithPorticoCredentialTests.test.js +205 -0
  155. package/lib/test/Integration/Gateways/GpApiConnector/GpApiCreateTokenWithPorticoCredentialTests.test.js.map +1 -0
  156. package/lib/test/Integration/Gateways/GpEcomConnector/Credit.test.js +4 -4
  157. package/lib/test/Integration/Gateways/PorticoConnector/Ecommerce.test.js +8 -8
  158. package/lib/test/Integration/Gateways/PorticoConnector/GlobalTransactionId.test.d.ts +1 -0
  159. package/lib/test/Integration/Gateways/PorticoConnector/GlobalTransactionId.test.js +243 -0
  160. package/lib/test/Integration/Gateways/PorticoConnector/GlobalTransactionId.test.js.map +1 -0
  161. package/lib/test/Integration/Gateways/Terminals/RequestIdProvider.d.ts +15 -1
  162. package/lib/test/Integration/Gateways/Terminals/RequestIdProvider.js +88 -3
  163. package/lib/test/Integration/Gateways/Terminals/RequestIdProvider.js.map +1 -1
  164. package/lib/test/Unit/Builders/AuthorizationBuilder/SupplementaryData.test.d.ts +1 -0
  165. package/lib/test/Unit/Builders/AuthorizationBuilder/SupplementaryData.test.js +147 -0
  166. package/lib/test/Unit/Builders/AuthorizationBuilder/SupplementaryData.test.js.map +1 -0
  167. package/lib/test/Unit/Terminals/UPA/UpaAdmin.test.d.ts +1 -0
  168. package/lib/test/Unit/Terminals/UPA/UpaAdmin.test.js +1260 -0
  169. package/lib/test/Unit/Terminals/UPA/UpaAdmin.test.js.map +1 -0
  170. package/lib/test/Unit/Terminals/UPA/UpaCredit.test.d.ts +1 -0
  171. package/lib/test/Unit/Terminals/UPA/UpaCredit.test.js +411 -0
  172. package/lib/test/Unit/Terminals/UPA/UpaCredit.test.js.map +1 -0
  173. package/lib/test/Unit/Terminals/UPA/UpaHelpertest.d.ts +55 -0
  174. package/lib/test/Unit/Terminals/UPA/UpaHelpertest.js +490 -0
  175. package/lib/test/Unit/Terminals/UPA/UpaHelpertest.js.map +1 -0
  176. package/lib/test/Unit/Terminals/UPA/UpaReport.test.d.ts +1 -0
  177. package/lib/test/Unit/Terminals/UPA/UpaReport.test.js +801 -0
  178. package/lib/test/Unit/Terminals/UPA/UpaReport.test.js.map +1 -0
  179. package/lib/test/Unit/Terminals/UPA/UpaStory1Methods.test.d.ts +1 -0
  180. package/lib/test/Unit/Terminals/UPA/UpaStory1Methods.test.js +250 -0
  181. package/lib/test/Unit/Terminals/UPA/UpaStory1Methods.test.js.map +1 -0
  182. package/lib/test/Unit/Terminals/UPA/UpaStory2Methods.test.d.ts +1 -0
  183. package/lib/test/Unit/Terminals/UPA/UpaStory2Methods.test.js +1277 -0
  184. package/lib/test/Unit/Terminals/UPA/UpaStory2Methods.test.js.map +1 -0
  185. package/lib/test/Unit/Terminals/UPA/UpaStory3_4Methods.test.d.ts +1 -0
  186. package/lib/test/Unit/Terminals/UPA/UpaStory3_4Methods.test.js +411 -0
  187. package/lib/test/Unit/Terminals/UPA/UpaStory3_4Methods.test.js.map +1 -0
  188. package/package.json +63 -63
@@ -0,0 +1,1260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Unit tests for device-level methods:
5
+ * endOfDay(), sendStoreAndForward(), getSignature(), ping(),
6
+ * balance(), reverse(), deletePreAuth(),
7
+ * startCardTransaction(), reboot(),
8
+ * MITC connection mode, deleteSaf(), cancel(), registerPOS()
9
+ *
10
+ */
11
+ const src_1 = require("../../../../src");
12
+ const DeviceService_1 = require("../../../../src/Services/DeviceService");
13
+ const AcquisitionType_1 = require("../../../../src/Entities/Enums/AcquisitionType");
14
+ const CardTypeFilter_1 = require("../../../../src/Entities/Enums/CardTypeFilter");
15
+ const ProcessIndicator_1 = require("../../../../src/Entities/UPA/ProcessIndicator");
16
+ const UpaParam_1 = require("../../../../src/Entities/UPA/UpaParam");
17
+ const UpaTransactionData_1 = require("../../../../src/Entities/UPA/UpaTransactionData");
18
+ const TransactionResponse_1 = require("../../../../src/Terminals/UPA/Reponses/TransactionResponse");
19
+ const UpaEODResponse_1 = require("../../../../src/Terminals/UPA/Reponses/UpaEODResponse");
20
+ const UpaGiftCardResponse_1 = require("../../../../src/Terminals/UPA/Reponses/UpaGiftCardResponse");
21
+ const UpaSAFResponse_1 = require("../../../../src/Terminals/UPA/Reponses/UpaSAFResponse");
22
+ const UpaSignatureResponse_1 = require("../../../../src/Terminals/UPA/Reponses/UpaSignatureResponse");
23
+ const UpaHelpertest_1 = require("./UpaHelpertest");
24
+ jest.setTimeout(240000);
25
+ function sleep(delayMs) {
26
+ return new Promise((resolve) => setTimeout(resolve, delayMs));
27
+ }
28
+ async function settleDevice(delayMs = 8000) {
29
+ if (UpaHelpertest_1.useLiveMic) {
30
+ await sleep(delayMs);
31
+ }
32
+ }
33
+ afterEach(async () => {
34
+ await settleDevice();
35
+ });
36
+ // ===========================================================================
37
+ // endOfDay()
38
+ // response != null, Status == "Success"
39
+ // response != null
40
+ // DeviceResponseText == "Success", DeviceResponseCode == "00"
41
+ // BatchId != null
42
+ // ===========================================================================
43
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – endOfDay()", () => {
44
+ let device;
45
+ beforeEach(() => {
46
+ device = (0, UpaHelpertest_1.createTestDevice)();
47
+ });
48
+ test("[UpaCreditTests][UpaDebitTests][UpaEbtTests][UpaMicTests] endOfDay() returns expected response", async () => {
49
+ const saleresponse = await device
50
+ .sale(5.0)
51
+ .withEcrId(13)
52
+ .withClerkId(123)
53
+ .execute();
54
+ expect(saleresponse).not.toBeNull();
55
+ expect(saleresponse.deviceResponseCode).toBe("00");
56
+ const response = await device.endOfDay();
57
+ expect(response).not.toBeNull();
58
+ expect(response).toBeInstanceOf(UpaEODResponse_1.UpaEODResponse);
59
+ if (UpaHelpertest_1.useLiveMic) {
60
+ expect(response.command).toBe("EODProcessing");
61
+ expect(response.status).toBeTruthy();
62
+ expect(response.deviceResponseCode).toBeTruthy();
63
+ expect(response.deviceResponseText).toBeTruthy();
64
+ if (response.status === "Success") {
65
+ expect(response.deviceResponseCode).toBe("00");
66
+ expect(response.deviceResponseText).toBe("Success");
67
+ expect(response.batchId).toBeDefined();
68
+ expect(response.batchId).not.toBeNull();
69
+ }
70
+ else {
71
+ expect(response.status).toBe("Failed");
72
+ }
73
+ return;
74
+ }
75
+ expect(response.status).toBe("Success");
76
+ expect(response.deviceResponseText).toBe("Success");
77
+ expect(response.deviceResponseCode).toBe("00");
78
+ expect(response.batchId).toBeDefined();
79
+ expect(response.batchId).not.toBeNull();
80
+ });
81
+ });
82
+ // ===========================================================================
83
+ // sendStoreAndForward()
84
+ // Status == "Success", DeviceResponseText == "Success", DeviceResponseCode == "00"
85
+ // no assertion (only checks no ApiException thrown)
86
+ // ===========================================================================
87
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – sendStoreAndForward()", () => {
88
+ let device;
89
+ beforeEach(() => {
90
+ device = (0, UpaHelpertest_1.createTestDevice)();
91
+ });
92
+ test("[UpaAdminTests][UpaMicTests] sendStoreAndForward() returns expected response and does not throw", async () => {
93
+ const response = await device.sendStoreAndForward();
94
+ expect(response).not.toBeNull();
95
+ expect(response).toBeInstanceOf(UpaSAFResponse_1.UpaSAFResponse);
96
+ if (UpaHelpertest_1.useLiveMic) {
97
+ expect(response.command).toBe("SendSAF");
98
+ expect(response.status).toBeTruthy();
99
+ expect(response.deviceResponseCode).toBeTruthy();
100
+ expect(response.deviceResponseText).toBeTruthy();
101
+ if (response.status === "Success") {
102
+ expect(response.deviceResponseCode).toBe("00");
103
+ expect(response.deviceResponseText).toBe("Success");
104
+ }
105
+ else {
106
+ expect(response.status).toBe("Failed");
107
+ }
108
+ return;
109
+ }
110
+ expect(response.status).toBe("Success");
111
+ expect(response.deviceResponseText).toBe("Success");
112
+ expect(response.deviceResponseCode).toBe("00");
113
+ });
114
+ });
115
+ // ===========================================================================
116
+ // getSignature() / PromptAndGetSignatureFile()
117
+ // DeviceResponseCode == "00", Status == "Success"
118
+ // SignatureData != null
119
+ // SignatureData populated (with prompt2 + displayOption)
120
+ // ===========================================================================
121
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – getSignature()", () => {
122
+ let device;
123
+ beforeEach(() => {
124
+ device = (0, UpaHelpertest_1.createTestDevice)();
125
+ });
126
+ test("[UpaAdminTests:130][UpaAdminTests:693] getSignature() returns expected response and SignatureData", async () => {
127
+ const response = await device.getSignature("Please sign");
128
+ expect(response).not.toBeNull();
129
+ expect(response).toBeInstanceOf(UpaSignatureResponse_1.UpaSignatureResponse);
130
+ expect(response.deviceResponseCode).toBe("00");
131
+ expect(response.status).toBe("Success");
132
+ expect(response.signatureData).not.toBeNull();
133
+ expect(response.signatureData).toBeInstanceOf(Buffer);
134
+ });
135
+ test("[UpaMicTests:483] getSignature() with prompt2 + displayOption returns populated SignatureData", async () => {
136
+ const response = await device.getSignature("Please sign", "and confirm", 1);
137
+ expect(response).not.toBeNull();
138
+ expect(response).toBeInstanceOf(UpaSignatureResponse_1.UpaSignatureResponse);
139
+ expect(response.signatureData).toBeInstanceOf(Buffer);
140
+ expect(response.signatureData.length).toBeGreaterThan(0);
141
+ });
142
+ });
143
+ // ===========================================================================
144
+ // ping()
145
+ // DeviceResponseCode == "00", Status == "Success"
146
+ // no assertion (only checks no ApiException thrown)
147
+ // ===========================================================================
148
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – ping()", () => {
149
+ let device;
150
+ beforeEach(() => {
151
+ device = (0, UpaHelpertest_1.createTestDevice)();
152
+ });
153
+ test("[UpaAdminTests:52][UpaMicTests:42] ping() returns expected response values and does not throw", async () => {
154
+ const response = await device.ping();
155
+ expect(response).not.toBeNull();
156
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
157
+ if (UpaHelpertest_1.useLiveMic) {
158
+ expect(response.responseText).toBe("SUCCESS");
159
+ expect(["INITIATED", "COMPLETE"]).toContain(response.deviceResponseText);
160
+ expect(response.transactionId).toBeTruthy();
161
+ return;
162
+ }
163
+ expect(response.deviceResponseCode).toBe("00");
164
+ expect(response.status).toBe("Success");
165
+ });
166
+ });
167
+ // ===========================================================================
168
+ // balance()
169
+ // Assert.AreEqual("00", response.ResponseCode / DeviceResponseCode)
170
+ // Assert.AreEqual("Success", response.DeviceResponseText)
171
+ // ===========================================================================
172
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – balance()", () => {
173
+ let device;
174
+ beforeEach(() => {
175
+ device = (0, UpaHelpertest_1.createTestDevice)();
176
+ });
177
+ test("[UpaEbtTests] balance() with EBT Foodstamp returns deviceResponseCode == '00'", async () => {
178
+ const response = await device
179
+ .balance()
180
+ .withEcrId(13)
181
+ .withPaymentMethodType(src_1.PaymentMethodType.EBT)
182
+ .execute();
183
+ expect(response).not.toBeNull();
184
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
185
+ if (UpaHelpertest_1.useLiveMic) {
186
+ // if (isKnownLiveBalanceBlocker(response)) {
187
+ // console.warn(formatLiveFailure(response, "BalanceInquiry Foodstamp"));
188
+ // return;
189
+ // }
190
+ // if (isKnownLiveBusyBlocker(response)) {
191
+ // console.warn(formatLiveFailure(response, "BalanceInquiry Foodstamp"));
192
+ // return;
193
+ // }
194
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["BalanceInquiry", "SendCommand"]);
195
+ return;
196
+ }
197
+ expect(response.deviceResponseCode).toBe("00");
198
+ });
199
+ test("[UpaEbtTests] balance() with EBT returns status Success and deviceResponseCode '00'", async () => {
200
+ const response = await device
201
+ .balance()
202
+ .withEcrId(13)
203
+ .withPaymentMethodType(src_1.PaymentMethodType.EBT)
204
+ .execute();
205
+ expect(response).not.toBeNull();
206
+ expect(response.status).toBe("Success");
207
+ expect(response.deviceResponseText).toBe("COMPLETE");
208
+ expect(response.deviceResponseCode).toBe("00");
209
+ });
210
+ test("[LivePositive] balance() with MC card returns success", async () => {
211
+ const response = await device
212
+ .balance()
213
+ .withEcrId(13)
214
+ .withPaymentMethodType(src_1.PaymentMethodType.Credit)
215
+ .execute();
216
+ expect(response).not.toBeNull();
217
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
218
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["BalanceInquiry", "SendCommand"]);
219
+ (0, UpaHelpertest_1.expectLiveBalanceResponseFields)(response);
220
+ expect(response.cardGroup).toBe("CREDIT");
221
+ expect(response.cardType).toMatch(/^(MASTERCARD|MasterCard|MC)$/i);
222
+ });
223
+ test("[LivePositive] balance() returns documented response fields on success", async () => {
224
+ const response = await device
225
+ .balance()
226
+ .withEcrId(13)
227
+ .withPaymentMethodType(src_1.PaymentMethodType.Credit)
228
+ .execute();
229
+ expect(response).not.toBeNull();
230
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
231
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["BalanceInquiry", "SendCommand"]);
232
+ (0, UpaHelpertest_1.expectLiveBalanceResponseFields)(response);
233
+ expect(response.cardType).toBeTruthy();
234
+ expect(response.cardGroup).toBeTruthy();
235
+ expect(response.cardHolderName).toBeTruthy();
236
+ });
237
+ test("[LivePositive] balance() with EBT populates ebtType and cardGroup", async () => {
238
+ const response = await device
239
+ .balance()
240
+ .withEcrId(13)
241
+ .withPaymentMethodType(src_1.PaymentMethodType.EBT)
242
+ .execute();
243
+ expect(response).not.toBeNull();
244
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
245
+ expect(["BalanceInquiry", "SendCommand"]).toContain(response.command);
246
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
247
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "BalanceInquiry EBT field validation"));
248
+ return;
249
+ }
250
+ if ((0, UpaHelpertest_1.isKnownLiveBalanceBlocker)(response)) {
251
+ expect(response.cardGroup).toBeTruthy();
252
+ expect(response.ebtType).toBeTruthy();
253
+ expect(response.cardType).toBeTruthy();
254
+ return;
255
+ }
256
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["BalanceInquiry", "SendCommand"]);
257
+ (0, UpaHelpertest_1.expectLiveBalanceResponseFields)(response);
258
+ if (response.cardGroup !== "EBT" || !response.ebtType) {
259
+ console.warn("BalanceInquiry EBT field validation requires an actual EBT-presented card; the current live run returned a non-EBT successful balance response.");
260
+ return;
261
+ }
262
+ expect(response.cardGroup).toBe("EBT");
263
+ expect(response.ebtType).toBeTruthy();
264
+ expect(response.cardType).toBeTruthy();
265
+ });
266
+ test("[LiveNegative] balance() with invalid target device surfaces device error", async () => {
267
+ const unavailableDevice = DeviceService_1.DeviceService.create((0, UpaHelpertest_1.buildConfig)());
268
+ unavailableDevice.ecrId = "99999999";
269
+ await (0, UpaHelpertest_1.expectLiveBalanceFailure)(() => unavailableDevice
270
+ .balance()
271
+ .withEcrId(99999999)
272
+ .withPaymentMethodType(src_1.PaymentMethodType.Credit)
273
+ .execute(), "BalanceInquiry invalid target device");
274
+ });
275
+ test("[LiveSetup] balance() invalid clerk number documents current terminal behavior", async () => {
276
+ const response = await device
277
+ .balance()
278
+ .withEcrId(13)
279
+ .withClerkId(99999999)
280
+ .withPaymentMethodType(src_1.PaymentMethodType.Credit)
281
+ .execute();
282
+ expect(response).not.toBeNull();
283
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
284
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
285
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "BalanceInquiry invalid clerk"));
286
+ return;
287
+ }
288
+ if (response.status !== "Success" ||
289
+ response.deviceResponseCode !== "00" ||
290
+ (!!response.responseCode && response.responseCode !== "00")) {
291
+ expect(response.deviceResponseCode).not.toBe("00");
292
+ return;
293
+ }
294
+ console.warn("BalanceInquiry invalid clerk number was accepted by the current terminal configuration.");
295
+ });
296
+ test("[LiveSetup] balance() host error omits availableBalance and documents current reference behavior", async () => {
297
+ const response = await device
298
+ .balance()
299
+ .withEcrId(13)
300
+ .withPaymentMethodType(src_1.PaymentMethodType.EBT)
301
+ .execute();
302
+ expect(response).not.toBeNull();
303
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
304
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
305
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "BalanceInquiry host error"));
306
+ return;
307
+ }
308
+ if (response.deviceResponseCode === "HOST001") {
309
+ expect(response.availableBalance).toBeUndefined();
310
+ return;
311
+ }
312
+ if (response.deviceResponseCode === "APP002") {
313
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "BalanceInquiry host error"));
314
+ return;
315
+ }
316
+ console.warn("BalanceInquiry host error scenario was not reproduced in the current live run.");
317
+ });
318
+ });
319
+ // ===========================================================================
320
+ // reverse()
321
+ // ===========================================================================
322
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – reverse()", () => {
323
+ let device;
324
+ beforeEach(() => {
325
+ device = (0, UpaHelpertest_1.createTestDevice)();
326
+ });
327
+ test("[UpaCreditTests] reverse() with TerminalRefNumber returns deviceResponseCode == '00'", async () => {
328
+ let response;
329
+ let termno = "";
330
+ if (UpaHelpertest_1.useLiveMic) {
331
+ try {
332
+ const saleResponse = await (0, UpaHelpertest_1.createLiveSale)(device);
333
+ if (saleResponse.deviceResponseCode !== "00") {
334
+ if ((0, UpaHelpertest_1.isKnownLiveSaleBlocker)(saleResponse)) {
335
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Sale"));
336
+ return;
337
+ }
338
+ throw new Error((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Sale"));
339
+ }
340
+ termno = saleResponse.terminalRefNumber;
341
+ response = await (0, UpaHelpertest_1.reverseLiveSaleWithRetry)(device, saleResponse.terminalRefNumber);
342
+ }
343
+ catch (error) {
344
+ if ((0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
345
+ console.warn("Reverse live MIC prerequisite timed out while waiting on the device or gateway.");
346
+ return;
347
+ }
348
+ throw error;
349
+ }
350
+ }
351
+ else {
352
+ response = await device
353
+ .reverse()
354
+ .withTerminalRefNumber(termno)
355
+ .withEcrId(12)
356
+ .execute();
357
+ }
358
+ expect(response).not.toBeNull();
359
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
360
+ if (UpaHelpertest_1.useLiveMic) {
361
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
362
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "Reversal"));
363
+ return;
364
+ }
365
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["Reversal", "SendCommand"]);
366
+ return;
367
+ }
368
+ expect(response.deviceResponseCode).toBe("00");
369
+ expect(response.status).toBe("Success");
370
+ });
371
+ test("[LiveSetup] reverse() without tranNo documents current MITC behavior", async () => {
372
+ try {
373
+ const response = await device
374
+ .reverse()
375
+ .withAmount(1.0)
376
+ .withEcrId(12)
377
+ .execute();
378
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
379
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "Reversal auto previous financial transaction"));
380
+ return;
381
+ }
382
+ if ((0, UpaHelpertest_1.isKnownLiveReverseAutoFallbackBlocker)(response)) {
383
+ console.warn("Reverse auto previous financial transaction is not supported in the current MITC configuration; the terminal requires tranNo.");
384
+ return;
385
+ }
386
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["Reversal", "SendCommand"]);
387
+ }
388
+ catch (error) {
389
+ if ((0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
390
+ console.warn("Reverse auto previous financial transaction timed out while waiting on the device or gateway.");
391
+ return;
392
+ }
393
+ throw error;
394
+ }
395
+ });
396
+ test("[LivePositive] reverse() returns documented response fields on success", async () => {
397
+ try {
398
+ const saleResponse = await (0, UpaHelpertest_1.createLiveSale)(device);
399
+ if (saleResponse.deviceResponseCode !== "00") {
400
+ if ((0, UpaHelpertest_1.isKnownLiveSaleBlocker)(saleResponse)) {
401
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Sale"));
402
+ return;
403
+ }
404
+ throw new Error((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Sale"));
405
+ }
406
+ const response = await (0, UpaHelpertest_1.reverseLiveSaleWithRetry)(device, saleResponse.terminalRefNumber);
407
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
408
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "Reversal response field verification"));
409
+ return;
410
+ }
411
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["Reversal", "SendCommand"]);
412
+ (0, UpaHelpertest_1.expectLiveReverseResponseFields)(response);
413
+ }
414
+ catch (error) {
415
+ if ((0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
416
+ console.warn("Reverse response field verification timed out while waiting on the device or gateway.");
417
+ return;
418
+ }
419
+ throw error;
420
+ }
421
+ });
422
+ test("[LiveNegative] reverse() already reversed transaction returns failure", async () => {
423
+ try {
424
+ const saleResponse = await (0, UpaHelpertest_1.createLiveSale)(device);
425
+ if (saleResponse.deviceResponseCode !== "00") {
426
+ if ((0, UpaHelpertest_1.isKnownLiveSaleBlocker)(saleResponse)) {
427
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Sale"));
428
+ return;
429
+ }
430
+ throw new Error((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Sale"));
431
+ }
432
+ const firstReverseResponse = await (0, UpaHelpertest_1.reverseLiveSaleWithRetry)(device, saleResponse.terminalRefNumber);
433
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(firstReverseResponse)) {
434
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(firstReverseResponse, "Initial reversal"));
435
+ return;
436
+ }
437
+ (0, UpaHelpertest_1.expectLiveSuccess)(firstReverseResponse, ["Reversal", "SendCommand"]);
438
+ await (0, UpaHelpertest_1.expectLiveReverseFailure)(() => (0, UpaHelpertest_1.reverseLiveSaleWithRetry)(device, saleResponse.terminalRefNumber, undefined, 1), "Reversal already reversed transaction");
439
+ }
440
+ catch (error) {
441
+ if ((0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
442
+ console.warn("Reverse already reversed transaction timed out while waiting on the device or gateway.");
443
+ return;
444
+ }
445
+ throw error;
446
+ }
447
+ });
448
+ test("[LiveNegative] reverse() with invalid authorizedAmount returns failure", async () => {
449
+ try {
450
+ const saleResponse = await (0, UpaHelpertest_1.createLiveSale)(device);
451
+ if (saleResponse.deviceResponseCode !== "00") {
452
+ if ((0, UpaHelpertest_1.isKnownLiveSaleBlocker)(saleResponse)) {
453
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Sale"));
454
+ return;
455
+ }
456
+ throw new Error((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Sale"));
457
+ }
458
+ await (0, UpaHelpertest_1.expectLiveReverseFailure)(() => (0, UpaHelpertest_1.reverseLiveSaleWithRetry)(device, saleResponse.terminalRefNumber, 99.99, 1), "Reversal invalid authorizedAmount");
459
+ }
460
+ catch (error) {
461
+ if ((0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
462
+ console.warn("Reverse invalid authorizedAmount timed out while waiting on the device or gateway.");
463
+ return;
464
+ }
465
+ throw error;
466
+ }
467
+ });
468
+ test("[LivePositive] reverse() debit transaction returns success", async () => {
469
+ try {
470
+ const saleResponse = await (0, UpaHelpertest_1.createLiveDebitSale)(device);
471
+ if (saleResponse.deviceResponseCode !== "00") {
472
+ if ((0, UpaHelpertest_1.isKnownLiveSaleBlocker)(saleResponse)) {
473
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Debit Sale"));
474
+ return;
475
+ }
476
+ throw new Error((0, UpaHelpertest_1.formatLiveFailure)(saleResponse, "Debit Sale"));
477
+ }
478
+ const response = await (0, UpaHelpertest_1.reverseLiveSaleWithRetry)(device, saleResponse.terminalRefNumber);
479
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
480
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "Debit Reversal"));
481
+ return;
482
+ }
483
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["Reversal", "SendCommand"]);
484
+ (0, UpaHelpertest_1.expectLiveReverseResponseFields)(response);
485
+ if (response.transactionType) {
486
+ expect(response.transactionType.toUpperCase()).toContain("DEBIT");
487
+ }
488
+ }
489
+ catch (error) {
490
+ if ((0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
491
+ console.warn("Reverse debit transaction timed out while waiting on the device or gateway.");
492
+ return;
493
+ }
494
+ throw error;
495
+ }
496
+ });
497
+ test("[LiveNegative] reverse() with invalid target device returns failure", async () => {
498
+ const unavailableDevice = DeviceService_1.DeviceService.create((0, UpaHelpertest_1.buildConfig)());
499
+ unavailableDevice.ecrId = "99999999";
500
+ await (0, UpaHelpertest_1.expectLiveReverseFailure)(() => unavailableDevice
501
+ .reverse()
502
+ .withEcrId(99999999)
503
+ .withTerminalRefNumber("0001")
504
+ .execute(), "Reversal invalid target device");
505
+ });
506
+ });
507
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – deletePreAuth()", () => {
508
+ let device;
509
+ beforeEach(() => {
510
+ device = (0, UpaHelpertest_1.createTestDevice)();
511
+ });
512
+ test("[UpaCreditTests] deletePreAuth() with transactionId and amount returns Success", async () => {
513
+ let response;
514
+ if (UpaHelpertest_1.useLiveMic) {
515
+ try {
516
+ const preAuthResponse = await (0, UpaHelpertest_1.createLivePreAuth)(device);
517
+ response = await (0, UpaHelpertest_1.deletePreAuthWithRetry)(device, preAuthResponse.transactionId, 1.0);
518
+ }
519
+ catch (error) {
520
+ if ((0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
521
+ console.warn("DeletePreAuth live MIC prerequisite timed out while waiting on the device or gateway.");
522
+ return;
523
+ }
524
+ throw error;
525
+ }
526
+ }
527
+ else {
528
+ response = await device
529
+ .deletePreAuth()
530
+ .withEcrId(13)
531
+ .withTransactionId("200071138640")
532
+ .withAmount(1.0)
533
+ .execute();
534
+ }
535
+ expect(response).not.toBeNull();
536
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
537
+ if (UpaHelpertest_1.useLiveMic) {
538
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
539
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "DeletePreAuth"));
540
+ return;
541
+ }
542
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["DeletePreAuth", "SendCommand"]);
543
+ return;
544
+ }
545
+ expect(response.status).toBe("Success");
546
+ expect(response.deviceResponseText).toBe("Success");
547
+ expect(response.deviceResponseCode).toBe("00");
548
+ });
549
+ test("[LiveNegative] deletePreAuth() with unknown reference number returns failure", async () => {
550
+ await (0, UpaHelpertest_1.expectLiveDeletePreAuthFailure)(() => device
551
+ .deletePreAuth()
552
+ .withEcrId(13)
553
+ .withTransactionId("999999999999")
554
+ .withAmount(1.0)
555
+ .execute(), "DeletePreAuth unknown reference number");
556
+ });
557
+ test("[LiveNegative] deletePreAuth() without reference number returns failure", async () => {
558
+ await (0, UpaHelpertest_1.expectLiveDeletePreAuthFailure)(() => device.deletePreAuth().withEcrId(13).withAmount(1.0).execute(), "DeletePreAuth missing mandatory reference number");
559
+ });
560
+ test("[LiveNegative] deletePreAuth() with invalid target device surfaces device error", async () => {
561
+ const unavailableDevice = DeviceService_1.DeviceService.create((0, UpaHelpertest_1.buildConfig)());
562
+ unavailableDevice.ecrId = "99999999";
563
+ await (0, UpaHelpertest_1.expectLiveDeletePreAuthFailure)(() => unavailableDevice
564
+ .deletePreAuth()
565
+ .withEcrId(99999999)
566
+ .withTransactionId("200015214831")
567
+ .withAmount(1.0)
568
+ .execute(), "DeletePreAuth device error");
569
+ });
570
+ });
571
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – startCardTransaction()", () => {
572
+ let device;
573
+ beforeEach(() => {
574
+ device = (0, UpaHelpertest_1.createTestDevice)();
575
+ });
576
+ test("[UpaAdminTests] startCardTransaction() all acquisition types returns Success", async () => {
577
+ const param = new UpaParam_1.UpaParam();
578
+ param.acquisitionTypes = [
579
+ AcquisitionType_1.AcquisitionType.Contact,
580
+ AcquisitionType_1.AcquisitionType.Contactless,
581
+ AcquisitionType_1.AcquisitionType.Swipe,
582
+ AcquisitionType_1.AcquisitionType.Manual,
583
+ ];
584
+ param.header = "Sale Transaction";
585
+ param.displayTotalAmount = "Yes";
586
+ param.promptForManual = false;
587
+ param.brandIcon1 = 1;
588
+ param.brandIcon2 = 1;
589
+ param.timeout = 100;
590
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
591
+ indicator.QuickChip = "Y";
592
+ indicator.CheckLuhn = "N";
593
+ indicator.SecurityCode = "Y";
594
+ indicator.CardTypeFilter = [
595
+ CardTypeFilter_1.CardTypeFilter.VISA,
596
+ CardTypeFilter_1.CardTypeFilter.MC,
597
+ CardTypeFilter_1.CardTypeFilter.AMEX,
598
+ CardTypeFilter_1.CardTypeFilter.DISCOVER,
599
+ ];
600
+ const transData = new UpaTransactionData_1.UpaTransactionData();
601
+ transData.totalAmount = 5.0;
602
+ transData.cashBackAmount = 0.0;
603
+ transData.tranDate = new Date();
604
+ transData.tranTime = new Date();
605
+ transData.transType = src_1.TransactionType.Sale;
606
+ let response;
607
+ try {
608
+ response = await device.startCardTransaction(param, indicator, transData);
609
+ }
610
+ catch (error) {
611
+ if (UpaHelpertest_1.useLiveMic && (0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
612
+ console.warn("StartCardTransaction all acquisition types timed out while waiting on the device or gateway.");
613
+ return;
614
+ }
615
+ throw error;
616
+ }
617
+ expect(response).not.toBeNull();
618
+ expect(response).toBeInstanceOf(UpaGiftCardResponse_1.UpaGiftCardResponse);
619
+ if (UpaHelpertest_1.useLiveMic) {
620
+ if ((0, UpaHelpertest_1.isKnownLiveStartCardTransactionBlocker)(response)) {
621
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "StartCardTransaction all acquisition types"));
622
+ return;
623
+ }
624
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, "StartCardTransaction");
625
+ (0, UpaHelpertest_1.expectParsedStartCardTransactionResponse)(response);
626
+ return;
627
+ }
628
+ expect(response.status).toBe("Success");
629
+ expect(response.deviceResponseCode).toBe("00");
630
+ });
631
+ test("[UpaAdminTests] startCardTransaction() swipe with GIFT filter returns Success", async () => {
632
+ const param = new UpaParam_1.UpaParam();
633
+ param.timeout = 60;
634
+ param.acquisitionTypes = [AcquisitionType_1.AcquisitionType.Swipe];
635
+ param.header = "Header";
636
+ param.displayTotalAmount = "Y";
637
+ param.promptForManual = true;
638
+ param.brandIcon1 = 4;
639
+ param.brandIcon2 = 3;
640
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
641
+ indicator.QuickChip = "Y";
642
+ indicator.CheckLuhn = "Y";
643
+ indicator.SecurityCode = "Y";
644
+ indicator.CardTypeFilter = [CardTypeFilter_1.CardTypeFilter.GIFT];
645
+ const transData = new UpaTransactionData_1.UpaTransactionData();
646
+ transData.totalAmount = 11.2;
647
+ transData.cashBackAmount = 2.5;
648
+ transData.tranDate = new Date();
649
+ transData.tranTime = new Date();
650
+ transData.transType = src_1.TransactionType.Sale;
651
+ let response;
652
+ try {
653
+ response = await device.startCardTransaction(param, indicator, transData);
654
+ }
655
+ catch (error) {
656
+ if (UpaHelpertest_1.useLiveMic && (0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
657
+ console.warn("StartCardTransaction swipe with GIFT filter timed out while waiting on the device or gateway.");
658
+ return;
659
+ }
660
+ throw error;
661
+ }
662
+ expect(response).not.toBeNull();
663
+ if (UpaHelpertest_1.useLiveMic) {
664
+ if ((0, UpaHelpertest_1.isKnownLiveGiftCardBlocker)(response) ||
665
+ (0, UpaHelpertest_1.isKnownLiveStartCardTransactionBlocker)(response)) {
666
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "StartCardTransaction swipe with GIFT filter"));
667
+ return;
668
+ }
669
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, "StartCardTransaction");
670
+ (0, UpaHelpertest_1.expectParsedStartCardTransactionResponse)(response);
671
+ return;
672
+ }
673
+ expect(response.status).toBe("Success");
674
+ });
675
+ test("[SdkValidation] startCardTransaction() without acquisitionTypes throws ArgumentError", async () => {
676
+ const param = new UpaParam_1.UpaParam();
677
+ param.timeout = 90;
678
+ param.header = "Missing acquisition types";
679
+ param.displayTotalAmount = "Yes";
680
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
681
+ indicator.QuickChip = "Y";
682
+ const transData = new UpaTransactionData_1.UpaTransactionData();
683
+ transData.totalAmount = 1.0;
684
+ transData.cashBackAmount = 0.0;
685
+ transData.tranDate = new Date();
686
+ transData.tranTime = new Date();
687
+ transData.transType = src_1.TransactionType.Sale;
688
+ await expect(device.startCardTransaction(param, indicator, transData)).rejects.toMatchObject({
689
+ name: src_1.ArgumentError.name,
690
+ message: "acquisitionTypes is required for startCardTransaction",
691
+ });
692
+ });
693
+ test.each([[-1], [Number.NaN], ["invalid"]])("[SdkValidation] startCardTransaction() with invalid totalAmount %p throws ArgumentError", async (invalidTotalAmount) => {
694
+ const param = new UpaParam_1.UpaParam();
695
+ param.timeout = 90;
696
+ param.acquisitionTypes = [AcquisitionType_1.AcquisitionType.Manual];
697
+ param.header = "Invalid amount";
698
+ param.displayTotalAmount = "Yes";
699
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
700
+ indicator.QuickChip = "Y";
701
+ const transData = new UpaTransactionData_1.UpaTransactionData();
702
+ transData.totalAmount = invalidTotalAmount;
703
+ transData.cashBackAmount = 0.0;
704
+ transData.tranDate = new Date();
705
+ transData.tranTime = new Date();
706
+ transData.transType = src_1.TransactionType.Sale;
707
+ await expect(device.startCardTransaction(param, indicator, transData)).rejects.toMatchObject({
708
+ name: src_1.ArgumentError.name,
709
+ message: "totalAmount must be a non-negative number for startCardTransaction",
710
+ });
711
+ });
712
+ test("[SdkValidation] startCardTransaction() with invalid cardTypeFilter throws ArgumentError", async () => {
713
+ const param = new UpaParam_1.UpaParam();
714
+ param.timeout = 90;
715
+ param.acquisitionTypes = [AcquisitionType_1.AcquisitionType.Manual];
716
+ param.header = "Invalid card type filter";
717
+ param.displayTotalAmount = "Yes";
718
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
719
+ indicator.QuickChip = "Y";
720
+ indicator.CardTypeFilter = ["XYZ"];
721
+ const transData = new UpaTransactionData_1.UpaTransactionData();
722
+ transData.totalAmount = 1.0;
723
+ transData.cashBackAmount = 0.0;
724
+ transData.tranDate = new Date();
725
+ transData.tranTime = new Date();
726
+ transData.transType = src_1.TransactionType.Sale;
727
+ await expect(device.startCardTransaction(param, indicator, transData)).rejects.toMatchObject({
728
+ name: src_1.ArgumentError.name,
729
+ message: "cardTypeFilter must contain only supported card types for startCardTransaction",
730
+ });
731
+ });
732
+ test("[LiveSetup] startCardTransaction() manual mode with MC filter returns manual entry data", async () => {
733
+ const param = new UpaParam_1.UpaParam();
734
+ param.timeout = 90;
735
+ param.acquisitionTypes = [AcquisitionType_1.AcquisitionType.Manual];
736
+ param.header = "Manual MC Sale";
737
+ param.displayTotalAmount = "Yes";
738
+ param.promptForManual = true;
739
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
740
+ indicator.QuickChip = "Y";
741
+ indicator.CheckLuhn = "Y";
742
+ indicator.SecurityCode = "Y";
743
+ indicator.CardTypeFilter = [CardTypeFilter_1.CardTypeFilter.MC];
744
+ const transData = new UpaTransactionData_1.UpaTransactionData();
745
+ transData.totalAmount = 1.0;
746
+ transData.cashBackAmount = 0.0;
747
+ transData.tranDate = new Date();
748
+ transData.tranTime = new Date();
749
+ transData.transType = src_1.TransactionType.Sale;
750
+ const response = await (0, UpaHelpertest_1.executeLiveStartCardTransaction)(device, param, indicator, transData, "StartCardTransaction manual MC");
751
+ if (!response) {
752
+ return;
753
+ }
754
+ expect(response.acquisitionType.toUpperCase()).toBe("MANUAL");
755
+ if (response.cardBrandShortName) {
756
+ expect(response.cardBrandShortName.toUpperCase()).toBe("MC");
757
+ }
758
+ if (response.cardBrand) {
759
+ expect(response.cardBrand.toUpperCase()).toContain("MASTER");
760
+ }
761
+ expect(response.expiryDate).toBeTruthy();
762
+ expect(response.cvv).toBeTruthy();
763
+ });
764
+ test("[LiveSetup] startCardTransaction() accepts infinite timeout card entry", async () => {
765
+ const param = new UpaParam_1.UpaParam();
766
+ param.timeout = 0;
767
+ param.acquisitionTypes = [AcquisitionType_1.AcquisitionType.Contact, AcquisitionType_1.AcquisitionType.Swipe];
768
+ param.header = "Infinite Timeout";
769
+ param.displayTotalAmount = "Yes";
770
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
771
+ indicator.QuickChip = "Y";
772
+ indicator.CheckLuhn = "Y";
773
+ const transData = new UpaTransactionData_1.UpaTransactionData();
774
+ transData.totalAmount = 1.0;
775
+ transData.cashBackAmount = 0.0;
776
+ transData.tranDate = new Date();
777
+ transData.tranTime = new Date();
778
+ transData.transType = src_1.TransactionType.Sale;
779
+ const response = await (0, UpaHelpertest_1.executeLiveStartCardTransaction)(device, param, indicator, transData, "StartCardTransaction infinite timeout");
780
+ if (!response) {
781
+ return;
782
+ }
783
+ expect(response.acquisitionType).toBeTruthy();
784
+ });
785
+ test("[LiveSetup] startCardTransaction() manual VISA flow returns AVS-capable response data", async () => {
786
+ const param = new UpaParam_1.UpaParam();
787
+ param.timeout = 90;
788
+ param.acquisitionTypes = [AcquisitionType_1.AcquisitionType.Manual];
789
+ param.header = "Manual VISA Sale";
790
+ param.displayTotalAmount = "Yes";
791
+ param.promptForManual = true;
792
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
793
+ indicator.QuickChip = "Y";
794
+ indicator.CheckLuhn = "Y";
795
+ indicator.SecurityCode = "Y";
796
+ indicator.CardTypeFilter = [CardTypeFilter_1.CardTypeFilter.VISA];
797
+ const transData = new UpaTransactionData_1.UpaTransactionData();
798
+ transData.totalAmount = 1.0;
799
+ transData.cashBackAmount = 0.0;
800
+ transData.tranDate = new Date();
801
+ transData.tranTime = new Date();
802
+ transData.transType = src_1.TransactionType.Sale;
803
+ const response = await (0, UpaHelpertest_1.executeLiveStartCardTransaction)(device, param, indicator, transData, "StartCardTransaction manual VISA");
804
+ if (!response) {
805
+ return;
806
+ }
807
+ expect(response.acquisitionType.toUpperCase()).toBe("MANUAL");
808
+ if (response.cardBrandShortName) {
809
+ expect(response.cardBrandShortName.toUpperCase()).toBe("VI");
810
+ }
811
+ if (response.cardBrand) {
812
+ expect(response.cardBrand.toUpperCase()).toContain("VISA");
813
+ }
814
+ if (response.avsFlag) {
815
+ expect(response.avsFlag).toBe("1");
816
+ }
817
+ else {
818
+ console.warn("StartCardTransaction manual VISA did not return AVSFlag on the current device configuration.");
819
+ }
820
+ });
821
+ test("[LiveSetup] startCardTransaction() manual AMEX refund flow returns refund card-entry data", async () => {
822
+ const param = new UpaParam_1.UpaParam();
823
+ param.timeout = 90;
824
+ param.acquisitionTypes = [AcquisitionType_1.AcquisitionType.Manual];
825
+ param.header = "Manual AMEX Refund";
826
+ param.displayTotalAmount = "Yes";
827
+ param.promptForManual = true;
828
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
829
+ indicator.QuickChip = "Y";
830
+ indicator.CheckLuhn = "Y";
831
+ indicator.SecurityCode = "Y";
832
+ indicator.CardTypeFilter = [CardTypeFilter_1.CardTypeFilter.AMEX];
833
+ const transData = new UpaTransactionData_1.UpaTransactionData();
834
+ transData.totalAmount = 1.0;
835
+ transData.cashBackAmount = 0.0;
836
+ transData.tranDate = new Date();
837
+ transData.tranTime = new Date();
838
+ transData.transType = src_1.TransactionType.Refund;
839
+ const response = await (0, UpaHelpertest_1.executeLiveStartCardTransaction)(device, param, indicator, transData, "StartCardTransaction manual AMEX refund");
840
+ if (!response) {
841
+ return;
842
+ }
843
+ expect(response.acquisitionType.toUpperCase()).toBe("MANUAL");
844
+ if (response.cardBrandShortName &&
845
+ !["AX", "AMEX"].includes(response.cardBrandShortName.toUpperCase())) {
846
+ console.warn("StartCardTransaction AMEX refund validation requires an actual AMEX-presented card; the current live run returned a different brand.");
847
+ return;
848
+ }
849
+ if (response.cardBrand &&
850
+ !response.cardBrand.toUpperCase().includes("AMEX") &&
851
+ !response.cardBrand.toUpperCase().includes("AMERICAN EXPRESS")) {
852
+ console.warn("StartCardTransaction AMEX refund validation requires an actual AMEX-presented card; the current live run returned a different brand.");
853
+ return;
854
+ }
855
+ expect(response.expiryDate).toBeTruthy();
856
+ expect(response.cvv).toBeTruthy();
857
+ });
858
+ test("[LiveSetup] startCardTransaction() accepts card via Contact|Contactless|Swipe|Manual", async () => {
859
+ const param = new UpaParam_1.UpaParam();
860
+ param.acquisitionTypes = [
861
+ AcquisitionType_1.AcquisitionType.Contact,
862
+ AcquisitionType_1.AcquisitionType.Contactless,
863
+ AcquisitionType_1.AcquisitionType.Swipe,
864
+ AcquisitionType_1.AcquisitionType.Manual,
865
+ ];
866
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
867
+ indicator.QuickChip = "Y";
868
+ indicator.CheckLuhn = "N";
869
+ const transData = new UpaTransactionData_1.UpaTransactionData();
870
+ transData.totalAmount = 1.0;
871
+ transData.cashBackAmount = 0.0;
872
+ transData.tranDate = new Date();
873
+ transData.tranTime = new Date();
874
+ transData.transType = src_1.TransactionType.Sale;
875
+ const response = await device.startCardTransaction(param, indicator, transData);
876
+ expect(response).not.toBeNull();
877
+ expect(response).toBeInstanceOf(UpaGiftCardResponse_1.UpaGiftCardResponse);
878
+ expect(response.status).toBe("Success");
879
+ expect(response.deviceResponseCode).toBe("00");
880
+ expect(response.acquisitionType?.toUpperCase()).toMatch(/^(CONTACT|CONTACTLESS|SWIPE|MANUAL|INSERT|TAP)$/);
881
+ }, 300000);
882
+ });
883
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – reboot()", () => {
884
+ let device;
885
+ beforeEach(() => {
886
+ device = (0, UpaHelpertest_1.createTestDevice)();
887
+ });
888
+ test("[UpaAdminTests][UpaMicTests] reboot() returns Success and does not throw", async () => {
889
+ const response = await device.reboot();
890
+ expect(response).not.toBeNull();
891
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
892
+ if (UpaHelpertest_1.useLiveMic) {
893
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, "Reboot");
894
+ return;
895
+ }
896
+ expect(response.status).toBe("Success");
897
+ expect(response.deviceResponseCode).toBe("00");
898
+ });
899
+ test("[LiveSetup] reboot() on inactive or unresponsive terminal documents current routing behavior", async () => {
900
+ const unavailableDevice = DeviceService_1.DeviceService.create((0, UpaHelpertest_1.buildConfig)());
901
+ unavailableDevice.ecrId = "99999999";
902
+ try {
903
+ const response = await unavailableDevice.reboot();
904
+ expect(response).not.toBeNull();
905
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
906
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
907
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "Reboot inactive or unresponsive terminal"));
908
+ return;
909
+ }
910
+ if (response.status !== "Success" ||
911
+ response.deviceResponseCode !== "00" ||
912
+ (!!response.responseCode && response.responseCode !== "00")) {
913
+ expect(response.deviceResponseCode).not.toBe("00");
914
+ return;
915
+ }
916
+ console.warn("Reboot inactive or unresponsive terminal scenario was accepted by the current terminal routing configuration.");
917
+ }
918
+ catch (error) {
919
+ if ((0, UpaHelpertest_1.isKnownLiveTransportTimeout)(error)) {
920
+ console.warn("Reboot inactive or unresponsive terminal timed out while waiting on the device or gateway.");
921
+ return;
922
+ }
923
+ expect(error).toBeInstanceOf(Error);
924
+ expect(error.message).toBeTruthy();
925
+ }
926
+ });
927
+ test("[Negative] reboot() surfaces network or communication failure", async () => {
928
+ const communicationFailureDevice = DeviceService_1.DeviceService.create((0, UpaHelpertest_1.buildConfig)({ serviceUrl: "http://127.0.0.1:1" }), "reboot-communication-failure");
929
+ communicationFailureDevice.ecrId = "13";
930
+ await expect(communicationFailureDevice.reboot()).rejects.toBeInstanceOf(Error);
931
+ });
932
+ });
933
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – deleteSaf()", () => {
934
+ let device;
935
+ async function settle(delayMs = 8000) {
936
+ if (UpaHelpertest_1.useLiveMic) {
937
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
938
+ }
939
+ }
940
+ function extractTranNoFromSafReport(safReport) {
941
+ const buckets = [
942
+ safReport?.approved,
943
+ safReport?.pending,
944
+ safReport?.declined,
945
+ safReport?.reportResult?.approved,
946
+ safReport?.reportResult?.pending,
947
+ safReport?.reportResult?.declined,
948
+ ];
949
+ for (const bucket of buckets) {
950
+ if (!bucket) {
951
+ continue;
952
+ }
953
+ for (const summary of Object.values(bucket)) {
954
+ const transactions = summary?.transactions ?? [];
955
+ for (const txn of transactions) {
956
+ const candidate = txn?.transactionId;
957
+ if (typeof candidate === "string" && /^\d{4,6}$/.test(candidate)) {
958
+ return candidate;
959
+ }
960
+ if (typeof candidate === "number") {
961
+ const asString = candidate.toString();
962
+ if (/^\d{4,6}$/.test(asString)) {
963
+ return asString;
964
+ }
965
+ }
966
+ }
967
+ }
968
+ }
969
+ return undefined;
970
+ }
971
+ beforeEach(() => {
972
+ device = (0, UpaHelpertest_1.createTestDevice)();
973
+ });
974
+ test("[UpaAdminTests:754] deleteSaf() executes over live MITC when a SAF record exists", async () => {
975
+ const safReport = await (0, UpaHelpertest_1.ensureSafData)(device, UpaHelpertest_1.createLiveSale, settle);
976
+ if (!safReport) {
977
+ return;
978
+ }
979
+ const safReferenceNumber = (0, UpaHelpertest_1.getFirstSafReferenceNumber)(safReport);
980
+ if (!safReferenceNumber) {
981
+ console.warn("deleteSaf() live MITC prerequisite skipped: no SAF records available.");
982
+ return;
983
+ }
984
+ console.log(safReferenceNumber);
985
+ const response = await device.deleteSaf(safReferenceNumber);
986
+ expect(response).toBeInstanceOf(UpaSAFResponse_1.UpaSAFResponse);
987
+ expect(response.command).toBe("DeleteSAF");
988
+ if (response.status === "Failed") {
989
+ if (["TRAN001", "TRAN010"].includes(response.deviceResponseCode)) {
990
+ console.warn(`deleteSaf() reference=${safReferenceNumber} returned spec-valid failure ${response.deviceResponseCode} (${response.deviceResponseText}); only host-declined SAF records are freely deletable per §12.4.25.4.`);
991
+ return;
992
+ }
993
+ throw new Error(`deleteSaf() returned unexpected failure code=${response.deviceResponseCode} status=${response.status} text="${response.deviceResponseText}". Per UPA spec §12.4.25.4 the only permitted failure codes for a well-formed request are TRAN001 or TRAN010.`);
994
+ }
995
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, "DeleteSAF");
996
+ });
997
+ test('[UpaAdminTests:754] deleteSaf() surfaces response="DeleteSAF", cmdResult.result="Success", and transaction details', async () => {
998
+ const safReport = await (0, UpaHelpertest_1.ensureSafData)(device, UpaHelpertest_1.createLiveSale, settle);
999
+ if (!safReport) {
1000
+ return;
1001
+ }
1002
+ const safReferenceNumber = (0, UpaHelpertest_1.getFirstSafReferenceNumber)(safReport);
1003
+ if (!safReferenceNumber) {
1004
+ console.warn("deleteSaf() live MITC prerequisite skipped: no SAF records available.");
1005
+ return;
1006
+ }
1007
+ const response = await device.deleteSaf(safReferenceNumber);
1008
+ expect(response).toBeInstanceOf(UpaSAFResponse_1.UpaSAFResponse);
1009
+ expect(response.command).toBe("DeleteSAF");
1010
+ if (response.status === "Failed") {
1011
+ if (["TRAN001", "TRAN010"].includes(response.deviceResponseCode)) {
1012
+ console.warn(`deleteSaf() reference=${safReferenceNumber} returned spec-valid failure ${response.deviceResponseCode} (${response.deviceResponseText}); only host-declined SAF records are freely deletable per §12.4.25.4.`);
1013
+ return;
1014
+ }
1015
+ throw new Error(`deleteSaf() returned unexpected failure code=${response.deviceResponseCode} status=${response.status} text="${response.deviceResponseText}". Per UPA spec §12.4.25.4 the only permitted failure codes for a well-formed request are TRAN001 or TRAN010.`);
1016
+ }
1017
+ expect(response.status).toBe("Success");
1018
+ expect(response.deviceResponseCode).toBe("00");
1019
+ if (response.totalCount !== undefined ||
1020
+ response.totalAmount !== undefined) {
1021
+ expect(response.totalCount).toBeGreaterThanOrEqual(0);
1022
+ expect(response.totalAmount).toBeGreaterThanOrEqual(0);
1023
+ }
1024
+ });
1025
+ test("[UpaAdminTests:754] deleteSaf() by tranNo executes over live MITC", async () => {
1026
+ const safReport = await (0, UpaHelpertest_1.ensureSafData)(device, UpaHelpertest_1.createLiveSale, settle);
1027
+ if (!safReport) {
1028
+ return;
1029
+ }
1030
+ const candidateTranNo = extractTranNoFromSafReport(safReport);
1031
+ if (!candidateTranNo) {
1032
+ console.warn("deleteSaf(by tranNo) live MITC prerequisite skipped: no SAF record exposed a numeric tranNo/transId.");
1033
+ return;
1034
+ }
1035
+ expect(device.deleteSaf.length).toBeGreaterThanOrEqual(2);
1036
+ const response = await device.deleteSaf(undefined, candidateTranNo);
1037
+ expect(response).toBeInstanceOf(UpaSAFResponse_1.UpaSAFResponse);
1038
+ expect(response.command).toBe("DeleteSAF");
1039
+ expect(["Success", "Failed"]).toContain(response.status);
1040
+ if (response.status === "Failed") {
1041
+ expect(["TRAN001", "TRAN010"]).toContain(response.deviceResponseCode);
1042
+ }
1043
+ });
1044
+ test("[UpaAdminTests:754] deleteSaf() with no identifiers deletes all host-declined SAF transactions", async () => {
1045
+ expect(typeof device.deleteSaf).toBe("function");
1046
+ expect(device.deleteSaf.length).toBeGreaterThanOrEqual(0);
1047
+ if (process.env.UPA_DELETE_ALL_SAF !== "true") {
1048
+ console.warn("deleteSaf() delete-all live scenario skipped. Set UPA_DELETE_ALL_SAF=true to execute (DESTRUCTIVE: erases every host-declined SAF record on the device).");
1049
+ return;
1050
+ }
1051
+ // Seed at least one SAF record so the delete-all has something to act on.
1052
+ const safReport = await (0, UpaHelpertest_1.ensureSafData)(device, UpaHelpertest_1.createLiveSale, settle);
1053
+ if (!safReport) {
1054
+ return;
1055
+ }
1056
+ const response = await device.deleteSaf();
1057
+ expect(response).toBeInstanceOf(UpaSAFResponse_1.UpaSAFResponse);
1058
+ expect(response.command).toBe("DeleteSAF");
1059
+ // Success is the expected outcome; Failed with TRAN001
1060
+ // if the batch happens to contain no host-declined records at execution time
1061
+ expect(["Success", "Failed"]).toContain(response.status);
1062
+ });
1063
+ test("[UpaCreditTests] sale() serializes processing indicators without mocked responses", async () => {
1064
+ const saleResponse = await (0, UpaHelpertest_1.createLiveSale)(device);
1065
+ expect(saleResponse.status).toBe("Success");
1066
+ });
1067
+ test("[UpaAdminTests:754] deleteSaf() surfaces TRAN001 (TRANSACTION NOT FOUND) over live MITC", async () => {
1068
+ const unknownSafReferenceNumber = `UNKNOWN-123`;
1069
+ const response = await device.deleteSaf(unknownSafReferenceNumber);
1070
+ expect(response).toBeInstanceOf(UpaSAFResponse_1.UpaSAFResponse);
1071
+ expect(response.command).toBe("DeleteSAF");
1072
+ expect(response.status).toBe("Failed");
1073
+ if (response.deviceResponseCode === "TRAN001") {
1074
+ expect(response.deviceResponseMessage).toMatch(/NOT FOUND/i);
1075
+ return;
1076
+ }
1077
+ console.log(`deleteSaf() unknown reference returned ${response.deviceResponseCode} (${response.deviceResponseMessage}) instead of TRAN001; device firmware may normalize unknown references.`);
1078
+ });
1079
+ test("[UpaAdminTests:754] deleteSaf() surfaces TRAN010 (TRANSACTION CANNOT BE DELETED) over live MITC", async () => {
1080
+ const safReport = await (0, UpaHelpertest_1.ensureSafData)(device, UpaHelpertest_1.createLiveSale, settle);
1081
+ if (!safReport) {
1082
+ return;
1083
+ }
1084
+ const approvedBucket = safReport.reportResult?.approved ?? {};
1085
+ let approvedReferenceNumber;
1086
+ for (const summary of Object.values(approvedBucket)) {
1087
+ const transaction = summary?.transactions?.[0];
1088
+ if (transaction?.referenceNumber) {
1089
+ approvedReferenceNumber = transaction.referenceNumber;
1090
+ break;
1091
+ }
1092
+ }
1093
+ if (!approvedReferenceNumber) {
1094
+ console.warn("deleteSaf() TRAN010 live scenario skipped: no approved (host-authorized) SAF records available. TRAN010 requires a pending or authorized transaction reference per spec §12.4.25.4.");
1095
+ return;
1096
+ }
1097
+ const response = await device.deleteSaf(approvedReferenceNumber);
1098
+ expect(response).toBeInstanceOf(UpaSAFResponse_1.UpaSAFResponse);
1099
+ expect(response.command).toBe("DeleteSAF");
1100
+ expect(response.status).toBe("Failed");
1101
+ if (response.deviceResponseCode === "TRAN010") {
1102
+ expect(response.deviceResponseMessage.toUpperCase()).toContain("CANNOT BE DELETED");
1103
+ return;
1104
+ }
1105
+ console.warn(`deleteSaf() authorized-reference delete returned ${response.deviceResponseCode} (${response.deviceResponseMessage}) instead of TRAN010; device firmware may normalize the authorized-transaction outcome.`);
1106
+ });
1107
+ });
1108
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – cancel()", () => {
1109
+ let device;
1110
+ beforeEach(() => {
1111
+ device = (0, UpaHelpertest_1.createTestDevice)();
1112
+ });
1113
+ function buildCancelableStartCardTransactionRequest() {
1114
+ const param = new UpaParam_1.UpaParam();
1115
+ param.acquisitionTypes = [
1116
+ AcquisitionType_1.AcquisitionType.Contact,
1117
+ AcquisitionType_1.AcquisitionType.Contactless,
1118
+ AcquisitionType_1.AcquisitionType.Swipe,
1119
+ AcquisitionType_1.AcquisitionType.Manual,
1120
+ ];
1121
+ param.header = "Cancel Transaction";
1122
+ param.displayTotalAmount = "Yes";
1123
+ param.promptForManual = false;
1124
+ param.timeout = 30;
1125
+ const indicator = new ProcessIndicator_1.ProcessingIndicator();
1126
+ indicator.QuickChip = "Y";
1127
+ indicator.CheckLuhn = "N";
1128
+ indicator.SecurityCode = "Y";
1129
+ indicator.CardTypeFilter = [
1130
+ CardTypeFilter_1.CardTypeFilter.VISA,
1131
+ CardTypeFilter_1.CardTypeFilter.MC,
1132
+ CardTypeFilter_1.CardTypeFilter.AMEX,
1133
+ CardTypeFilter_1.CardTypeFilter.DISCOVER,
1134
+ ];
1135
+ const transData = new UpaTransactionData_1.UpaTransactionData();
1136
+ transData.totalAmount = 1.0;
1137
+ transData.cashBackAmount = 0.0;
1138
+ transData.tranDate = new Date();
1139
+ transData.tranTime = new Date();
1140
+ transData.transType = src_1.TransactionType.Sale;
1141
+ return [param, indicator, transData];
1142
+ }
1143
+ function timeoutAfter(delayMs, label) {
1144
+ return new Promise((_, reject) => {
1145
+ setTimeout(() => reject(new Error(`${label} timed out after ${delayMs}ms`)), delayMs);
1146
+ });
1147
+ }
1148
+ function sleep(delayMs) {
1149
+ return new Promise((resolve) => setTimeout(resolve, delayMs));
1150
+ }
1151
+ test("[UpaAdminTests:711] cancel() cancels an active startCardTransaction over live MITC", async () => {
1152
+ const [param, indicator, transData] = buildCancelableStartCardTransactionRequest();
1153
+ const activeCommand = device
1154
+ .startCardTransaction(param, indicator, transData)
1155
+ .then((response) => ({ kind: "resolved", response }))
1156
+ .catch((error) => ({ kind: "rejected", error }));
1157
+ await sleep(2000);
1158
+ await expect(device.cancel()).resolves.toBeUndefined();
1159
+ const result = await Promise.race([
1160
+ activeCommand,
1161
+ timeoutAfter(45000, "cancelled startCardTransaction"),
1162
+ ]);
1163
+ if (result.kind === "resolved") {
1164
+ expect(result.response).toBeTruthy();
1165
+ if (result.response instanceof TransactionResponse_1.TransactionResponse) {
1166
+ expect([
1167
+ "StartCardTransaction",
1168
+ "CancelTransaction",
1169
+ "SendCommand",
1170
+ ]).toContain(result.response.command);
1171
+ }
1172
+ return;
1173
+ }
1174
+ expect(result.error).toBeInstanceOf(Error);
1175
+ });
1176
+ test("[UpaAdminTests:711] cancel() sends CancelTransaction without a displayOption parameter", async () => {
1177
+ expect(typeof device.cancel).toBe("function");
1178
+ expect(device.cancel.length).toBe(0);
1179
+ await expect(device.cancel()).resolves.toBeUndefined();
1180
+ });
1181
+ test("[UpaAdminTests:711] cancel() handles APP006 (TRANSACTION CANNOT BE CANCELED) without throwing", async () => {
1182
+ await expect(device.cancel()).resolves.toBeUndefined();
1183
+ });
1184
+ });
1185
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – registerPOS()", () => {
1186
+ let device;
1187
+ beforeEach(() => {
1188
+ device = (0, UpaHelpertest_1.createTestDevice)();
1189
+ });
1190
+ test("[UpaAdminTests:776] registerPOS() executes over live MITC", async () => {
1191
+ const posData = new src_1.POSData();
1192
+ posData.appName = `com.global.testapp.${Date.now()}`;
1193
+ posData.launchOrder = 1;
1194
+ posData.remove = false;
1195
+ posData.silent = 0;
1196
+ try {
1197
+ const response = await device.registerPOS(posData);
1198
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
1199
+ expect(response.status).toBe("Success");
1200
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, "RegisterPOS");
1201
+ }
1202
+ catch (err) {
1203
+ const message = err instanceof Error ? err.message : String(err);
1204
+ if (message.includes("SYSTEM_ERROR")) {
1205
+ console.warn("registerPOS() succeeded on the device but GP-API returned SYSTEM_ERROR during response mediation; verify registration state on the terminal.");
1206
+ return;
1207
+ }
1208
+ throw err;
1209
+ }
1210
+ });
1211
+ });
1212
+ // ===========================================================================
1213
+ // verify()
1214
+ // CardVerify command with tokenRequest = "1"
1215
+ // Confirms a multi-use token is created and returned by the host
1216
+ // ===========================================================================
1217
+ (0, UpaHelpertest_1.describeUpaLive)("UPA Admin – verify()", () => {
1218
+ let device;
1219
+ beforeEach(() => {
1220
+ device = (0, UpaHelpertest_1.createTestDevice)();
1221
+ });
1222
+ test("[UpaMicTests] verify() returns expected response", async () => {
1223
+ const response = await device.verify().withEcrId(13).execute();
1224
+ expect(response).not.toBeNull();
1225
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
1226
+ expect(response.status).toBe("Success");
1227
+ expect(response.deviceResponseCode).toBe("00");
1228
+ });
1229
+ test("[UpaMicTests] verify() with tokenRequest = 1 returns a token", async () => {
1230
+ try {
1231
+ const response = await device
1232
+ .verify()
1233
+ .withRequestMultiUseToken(true)
1234
+ .withCardBrandStorage(src_1.StoredCredentialInitiator.CardHolder)
1235
+ .withEcrId(13)
1236
+ .execute();
1237
+ console.log("[VERIFY RESPONSE]", JSON.stringify(response, null, 2));
1238
+ expect(response).not.toBeNull();
1239
+ expect(response).toBeInstanceOf(TransactionResponse_1.TransactionResponse);
1240
+ if (UpaHelpertest_1.useLiveMic) {
1241
+ if ((0, UpaHelpertest_1.isKnownLiveBusyBlocker)(response)) {
1242
+ console.warn((0, UpaHelpertest_1.formatLiveFailure)(response, "CardVerify tokenRequest"));
1243
+ return;
1244
+ }
1245
+ (0, UpaHelpertest_1.expectLiveSuccess)(response, ["CardVerify", "SendCommand"]);
1246
+ expect(response.token).toBeTruthy();
1247
+ expect(response.token.length).toBeGreaterThan(0);
1248
+ return;
1249
+ }
1250
+ expect(response.status).toBe("Success");
1251
+ expect(response.deviceResponseCode).toBe("00");
1252
+ // ...existing expects
1253
+ }
1254
+ catch (err) {
1255
+ console.log("[VERIFY ERROR]", err);
1256
+ throw err;
1257
+ }
1258
+ });
1259
+ });
1260
+ //# sourceMappingURL=UpaAdmin.test.js.map