11import type { EntitlementsUpdateListener } from '../../dto/EntitlementsUpdateListener' ;
22import type { DeferredPurchasesListener } from '../../dto/DeferredPurchasesListener' ;
3- import type { QEntitlement } from '../Mapper' ;
43import PurchaseResult from '../../dto/PurchaseResult' ;
4+ import Entitlement from '../../dto/Entitlement' ;
55import { PurchaseResultStatus , PurchaseResultSource } from '../../dto/enums' ;
66
77// Capture event handlers registered on the native module mock
@@ -20,9 +20,6 @@ jest.mock('../specs/NativeQonversionModule', () => ({
2020 default : {
2121 storeSDKInfo : jest . fn ( ) ,
2222 initializeSdk : jest . fn ( ) ,
23- onEntitlementsUpdated : jest . fn ( ( handler : Function ) => {
24- eventHandlers [ 'onEntitlementsUpdated' ] = handler ;
25- } ) ,
2623 onDeferredPurchaseCompleted : jest . fn ( ( handler : Function ) => {
2724 eventHandlers [ 'onDeferredPurchaseCompleted' ] = handler ;
2825 } ) ,
@@ -31,7 +28,19 @@ jest.mock('../specs/NativeQonversionModule', () => ({
3128 } ,
3229} ) ) ;
3330
31+ const mockEntitlements = new Map < string , Entitlement > ( ) ;
32+ mockEntitlements . set ( 'premium' , { id : 'premium' , productId : 'premium_product' , isActive : true } as unknown as Entitlement ) ;
33+
3434const mockPurchaseResult = new PurchaseResult (
35+ PurchaseResultStatus . SUCCESS ,
36+ mockEntitlements ,
37+ null ,
38+ false ,
39+ PurchaseResultSource . API ,
40+ null
41+ ) ;
42+
43+ const mockPurchaseResultNoEntitlements = new PurchaseResult (
3544 PurchaseResultStatus . SUCCESS ,
3645 null ,
3746 null ,
@@ -60,6 +69,7 @@ import QonversionInternal from '../QonversionInternal';
6069import QonversionConfig from '../../QonversionConfig' ;
6170import { Environment , EntitlementsCacheLifetime , LaunchMode } from '../../dto/enums' ;
6271import RNQonversion from '../specs/NativeQonversionModule' ;
72+ import Mapper from '../Mapper' ;
6373
6474function createConfig ( ) {
6575 return new QonversionConfig (
@@ -69,24 +79,21 @@ function createConfig() {
6979 EntitlementsCacheLifetime . MONTH ,
7080 undefined ,
7181 undefined ,
82+ undefined ,
7283 false ,
7384 ) ;
7485}
7586
7687const samplePurchaseResult = {
7788 status : 'Success' ,
78- entitlements : null ,
89+ entitlements : { premium : { id : 'premium' , productId : 'premium_product' , isActive : true } } ,
7990 error : null ,
8091 isFallbackGenerated : false ,
8192 source : 'Api' ,
8293 storeTransaction : null ,
8394} ;
8495
85- const entitlementsPayload : Record < string , QEntitlement > = {
86- premium : { id : 'premium' , productId : 'premium_product' , isActive : true } as unknown as QEntitlement ,
87- } ;
88-
89- describe ( 'QonversionInternal - DeferredPurchasesListener (native event)' , ( ) => {
96+ describe ( 'QonversionInternal - DeferredPurchasesListener' , ( ) => {
9097 beforeEach ( ( ) => {
9198 jest . clearAllMocks ( ) ;
9299 for ( const key of Object . keys ( eventHandlers ) ) {
@@ -149,15 +156,6 @@ describe('QonversionInternal - DeferredPurchasesListener (native event)', () =>
149156
150157 expect ( RNQonversion . onDeferredPurchaseCompleted ) . toHaveBeenCalledTimes ( 1 ) ;
151158 } ) ;
152-
153- it ( 'deferred listener does NOT subscribe to onEntitlementsUpdated' , ( ) => {
154- const instance = new QonversionInternal ( createConfig ( ) ) ;
155- const listener : DeferredPurchasesListener = { onDeferredPurchaseCompleted : jest . fn ( ) } ;
156-
157- instance . setDeferredPurchasesListener ( listener ) ;
158-
159- expect ( RNQonversion . onEntitlementsUpdated ) . not . toHaveBeenCalled ( ) ;
160- } ) ;
161159} ) ;
162160
163161describe ( 'QonversionInternal - deprecated setEntitlementsUpdateListener' , ( ) => {
@@ -168,23 +166,36 @@ describe('QonversionInternal - deprecated setEntitlementsUpdateListener', () =>
168166 }
169167 } ) ;
170168
171- it ( 'subscribes to onEntitlementsUpdated ' , ( ) => {
169+ it ( 'subscribes to onDeferredPurchaseCompleted (same as native SDK) ' , ( ) => {
172170 const instance = new QonversionInternal ( createConfig ( ) ) ;
173171 const oldListener : EntitlementsUpdateListener = { onEntitlementsUpdated : jest . fn ( ) } ;
174172
175173 instance . setEntitlementsUpdateListener ( oldListener ) ;
176174
177- expect ( RNQonversion . onEntitlementsUpdated ) . toHaveBeenCalled ( ) ;
175+ expect ( RNQonversion . onDeferredPurchaseCompleted ) . toHaveBeenCalled ( ) ;
178176 } ) ;
179177
180- it ( 'fires for ALL entitlement updates ' , ( ) => {
178+ it ( 'fires with entitlements extracted from PurchaseResult ' , ( ) => {
181179 const instance = new QonversionInternal ( createConfig ( ) ) ;
182180 const oldListener : EntitlementsUpdateListener = { onEntitlementsUpdated : jest . fn ( ) } ;
183181
184182 instance . setEntitlementsUpdateListener ( oldListener ) ;
185- fireEvent ( 'onEntitlementsUpdated ' , entitlementsPayload ) ;
183+ fireEvent ( 'onDeferredPurchaseCompleted ' , samplePurchaseResult ) ;
186184
187185 expect ( oldListener . onEntitlementsUpdated ) . toHaveBeenCalledTimes ( 1 ) ;
186+ expect ( oldListener . onEntitlementsUpdated ) . toHaveBeenCalledWith ( mockEntitlements ) ;
187+ } ) ;
188+
189+ it ( 'does not fire when PurchaseResult has no entitlements' , ( ) => {
190+ ( Mapper . convertPurchaseResult as jest . Mock ) . mockReturnValueOnce ( mockPurchaseResultNoEntitlements ) ;
191+
192+ const instance = new QonversionInternal ( createConfig ( ) ) ;
193+ const oldListener : EntitlementsUpdateListener = { onEntitlementsUpdated : jest . fn ( ) } ;
194+
195+ instance . setEntitlementsUpdateListener ( oldListener ) ;
196+ fireEvent ( 'onDeferredPurchaseCompleted' , samplePurchaseResult ) ;
197+
198+ expect ( oldListener . onEntitlementsUpdated ) . not . toHaveBeenCalled ( ) ;
188199 } ) ;
189200} ) ;
190201
@@ -196,7 +207,7 @@ describe('QonversionInternal - both listeners coexist', () => {
196207 }
197208 } ) ;
198209
199- it ( 'both listeners fire independently from their own native events ' , ( ) => {
210+ it ( 'both listeners fire from onDeferredPurchaseCompleted ' , ( ) => {
200211 const oldListener : EntitlementsUpdateListener = { onEntitlementsUpdated : jest . fn ( ) } ;
201212 const newListener : DeferredPurchasesListener = { onDeferredPurchaseCompleted : jest . fn ( ) } ;
202213
@@ -207,24 +218,21 @@ describe('QonversionInternal - both listeners coexist', () => {
207218 EntitlementsCacheLifetime . MONTH ,
208219 oldListener ,
209220 undefined ,
221+ undefined ,
210222 false ,
211- newListener ,
212223 ) ;
213224
214- void new QonversionInternal ( config ) ;
225+ const instance = new QonversionInternal ( config ) ;
226+ instance . setDeferredPurchasesListener ( newListener ) ;
215227
216- // Entitlements update fires old listener only
217- fireEvent ( 'onEntitlementsUpdated' , entitlementsPayload ) ;
218- expect ( oldListener . onEntitlementsUpdated ) . toHaveBeenCalledTimes ( 1 ) ;
219- expect ( newListener . onDeferredPurchaseCompleted ) . not . toHaveBeenCalled ( ) ;
220-
221- // Deferred purchase fires new listener only
222228 fireEvent ( 'onDeferredPurchaseCompleted' , samplePurchaseResult ) ;
223- expect ( oldListener . onEntitlementsUpdated ) . toHaveBeenCalledTimes ( 1 ) ; // still 1
229+
224230 expect ( newListener . onDeferredPurchaseCompleted ) . toHaveBeenCalledTimes ( 1 ) ;
231+ expect ( oldListener . onEntitlementsUpdated ) . toHaveBeenCalledTimes ( 1 ) ;
232+ expect ( oldListener . onEntitlementsUpdated ) . toHaveBeenCalledWith ( mockEntitlements ) ;
225233 } ) ;
226234
227- it ( 'subscribes to both native events independently ' , ( ) => {
235+ it ( 'subscribes to onDeferredPurchaseCompleted only once for both listeners ' , ( ) => {
228236 const oldListener : EntitlementsUpdateListener = { onEntitlementsUpdated : jest . fn ( ) } ;
229237 const newListener : DeferredPurchasesListener = { onDeferredPurchaseCompleted : jest . fn ( ) } ;
230238
@@ -235,13 +243,13 @@ describe('QonversionInternal - both listeners coexist', () => {
235243 EntitlementsCacheLifetime . MONTH ,
236244 oldListener ,
237245 undefined ,
246+ undefined ,
238247 false ,
239- newListener ,
240248 ) ;
241249
242- void new QonversionInternal ( config ) ;
250+ const instance = new QonversionInternal ( config ) ;
251+ instance . setDeferredPurchasesListener ( newListener ) ;
243252
244- expect ( RNQonversion . onEntitlementsUpdated ) . toHaveBeenCalledTimes ( 1 ) ;
245253 expect ( RNQonversion . onDeferredPurchaseCompleted ) . toHaveBeenCalledTimes ( 1 ) ;
246254 } ) ;
247255} ) ;
0 commit comments