@adtrackify/at-service-common 4.0.7 → 4.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/cjs/__tests__/identity-cache/helpers.spec.d.ts +1 -0
  2. package/dist/cjs/__tests__/identity-cache/helpers.spec.js +594 -0
  3. package/dist/cjs/__tests__/identity-cache/helpers.spec.js.map +1 -0
  4. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.d.ts +1 -0
  5. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js +556 -0
  6. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js.map +1 -0
  7. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-service-v2-comparison.spec.js +23 -25
  8. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-service-v2-comparison.spec.js.map +1 -1
  9. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-service.spec.js +11 -12
  10. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-service.spec.js.map +1 -1
  11. package/dist/cjs/__tests__/identity-cache/identity-cache-tier-routing.spec.js +64 -21
  12. package/dist/cjs/__tests__/identity-cache/identity-cache-tier-routing.spec.js.map +1 -1
  13. package/dist/cjs/__tests__/identity-cache/identity-gateway-service.spec.js +1617 -14
  14. package/dist/cjs/__tests__/identity-cache/identity-gateway-service.spec.js.map +1 -1
  15. package/dist/cjs/__tests__/identity-cache/trait-merging-and-staleness.spec.js +711 -0
  16. package/dist/cjs/__tests__/identity-cache/trait-merging-and-staleness.spec.js.map +1 -1
  17. package/dist/cjs/helpers/identity-cache-helper.d.ts +9 -0
  18. package/dist/cjs/helpers/identity-cache-helper.js +54 -1
  19. package/dist/cjs/helpers/identity-cache-helper.js.map +1 -1
  20. package/dist/cjs/services/db/identity-cache-dynamodb-service/helpers.d.ts +17 -4
  21. package/dist/cjs/services/db/identity-cache-dynamodb-service/helpers.js +35 -33
  22. package/dist/cjs/services/db/identity-cache-dynamodb-service/helpers.js.map +1 -1
  23. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.d.ts +4 -2
  24. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js +63 -8
  25. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js.map +1 -1
  26. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.d.ts +1 -0
  27. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.js +91 -53
  28. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.js.map +1 -1
  29. package/dist/cjs/services/db/identity-cache-dynamodb-service/index.d.ts +1 -0
  30. package/dist/cjs/services/db/identity-cache-dynamodb-service/index.js +1 -0
  31. package/dist/cjs/services/db/identity-cache-dynamodb-service/index.js.map +1 -1
  32. package/dist/cjs/services/db/identity-cache-dynamodb-service/types.d.ts +16 -0
  33. package/dist/cjs/services/db/identity-cache-dynamodb-service/types.js +9 -1
  34. package/dist/cjs/services/db/identity-cache-dynamodb-service/types.js.map +1 -1
  35. package/dist/esm/__tests__/identity-cache/helpers.spec.d.ts +1 -0
  36. package/dist/esm/__tests__/identity-cache/helpers.spec.js +592 -0
  37. package/dist/esm/__tests__/identity-cache/helpers.spec.js.map +1 -0
  38. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.d.ts +1 -0
  39. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js +554 -0
  40. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js.map +1 -0
  41. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-service-v2-comparison.spec.js +23 -25
  42. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-service-v2-comparison.spec.js.map +1 -1
  43. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-service.spec.js +11 -12
  44. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-service.spec.js.map +1 -1
  45. package/dist/esm/__tests__/identity-cache/identity-cache-tier-routing.spec.js +65 -22
  46. package/dist/esm/__tests__/identity-cache/identity-cache-tier-routing.spec.js.map +1 -1
  47. package/dist/esm/__tests__/identity-cache/identity-gateway-service.spec.js +1617 -14
  48. package/dist/esm/__tests__/identity-cache/identity-gateway-service.spec.js.map +1 -1
  49. package/dist/esm/__tests__/identity-cache/trait-merging-and-staleness.spec.js +712 -1
  50. package/dist/esm/__tests__/identity-cache/trait-merging-and-staleness.spec.js.map +1 -1
  51. package/dist/esm/helpers/identity-cache-helper.d.ts +9 -0
  52. package/dist/esm/helpers/identity-cache-helper.js +52 -1
  53. package/dist/esm/helpers/identity-cache-helper.js.map +1 -1
  54. package/dist/esm/services/db/identity-cache-dynamodb-service/helpers.d.ts +17 -4
  55. package/dist/esm/services/db/identity-cache-dynamodb-service/helpers.js +33 -31
  56. package/dist/esm/services/db/identity-cache-dynamodb-service/helpers.js.map +1 -1
  57. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.d.ts +4 -2
  58. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js +57 -2
  59. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js.map +1 -1
  60. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.d.ts +1 -0
  61. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.js +92 -54
  62. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.js.map +1 -1
  63. package/dist/esm/services/db/identity-cache-dynamodb-service/index.d.ts +1 -0
  64. package/dist/esm/services/db/identity-cache-dynamodb-service/index.js +1 -0
  65. package/dist/esm/services/db/identity-cache-dynamodb-service/index.js.map +1 -1
  66. package/dist/esm/services/db/identity-cache-dynamodb-service/types.d.ts +16 -0
  67. package/dist/esm/services/db/identity-cache-dynamodb-service/types.js +8 -0
  68. package/dist/esm/services/db/identity-cache-dynamodb-service/types.js.map +1 -1
  69. package/package.json +1 -1
