From 0f9ec5d59dddf54127ee9c314b868da9389a75f5 Mon Sep 17 00:00:00 2001 From: Michael Paul Date: Wed, 15 Jun 2022 13:24:05 +0000 Subject: [PATCH 1/3] PW-6628: Update ReversalRequest model --- src/__mocks__/base.ts | 3 ++- src/typings/terminal/reversalRequest.ts | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/__mocks__/base.ts b/src/__mocks__/base.ts index b49ce9f12..70982397c 100644 --- a/src/__mocks__/base.ts +++ b/src/__mocks__/base.ts @@ -112,7 +112,8 @@ const getReversalRequest = (poiTransaction: TransactionIdentification): Reversal TimeStamp: poiTransaction.TimeStamp }, }, - ReversalReason: ReversalReasonType.MerchantCancel + ReversalReason: ReversalReasonType.MerchantCancel, + SaleData: saleData }); const getSaleToPOIRequest = (messageHeader: MessageHeader, request: Partial): SaleToPOIRequest => ({ diff --git a/src/typings/terminal/reversalRequest.ts b/src/typings/terminal/reversalRequest.ts index 66504c371..49d059325 100644 --- a/src/typings/terminal/reversalRequest.ts +++ b/src/typings/terminal/reversalRequest.ts @@ -33,21 +33,22 @@ import { CustomerOrder } from './customerOrder'; import { OriginalPOITransaction } from './originalPOITransaction'; import { ReversalReasonType } from './reversalReasonType'; +import { SaleData } from './saleData'; export class ReversalRequest { - 'CustomerOrderID'?: CustomerOrder; + 'SaleData'?: SaleData; 'OriginalPOITransaction': OriginalPOITransaction; - 'ReversalReason': ReversalReasonType; 'ReversedAmount'?: number; - 'SaleReferenceID'?: string; + 'ReversalReason': ReversalReasonType; + 'CustomerOrder'?: CustomerOrder; static discriminator: string | undefined = undefined; static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [ { - "name": "CustomerOrderID", - "baseName": "CustomerOrderID", - "type": "CustomerOrder" + "name": "SaleData", + "baseName": "SaleData", + "type": "SaleData", }, { "name": "OriginalPOITransaction", @@ -65,9 +66,9 @@ export class ReversalRequest { "type": "number" }, { - "name": "SaleReferenceID", - "baseName": "SaleReferenceID", - "type": "string" + "name": "CustomerOrder", + "baseName": "CustomerOrder", + "type": "CustomerOrder" } ]; static getAttributeTypeMap() { From e3f8eef01371223d5b676b5c28c12b6e995d67a4 Mon Sep 17 00:00:00 2001 From: Michael Paul Date: Thu, 16 Jun 2022 13:30:27 +0000 Subject: [PATCH 2/3] PW-6628: Test adding currency to a refund request Remove duplicated data provider when running on CI. Make it a single control variable. --- src/__tests__/terminalCloudAPI.spec.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/__tests__/terminalCloudAPI.spec.ts b/src/__tests__/terminalCloudAPI.spec.ts index ce2d68e6c..30ab8575e 100644 --- a/src/__tests__/terminalCloudAPI.spec.ts +++ b/src/__tests__/terminalCloudAPI.spec.ts @@ -46,7 +46,7 @@ afterEach((): void => { const isCI = process.env.CI === "true" || (typeof process.env.CI === "boolean" && process.env.CI); describe("Terminal Cloud API", (): void => { - test.each([isCI, true])("should make an async payment request, isMock: %p", async (isMock): Promise => { + test.each([isCI])("should make an async payment request, isMock: %p", async (isMock): Promise => { !isMock && nock.restore(); scope.post("/async").reply(200, asyncRes); @@ -57,7 +57,7 @@ describe("Terminal Cloud API", (): void => { expect(requestResponse).toEqual("ok"); }); - test.each([isCI, true])("should make a sync payment request, isMock: %p", async (isMock): Promise => { + test.each([isCI])("should make a sync payment request, isMock: %p", async (isMock): Promise => { !isMock && nock.restore(); scope.post("/sync").reply(200, syncRes); @@ -68,7 +68,7 @@ describe("Terminal Cloud API", (): void => { expect(terminalAPIResponse.SaleToPOIResponse?.MessageHeader).toBeDefined(); }); - test.each([isCI, true])("should return event notification if response contains it, isMock: %p", async (isMock): Promise => { + test.each([isCI])("should return event notification if response contains it, isMock: %p", async (isMock): Promise => { !isMock && nock.restore(); const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest(); @@ -79,23 +79,23 @@ describe("Terminal Cloud API", (): void => { expect(terminalAPIResponse.SaleToPOIRequest?.EventNotification).toBeDefined(); }); - test.each([isCI, true])("should make an async refund request, isMock: %p", async (isMock): Promise => { + test.each([isCI])("should make an async refund request, isMock: %p", async (isMock): Promise => { !isMock && nock.restore(); scope.post("/sync").reply(200, syncRes); const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest(); const terminalAPIResponse: TerminalApiResponse = await terminalCloudAPI.sync(terminalAPIPaymentRequest); + const pOITransactionId = terminalAPIResponse.SaleToPOIResponse!.PaymentResponse!.POIData!.POITransactionID; + expect(pOITransactionId).toBeTruthy(); + + scope.post("/sync").reply(200, syncRefund); - const pOITransactionId = terminalAPIResponse.SaleToPOIResponse?.PaymentResponse?.POIData!.POITransactionID; - if(pOITransactionId) { - const terminalAPIRefundRequest = createTerminalAPIRefundRequest(pOITransactionId); - const terminalAPIRefundResponse = await terminalCloudAPI.sync(terminalAPIRefundRequest); + const terminalAPIRefundRequest = createTerminalAPIRefundRequest(pOITransactionId); + terminalAPIRefundRequest.SaleToPOIRequest.ReversalRequest!.SaleData!.SaleToAcquirerData!.currency = 'EUR'; + const terminalAPIRefundResponse = await terminalCloudAPI.sync(terminalAPIRefundRequest); - expect(terminalAPIRefundResponse.SaleToPOIResponse?.ReversalResponse).toBeDefined(); - } else { - fail(); - } + expect(terminalAPIRefundResponse.SaleToPOIResponse?.ReversalResponse).toBeDefined(); }); }); From 75243ebd6e14bb78354e0751f950f19672704c0b Mon Sep 17 00:00:00 2001 From: Michael Paul Date: Fri, 17 Jun 2022 08:20:55 +0000 Subject: [PATCH 3/3] PW-6628: Serialize SaleToAcquirerData Using same option (base64 encoded JSON string) on all terminal requests. --- src/__tests__/terminalCloudAPI.spec.ts | 7 ++++--- src/services/terminalCloudAPI.ts | 8 -------- src/services/terminalLocalAPI.ts | 6 ------ src/typings/terminal/models.ts | 3 +++ 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/__tests__/terminalCloudAPI.spec.ts b/src/__tests__/terminalCloudAPI.spec.ts index 30ab8575e..378893b49 100644 --- a/src/__tests__/terminalCloudAPI.spec.ts +++ b/src/__tests__/terminalCloudAPI.spec.ts @@ -89,13 +89,14 @@ describe("Terminal Cloud API", (): void => { const pOITransactionId = terminalAPIResponse.SaleToPOIResponse!.PaymentResponse!.POIData!.POITransactionID; expect(pOITransactionId).toBeTruthy(); - scope.post("/sync").reply(200, syncRefund); const terminalAPIRefundRequest = createTerminalAPIRefundRequest(pOITransactionId); + const id = Math.floor(Math.random() * Math.floor(10000000)).toString(); + terminalAPIRefundRequest.SaleToPOIRequest.MessageHeader.ServiceID = id; terminalAPIRefundRequest.SaleToPOIRequest.ReversalRequest!.SaleData!.SaleToAcquirerData!.currency = 'EUR'; const terminalAPIRefundResponse = await terminalCloudAPI.sync(terminalAPIRefundRequest); - expect(terminalAPIRefundResponse.SaleToPOIResponse?.ReversalResponse).toBeDefined(); - }); + expect(terminalAPIRefundResponse.SaleToPOIResponse?.ReversalResponse?.Response.Result).toBe('Success'); + }, 20000); }); diff --git a/src/services/terminalCloudAPI.ts b/src/services/terminalCloudAPI.ts index 3adda40a0..13c17362f 100644 --- a/src/services/terminalCloudAPI.ts +++ b/src/services/terminalCloudAPI.ts @@ -46,14 +46,6 @@ class TerminalCloudAPI extends ApiKeyAuthenticatedService { const reqWithAppInfo = {saleToPOIRequest}; mergeDeep(request, reqWithAppInfo); - const formattedRequest = ObjectSerializer.serialize(request, "TerminalApiRequest"); - - if (formattedRequest.SaleToPOIRequest?.PaymentRequest?.SaleData?.SaleToAcquirerData) { - const dataString = JSON.stringify(formattedRequest.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData); - formattedRequest.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData = Buffer.from(dataString).toString("base64"); - } - - return formattedRequest; } return ObjectSerializer.serialize(request, "TerminalApiRequest"); diff --git a/src/services/terminalLocalAPI.ts b/src/services/terminalLocalAPI.ts index e92e8c9fb..3d2a86ea6 100644 --- a/src/services/terminalLocalAPI.ts +++ b/src/services/terminalLocalAPI.ts @@ -47,12 +47,6 @@ class TerminalLocalAPI extends ApiKeyAuthenticatedService { securityKey: SecurityKey, ): Promise { const formattedRequest = ObjectSerializer.serialize(terminalApiRequest, "TerminalApiRequest"); - - if (formattedRequest.SaleToPOIRequest?.PaymentRequest?.SaleData?.SaleToAcquirerData) { - const dataString = JSON.stringify(formattedRequest.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData); - formattedRequest.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData = Buffer.from(dataString).toString("base64"); - } - const saleToPoiSecuredMessage: SaleToPOISecuredMessage = NexoCrypto.encrypt( terminalApiRequest.SaleToPOIRequest.MessageHeader, JSON.stringify(formattedRequest), diff --git a/src/typings/terminal/models.ts b/src/typings/terminal/models.ts index 19ae47323..2a8c2baec 100644 --- a/src/typings/terminal/models.ts +++ b/src/typings/terminal/models.ts @@ -853,6 +853,9 @@ export class ObjectSerializer { return transformedData; } else if (type === "Date") { return data.toISOString(); + } else if (type === "SaleToAcquirerData") { + const dataString = JSON.stringify(data); + return Buffer.from(dataString).toString("base64"); } else { if (enumsMap[type]) { return data;