@adtrackify/at-service-common 4.0.13 → 4.0.15
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.
- package/dist/cjs/__tests__/identity-cache/helpers.spec.js +37 -38
- package/dist/cjs/__tests__/identity-cache/helpers.spec.js.map +1 -1
- package/dist/cjs/__tests__/identity-cache/identity-cache-tier-routing.spec.js +92 -349
- package/dist/cjs/__tests__/identity-cache/identity-cache-tier-routing.spec.js.map +1 -1
- package/dist/cjs/__tests__/identity-cache/identity-client.spec.js +360 -0
- package/dist/cjs/__tests__/identity-cache/identity-client.spec.js.map +1 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-hit.spec.js +138 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-hit.spec.js.map +1 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-miss.spec.js +153 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-miss.spec.js.map +1 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-constructor.spec.js +72 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-constructor.spec.js.map +1 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-edge-cases.spec.js +89 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-edge-cases.spec.js.map +1 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-enqueue-async.spec.js +136 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-enqueue-async.spec.js.map +1 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-stale-cache.spec.js +224 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-stale-cache.spec.js.map +1 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-test-setup.d.ts +28 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-test-setup.js +90 -0
- package/dist/cjs/__tests__/identity-cache/identity-gateway-test-setup.js.map +1 -0
- package/dist/cjs/clients/internal-api/identity-client.d.ts +12 -2
- package/dist/cjs/clients/internal-api/identity-client.js +59 -13
- package/dist/cjs/clients/internal-api/identity-client.js.map +1 -1
- package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.d.ts +1 -7
- package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js +0 -305
- package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js.map +1 -1
- package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.d.ts +14 -14
- package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.js +122 -330
- package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.js.map +1 -1
- package/dist/cjs/services/db/identity-cache-dynamodb-service/index.d.ts +0 -1
- package/dist/cjs/services/db/identity-cache-dynamodb-service/index.js +0 -1
- package/dist/cjs/services/db/identity-cache-dynamodb-service/index.js.map +1 -1
- package/dist/cjs/services/db/identity-cache-dynamodb-service/types.d.ts +8 -158
- package/dist/cjs/services/db/identity-cache-dynamodb-service/types.js +1 -15
- package/dist/cjs/services/db/identity-cache-dynamodb-service/types.js.map +1 -1
- package/dist/esm/__tests__/identity-cache/helpers.spec.js +26 -27
- package/dist/esm/__tests__/identity-cache/helpers.spec.js.map +1 -1
- package/dist/esm/__tests__/identity-cache/identity-cache-tier-routing.spec.js +92 -349
- package/dist/esm/__tests__/identity-cache/identity-cache-tier-routing.spec.js.map +1 -1
- package/dist/esm/__tests__/identity-cache/identity-client.spec.js +358 -0
- package/dist/esm/__tests__/identity-cache/identity-client.spec.js.map +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-cache-hit.spec.d.ts +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-cache-hit.spec.js +136 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-cache-hit.spec.js.map +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-cache-miss.spec.d.ts +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-cache-miss.spec.js +151 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-cache-miss.spec.js.map +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-constructor.spec.d.ts +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-constructor.spec.js +70 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-constructor.spec.js.map +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-edge-cases.spec.d.ts +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-edge-cases.spec.js +87 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-edge-cases.spec.js.map +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-enqueue-async.spec.d.ts +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-enqueue-async.spec.js +134 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-enqueue-async.spec.js.map +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-stale-cache.spec.d.ts +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-stale-cache.spec.js +222 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-stale-cache.spec.js.map +1 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-test-setup.d.ts +28 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-test-setup.js +83 -0
- package/dist/esm/__tests__/identity-cache/identity-gateway-test-setup.js.map +1 -0
- package/dist/esm/clients/internal-api/identity-client.d.ts +12 -2
- package/dist/esm/clients/internal-api/identity-client.js +60 -14
- package/dist/esm/clients/internal-api/identity-client.js.map +1 -1
- package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.d.ts +1 -7
- package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js +1 -303
- package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js.map +1 -1
- package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.d.ts +14 -14
- package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.js +125 -330
- package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.js.map +1 -1
- package/dist/esm/services/db/identity-cache-dynamodb-service/index.d.ts +0 -1
- package/dist/esm/services/db/identity-cache-dynamodb-service/index.js +0 -1
- package/dist/esm/services/db/identity-cache-dynamodb-service/index.js.map +1 -1
- package/dist/esm/services/db/identity-cache-dynamodb-service/types.d.ts +8 -158
- package/dist/esm/services/db/identity-cache-dynamodb-service/types.js +0 -14
- package/dist/esm/services/db/identity-cache-dynamodb-service/types.js.map +1 -1
- package/package.json +2 -2
- package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service-v2-comparison.spec.js +0 -646
- package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service-v2-comparison.spec.js.map +0 -1
- package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-service-v2-comparison.spec.js +0 -325
- package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-service-v2-comparison.spec.js.map +0 -1
- package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-service.spec.js +0 -1286
- package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-service.spec.js.map +0 -1
- package/dist/cjs/__tests__/identity-cache/identity-gateway-service.spec.js +0 -2170
- package/dist/cjs/__tests__/identity-cache/identity-gateway-service.spec.js.map +0 -1
- package/dist/cjs/services/db/identity-cache-dynamodb-service/helpers.d.ts +0 -26
- package/dist/cjs/services/db/identity-cache-dynamodb-service/helpers.js +0 -252
- package/dist/cjs/services/db/identity-cache-dynamodb-service/helpers.js.map +0 -1
- package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service-v2-comparison.spec.js +0 -644
- package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service-v2-comparison.spec.js.map +0 -1
- package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-service-v2-comparison.spec.js +0 -323
- package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-service-v2-comparison.spec.js.map +0 -1
- package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-service.spec.js +0 -1284
- package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-service.spec.js.map +0 -1
- package/dist/esm/__tests__/identity-cache/identity-gateway-service.spec.js +0 -2168
- package/dist/esm/__tests__/identity-cache/identity-gateway-service.spec.js.map +0 -1
- package/dist/esm/services/db/identity-cache-dynamodb-service/helpers.d.ts +0 -26
- package/dist/esm/services/db/identity-cache-dynamodb-service/helpers.js +0 -235
- package/dist/esm/services/db/identity-cache-dynamodb-service/helpers.js.map +0 -1
- /package/dist/cjs/__tests__/identity-cache/{identity-cache-dynamodb-db-service-v2-comparison.spec.d.ts → identity-client.spec.d.ts} +0 -0
- /package/dist/cjs/__tests__/identity-cache/{identity-cache-dynamodb-service-v2-comparison.spec.d.ts → identity-gateway-cache-hit.spec.d.ts} +0 -0
- /package/dist/cjs/__tests__/identity-cache/{identity-cache-dynamodb-service.spec.d.ts → identity-gateway-cache-miss.spec.d.ts} +0 -0
- /package/dist/cjs/__tests__/identity-cache/{identity-gateway-service.spec.d.ts → identity-gateway-constructor.spec.d.ts} +0 -0
- /package/dist/{esm/__tests__/identity-cache/identity-cache-dynamodb-db-service-v2-comparison.spec.d.ts → cjs/__tests__/identity-cache/identity-gateway-edge-cases.spec.d.ts} +0 -0
- /package/dist/{esm/__tests__/identity-cache/identity-cache-dynamodb-service-v2-comparison.spec.d.ts → cjs/__tests__/identity-cache/identity-gateway-enqueue-async.spec.d.ts} +0 -0
- /package/dist/{esm/__tests__/identity-cache/identity-cache-dynamodb-service.spec.d.ts → cjs/__tests__/identity-cache/identity-gateway-stale-cache.spec.d.ts} +0 -0
- /package/dist/esm/__tests__/identity-cache/{identity-gateway-service.spec.d.ts → identity-client.spec.d.ts} +0 -0
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const at_tracking_event_types_1 = require("@adtrackify/at-tracking-event-types");
|
|
4
|
-
const
|
|
5
|
-
const identity_cache_dynamodb_service_1 = require("../../services/db/identity-cache-dynamodb-service");
|
|
6
|
-
const mockInvokeFunction = jest.fn();
|
|
4
|
+
const mockLambdaInvoke = jest.fn();
|
|
7
5
|
const mockBuildAndSendMessage = jest.fn();
|
|
8
6
|
const mockSQSClientConstructor = jest.fn();
|
|
9
7
|
jest.mock('../../clients/index.js', () => ({
|
|
@@ -17,7 +15,7 @@ jest.mock('../../clients/index.js', () => ({
|
|
|
17
15
|
batchWrite: jest.fn(),
|
|
18
16
|
},
|
|
19
17
|
LambdaInvokeClient: jest.fn().mockImplementation(() => ({
|
|
20
|
-
invokeFunction:
|
|
18
|
+
invokeFunction: mockLambdaInvoke,
|
|
21
19
|
})),
|
|
22
20
|
SQSClient: jest.fn().mockImplementation((_region, _accountId, _queueName) => {
|
|
23
21
|
mockSQSClientConstructor(_region, _accountId, _queueName);
|
|
@@ -35,15 +33,23 @@ jest.mock('../../helpers/index.js', () => ({
|
|
|
35
33
|
error: jest.fn(),
|
|
36
34
|
},
|
|
37
35
|
}));
|
|
36
|
+
const mockGetIdentity = jest.fn();
|
|
37
|
+
jest.mock('../../clients/internal-api/identity-client.js', () => ({
|
|
38
|
+
IdentityClient: jest.fn().mockImplementation(() => ({
|
|
39
|
+
getIdentity: mockGetIdentity,
|
|
40
|
+
})),
|
|
41
|
+
}));
|
|
38
42
|
const identity_gateway_service_js_1 = require("../../services/db/identity-cache-dynamodb-service/identity-gateway-service.js");
|
|
39
43
|
const types_js_1 = require("../../services/db/identity-cache-dynamodb-service/types.js");
|
|
40
|
-
const identity_cache_dynamodb_db_service_js_1 = require("../../services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js");
|
|
41
44
|
const index_js_1 = require("../../clients/index.js");
|
|
42
45
|
const mockedDynamoDbClient = index_js_1.DynamoDbClient;
|
|
43
46
|
const _mockedSQSClient = index_js_1.SQSClient;
|
|
47
|
+
const createService = (options = { identifyPrivateLambdaArn: 'arn:aws:lambda:us-east-1:123456789:function:identity-private' }) => {
|
|
48
|
+
return new identity_gateway_service_js_1.IdentityGatewayService(options);
|
|
49
|
+
};
|
|
44
50
|
describe('Identity Cache Three-Tier Routing', () => {
|
|
45
51
|
const pixelId = 'pixel123';
|
|
46
|
-
|
|
52
|
+
let service;
|
|
47
53
|
beforeEach(() => {
|
|
48
54
|
jest.clearAllMocks();
|
|
49
55
|
mockedDynamoDbClient.safeGet.mockReset();
|
|
@@ -53,13 +59,11 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
53
59
|
mockedDynamoDbClient.safeBatchWrite.mockReset();
|
|
54
60
|
mockedDynamoDbClient.safeQueryByGSI.mockReset();
|
|
55
61
|
mockedDynamoDbClient.batchWrite.mockReset();
|
|
56
|
-
|
|
62
|
+
mockGetIdentity.mockReset();
|
|
57
63
|
mockBuildAndSendMessage.mockReset();
|
|
58
64
|
mockSQSClientConstructor.mockReset();
|
|
59
65
|
_mockedSQSClient.mockClear();
|
|
60
|
-
|
|
61
|
-
identity_gateway_service_js_1.IdentityGatewayService.sqsClient = undefined;
|
|
62
|
-
identity_gateway_service_js_1.IdentityGatewayService.sqsQueueUrl = undefined;
|
|
66
|
+
service = createService();
|
|
63
67
|
});
|
|
64
68
|
describe('TIER: VOLATILE_ONLY — Returns merged identity, NO Neptune, NO cache write', () => {
|
|
65
69
|
it('should return merged identity without Neptune call when only ipAddress is stale', async () => {
|
|
@@ -84,10 +88,10 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
84
88
|
updatedAt: new Date().toISOString(),
|
|
85
89
|
};
|
|
86
90
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
87
|
-
const result = await
|
|
91
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
88
92
|
expect(result.identity).toBeDefined();
|
|
89
93
|
expect(result.identity?.identityId).toBe('identity456');
|
|
90
|
-
expect(
|
|
94
|
+
expect(mockGetIdentity).not.toHaveBeenCalled();
|
|
91
95
|
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
92
96
|
});
|
|
93
97
|
it('should return merged identity without Neptune call when only userAgent is stale', async () => {
|
|
@@ -112,9 +116,9 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
112
116
|
updatedAt: new Date().toISOString(),
|
|
113
117
|
};
|
|
114
118
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
115
|
-
const result = await
|
|
119
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
116
120
|
expect(result.identity).toBeDefined();
|
|
117
|
-
expect(
|
|
121
|
+
expect(mockGetIdentity).not.toHaveBeenCalled();
|
|
118
122
|
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
119
123
|
});
|
|
120
124
|
it('should return merged identity without Neptune call when only IP-sourced addresses are stale', async () => {
|
|
@@ -139,115 +143,10 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
139
143
|
updatedAt: new Date().toISOString(),
|
|
140
144
|
};
|
|
141
145
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
142
|
-
const result = await
|
|
143
|
-
expect(result.identity).toBeDefined();
|
|
144
|
-
expect(mockInvokeFunction).not.toHaveBeenCalled();
|
|
145
|
-
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
describe('TIER: ADDRESS_UPDATE — Enqueues async update, NO Neptune call, NO sync cache write', () => {
|
|
149
|
-
it('should enqueue async update but skip Neptune when new non-IP address is added', async () => {
|
|
150
|
-
identity_gateway_service_js_1.IdentityGatewayService.configure({
|
|
151
|
-
awsRegion: 'us-east-1',
|
|
152
|
-
awsAccountId: '123456789',
|
|
153
|
-
asyncUpdateQueueName: 'test-queue',
|
|
154
|
-
});
|
|
155
|
-
mockBuildAndSendMessage.mockResolvedValueOnce({ MessageId: 'test-msg-id' });
|
|
156
|
-
const incomingIdentity = {
|
|
157
|
-
identityId: 'identity456',
|
|
158
|
-
traits: {
|
|
159
|
-
emails: ['test@email.com'],
|
|
160
|
-
addresses: [{ city: 'Boston', firstName: 'John', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
|
|
161
|
-
},
|
|
162
|
-
};
|
|
163
|
-
const cachedResponse = {
|
|
164
|
-
pk: `identity#${pixelId}#identity456`,
|
|
165
|
-
pixelId,
|
|
166
|
-
identityId: 'identity456',
|
|
167
|
-
response: {
|
|
168
|
-
identityId: 'identity456',
|
|
169
|
-
traits: {
|
|
170
|
-
emails: ['test@email.com'],
|
|
171
|
-
addresses: [],
|
|
172
|
-
},
|
|
173
|
-
},
|
|
174
|
-
updatedAt: new Date().toISOString(),
|
|
175
|
-
};
|
|
176
|
-
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
177
|
-
const result = await identity_gateway_service_js_1.IdentityGatewayService.getIdentityWithCachingV2(pixelId, incomingIdentity, lambdaArn);
|
|
178
|
-
expect(result.identity).toBeDefined();
|
|
179
|
-
expect(result.identity?.traits?.addresses).toHaveLength(1);
|
|
180
|
-
expect(mockInvokeFunction).not.toHaveBeenCalled();
|
|
181
|
-
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
182
|
-
expect(mockBuildAndSendMessage).toHaveBeenCalled();
|
|
183
|
-
});
|
|
184
|
-
it('should enqueue async update and skip Neptune when address with PII but no source is added', async () => {
|
|
185
|
-
identity_gateway_service_js_1.IdentityGatewayService.configure({
|
|
186
|
-
awsRegion: 'us-east-1',
|
|
187
|
-
awsAccountId: '123456789',
|
|
188
|
-
asyncUpdateQueueName: 'test-queue',
|
|
189
|
-
});
|
|
190
|
-
mockBuildAndSendMessage.mockResolvedValueOnce({ MessageId: 'test-msg-id' });
|
|
191
|
-
const incomingIdentity = {
|
|
192
|
-
identityId: 'identity456',
|
|
193
|
-
traits: {
|
|
194
|
-
emails: ['test@email.com'],
|
|
195
|
-
addresses: [{ city: 'Miami', lastName: 'Smith' }],
|
|
196
|
-
},
|
|
197
|
-
};
|
|
198
|
-
const cachedResponse = {
|
|
199
|
-
pk: `identity#${pixelId}#identity456`,
|
|
200
|
-
pixelId,
|
|
201
|
-
identityId: 'identity456',
|
|
202
|
-
response: {
|
|
203
|
-
identityId: 'identity456',
|
|
204
|
-
traits: {
|
|
205
|
-
emails: ['test@email.com'],
|
|
206
|
-
addresses: [],
|
|
207
|
-
},
|
|
208
|
-
},
|
|
209
|
-
updatedAt: new Date().toISOString(),
|
|
210
|
-
};
|
|
211
|
-
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
212
|
-
const result = await identity_gateway_service_js_1.IdentityGatewayService.getIdentityWithCachingV2(pixelId, incomingIdentity, lambdaArn);
|
|
146
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
213
147
|
expect(result.identity).toBeDefined();
|
|
214
|
-
expect(
|
|
148
|
+
expect(mockGetIdentity).not.toHaveBeenCalled();
|
|
215
149
|
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
216
|
-
expect(mockBuildAndSendMessage).toHaveBeenCalled();
|
|
217
|
-
});
|
|
218
|
-
it('should return ADDRESS_UPDATE_ASYNC outcome in summary', async () => {
|
|
219
|
-
identity_gateway_service_js_1.IdentityGatewayService.configure({
|
|
220
|
-
awsRegion: 'us-east-1',
|
|
221
|
-
awsAccountId: '123456789',
|
|
222
|
-
asyncUpdateQueueName: 'test-queue',
|
|
223
|
-
});
|
|
224
|
-
mockBuildAndSendMessage.mockResolvedValueOnce({ MessageId: 'test-msg-id' });
|
|
225
|
-
const incomingIdentity = {
|
|
226
|
-
identityId: 'identity456',
|
|
227
|
-
traits: {
|
|
228
|
-
emails: ['test@email.com'],
|
|
229
|
-
addresses: [{ city: 'Seattle', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
|
|
230
|
-
},
|
|
231
|
-
};
|
|
232
|
-
const cachedResponse = {
|
|
233
|
-
pk: `identity#${pixelId}#identity456`,
|
|
234
|
-
pixelId,
|
|
235
|
-
identityId: 'identity456',
|
|
236
|
-
response: {
|
|
237
|
-
identityId: 'identity456',
|
|
238
|
-
traits: {
|
|
239
|
-
emails: ['test@email.com'],
|
|
240
|
-
addresses: [],
|
|
241
|
-
},
|
|
242
|
-
},
|
|
243
|
-
updatedAt: new Date().toISOString(),
|
|
244
|
-
};
|
|
245
|
-
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
246
|
-
const result = await identity_gateway_service_js_1.IdentityGatewayService.getIdentityWithCachingV2(pixelId, incomingIdentity, lambdaArn);
|
|
247
|
-
expect(result.summary.outcome).toBe(types_js_1.IDENTITY_CACHE_WITH_CACHING_OUTCOME.ADDRESS_UPDATE_ASYNC);
|
|
248
|
-
expect(result.summary.didSkipNeptune).toBe(true);
|
|
249
|
-
expect(result.summary.didWriteCache).toBe(false);
|
|
250
|
-
expect(result.summary.didEnqueueAsync).toBe(true);
|
|
251
150
|
});
|
|
252
151
|
});
|
|
253
152
|
describe('TIER: IDENTITY_STALE — Calls Neptune AND writes to cache', () => {
|
|
@@ -271,18 +170,13 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
271
170
|
updatedAt: new Date().toISOString(),
|
|
272
171
|
};
|
|
273
172
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
identity: {
|
|
278
|
-
identityId: 'identity456',
|
|
279
|
-
traits: { emails: ['old@email.com', 'new@email.com', 'resolved@email.com'] },
|
|
280
|
-
},
|
|
281
|
-
}),
|
|
173
|
+
mockGetIdentity.mockResolvedValueOnce({
|
|
174
|
+
identityId: 'identity456',
|
|
175
|
+
traits: { emails: ['old@email.com', 'new@email.com', 'resolved@email.com'] },
|
|
282
176
|
});
|
|
283
|
-
const result = await
|
|
177
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
284
178
|
expect(result.identity).toBeDefined();
|
|
285
|
-
expect(
|
|
179
|
+
expect(mockGetIdentity).toHaveBeenCalled();
|
|
286
180
|
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
287
181
|
});
|
|
288
182
|
it('should call Neptune and write to cache when phones are stale', async () => {
|
|
@@ -305,18 +199,13 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
305
199
|
updatedAt: new Date().toISOString(),
|
|
306
200
|
};
|
|
307
201
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
identity: {
|
|
312
|
-
identityId: 'identity456',
|
|
313
|
-
traits: { phones: ['+1234567890', '+9876543210'] },
|
|
314
|
-
},
|
|
315
|
-
}),
|
|
202
|
+
mockGetIdentity.mockResolvedValueOnce({
|
|
203
|
+
identityId: 'identity456',
|
|
204
|
+
traits: { phones: ['+1234567890', '+9876543210'] },
|
|
316
205
|
});
|
|
317
|
-
const result = await
|
|
206
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
318
207
|
expect(result.identity).toBeDefined();
|
|
319
|
-
expect(
|
|
208
|
+
expect(mockGetIdentity).toHaveBeenCalled();
|
|
320
209
|
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
321
210
|
});
|
|
322
211
|
it('should return NEPTUNE_WRITE_BACK outcome with staleTraits in summary', async () => {
|
|
@@ -337,20 +226,15 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
337
226
|
updatedAt: new Date().toISOString(),
|
|
338
227
|
};
|
|
339
228
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
identity: {
|
|
344
|
-
identityId: 'identity456',
|
|
345
|
-
traits: { emails: ['old@email.com', 'new@email.com'] },
|
|
346
|
-
},
|
|
347
|
-
}),
|
|
229
|
+
mockGetIdentity.mockResolvedValueOnce({
|
|
230
|
+
identityId: 'identity456',
|
|
231
|
+
traits: { emails: ['old@email.com', 'new@email.com'] },
|
|
348
232
|
});
|
|
349
|
-
const result = await
|
|
350
|
-
expect(result.
|
|
351
|
-
expect(result.
|
|
352
|
-
expect(result.
|
|
353
|
-
expect(result.
|
|
233
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
234
|
+
expect(result.outcome).toBe(types_js_1.IDENTITY_CACHE_WITH_CACHING_OUTCOME.NEPTUNE_RESOLVED);
|
|
235
|
+
expect(result.stalenessResult?.staleTraits).toContain('emails');
|
|
236
|
+
expect(result.didCallNeptune).toBe(true);
|
|
237
|
+
expect(result.didWriteCache).toBe(false);
|
|
354
238
|
});
|
|
355
239
|
});
|
|
356
240
|
describe('CACHE_MISS — Calls Neptune AND writes to cache', () => {
|
|
@@ -360,18 +244,13 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
360
244
|
traits: { emails: ['test@email.com'] },
|
|
361
245
|
};
|
|
362
246
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(null);
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
identity: {
|
|
367
|
-
identityId: 'identity456',
|
|
368
|
-
traits: { emails: ['test@email.com'] },
|
|
369
|
-
},
|
|
370
|
-
}),
|
|
247
|
+
mockGetIdentity.mockResolvedValueOnce({
|
|
248
|
+
identityId: 'identity456',
|
|
249
|
+
traits: { emails: ['test@email.com'] },
|
|
371
250
|
});
|
|
372
|
-
const result = await
|
|
251
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
373
252
|
expect(result.identity).toBeDefined();
|
|
374
|
-
expect(
|
|
253
|
+
expect(mockGetIdentity).toHaveBeenCalled();
|
|
375
254
|
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
376
255
|
});
|
|
377
256
|
it('should return NEPTUNE_WRITE_BACK outcome for cache miss', async () => {
|
|
@@ -380,19 +259,14 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
380
259
|
traits: { emails: ['test@email.com'] },
|
|
381
260
|
};
|
|
382
261
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(null);
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
identity: {
|
|
387
|
-
identityId: 'identity456',
|
|
388
|
-
traits: { emails: ['test@email.com'] },
|
|
389
|
-
},
|
|
390
|
-
}),
|
|
262
|
+
mockGetIdentity.mockResolvedValueOnce({
|
|
263
|
+
identityId: 'identity456',
|
|
264
|
+
traits: { emails: ['test@email.com'] },
|
|
391
265
|
});
|
|
392
|
-
const result = await
|
|
393
|
-
expect(result.
|
|
394
|
-
expect(result.
|
|
395
|
-
expect(result.
|
|
266
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
267
|
+
expect(result.outcome).toBe(types_js_1.IDENTITY_CACHE_WITH_CACHING_OUTCOME.NEPTUNE_RESOLVED);
|
|
268
|
+
expect(result.didCallNeptune).toBe(true);
|
|
269
|
+
expect(result.didWriteCache).toBe(false);
|
|
396
270
|
});
|
|
397
271
|
});
|
|
398
272
|
describe('EMAIL_POINTER_DISCOVERY — Calls Neptune with discovered identityId', () => {
|
|
@@ -408,36 +282,30 @@ describe('Identity Cache Three-Tier Routing', () => {
|
|
|
408
282
|
updatedAt: new Date().toISOString(),
|
|
409
283
|
};
|
|
410
284
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(pointerRecord);
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
identity: {
|
|
415
|
-
identityId: 'discovered-id',
|
|
416
|
-
traits: { emails: ['test@email.com', 'other@email.com'] },
|
|
417
|
-
},
|
|
418
|
-
}),
|
|
285
|
+
mockGetIdentity.mockResolvedValueOnce({
|
|
286
|
+
identityId: 'discovered-id',
|
|
287
|
+
traits: { emails: ['test@email.com', 'other@email.com'] },
|
|
419
288
|
});
|
|
420
|
-
const result = await
|
|
289
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
421
290
|
expect(result.identity?.identityId).toBe('discovered-id');
|
|
422
|
-
expect(
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
},
|
|
291
|
+
expect(mockGetIdentity).toHaveBeenCalledWith(pixelId, expect.objectContaining({
|
|
292
|
+
identity: expect.objectContaining({
|
|
293
|
+
identityId: 'discovered-id',
|
|
294
|
+
traits: expect.objectContaining({ emails: ['test@email.com'] }),
|
|
295
|
+
}),
|
|
428
296
|
}));
|
|
429
297
|
});
|
|
430
298
|
});
|
|
431
299
|
});
|
|
432
300
|
describe('Identity Cache stripAddressTimestamps', () => {
|
|
433
301
|
const pixelId = 'pixel123';
|
|
434
|
-
|
|
302
|
+
let service;
|
|
435
303
|
beforeEach(() => {
|
|
436
304
|
jest.clearAllMocks();
|
|
437
305
|
mockedDynamoDbClient.safeGet.mockReset();
|
|
438
306
|
mockedDynamoDbClient.safeBatchWrite.mockReset();
|
|
439
|
-
|
|
440
|
-
|
|
307
|
+
mockGetIdentity.mockReset();
|
|
308
|
+
service = createService();
|
|
441
309
|
});
|
|
442
310
|
it('should strip cra and upa from addresses during comparison', async () => {
|
|
443
311
|
const incomingIdentity = {
|
|
@@ -475,9 +343,9 @@ describe('Identity Cache stripAddressTimestamps', () => {
|
|
|
475
343
|
updatedAt: new Date().toISOString(),
|
|
476
344
|
};
|
|
477
345
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
478
|
-
const result = await
|
|
346
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
479
347
|
expect(result.identity).toBeDefined();
|
|
480
|
-
expect(
|
|
348
|
+
expect(mockGetIdentity).not.toHaveBeenCalled();
|
|
481
349
|
});
|
|
482
350
|
it('should NOT mutate the original object when stripping timestamps', async () => {
|
|
483
351
|
const originalAddress = {
|
|
@@ -514,7 +382,7 @@ describe('Identity Cache stripAddressTimestamps', () => {
|
|
|
514
382
|
updatedAt: new Date().toISOString(),
|
|
515
383
|
};
|
|
516
384
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
517
|
-
await
|
|
385
|
+
await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
518
386
|
expect(incomingIdentity.traits?.addresses?.[0]).toHaveProperty('cra');
|
|
519
387
|
expect(incomingIdentity.traits?.addresses?.[0]).toHaveProperty('upa');
|
|
520
388
|
expect(cachedResponse.response.traits?.addresses?.[0]).toHaveProperty('cra');
|
|
@@ -540,9 +408,9 @@ describe('Identity Cache stripAddressTimestamps', () => {
|
|
|
540
408
|
updatedAt: new Date().toISOString(),
|
|
541
409
|
};
|
|
542
410
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
543
|
-
const result = await
|
|
411
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
544
412
|
expect(result.identity).toBeDefined();
|
|
545
|
-
expect(
|
|
413
|
+
expect(mockGetIdentity).not.toHaveBeenCalled();
|
|
546
414
|
});
|
|
547
415
|
it('should handle identity with empty addresses array', async () => {
|
|
548
416
|
const incomingIdentity = {
|
|
@@ -566,9 +434,9 @@ describe('Identity Cache stripAddressTimestamps', () => {
|
|
|
566
434
|
updatedAt: new Date().toISOString(),
|
|
567
435
|
};
|
|
568
436
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
569
|
-
const result = await
|
|
437
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
570
438
|
expect(result.identity).toBeDefined();
|
|
571
|
-
expect(
|
|
439
|
+
expect(mockGetIdentity).not.toHaveBeenCalled();
|
|
572
440
|
});
|
|
573
441
|
it('should handle addresses without cra/upa (no-op)', async () => {
|
|
574
442
|
const incomingIdentity = {
|
|
@@ -592,20 +460,20 @@ describe('Identity Cache stripAddressTimestamps', () => {
|
|
|
592
460
|
updatedAt: new Date().toISOString(),
|
|
593
461
|
};
|
|
594
462
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
595
|
-
const result = await
|
|
463
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
596
464
|
expect(result.identity).toBeDefined();
|
|
597
|
-
expect(
|
|
465
|
+
expect(mockGetIdentity).not.toHaveBeenCalled();
|
|
598
466
|
});
|
|
599
467
|
});
|
|
600
468
|
describe('Identity Cache fastDeepEqual with Timestamp Stripping', () => {
|
|
601
469
|
const pixelId = 'pixel123';
|
|
602
|
-
|
|
470
|
+
let service;
|
|
603
471
|
beforeEach(() => {
|
|
604
472
|
jest.clearAllMocks();
|
|
605
473
|
mockedDynamoDbClient.safeGet.mockReset();
|
|
606
474
|
mockedDynamoDbClient.safeBatchWrite.mockReset();
|
|
607
|
-
|
|
608
|
-
|
|
475
|
+
mockGetIdentity.mockReset();
|
|
476
|
+
service = createService();
|
|
609
477
|
});
|
|
610
478
|
it('should treat cached and merged as equal when they differ ONLY in cra/upa', async () => {
|
|
611
479
|
const incomingIdentity = {
|
|
@@ -647,9 +515,9 @@ describe('Identity Cache fastDeepEqual with Timestamp Stripping', () => {
|
|
|
647
515
|
updatedAt: new Date().toISOString(),
|
|
648
516
|
};
|
|
649
517
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
650
|
-
const result = await
|
|
518
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
651
519
|
expect(result.identity).toBeDefined();
|
|
652
|
-
expect(
|
|
520
|
+
expect(mockGetIdentity).not.toHaveBeenCalled();
|
|
653
521
|
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
654
522
|
});
|
|
655
523
|
it('should treat cached and merged as NOT equal when address content differs (plus cra/upa)', async () => {
|
|
@@ -690,19 +558,19 @@ describe('Identity Cache fastDeepEqual with Timestamp Stripping', () => {
|
|
|
690
558
|
updatedAt: new Date().toISOString(),
|
|
691
559
|
};
|
|
692
560
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
693
|
-
const result = await
|
|
561
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
694
562
|
expect(result.identity).toBeDefined();
|
|
695
563
|
});
|
|
696
564
|
});
|
|
697
565
|
describe('Identity Cache Logging Levels', () => {
|
|
698
566
|
const pixelId = 'pixel123';
|
|
699
|
-
|
|
567
|
+
let service;
|
|
700
568
|
beforeEach(() => {
|
|
701
569
|
jest.clearAllMocks();
|
|
702
570
|
mockedDynamoDbClient.safeGet.mockReset();
|
|
703
571
|
mockedDynamoDbClient.safeBatchWrite.mockReset();
|
|
704
|
-
|
|
705
|
-
|
|
572
|
+
mockGetIdentity.mockReset();
|
|
573
|
+
service = createService();
|
|
706
574
|
});
|
|
707
575
|
it('should return fresh cache hit without calling Neptune or writing cache', async () => {
|
|
708
576
|
const incomingIdentity = {
|
|
@@ -724,45 +592,11 @@ describe('Identity Cache Logging Levels', () => {
|
|
|
724
592
|
updatedAt: new Date().toISOString(),
|
|
725
593
|
};
|
|
726
594
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
727
|
-
const result = await
|
|
728
|
-
expect(result.
|
|
729
|
-
expect(
|
|
595
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
596
|
+
expect(result.outcome).toBe(types_js_1.IDENTITY_CACHE_WITH_CACHING_OUTCOME.FRESH_CACHE_HIT);
|
|
597
|
+
expect(mockGetIdentity).not.toHaveBeenCalled();
|
|
730
598
|
expect(mockedDynamoDbClient.safeBatchWrite).not.toHaveBeenCalled();
|
|
731
599
|
});
|
|
732
|
-
it('should return ADDRESS_UPDATE_ASYNC outcome for address update path', async () => {
|
|
733
|
-
identity_gateway_service_js_1.IdentityGatewayService.configure({
|
|
734
|
-
awsRegion: 'us-east-1',
|
|
735
|
-
awsAccountId: '123456789',
|
|
736
|
-
asyncUpdateQueueName: 'test-queue',
|
|
737
|
-
});
|
|
738
|
-
mockBuildAndSendMessage.mockResolvedValueOnce({ MessageId: 'test-msg-id' });
|
|
739
|
-
const incomingIdentity = {
|
|
740
|
-
identityId: 'identity456',
|
|
741
|
-
traits: {
|
|
742
|
-
emails: ['test@email.com'],
|
|
743
|
-
addresses: [{ city: 'New City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
|
|
744
|
-
},
|
|
745
|
-
};
|
|
746
|
-
const cachedResponse = {
|
|
747
|
-
pk: `identity#${pixelId}#identity456`,
|
|
748
|
-
pixelId,
|
|
749
|
-
identityId: 'identity456',
|
|
750
|
-
response: {
|
|
751
|
-
identityId: 'identity456',
|
|
752
|
-
traits: {
|
|
753
|
-
emails: ['test@email.com'],
|
|
754
|
-
addresses: [],
|
|
755
|
-
},
|
|
756
|
-
},
|
|
757
|
-
updatedAt: new Date().toISOString(),
|
|
758
|
-
};
|
|
759
|
-
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
760
|
-
const result = await identity_gateway_service_js_1.IdentityGatewayService.getIdentityWithCachingV2(pixelId, incomingIdentity, lambdaArn);
|
|
761
|
-
expect(result.summary.outcome).toBe(types_js_1.IDENTITY_CACHE_WITH_CACHING_OUTCOME.ADDRESS_UPDATE_ASYNC);
|
|
762
|
-
expect(result.summary.didSkipNeptune).toBe(true);
|
|
763
|
-
expect(result.summary.didWriteCache).toBe(false);
|
|
764
|
-
expect(result.summary.didEnqueueAsync).toBe(true);
|
|
765
|
-
});
|
|
766
600
|
it('should return NEPTUNE_WRITE_BACK outcome with traitChanges for stale traits', async () => {
|
|
767
601
|
const incomingIdentity = {
|
|
768
602
|
identityId: 'identity456',
|
|
@@ -783,107 +617,16 @@ describe('Identity Cache Logging Levels', () => {
|
|
|
783
617
|
updatedAt: new Date().toISOString(),
|
|
784
618
|
};
|
|
785
619
|
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
786
|
-
|
|
787
|
-
statusCode: 200,
|
|
788
|
-
body: JSON.stringify({
|
|
789
|
-
identity: {
|
|
790
|
-
identityId: 'identity456',
|
|
791
|
-
traits: { emails: ['old@email.com', 'new@email.com'] },
|
|
792
|
-
},
|
|
793
|
-
}),
|
|
794
|
-
});
|
|
795
|
-
const result = await identity_gateway_service_js_1.IdentityGatewayService.getIdentityWithCachingV2(pixelId, incomingIdentity, lambdaArn);
|
|
796
|
-
expect(result.summary.outcome).toBe(types_js_1.IDENTITY_CACHE_WITH_CACHING_OUTCOME.NEPTUNE_RESOLVED);
|
|
797
|
-
expect(result.summary.staleTraits).toContain('emails');
|
|
798
|
-
expect(result.summary.traitChanges).toBeDefined();
|
|
799
|
-
expect(result.summary.didCallNeptune).toBe(true);
|
|
800
|
-
expect(result.summary.didWriteCache).toBe(false);
|
|
801
|
-
});
|
|
802
|
-
});
|
|
803
|
-
describe('getIdentityFromCache staleness tier results', () => {
|
|
804
|
-
const pixelId = 'pixel123';
|
|
805
|
-
beforeEach(() => {
|
|
806
|
-
jest.clearAllMocks();
|
|
807
|
-
mockedDynamoDbClient.safeGet.mockReset();
|
|
808
|
-
});
|
|
809
|
-
it('should return staleTier NONE when cached and incoming are deep equal', async () => {
|
|
810
|
-
const incomingIdentity = {
|
|
811
|
-
identityId: 'identity456',
|
|
812
|
-
traits: {
|
|
813
|
-
emails: ['test@email.com'],
|
|
814
|
-
},
|
|
815
|
-
};
|
|
816
|
-
const cachedResponse = {
|
|
817
|
-
pk: `identity#${pixelId}#identity456`,
|
|
818
|
-
pixelId,
|
|
819
|
-
identityId: 'identity456',
|
|
820
|
-
response: {
|
|
821
|
-
identityId: 'identity456',
|
|
822
|
-
traits: {
|
|
823
|
-
emails: ['test@email.com'],
|
|
824
|
-
},
|
|
825
|
-
},
|
|
826
|
-
updatedAt: new Date().toISOString(),
|
|
827
|
-
};
|
|
828
|
-
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
829
|
-
const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCache(pixelId, incomingIdentity);
|
|
830
|
-
expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
|
|
831
|
-
expect(result.isCacheStale).toBe(false);
|
|
832
|
-
expect(result.skipNeptune).toBeUndefined();
|
|
833
|
-
});
|
|
834
|
-
it('should return staleTier ADDRESS_UPDATE and skipNeptune=true for new non-IP address', async () => {
|
|
835
|
-
const incomingIdentity = {
|
|
836
|
-
identityId: 'identity456',
|
|
837
|
-
traits: {
|
|
838
|
-
emails: ['test@email.com'],
|
|
839
|
-
addresses: [{ city: 'New City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
|
|
840
|
-
},
|
|
841
|
-
};
|
|
842
|
-
const cachedResponse = {
|
|
843
|
-
pk: `identity#${pixelId}#identity456`,
|
|
844
|
-
pixelId,
|
|
845
|
-
identityId: 'identity456',
|
|
846
|
-
response: {
|
|
847
|
-
identityId: 'identity456',
|
|
848
|
-
traits: {
|
|
849
|
-
emails: ['test@email.com'],
|
|
850
|
-
addresses: [],
|
|
851
|
-
},
|
|
852
|
-
},
|
|
853
|
-
updatedAt: new Date().toISOString(),
|
|
854
|
-
};
|
|
855
|
-
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
856
|
-
const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCache(pixelId, incomingIdentity);
|
|
857
|
-
expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
|
|
858
|
-
expect(result.isCacheStale).toBe(true);
|
|
859
|
-
expect(result.skipNeptune).toBe(true);
|
|
860
|
-
expect(result.writeReason).toBe(identity_cache_dynamodb_service_1.CACHE_WRITE_REASON.ADDRESS_UPDATE);
|
|
861
|
-
});
|
|
862
|
-
it('should return staleTier IDENTITY_STALE and skipNeptune=false for new email', async () => {
|
|
863
|
-
const incomingIdentity = {
|
|
620
|
+
mockGetIdentity.mockResolvedValueOnce({
|
|
864
621
|
identityId: 'identity456',
|
|
865
|
-
traits: {
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
response: {
|
|
874
|
-
identityId: 'identity456',
|
|
875
|
-
traits: {
|
|
876
|
-
emails: ['old@email.com'],
|
|
877
|
-
},
|
|
878
|
-
},
|
|
879
|
-
updatedAt: new Date().toISOString(),
|
|
880
|
-
};
|
|
881
|
-
mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedResponse);
|
|
882
|
-
const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCache(pixelId, incomingIdentity);
|
|
883
|
-
expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
|
|
884
|
-
expect(result.isCacheStale).toBe(true);
|
|
885
|
-
expect(result.skipNeptune).toBe(false);
|
|
886
|
-
expect(result.writeReason).toBe(identity_cache_dynamodb_service_1.CACHE_WRITE_REASON.STALE_TRAITS);
|
|
622
|
+
traits: { emails: ['old@email.com', 'new@email.com'] },
|
|
623
|
+
});
|
|
624
|
+
const result = await service.resolveIdentityWithCaching(pixelId, incomingIdentity);
|
|
625
|
+
expect(result.outcome).toBe(types_js_1.IDENTITY_CACHE_WITH_CACHING_OUTCOME.NEPTUNE_RESOLVED);
|
|
626
|
+
expect(result.stalenessResult?.staleTraits).toContain('emails');
|
|
627
|
+
expect(result.traitChanges).toBeDefined();
|
|
628
|
+
expect(result.didCallNeptune).toBe(true);
|
|
629
|
+
expect(result.didWriteCache).toBe(false);
|
|
887
630
|
});
|
|
888
631
|
});
|
|
889
632
|
//# sourceMappingURL=identity-cache-tier-routing.spec.js.map
|