|
1 | 1 | import { readinessManagerFactory } from '../readinessManager'; |
2 | 2 | import { EventEmitter } from '../../utils/MinEvents'; |
3 | 3 | import { IReadinessManager } from '../types'; |
4 | | -import { SDK_READY, SDK_UPDATE, SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED, SDK_READY_FROM_CACHE, SDK_SPLITS_CACHE_LOADED, SDK_READY_TIMED_OUT } from '../constants'; |
| 4 | +import { SDK_READY, SDK_UPDATE, SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED, SDK_READY_FROM_CACHE, SDK_SPLITS_CACHE_LOADED, SDK_READY_TIMED_OUT, FLAGS_UPDATE, SEGMENTS_UPDATE } from '../constants'; |
5 | 5 | import { ISettings } from '../../types'; |
| 6 | +import { SdkUpdateMetadata, SdkReadyMetadata } from '../../../types/splitio'; |
6 | 7 |
|
7 | 8 | const settings = { |
8 | 9 | startup: { |
@@ -99,15 +100,13 @@ test('READINESS MANAGER / Ready from cache event should be fired once', (done) = |
99 | 100 | counter++; |
100 | 101 | }); |
101 | 102 |
|
102 | | - readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED); |
103 | | - readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED); |
| 103 | + readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED, { initialCacheLoad: false, lastUpdateTimestamp: undefined }); |
| 104 | + readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED, { initialCacheLoad: false, lastUpdateTimestamp: undefined }); |
104 | 105 | setTimeout(() => { |
105 | | - readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED); |
| 106 | + readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED, { initialCacheLoad: false, lastUpdateTimestamp: undefined }); |
106 | 107 | }, 0); |
107 | | - readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED); |
108 | | - readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED); |
109 | | - readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED); |
110 | | - readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED); |
| 108 | + readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED, { initialCacheLoad: false, lastUpdateTimestamp: undefined }); |
| 109 | + readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED, { initialCacheLoad: false, lastUpdateTimestamp: undefined }); |
111 | 110 |
|
112 | 111 | setTimeout(() => { |
113 | 112 | expect(counter).toBe(1); // should be called only once |
@@ -300,3 +299,139 @@ test('READINESS MANAGER / Destroy before it was ready and timedout', (done) => { |
300 | 299 | }, settingsWithTimeout.startup.readyTimeout * 1.5); |
301 | 300 |
|
302 | 301 | }); |
| 302 | + |
| 303 | +test('READINESS MANAGER / SDK_UPDATE should emit with metadata', () => { |
| 304 | + const readinessManager = readinessManagerFactory(EventEmitter, settings); |
| 305 | + |
| 306 | + // SDK_READY |
| 307 | + readinessManager.splits.emit(SDK_SPLITS_ARRIVED); |
| 308 | + readinessManager.segments.emit(SDK_SEGMENTS_ARRIVED); |
| 309 | + |
| 310 | + const metadata: SdkUpdateMetadata = { |
| 311 | + type: FLAGS_UPDATE, |
| 312 | + names: ['flag1', 'flag2'] |
| 313 | + }; |
| 314 | + |
| 315 | + let receivedMetadata: SdkUpdateMetadata | undefined; |
| 316 | + readinessManager.gate.on(SDK_UPDATE, (meta: SdkUpdateMetadata) => { |
| 317 | + receivedMetadata = meta; |
| 318 | + }); |
| 319 | + |
| 320 | + readinessManager.splits.emit(SDK_SPLITS_ARRIVED, metadata); |
| 321 | + |
| 322 | + expect(receivedMetadata).toEqual(metadata); |
| 323 | +}); |
| 324 | + |
| 325 | +test('READINESS MANAGER / SDK_UPDATE should handle undefined metadata', () => { |
| 326 | + const readinessManager = readinessManagerFactory(EventEmitter, settings); |
| 327 | + |
| 328 | + // SDK_READY |
| 329 | + readinessManager.splits.emit(SDK_SPLITS_ARRIVED); |
| 330 | + readinessManager.segments.emit(SDK_SEGMENTS_ARRIVED); |
| 331 | + |
| 332 | + let receivedMetadata: any; |
| 333 | + readinessManager.gate.on(SDK_UPDATE, (meta: SdkUpdateMetadata) => { |
| 334 | + receivedMetadata = meta; |
| 335 | + }); |
| 336 | + |
| 337 | + readinessManager.splits.emit(SDK_SPLITS_ARRIVED); |
| 338 | + |
| 339 | + expect(receivedMetadata).toBeUndefined(); |
| 340 | +}); |
| 341 | + |
| 342 | +test('READINESS MANAGER / SDK_UPDATE should forward metadata from segments', () => { |
| 343 | + const readinessManager = readinessManagerFactory(EventEmitter, settings); |
| 344 | + |
| 345 | + // SDK_READY |
| 346 | + readinessManager.splits.emit(SDK_SPLITS_ARRIVED); |
| 347 | + readinessManager.segments.emit(SDK_SEGMENTS_ARRIVED); |
| 348 | + |
| 349 | + const metadata: SdkUpdateMetadata = { |
| 350 | + type: SEGMENTS_UPDATE, |
| 351 | + names: [] |
| 352 | + }; |
| 353 | + |
| 354 | + let receivedMetadata: SdkUpdateMetadata | undefined; |
| 355 | + readinessManager.gate.on(SDK_UPDATE, (meta: SdkUpdateMetadata) => { |
| 356 | + receivedMetadata = meta; |
| 357 | + }); |
| 358 | + |
| 359 | + readinessManager.segments.emit(SDK_SEGMENTS_ARRIVED, metadata); |
| 360 | + |
| 361 | + expect(receivedMetadata).toEqual(metadata); |
| 362 | +}); |
| 363 | + |
| 364 | +test('READINESS MANAGER / SDK_READY_FROM_CACHE should emit with metadata when cache is loaded', () => { |
| 365 | + const readinessManager = readinessManagerFactory(EventEmitter, settings); |
| 366 | + |
| 367 | + const cacheTimestamp = Date.now() - 1000 * 60 * 60; // 1 hour ago |
| 368 | + let receivedMetadata: SdkReadyMetadata | undefined; |
| 369 | + readinessManager.gate.on(SDK_READY_FROM_CACHE, (meta: SdkReadyMetadata) => { |
| 370 | + receivedMetadata = meta; |
| 371 | + }); |
| 372 | + |
| 373 | + // Emit cache loaded event with timestamp |
| 374 | + readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED, { |
| 375 | + initialCacheLoad: false, |
| 376 | + lastUpdateTimestamp: cacheTimestamp |
| 377 | + }); |
| 378 | + |
| 379 | + expect(receivedMetadata).toBeDefined(); |
| 380 | + expect(receivedMetadata!.initialCacheLoad).toBe(false); |
| 381 | + expect(receivedMetadata!.lastUpdateTimestamp).toBe(cacheTimestamp); |
| 382 | +}); |
| 383 | + |
| 384 | +test('READINESS MANAGER / SDK_READY_FROM_CACHE should emit with metadata when SDK becomes ready without cache', () => { |
| 385 | + const readinessManager = readinessManagerFactory(EventEmitter, settings); |
| 386 | + |
| 387 | + let receivedMetadata: SdkReadyMetadata | undefined; |
| 388 | + readinessManager.gate.on(SDK_READY_FROM_CACHE, (meta: SdkReadyMetadata) => { |
| 389 | + receivedMetadata = meta; |
| 390 | + }); |
| 391 | + |
| 392 | + // Make SDK ready without cache first |
| 393 | + readinessManager.splits.emit(SDK_SPLITS_ARRIVED); |
| 394 | + readinessManager.segments.emit(SDK_SEGMENTS_ARRIVED); |
| 395 | + |
| 396 | + expect(receivedMetadata).toBeDefined(); |
| 397 | + expect(receivedMetadata!.initialCacheLoad).toBe(true); |
| 398 | + expect(receivedMetadata!.lastUpdateTimestamp).toBeUndefined(); |
| 399 | +}); |
| 400 | + |
| 401 | +test('READINESS MANAGER / SDK_READY should emit with metadata when ready from cache', () => { |
| 402 | + const readinessManager = readinessManagerFactory(EventEmitter, settings); |
| 403 | + |
| 404 | + const cacheTimestamp = Date.now() - 1000 * 60 * 60; // 1 hour ago |
| 405 | + // First emit cache loaded with timestamp |
| 406 | + readinessManager.splits.emit(SDK_SPLITS_CACHE_LOADED, { initialCacheLoad: false, lastUpdateTimestamp: cacheTimestamp }); |
| 407 | + |
| 408 | + let receivedMetadata: SdkReadyMetadata | undefined; |
| 409 | + readinessManager.gate.on(SDK_READY, (meta: SdkReadyMetadata) => { |
| 410 | + receivedMetadata = meta; |
| 411 | + }); |
| 412 | + |
| 413 | + // Make SDK ready |
| 414 | + readinessManager.splits.emit(SDK_SPLITS_ARRIVED); |
| 415 | + readinessManager.segments.emit(SDK_SEGMENTS_ARRIVED); |
| 416 | + |
| 417 | + expect(receivedMetadata).toBeDefined(); |
| 418 | + expect(receivedMetadata!.initialCacheLoad).toBe(false); // Was ready from cache first |
| 419 | + expect(receivedMetadata!.lastUpdateTimestamp).toBe(cacheTimestamp); |
| 420 | +}); |
| 421 | + |
| 422 | +test('READINESS MANAGER / SDK_READY should emit with metadata when ready without cache', () => { |
| 423 | + const readinessManager = readinessManagerFactory(EventEmitter, settings); |
| 424 | + |
| 425 | + let receivedMetadata: SdkReadyMetadata | undefined; |
| 426 | + readinessManager.gate.on(SDK_READY, (meta: SdkReadyMetadata) => { |
| 427 | + receivedMetadata = meta; |
| 428 | + }); |
| 429 | + |
| 430 | + // Make SDK ready without cache |
| 431 | + readinessManager.splits.emit(SDK_SPLITS_ARRIVED); |
| 432 | + readinessManager.segments.emit(SDK_SEGMENTS_ARRIVED); |
| 433 | + |
| 434 | + expect(receivedMetadata).toBeDefined(); |
| 435 | + expect(receivedMetadata!.initialCacheLoad).toBe(true); // Was not ready from cache |
| 436 | + expect(receivedMetadata!.lastUpdateTimestamp).toBeUndefined(); // No cache timestamp when fresh install |
| 437 | +}); |
0 commit comments