File tree 2 files changed +54
-0
lines changed
2 files changed +54
-0
lines changed Original file line number Diff line number Diff line change
1
+ import BankingWebhookHandler from "../notification/bankingWebhookHandler" ;
2
+ import { EstimationTrackingData } from "../typings/transferWebhooks/estimationTrackingData" ;
3
+
4
+ describe ( "Transfer Webhook Serialization" , ( ) : void => {
5
+ it ( "should correctly deserialize union types in transfer webhooks" , ( ) => {
6
+ // Simplest possible webhook with just the fields we need to test
7
+ const webhookData = {
8
+ data : {
9
+ id : "test-transfer-id" ,
10
+ tracking : {
11
+ estimatedArrivalTime : "2025-04-23T22:30:00+02:00" ,
12
+ type : "estimation" ,
13
+ } ,
14
+ } ,
15
+ type : "balancePlatform.transfer.updated" ,
16
+ } ;
17
+
18
+ const jsonString = JSON . stringify ( webhookData ) ;
19
+ const bankingWebhookHandler = new BankingWebhookHandler ( jsonString ) ;
20
+ const transferNotification =
21
+ bankingWebhookHandler . getTransferNotificationRequest ( ) ;
22
+
23
+ if ( transferNotification . data . tracking ?. type === "estimation" ) {
24
+ // Verify that the tracking object is properly deserialized to the correct type
25
+ expect ( transferNotification . data . tracking ) . toBeInstanceOf (
26
+ EstimationTrackingData
27
+ ) ;
28
+
29
+ // Verify that estimatedArrivalTime is properly converted to a Date object
30
+ expect (
31
+ transferNotification . data . tracking . estimatedArrivalTime
32
+ ) . toBeInstanceOf ( Date ) ;
33
+ }
34
+ } ) ;
35
+ } ) ;
Original file line number Diff line number Diff line change @@ -259,6 +259,25 @@ export class ObjectSerializer {
259
259
return expectedType ;
260
260
}
261
261
262
+ // Handle union types
263
+ if ( expectedType . includes ( " | " ) ) {
264
+ const unionTypes = expectedType . split ( " | " ) . map ( ( t ) => t . trim ( ) ) ;
265
+
266
+ // For tracking field specifically, use the 'type' field to determine the actual type
267
+ if ( data && data . type && unionTypes . some ( ( t ) => t . includes ( "TrackingData" ) ) ) {
268
+ if ( data . type === "estimation" ) return "EstimationTrackingData" ;
269
+ if ( data . type === "confirmation" ) return "ConfirmationTrackingData" ;
270
+ if ( data . type === "internalReview" ) return "InternalReviewTrackingData" ;
271
+ }
272
+
273
+ // For other union types, return the first non-null type that exists in typeMap
274
+ for ( const type of unionTypes ) {
275
+ if ( type !== "null" && typeMap [ type ] ) {
276
+ return type ;
277
+ }
278
+ }
279
+ }
280
+
262
281
if ( ! typeMap [ expectedType ] ) {
263
282
return expectedType ; // w/e we don't know the type
264
283
}
You can’t perform that action at this time.
0 commit comments