@@ -0,0 +1,594 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const identity_cache_helper_js_1 = require("../../helpers/identity-cache-helper.js");
4
+ const helpers_js_1 = require("../../services/db/identity-cache-dynamodb-service/helpers.js");
5
+ const types_js_1 = require("../../services/db/identity-cache-dynamodb-service/types.js");
6
+ describe('processCacheHit helper', () => {
7
+ describe('deep equality check behavior', () => {
8
+ it('should return isDeepEqual=true when merged equals cached', () => {
9
+ const cachedIdentity = {
10
+ identityId: 'test-id',
11
+ traits: {
12
+ emails: ['test@email.com'],
13
+ phones: ['555-1234'],
14
+ },
15
+ };
16
+ const incomingIdentity = {
17
+ identityId: 'test-id',
18
+ traits: {
19
+ emails: ['test@email.com'],
20
+ phones: ['555-1234'],
21
+ },
22
+ };
23
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
24
+ expect(result.isDeepEqual).toBe(true);
25
+ expect(result.isCacheStale).toBe(false);
26
+ });
27
+ it('should return isDeepEqual=false when merged differs from cached', () => {
28
+ const cachedIdentity = {
29
+ identityId: 'test-id',
30
+ traits: {
31
+ emails: ['old@email.com'],
32
+ },
33
+ };
34
+ const incomingIdentity = {
35
+ identityId: 'test-id',
36
+ traits: {
37
+ emails: ['old@email.com', 'new@email.com'],
38
+ },
39
+ };
40
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
41
+ expect(result.isDeepEqual).toBe(false);
42
+ expect(result.isCacheStale).toBe(true);
43
+ });
44
+ it('should strip address timestamps before comparison', () => {
45
+ const now = Date.now();
46
+ const cachedIdentity = {
47
+ identityId: 'test-id',
48
+ traits: {
49
+ emails: ['test@email.com'],
50
+ addresses: [{ city: 'NYC', firstName: 'John', cra: now - 10000, upa: now - 5000 }],
51
+ },
52
+ };
53
+ const incomingIdentity = {
54
+ identityId: 'test-id',
55
+ traits: {
56
+ emails: ['test@email.com'],
57
+ },
58
+ };
59
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
60
+ expect(result.isCacheStale).toBe(false);
61
+ });
62
+ it('should detect difference in address content even with timestamp stripping', () => {
63
+ const now = Date.now();
64
+ const cachedIdentity = {
65
+ identityId: 'test-id',
66
+ traits: {
67
+ emails: ['test@email.com'],
68
+ addresses: [{ city: 'NYC', cra: now }],
69
+ },
70
+ };
71
+ const incomingIdentity = {
72
+ identityId: 'test-id',
73
+ traits: {
74
+ emails: ['test@email.com'],
75
+ addresses: [{ city: 'Boston', cra: now }],
76
+ },
77
+ };
78
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
79
+ expect(result.isDeepEqual).toBe(false);
80
+ });
81
+ });
82
+ describe('volatile-only tier handling', () => {
83
+ it('should return isVolatileOnly=true when only ipAddress changes', () => {
84
+ const cachedIdentity = {
85
+ identityId: 'test-id',
86
+ traits: {
87
+ emails: ['test@email.com'],
88
+ },
89
+ };
90
+ const incomingIdentity = {
91
+ identityId: 'test-id',
92
+ traits: {
93
+ emails: ['test@email.com'],
94
+ ipAddress: '10.0.0.1',
95
+ },
96
+ };
97
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
98
+ expect(result.isVolatileOnly).toBe(true);
99
+ expect(result.staleTier).toBe(identity_cache_helper_js_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
100
+ });
101
+ it('should return isVolatileOnly=true when only userAgent changes', () => {
102
+ const cachedIdentity = {
103
+ identityId: 'test-id',
104
+ traits: {
105
+ emails: ['test@email.com'],
106
+ },
107
+ };
108
+ const incomingIdentity = {
109
+ identityId: 'test-id',
110
+ traits: {
111
+ emails: ['test@email.com'],
112
+ userAgent: 'Mozilla/5.0',
113
+ },
114
+ };
115
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
116
+ expect(result.isVolatileOnly).toBe(true);
117
+ });
118
+ it('should set isCacheStale=false for volatile-only tier (override)', () => {
119
+ const cachedIdentity = {
120
+ identityId: 'test-id',
121
+ traits: {
122
+ emails: ['test@email.com'],
123
+ },
124
+ };
125
+ const incomingIdentity = {
126
+ identityId: 'test-id',
127
+ traits: {
128
+ emails: ['test@email.com'],
129
+ ipAddress: '192.168.1.1',
130
+ userAgent: 'Chrome/100',
131
+ },
132
+ };
133
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
134
+ expect(result.isVolatileOnly).toBe(true);
135
+ expect(result.isCacheStale).toBe(false);
136
+ });
137
+ it('should set skipNeptune=true for volatile-only tier', () => {
138
+ const cachedIdentity = {
139
+ identityId: 'test-id',
140
+ traits: {
141
+ emails: ['test@email.com'],
142
+ },
143
+ };
144
+ const incomingIdentity = {
145
+ identityId: 'test-id',
146
+ traits: {
147
+ emails: ['test@email.com'],
148
+ ipAddress: '10.0.0.1',
149
+ },
150
+ };
151
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
152
+ expect(result.skipNeptune).toBe(true);
153
+ });
154
+ it('should return merged identity with volatile traits', () => {
155
+ const cachedIdentity = {
156
+ identityId: 'test-id',
157
+ traits: {
158
+ emails: ['test@email.com'],
159
+ phones: ['555-cached'],
160
+ },
161
+ };
162
+ const incomingIdentity = {
163
+ identityId: 'test-id',
164
+ traits: {
165
+ emails: ['test@email.com'],
166
+ ipAddress: '10.0.0.1',
167
+ },
168
+ };
169
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
170
+ expect(result.mergedIdentity.traits?.phones).toContain('555-cached');
171
+ expect(result.mergedIdentity.traits?.ipAddress).toBe('10.0.0.1');
172
+ });
173
+ });
174
+ describe('address update tier handling', () => {
175
+ it('should return isAddressUpdate=true when non-IP address is added', () => {
176
+ const cachedIdentity = {
177
+ identityId: 'test-id',
178
+ traits: {
179
+ emails: ['test@email.com'],
180
+ addresses: [],
181
+ },
182
+ };
183
+ const incomingIdentity = {
184
+ identityId: 'test-id',
185
+ traits: {
186
+ emails: ['test@email.com'],
187
+ addresses: [{ firstName: 'John', lastName: 'Doe', city: 'NYC' }],
188
+ },
189
+ };
190
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
191
+ expect(result.isAddressUpdate).toBe(true);
192
+ expect(result.staleTier).toBe(identity_cache_helper_js_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
193
+ });
194
+ it('should set writeReason=ADDRESS_UPDATE for address update tier', () => {
195
+ const cachedIdentity = {
196
+ identityId: 'test-id',
197
+ traits: {
198
+ emails: ['test@email.com'],
199
+ addresses: [],
200
+ },
201
+ };
202
+ const incomingIdentity = {
203
+ identityId: 'test-id',
204
+ traits: {
205
+ emails: ['test@email.com'],
206
+ addresses: [{ firstName: 'Jane', city: 'Boston' }],
207
+ },
208
+ };
209
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
210
+ expect(result.writeReason).toBe(types_js_1.CACHE_WRITE_REASON.ADDRESS_UPDATE);
211
+ });
212
+ it('should set skipNeptune=true for address update tier', () => {
213
+ const cachedIdentity = {
214
+ identityId: 'test-id',
215
+ traits: {
216
+ emails: ['test@email.com'],
217
+ addresses: [],
218
+ },
219
+ };
220
+ const incomingIdentity = {
221
+ identityId: 'test-id',
222
+ traits: {
223
+ emails: ['test@email.com'],
224
+ addresses: [{ firstName: 'Test', city: 'TestCity', zip: '12345' }],
225
+ },
226
+ };
227
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
228
+ expect(result.skipNeptune).toBe(true);
229
+ });
230
+ it('should set isCacheStale=true for address update tier', () => {
231
+ const cachedIdentity = {
232
+ identityId: 'test-id',
233
+ traits: {
234
+ emails: ['test@email.com'],
235
+ addresses: [],
236
+ },
237
+ };
238
+ const incomingIdentity = {
239
+ identityId: 'test-id',
240
+ traits: {
241
+ emails: ['test@email.com'],
242
+ addresses: [{ firstName: 'Test', city: 'TestCity' }],
243
+ },
244
+ };
245
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
246
+ expect(result.isCacheStale).toBe(true);
247
+ });
248
+ it('should NOT be address update for IP-sourced addresses', () => {
249
+ const cachedIdentity = {
250
+ identityId: 'test-id',
251
+ traits: {
252
+ emails: ['test@email.com'],
253
+ addresses: [],
254
+ },
255
+ };
256
+ const incomingIdentity = {
257
+ identityId: 'test-id',
258
+ traits: {
259
+ emails: ['test@email.com'],
260
+ addresses: [{ city: 'IPCity', country: 'US' }],
261
+ },
262
+ };
263
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
264
+ expect(result.isAddressUpdate).toBe(false);
265
+ expect(result.isVolatileOnly).toBe(true);
266
+ });
267
+ });
268
+ describe('identity stale tier handling', () => {
269
+ it('should return IDENTITY_STALE when identity-defining trait changes', () => {
270
+ const cachedIdentity = {
271
+ identityId: 'test-id',
272
+ traits: {
273
+ emails: ['old@email.com'],
274
+ },
275
+ };
276
+ const incomingIdentity = {
277
+ identityId: 'test-id',
278
+ traits: {
279
+ emails: ['old@email.com', 'new@email.com'],
280
+ },
281
+ };
282
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
283
+ expect(result.staleTier).toBe(identity_cache_helper_js_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
284
+ expect(result.isCacheStale).toBe(true);
285
+ });
286
+ it('should set writeReason=STALE_TRAITS for identity stale tier', () => {
287
+ const cachedIdentity = {
288
+ identityId: 'test-id',
289
+ traits: {
290
+ emails: ['test@email.com'],
291
+ phones: ['555-old'],
292
+ },
293
+ };
294
+ const incomingIdentity = {
295
+ identityId: 'test-id',
296
+ traits: {
297
+ emails: ['test@email.com'],
298
+ phones: ['555-old', '555-new'],
299
+ },
300
+ };
301
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
302
+ expect(result.writeReason).toBe(types_js_1.CACHE_WRITE_REASON.STALE_TRAITS);
303
+ });
304
+ it('should set skipNeptune=false for identity stale tier', () => {
305
+ const cachedIdentity = {
306
+ identityId: 'test-id',
307
+ traits: {
308
+ emails: ['test@email.com'],
309
+ },
310
+ };
311
+ const incomingIdentity = {
312
+ identityId: 'test-id',
313
+ traits: {
314
+ emails: ['test@email.com'],
315
+ userIds: ['user-123'],
316
+ },
317
+ };
318
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
319
+ expect(result.skipNeptune).toBe(false);
320
+ });
321
+ it('should populate staleTraits with changed trait names', () => {
322
+ const cachedIdentity = {
323
+ identityId: 'test-id',
324
+ traits: {
325
+ emails: ['old@email.com'],
326
+ },
327
+ };
328
+ const incomingIdentity = {
329
+ identityId: 'test-id',
330
+ traits: {
331
+ emails: ['old@email.com', 'new@email.com'],
332
+ phones: ['555-new'],
333
+ },
334
+ };
335
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
336
+ expect(result.staleTraits).toContain('emails');
337
+ expect(result.staleTraits).toContain('phones');
338
+ });
339
+ });
340
+ describe('deep equality override for isCacheStale', () => {
341
+ it('should set isCacheStale=false when deep equal regardless of staleness computation', () => {
342
+ const cachedIdentity = {
343
+ identityId: 'test-id',
344
+ traits: {
345
+ emails: ['test@email.com'],
346
+ },
347
+ };
348
+ const incomingIdentity = {
349
+ identityId: 'test-id',
350
+ traits: {
351
+ emails: ['test@email.com'],
352
+ },
353
+ };
354
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
355
+ expect(result.isDeepEqual).toBe(true);
356
+ expect(result.isCacheStale).toBe(false);
357
+ });
358
+ });
359
+ describe('staleTracker population', () => {
360
+ it('should return populated staleTracker from mergeAndComputeIdentityStaleness', () => {
361
+ const cachedIdentity = {
362
+ identityId: 'test-id',
363
+ traits: {
364
+ emails: ['old@email.com'],
365
+ },
366
+ };
367
+ const incomingIdentity = {
368
+ identityId: 'test-id',
369
+ traits: {
370
+ emails: ['old@email.com', 'new@email.com'],
371
+ },
372
+ };
373
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
374
+ expect(result.staleTracker).toBeDefined();
375
+ expect(result.staleTracker.isEmailsStale).toBe(true);
376
+ });
377
+ });
378
+ describe('merged identity correctness', () => {
379
+ it('should merge traits from both incoming and cached', () => {
380
+ const cachedIdentity = {
381
+ identityId: 'test-id',
382
+ traits: {
383
+ emails: ['cached@email.com'],
384
+ phones: ['555-cached'],
385
+ },
386
+ };
387
+ const incomingIdentity = {
388
+ identityId: 'test-id',
389
+ traits: {
390
+ emails: ['cached@email.com', 'new@email.com'],
391
+ },
392
+ };
393
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
394
+ expect(result.mergedIdentity.traits?.emails).toContain('cached@email.com');
395
+ expect(result.mergedIdentity.traits?.emails).toContain('new@email.com');
396
+ expect(result.mergedIdentity.traits?.phones).toContain('555-cached');
397
+ });
398
+ it('should preserve identityId from incoming (incoming spreads first)', () => {
399
+ const cachedIdentity = {
400
+ identityId: 'cached-identity-id',
401
+ traits: { emails: ['test@email.com'] },
402
+ };
403
+ const incomingIdentity = {
404
+ identityId: 'incoming-identity-id',
405
+ traits: { emails: ['test@email.com'] },
406
+ };
407
+ const result = (0, helpers_js_1.processCacheHit)(incomingIdentity, cachedIdentity);
408
+ expect(result.mergedIdentity.identityId).toBe('incoming-identity-id');
409
+ });
410
+ });
411
+ });
412
+ describe('stripAddressTimestamps helper', () => {
413
+ it('should remove cra and upa from addresses', () => {
414
+ const identity = {
415
+ identityId: 'test',
416
+ traits: {
417
+ addresses: [
418
+ { city: 'NYC', cra: 1234567890, upa: 1234567899 },
419
+ { city: 'LA', cra: 9876543210, upa: 9876543219 },
420
+ ],
421
+ },
422
+ };
423
+ const result = (0, helpers_js_1.stripAddressTimestamps)(identity);
424
+ expect(result.traits?.addresses?.[0]).not.toHaveProperty('cra');
425
+ expect(result.traits?.addresses?.[0]).not.toHaveProperty('upa');
426
+ expect(result.traits?.addresses?.[0]?.city).toBe('NYC');
427
+ expect(result.traits?.addresses?.[1]).not.toHaveProperty('cra');
428
+ expect(result.traits?.addresses?.[1]).not.toHaveProperty('upa');
429
+ expect(result.traits?.addresses?.[1]?.city).toBe('LA');
430
+ });
431
+ it('should return original identity if no addresses', () => {
432
+ const identity = {
433
+ identityId: 'test',
434
+ traits: {
435
+ emails: ['test@email.com'],
436
+ },
437
+ };
438
+ const result = (0, helpers_js_1.stripAddressTimestamps)(identity);
439
+ expect(result).toEqual(identity);
440
+ });
441
+ it('should return original identity if addresses array is empty', () => {
442
+ const identity = {
443
+ identityId: 'test',
444
+ traits: {
445
+ addresses: [],
446
+ },
447
+ };
448
+ const result = (0, helpers_js_1.stripAddressTimestamps)(identity);
449
+ expect(result).toEqual(identity);
450
+ });
451
+ it('should preserve other address fields', () => {
452
+ const identity = {
453
+ identityId: 'test',
454
+ traits: {
455
+ addresses: [
456
+ {
457
+ firstName: 'John',
458
+ lastName: 'Doe',
459
+ city: 'NYC',
460
+ zip: '10001',
461
+ country: 'US',
462
+ cra: 123456,
463
+ upa: 789012,
464
+ },
465
+ ],
466
+ },
467
+ };
468
+ const result = (0, helpers_js_1.stripAddressTimestamps)(identity);
469
+ const addr = result.traits?.addresses?.[0];
470
+ expect(addr?.firstName).toBe('John');
471
+ expect(addr?.lastName).toBe('Doe');
472
+ expect(addr?.city).toBe('NYC');
473
+ expect(addr?.zip).toBe('10001');
474
+ expect(addr?.country).toBe('US');
475
+ expect(addr).not.toHaveProperty('cra');
476
+ expect(addr).not.toHaveProperty('upa');
477
+ });
478
+ });
479
+ describe('computeTraitChanges helper', () => {
480
+ it('should detect email changes', () => {
481
+ const cached = {
482
+ identityId: 'test',
483
+ traits: { emails: ['old@email.com'] },
484
+ };
485
+ const resolved = {
486
+ identityId: 'test',
487
+ traits: { emails: ['old@email.com', 'new@email.com'] },
488
+ };
489
+ const changes = (0, helpers_js_1.computeTraitChanges)(cached, resolved);
490
+ expect(changes.emails).toBeDefined();
491
+ expect(changes.emails?.cached).toEqual(['old@email.com']);
492
+ expect(changes.emails?.resolved).toEqual(['old@email.com', 'new@email.com']);
493
+ });
494
+ it('should detect phone changes', () => {
495
+ const cached = {
496
+ identityId: 'test',
497
+ traits: { phones: ['555-old'] },
498
+ };
499
+ const resolved = {
500
+ identityId: 'test',
501
+ traits: { phones: ['555-old', '555-new'] },
502
+ };
503
+ const changes = (0, helpers_js_1.computeTraitChanges)(cached, resolved);
504
+ expect(changes.phones).toBeDefined();
505
+ expect(changes.phones?.cached).toEqual(['555-old']);
506
+ expect(changes.phones?.resolved).toContain('555-new');
507
+ });
508
+ it('should detect address changes', () => {
509
+ const cached = {
510
+ identityId: 'test',
511
+ traits: { addresses: [{ city: 'NYC' }] },
512
+ };
513
+ const resolved = {
514
+ identityId: 'test',
515
+ traits: { addresses: [{ city: 'NYC' }, { city: 'LA' }] },
516
+ };
517
+ const changes = (0, helpers_js_1.computeTraitChanges)(cached, resolved);
518
+ expect(changes.addresses).toBeDefined();
519
+ });
520
+ it('should detect identityId changes', () => {
521
+ const cached = {
522
+ identityId: 'old-id',
523
+ traits: {},
524
+ };
525
+ const resolved = {
526
+ identityId: 'new-id',
527
+ traits: {},
528
+ };
529
+ const changes = (0, helpers_js_1.computeTraitChanges)(cached, resolved);
530
+ expect(changes.identityId).toBeDefined();
531
+ expect(changes.identityId?.cached).toBe('old-id');
532
+ expect(changes.identityId?.resolved).toBe('new-id');
533
+ });
534
+ it('should detect ipAddress changes', () => {
535
+ const cached = {
536
+ identityId: 'test',
537
+ traits: { ipAddress: '10.0.0.1' },
538
+ };
539
+ const resolved = {
540
+ identityId: 'test',
541
+ traits: { ipAddress: '10.0.0.2' },
542
+ };
543
+ const changes = (0, helpers_js_1.computeTraitChanges)(cached, resolved);
544
+ expect(changes.ipAddress).toBeDefined();
545
+ expect(changes.ipAddress?.cached).toBe('10.0.0.1');
546
+ expect(changes.ipAddress?.resolved).toBe('10.0.0.2');
547
+ });
548
+ it('should detect userAgent changes', () => {
549
+ const cached = {
550
+ identityId: 'test',
551
+ traits: { userAgent: 'Mozilla/5.0 Old' },
552
+ };
553
+ const resolved = {
554
+ identityId: 'test',
555
+ traits: { userAgent: 'Mozilla/5.0 New' },
556
+ };
557
+ const changes = (0, helpers_js_1.computeTraitChanges)(cached, resolved);
558
+ expect(changes.userAgent).toBeDefined();
559
+ });
560
+ it('should not include unchanged traits', () => {
561
+ const cached = {
562
+ identityId: 'test',
563
+ traits: {
564
+ emails: ['same@email.com'],
565
+ phones: ['555-same'],
566
+ },
567
+ };
568
+ const resolved = {
569
+ identityId: 'test',
570
+ traits: {
571
+ emails: ['same@email.com'],
572
+ phones: ['555-same'],
573
+ },
574
+ };
575
+ const changes = (0, helpers_js_1.computeTraitChanges)(cached, resolved);
576
+ expect(changes.emails).toBeUndefined();
577
+ expect(changes.phones).toBeUndefined();
578
+ });
579
+ it('should handle undefined traits gracefully', () => {
580
+ const cached = {
581
+ identityId: 'test',
582
+ traits: undefined,
583
+ };
584
+ const resolved = {
585
+ identityId: 'test',
586
+ traits: { emails: ['new@email.com'] },
587
+ };
588
+ const changes = (0, helpers_js_1.computeTraitChanges)(cached, resolved);
589
+ expect(changes.emails).toBeDefined();
590
+ expect(changes.emails?.cached).toEqual([]);
591
+ expect(changes.emails?.resolved).toEqual(['new@email.com']);
592
+ });
593
+ });
594
+ //# sourceMappingURL=helpers.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/identity-cache/helpers.spec.ts"],"names":[],"mappings":"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"}