Skip to content

Commit 6750cb5

Browse files
authored
Merge branch 'main' into predefinedcontent-referenceid-helper
2 parents 2fbf040 + 188715c commit 6750cb5

File tree

6 files changed

+243
-3
lines changed

6 files changed

+243
-3
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
27.0.0
1+
28.0.0

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@adyen/api-library",
3-
"version": "27.0.0",
3+
"version": "28.0.0",
44
"description": "The Adyen API Library for NodeJS enables you to work with Adyen APIs.",
55
"main": "lib/src/index.js",
66
"types": "lib/src/index.d.ts",
@@ -31,7 +31,7 @@
3131
"test:watch": "jest --watch",
3232
"test:coverage": "jest --coverage"
3333
},
34-
"author": "Ricardo Ambrogi",
34+
"author": "Adyen",
3535
"license": "MIT",
3636
"devDependencies": {
3737
"@types/jest": "27.5.2",
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { HttpClientException } from "../";
2+
3+
describe("HttpClientException", () => {
4+
it("should export HttpClientException as a class", () => {
5+
expect(typeof HttpClientException).toBe("function");
6+
7+
const error = new HttpClientException({
8+
message: "Test error",
9+
statusCode: 422,
10+
responseBody: JSON.stringify({ status: 422, message: "Test error" }),
11+
});
12+
13+
expect(error).toBeInstanceOf(HttpClientException);
14+
expect(error.statusCode).toBe(422);
15+
});
16+
});
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
import { MessageCategoryType, MessageClassType, MessageType, ObjectSerializer, TerminalApiRequest } from "../typings/terminal/models";
2+
3+
4+
describe("ObjectSerializer.serialize", () => {
5+
6+
it("should serialize TerminalAPIPaymentRequest", () => {
7+
const terminalAPIPaymentRequest = newTerminalAPIPaymentRequest();
8+
9+
const json = ObjectSerializer.serialize(terminalAPIPaymentRequest, "TerminalApiRequest");
10+
11+
expect(json).toBeTruthy();
12+
expect(json).toHaveProperty("SaleToPOIRequest");
13+
expect(json.SaleToPOIRequest).toHaveProperty("MessageHeader");
14+
expect(json.SaleToPOIRequest).toHaveProperty("PaymentRequest");
15+
16+
expect(json.SaleToPOIRequest.PaymentRequest).toHaveProperty("SaleData");
17+
expect(json.SaleToPOIRequest.PaymentRequest.SaleData).toHaveProperty("SaleTransactionID");
18+
expect(json.SaleToPOIRequest.PaymentRequest.SaleData.SaleTransactionID).toHaveProperty("TimeStamp");
19+
expect(json.SaleToPOIRequest.PaymentRequest.SaleData).toHaveProperty("SaleToAcquirerData");
20+
21+
const saleToAcquirerData = json.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData;
22+
// SaleToAcquirerData should be a string
23+
expect(typeof(saleToAcquirerData)).toBe("string");
24+
// SaleToAcquirerData should be base64 encoded
25+
expect(() => Buffer.from(saleToAcquirerData, "base64").toString("utf-8")).not.toThrow();
26+
27+
// decode and test metadata
28+
const decoded = JSON.parse(Buffer.from(saleToAcquirerData, "base64").toString("utf-8"));
29+
expect(decoded).toHaveProperty("applicationInfo");
30+
31+
expect(decoded).toHaveProperty("metadata");
32+
expect(decoded.metadata).toHaveProperty("someMetaDataKey1");
33+
expect(decoded.metadata).toHaveProperty("someMetaDataKey2");
34+
expect(decoded.metadata.someMetaDataKey1).toBe("YOUR_VALUE");
35+
expect(decoded.metadata.someMetaDataKey2).toBe("YOUR_VALUE");
36+
});
37+
38+
it("should serialize SaleToAcquirerData as base64 if object", () => {
39+
const obj = { foo: "bar" };
40+
const expected = Buffer.from(JSON.stringify(obj)).toString("base64");
41+
expect(ObjectSerializer.serialize(obj, "SaleToAcquirerData")).toBe(expected);
42+
});
43+
44+
it("should serialize TerminalAPIPaymentRequest with additionalData as JSON object", () => {
45+
const terminalAPIPaymentRequest = newTerminalAPIPaymentRequestWithAdditionalDataAsJSONObject();
46+
47+
const json = ObjectSerializer.serialize(terminalAPIPaymentRequest, "TerminalApiRequest");
48+
49+
expect(json).toBeTruthy();
50+
expect(json).toHaveProperty("SaleToPOIRequest");
51+
expect(json.SaleToPOIRequest).toHaveProperty("MessageHeader");
52+
expect(json.SaleToPOIRequest).toHaveProperty("PaymentRequest");
53+
54+
expect(json.SaleToPOIRequest.PaymentRequest).toHaveProperty("SaleData");
55+
expect(json.SaleToPOIRequest.PaymentRequest.SaleData).toHaveProperty("SaleToAcquirerData");
56+
const saleToAcquirerData = json.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData;
57+
// SaleToAcquirerData should be a string
58+
expect(typeof(saleToAcquirerData)).toBe("string");
59+
// SaleToAcquirerData should be base64 encoded
60+
expect(() => Buffer.from(saleToAcquirerData, "base64").toString("utf-8")).not.toThrow();
61+
62+
// decode and test metadata
63+
const decoded = JSON.parse(Buffer.from(saleToAcquirerData, "base64").toString("utf-8"));
64+
// verify manualCapture
65+
expect(decoded).toHaveProperty("additionalData");
66+
expect(decoded.additionalData).toHaveProperty("manualCapture");
67+
expect(decoded.additionalData.manualCapture).toBe("true");
68+
});
69+
70+
it("should return undefined when data is undefined", () => {
71+
expect(ObjectSerializer.serialize(undefined, "string")).toBeUndefined();
72+
});
73+
74+
it("should serialize primitive types", () => {
75+
expect(ObjectSerializer.serialize("hello", "string")).toBe("hello");
76+
expect(ObjectSerializer.serialize(123, "number")).toBe(123);
77+
expect(ObjectSerializer.serialize(true, "boolean")).toBe(true);
78+
});
79+
80+
it("should serialize Date to ISO string", () => {
81+
const date = new Date("2024-01-01T12:00:00Z");
82+
expect(ObjectSerializer.serialize(date, "Date")).toBe(date.toISOString());
83+
});
84+
85+
it("should serialize Array of primitives", () => {
86+
expect(ObjectSerializer.serialize([1, 2, 3], "Array<number>")).toEqual([1, 2, 3]);
87+
expect(ObjectSerializer.serialize(["a", "b"], "Array<string>")).toEqual(["a", "b"]);
88+
});
89+
90+
it("should serialize SaleToAcquirerData as string if already string", () => {
91+
expect(ObjectSerializer.serialize("somestring", "SaleToAcquirerData")).toBe("somestring");
92+
});
93+
94+
it("should serialize enums as is", () => {
95+
expect(ObjectSerializer.serialize("Default", "AccountType")).toBe("Default");
96+
});
97+
98+
});
99+
100+
const newTerminalAPIPaymentRequest = (): TerminalApiRequest => {
101+
const messageHeader = {
102+
MessageCategory: MessageCategoryType.Payment,
103+
MessageClass: MessageClassType.Service,
104+
MessageType: MessageType.Request,
105+
POIID: "V400m-324688179",
106+
ProtocolVersion: "3.0",
107+
SaleID: "POSSystemID12345",
108+
ServiceID: "0207111104",
109+
};
110+
111+
const paymentRequest = {
112+
PaymentTransaction: {
113+
AmountsReq: {
114+
Currency: "EUR",
115+
RequestedAmount: 1000,
116+
},
117+
},
118+
SaleData: {
119+
SaleTransactionID: {
120+
TimeStamp: new Date().toISOString(),
121+
TransactionID: "1234567890",
122+
},
123+
SaleToAcquirerData: {
124+
applicationInfo: {
125+
merchantApplication: {
126+
version: "1.0",
127+
name: "TestApp",
128+
},
129+
},
130+
metadata: {
131+
someMetaDataKey1: "YOUR_VALUE",
132+
someMetaDataKey2: "YOUR_VALUE",
133+
},
134+
},
135+
},
136+
};
137+
138+
return { SaleToPOIRequest: {MessageHeader: messageHeader, PaymentRequest: paymentRequest} };
139+
};
140+
141+
const newTerminalAPIPaymentRequestWithAdditionalDataAsJSONObject = (): TerminalApiRequest => {
142+
const messageHeader = {
143+
MessageCategory: MessageCategoryType.Payment,
144+
MessageClass: MessageClassType.Service,
145+
MessageType: MessageType.Request,
146+
POIID: "V400m-324688179",
147+
ProtocolVersion: "3.0",
148+
SaleID: "POSSystemID12345",
149+
ServiceID: "0207111104",
150+
};
151+
152+
const paymentRequest = {
153+
PaymentTransaction: {
154+
AmountsReq: {
155+
Currency: "EUR",
156+
RequestedAmount: 1000,
157+
},
158+
},
159+
SaleData: {
160+
SaleTransactionID: {
161+
TimeStamp: new Date().toISOString(),
162+
TransactionID: "1234567890",
163+
},
164+
SaleToAcquirerData: {
165+
additionalData: {
166+
manualCapture: "true"
167+
},
168+
},
169+
},
170+
};
171+
172+
return { SaleToPOIRequest: {MessageHeader: messageHeader, PaymentRequest: paymentRequest} };
173+
};

src/__tests__/webhooks/notification.spec.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,54 @@ describe("Notification Tests", function (): void {
9191
}
9292
});
9393

94+
it("should return notification items with additional data as key-value map", function (): void {
95+
const notificationRequestItem = new NotificationRequestItem();
96+
97+
notificationRequestItem.amount = { currency: "EUR", value: 1000 };
98+
notificationRequestItem.pspReference = "123456789";
99+
notificationRequestItem.eventCode = NotificationEnum.Authorisation;
100+
notificationRequestItem.eventDate = "2023-10-01T12:00:00+00:00";
101+
notificationRequestItem.merchantAccountCode = "TestMerchant";
102+
notificationRequestItem.merchantReference = "TestReference";
103+
notificationRequestItem.success = SuccessEnum.True;
104+
notificationRequestItem.additionalData = {
105+
orderId: "12345",
106+
customerId: "67890"
107+
};
108+
109+
expect(notificationRequestItem.amount).toBeDefined();
110+
expect(notificationRequestItem.additionalData).toBeDefined();
111+
expect(notificationRequestItem.additionalData).toHaveProperty("orderId", "12345");
112+
expect(notificationRequestItem.additionalData).toHaveProperty("customerId", "67890");
113+
114+
});
115+
116+
// test additionanDalata with medata as key-value pairs prefixed with "metadata." i.e. "metadata.myKey": "myValue"
117+
it("should return notification items with additional data as key-value object", function (): void {
118+
const notificationRequestItem = new NotificationRequestItem();
119+
120+
notificationRequestItem.amount = { currency: "EUR", value: 1000 };
121+
notificationRequestItem.pspReference = "123456789";
122+
notificationRequestItem.eventCode = NotificationEnum.Authorisation;
123+
notificationRequestItem.eventDate = "2023-10-01T12:00:00+00:00";
124+
notificationRequestItem.merchantAccountCode = "TestMerchant";
125+
notificationRequestItem.merchantReference = "TestReference";
126+
notificationRequestItem.success = SuccessEnum.True;
127+
notificationRequestItem.additionalData = {
128+
orderId: "12345",
129+
customerId: "67890",
130+
"metadata.myKey": "myValue",
131+
"metadata.anotherKey": "anotherValue"
132+
};
133+
134+
expect(notificationRequestItem.amount).toBeDefined();
135+
expect(notificationRequestItem.additionalData).toBeDefined();
136+
expect(notificationRequestItem.additionalData).toHaveProperty("orderId", "12345");
137+
expect(notificationRequestItem.additionalData).toHaveProperty("customerId", "67890");
138+
expect(notificationRequestItem.additionalData["metadata.myKey"]).toBeDefined();
139+
expect(notificationRequestItem.additionalData["metadata.anotherKey"]).toBeDefined();
140+
expect(notificationRequestItem.additionalData["metadata.myKey"]).toEqual("myValue");
141+
expect(notificationRequestItem.additionalData["metadata.anotherKey"]).toEqual("anotherValue");
142+
143+
});
94144
});

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@ export { default as Config } from "./config";
2424
export * from "./services/";
2525
export { hmacValidator } from "./utils";
2626
export { default as HttpURLConnectionClient } from "./httpClient/httpURLConnectionClient";
27+
export { default as HttpClientException } from "./httpClient/httpClientException";
2728
export * as Types from "./typings";
2829

0 commit comments

Comments
 (0)