@adtrackify/at-service-common 3.19.17 → 3.19.18

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 (41) hide show
  1. package/dist/cjs/__tests__/clients/dynamodb-client.spec.js +161 -121
  2. package/dist/cjs/__tests__/clients/dynamodb-client.spec.js.map +1 -1
  3. package/dist/cjs/__tests__/db/destinations-db-service.spec.d.ts +1 -0
  4. package/dist/cjs/__tests__/db/destinations-db-service.spec.js +126 -0
  5. package/dist/cjs/__tests__/db/destinations-db-service.spec.js.map +1 -0
  6. package/dist/cjs/__tests__/db/shopify-app-installs-db-service.spec.d.ts +1 -0
  7. package/dist/cjs/__tests__/db/shopify-app-installs-db-service.spec.js +105 -0
  8. package/dist/cjs/__tests__/db/shopify-app-installs-db-service.spec.js.map +1 -0
  9. package/dist/cjs/__tests__/db/subscriptions-db-service.spec.d.ts +1 -0
  10. package/dist/cjs/__tests__/db/subscriptions-db-service.spec.js +96 -0
  11. package/dist/cjs/__tests__/db/subscriptions-db-service.spec.js.map +1 -0
  12. package/dist/cjs/__tests__/db/user-accounts-db-service.spec.d.ts +1 -0
  13. package/dist/cjs/__tests__/db/user-accounts-db-service.spec.js +77 -0
  14. package/dist/cjs/__tests__/db/user-accounts-db-service.spec.js.map +1 -0
  15. package/dist/cjs/clients/generic/dynamodb-client.js +10 -16
  16. package/dist/cjs/clients/generic/dynamodb-client.js.map +1 -1
  17. package/dist/cjs/services/db/destinations-db-service.js +2 -8
  18. package/dist/cjs/services/db/destinations-db-service.js.map +1 -1
  19. package/dist/cjs/services/db/shopify-app-installs-db-service.js +4 -10
  20. package/dist/cjs/services/db/shopify-app-installs-db-service.js.map +1 -1
  21. package/dist/esm/__tests__/clients/dynamodb-client.spec.js +161 -121
  22. package/dist/esm/__tests__/clients/dynamodb-client.spec.js.map +1 -1
  23. package/dist/esm/__tests__/db/destinations-db-service.spec.d.ts +1 -0
  24. package/dist/esm/__tests__/db/destinations-db-service.spec.js +124 -0
  25. package/dist/esm/__tests__/db/destinations-db-service.spec.js.map +1 -0
  26. package/dist/esm/__tests__/db/shopify-app-installs-db-service.spec.d.ts +1 -0
  27. package/dist/esm/__tests__/db/shopify-app-installs-db-service.spec.js +103 -0
  28. package/dist/esm/__tests__/db/shopify-app-installs-db-service.spec.js.map +1 -0
  29. package/dist/esm/__tests__/db/subscriptions-db-service.spec.d.ts +1 -0
  30. package/dist/esm/__tests__/db/subscriptions-db-service.spec.js +94 -0
  31. package/dist/esm/__tests__/db/subscriptions-db-service.spec.js.map +1 -0
  32. package/dist/esm/__tests__/db/user-accounts-db-service.spec.d.ts +1 -0
  33. package/dist/esm/__tests__/db/user-accounts-db-service.spec.js +75 -0
  34. package/dist/esm/__tests__/db/user-accounts-db-service.spec.js.map +1 -0
  35. package/dist/esm/clients/generic/dynamodb-client.js +10 -16
  36. package/dist/esm/clients/generic/dynamodb-client.js.map +1 -1
  37. package/dist/esm/services/db/destinations-db-service.js +2 -8
  38. package/dist/esm/services/db/destinations-db-service.js.map +1 -1
  39. package/dist/esm/services/db/shopify-app-installs-db-service.js +4 -10
  40. package/dist/esm/services/db/shopify-app-installs-db-service.js.map +1 -1
  41. package/package.json +1 -1
@@ -1,152 +1,192 @@
1
- import { DynamoDbClient } from '../../clients/generic/dynamodb-client.js';
2
- jest.mock('@aws-sdk/lib-dynamodb', () => {
3
- const mockBatchGet = jest.fn();
4
- const mockBatchWrite = jest.fn();
5
- return {
6
- DynamoDBDocument: {
7
- from: () => ({
8
- batchGet: mockBatchGet,
9
- batchWrite: mockBatchWrite,
10
- get: jest.fn(),
11
- put: jest.fn(),
12
- delete: jest.fn(),
13
- query: jest.fn(),
14
- scan: jest.fn(),
15
- update: jest.fn(),
16
- }),
17
- },
18
- __mockBatchGet: mockBatchGet,
19
- __mockBatchWrite: mockBatchWrite,
20
- };
21
- });
22
- jest.mock('../../helpers/index.js', () => ({
1
+ import { DynamoDbClient } from '../../clients/generic/dynamodb-client';
2
+ jest.mock('@aws-sdk/client-dynamodb', () => ({
3
+ DynamoDBClient: jest.fn().mockImplementation(() => ({})),
4
+ QueryOutput: {},
5
+ }));
6
+ jest.mock('@aws-sdk/lib-dynamodb', () => ({
7
+ DynamoDBDocument: {
8
+ from: jest.fn().mockReturnValue({
9
+ get: jest.fn(),
10
+ put: jest.fn(),
11
+ query: jest.fn(),
12
+ batchGet: jest.fn(),
13
+ batchWrite: jest.fn(),
14
+ }),
15
+ },
16
+ }));
17
+ jest.mock('../../helpers/logging-helper.js', () => ({
23
18
  Logger: {
24
- debug: jest.fn(),
25
19
  info: jest.fn(),
26
20
  warn: jest.fn(),
27
21
  error: jest.fn(),
22
+ debug: jest.fn(),
28
23
  },
29
24
  }));
30
- const { __mockBatchGet, __mockBatchWrite } = jest.requireMock('@aws-sdk/lib-dynamodb');
25
+ jest.mock('@adtrackify/at-shared-utils', () => ({
26
+ chunkArray: jest.fn((arr, size) => {
27
+ const chunks = [];
28
+ for (let i = 0; i < arr.length; i += size) {
29
+ chunks.push(arr.slice(i, i + size));
30
+ }
31
+ return chunks;
32
+ }),
33
+ }));
31
34
  describe('DynamoDbClient', () => {
32
35
  beforeEach(() => {
33
36
  jest.clearAllMocks();
34
37
  });
38
+ afterEach(() => {
39
+ jest.restoreAllMocks();
40
+ });
41
+ describe('safeQueryByGSI', () => {
42
+ it('returns results on successful query', async () => {
43
+ const mockResults = [{ id: '1' }, { id: '2' }];
44
+ jest.spyOn(DynamoDbClient, 'queryAll').mockResolvedValueOnce(mockResults);
45
+ const result = await DynamoDbClient.safeQueryByGSI('test-table', 'gsi-name', 'accountId', 'acc-123');
46
+ expect(result).toEqual(mockResults);
47
+ expect(DynamoDbClient.queryAll).toHaveBeenCalledWith({
48
+ TableName: 'test-table',
49
+ IndexName: 'gsi-name',
50
+ KeyConditionExpression: 'accountId = :value',
51
+ ExpressionAttributeValues: { ':value': 'acc-123' },
52
+ });
53
+ });
54
+ it('returns null when query throws error', async () => {
55
+ jest.spyOn(DynamoDbClient, 'queryAll').mockRejectedValueOnce(new Error('DynamoDB error'));
56
+ const result = await DynamoDbClient.safeQueryByGSI('test-table', 'gsi-name', 'accountId', 'acc-123');
57
+ expect(result).toBeNull();
58
+ });
59
+ });
60
+ describe('safeBatchQueryByGSI', () => {
61
+ it('returns empty array for empty input', async () => {
62
+ const result = await DynamoDbClient.safeBatchQueryByGSI('test-table', 'gsi-name', 'accountId', []);
63
+ expect(result).toEqual([]);
64
+ });
65
+ it('returns results for single value', async () => {
66
+ const mockResults = [{ id: '1', accountId: 'acc-1' }];
67
+ jest.spyOn(DynamoDbClient, 'safeQueryByGSI').mockResolvedValueOnce(mockResults);
68
+ const result = await DynamoDbClient.safeBatchQueryByGSI('test-table', 'gsi-name', 'accountId', ['acc-1']);
69
+ expect(result).toEqual(mockResults);
70
+ expect(DynamoDbClient.safeQueryByGSI).toHaveBeenCalledTimes(1);
71
+ expect(DynamoDbClient.safeQueryByGSI).toHaveBeenCalledWith('test-table', 'gsi-name', 'accountId', 'acc-1');
72
+ });
73
+ it('returns combined results for multiple values', async () => {
74
+ const results1 = [{ id: '1', accountId: 'acc-1' }];
75
+ const results2 = [{ id: '2', accountId: 'acc-2' }, { id: '3', accountId: 'acc-2' }];
76
+ jest.spyOn(DynamoDbClient, 'safeQueryByGSI')
77
+ .mockResolvedValueOnce(results1)
78
+ .mockResolvedValueOnce(results2);
79
+ const result = await DynamoDbClient.safeBatchQueryByGSI('test-table', 'gsi-name', 'accountId', ['acc-1', 'acc-2']);
80
+ expect(result).toEqual([...results1, ...results2]);
81
+ expect(DynamoDbClient.safeQueryByGSI).toHaveBeenCalledTimes(2);
82
+ });
83
+ it('deduplicates input values', async () => {
84
+ const mockResults = [{ id: '1', accountId: 'acc-1' }];
85
+ jest.spyOn(DynamoDbClient, 'safeQueryByGSI').mockResolvedValue(mockResults);
86
+ await DynamoDbClient.safeBatchQueryByGSI('test-table', 'gsi-name', 'accountId', ['acc-1', 'acc-1', 'acc-1']);
87
+ expect(DynamoDbClient.safeQueryByGSI).toHaveBeenCalledTimes(1);
88
+ });
89
+ it('handles null results from inner calls gracefully', async () => {
90
+ const results1 = [{ id: '1', accountId: 'acc-1' }];
91
+ jest.spyOn(DynamoDbClient, 'safeQueryByGSI')
92
+ .mockResolvedValueOnce(results1)
93
+ .mockResolvedValueOnce(null);
94
+ const result = await DynamoDbClient.safeBatchQueryByGSI('test-table', 'gsi-name', 'accountId', ['acc-1', 'acc-2']);
95
+ expect(result).toEqual(results1);
96
+ });
97
+ it('respects concurrency parameter by chunking queries', async () => {
98
+ const mockResults = [{ id: '1' }];
99
+ jest.spyOn(DynamoDbClient, 'safeQueryByGSI').mockResolvedValue(mockResults);
100
+ const values = Array.from({ length: 15 }, (_, i) => `acc-${i}`);
101
+ await DynamoDbClient.safeBatchQueryByGSI('test-table', 'gsi-name', 'accountId', values, 5);
102
+ expect(DynamoDbClient.safeQueryByGSI).toHaveBeenCalledTimes(15);
103
+ });
104
+ it('handles all queries returning null gracefully', async () => {
105
+ jest.spyOn(DynamoDbClient, 'safeQueryByGSI')
106
+ .mockResolvedValueOnce(null)
107
+ .mockResolvedValueOnce(null);
108
+ const result = await DynamoDbClient.safeBatchQueryByGSI('test-table', 'gsi-name', 'accountId', ['acc-1', 'acc-2']);
109
+ expect(result).toEqual([]);
110
+ });
111
+ });
35
112
  describe('safeBatchGet', () => {
36
- const tableName = 'test-table';
37
- it('should return empty array for empty keys', async () => {
38
- const result = await DynamoDbClient.safeBatchGet(tableName, []);
113
+ let mockBatchGet;
114
+ beforeEach(() => {
115
+ const { DynamoDBDocument } = require('@aws-sdk/lib-dynamodb');
116
+ mockBatchGet = DynamoDBDocument.from().batchGet;
117
+ });
118
+ it('returns empty array for empty keys', async () => {
119
+ const result = await DynamoDbClient.safeBatchGet('test-table', []);
39
120
  expect(result).toEqual([]);
40
- expect(__mockBatchGet).not.toHaveBeenCalled();
41
- });
42
- it('should return items from DynamoDB response', async () => {
43
- const mockItems = [
44
- { pk: 'key1', data: 'value1' },
45
- { pk: 'key2', data: 'value2' },
46
- ];
47
- __mockBatchGet.mockResolvedValueOnce({
48
- Responses: { [tableName]: mockItems },
121
+ expect(mockBatchGet).not.toHaveBeenCalled();
122
+ });
123
+ it('returns results for successful batch get', async () => {
124
+ const mockItems = [{ id: '1' }, { id: '2' }];
125
+ mockBatchGet.mockResolvedValueOnce({
126
+ Responses: { 'test-table': mockItems },
49
127
  });
50
- const keys = [{ pk: 'key1' }, { pk: 'key2' }];
51
- const result = await DynamoDbClient.safeBatchGet(tableName, keys);
128
+ const result = await DynamoDbClient.safeBatchGet('test-table', [{ id: '1' }, { id: '2' }]);
52
129
  expect(result).toEqual(mockItems);
53
- expect(__mockBatchGet).toHaveBeenCalledTimes(1);
54
- expect(__mockBatchGet).toHaveBeenCalledWith({
55
- RequestItems: { [tableName]: { Keys: keys } },
56
- });
57
130
  });
58
- it('should return empty array on error (fail-open behavior)', async () => {
59
- __mockBatchGet.mockRejectedValueOnce(new Error('DynamoDB error'));
60
- const keys = [{ pk: 'key1' }];
61
- const result = await DynamoDbClient.safeBatchGet(tableName, keys);
62
- expect(result).toEqual([]);
63
- });
64
- it('should handle partial results with UnprocessedKeys (fail-open)', async () => {
65
- const mockItems = [{ pk: 'key1', data: 'value1' }];
66
- __mockBatchGet.mockResolvedValueOnce({
67
- Responses: { [tableName]: mockItems },
68
- UnprocessedKeys: { [tableName]: { Keys: [{ pk: 'key2' }] } },
131
+ it('handles unprocessed keys without retry (fail-open)', async () => {
132
+ const mockItems = [{ id: '1' }];
133
+ mockBatchGet.mockResolvedValueOnce({
134
+ Responses: { 'test-table': mockItems },
135
+ UnprocessedKeys: { 'test-table': { Keys: [{ id: '2' }] } },
69
136
  });
70
- const keys = [{ pk: 'key1' }, { pk: 'key2' }];
71
- const result = await DynamoDbClient.safeBatchGet(tableName, keys);
137
+ const result = await DynamoDbClient.safeBatchGet('test-table', [{ id: '1' }, { id: '2' }]);
72
138
  expect(result).toEqual(mockItems);
73
- expect(__mockBatchGet).toHaveBeenCalledTimes(1);
74
- });
75
- it('should chunk keys into batches of 100', async () => {
76
- const mockItems1 = Array.from({ length: 100 }, (_, i) => ({ pk: `key${i}`, data: `value${i}` }));
77
- const mockItems2 = Array.from({ length: 50 }, (_, i) => ({ pk: `key${100 + i}`, data: `value${100 + i}` }));
78
- __mockBatchGet
79
- .mockResolvedValueOnce({ Responses: { [tableName]: mockItems1 } })
80
- .mockResolvedValueOnce({ Responses: { [tableName]: mockItems2 } });
81
- const keys = Array.from({ length: 150 }, (_, i) => ({ pk: `key${i}` }));
82
- const result = await DynamoDbClient.safeBatchGet(tableName, keys);
83
- expect(result).toHaveLength(150);
84
- expect(__mockBatchGet).toHaveBeenCalledTimes(2);
139
+ expect(mockBatchGet).toHaveBeenCalledTimes(1);
85
140
  });
86
- it('should handle missing Responses gracefully', async () => {
87
- __mockBatchGet.mockResolvedValueOnce({});
88
- const keys = [{ pk: 'key1' }];
89
- const result = await DynamoDbClient.safeBatchGet(tableName, keys);
141
+ it('returns empty array on error (fail-open)', async () => {
142
+ mockBatchGet.mockRejectedValueOnce(new Error('DynamoDB error'));
143
+ const result = await DynamoDbClient.safeBatchGet('test-table', [{ id: '1' }]);
90
144
  expect(result).toEqual([]);
91
145
  });
92
- it('should continue processing other chunks if one fails', async () => {
93
- const mockItems = [{ pk: 'key100', data: 'value100' }];
94
- __mockBatchGet
95
- .mockRejectedValueOnce(new Error('First chunk failed'))
96
- .mockResolvedValueOnce({ Responses: { [tableName]: mockItems } });
97
- const keys = Array.from({ length: 150 }, (_, i) => ({ pk: `key${i}` }));
98
- const result = await DynamoDbClient.safeBatchGet(tableName, keys);
99
- expect(result).toEqual(mockItems);
100
- expect(__mockBatchGet).toHaveBeenCalledTimes(2);
146
+ it('handles >100 keys by chunking', async () => {
147
+ const keys = Array.from({ length: 150 }, (_, i) => ({ id: `${i}` }));
148
+ const chunk1Items = Array.from({ length: 100 }, (_, i) => ({ id: `${i}` }));
149
+ const chunk2Items = Array.from({ length: 50 }, (_, i) => ({ id: `${100 + i}` }));
150
+ mockBatchGet
151
+ .mockResolvedValueOnce({ Responses: { 'test-table': chunk1Items } })
152
+ .mockResolvedValueOnce({ Responses: { 'test-table': chunk2Items } });
153
+ const result = await DynamoDbClient.safeBatchGet('test-table', keys);
154
+ expect(mockBatchGet).toHaveBeenCalledTimes(2);
155
+ expect(result).toHaveLength(150);
101
156
  });
102
157
  });
103
158
  describe('safeBatchWrite', () => {
104
- const tableName = 'test-table';
105
- it('should return early for empty items', async () => {
106
- await DynamoDbClient.safeBatchWrite(tableName, []);
107
- expect(__mockBatchWrite).not.toHaveBeenCalled();
108
- });
109
- it('should write items to DynamoDB', async () => {
110
- __mockBatchWrite.mockResolvedValueOnce({});
111
- const items = [
112
- { pk: 'key1', data: 'value1' },
113
- { pk: 'key2', data: 'value2' },
114
- ];
115
- await DynamoDbClient.safeBatchWrite(tableName, items);
116
- expect(__mockBatchWrite).toHaveBeenCalledTimes(1);
117
- expect(__mockBatchWrite).toHaveBeenCalledWith({
159
+ let mockBatchWrite;
160
+ beforeEach(() => {
161
+ const { DynamoDBDocument } = require('@aws-sdk/lib-dynamodb');
162
+ mockBatchWrite = DynamoDBDocument.from().batchWrite;
163
+ });
164
+ it('does nothing for empty items', async () => {
165
+ await DynamoDbClient.safeBatchWrite('test-table', []);
166
+ expect(mockBatchWrite).not.toHaveBeenCalled();
167
+ });
168
+ it('writes items successfully', async () => {
169
+ mockBatchWrite.mockResolvedValueOnce({});
170
+ await DynamoDbClient.safeBatchWrite('test-table', [{ id: '1' }, { id: '2' }]);
171
+ expect(mockBatchWrite).toHaveBeenCalledTimes(1);
172
+ expect(mockBatchWrite).toHaveBeenCalledWith({
118
173
  RequestItems: {
119
- [tableName]: [{ PutRequest: { Item: items[0] } }, { PutRequest: { Item: items[1] } }],
174
+ 'test-table': [
175
+ { PutRequest: { Item: { id: '1' } } },
176
+ { PutRequest: { Item: { id: '2' } } },
177
+ ],
120
178
  },
121
179
  });
122
180
  });
123
- it('should not throw on error (fail-open behavior)', async () => {
124
- __mockBatchWrite.mockRejectedValueOnce(new Error('DynamoDB error'));
125
- const items = [{ pk: 'key1', data: 'value1' }];
126
- await expect(DynamoDbClient.safeBatchWrite(tableName, items)).resolves.toBeUndefined();
181
+ it('handles >25 items by chunking', async () => {
182
+ const items = Array.from({ length: 30 }, (_, i) => ({ id: `${i}` }));
183
+ mockBatchWrite.mockResolvedValue({});
184
+ await DynamoDbClient.safeBatchWrite('test-table', items);
185
+ expect(mockBatchWrite).toHaveBeenCalledTimes(2);
127
186
  });
128
- it('should handle partial writes with UnprocessedItems (no retry)', async () => {
129
- __mockBatchWrite.mockResolvedValueOnce({
130
- UnprocessedItems: { [tableName]: [{ PutRequest: { Item: { pk: 'key2' } } }] },
131
- });
132
- const items = [
133
- { pk: 'key1', data: 'value1' },
134
- { pk: 'key2', data: 'value2' },
135
- ];
136
- await DynamoDbClient.safeBatchWrite(tableName, items);
137
- expect(__mockBatchWrite).toHaveBeenCalledTimes(1);
138
- });
139
- it('should chunk items into batches of 25', async () => {
140
- __mockBatchWrite.mockResolvedValue({});
141
- const items = Array.from({ length: 60 }, (_, i) => ({ pk: `key${i}`, data: `value${i}` }));
142
- await DynamoDbClient.safeBatchWrite(tableName, items);
143
- expect(__mockBatchWrite).toHaveBeenCalledTimes(3);
144
- });
145
- it('should continue processing other chunks if one fails', async () => {
146
- __mockBatchWrite.mockRejectedValueOnce(new Error('First chunk failed')).mockResolvedValueOnce({});
147
- const items = Array.from({ length: 30 }, (_, i) => ({ pk: `key${i}`, data: `value${i}` }));
148
- await DynamoDbClient.safeBatchWrite(tableName, items);
149
- expect(__mockBatchWrite).toHaveBeenCalledTimes(2);
187
+ it('swallows errors (fail-open)', async () => {
188
+ mockBatchWrite.mockRejectedValueOnce(new Error('DynamoDB error'));
189
+ await expect(DynamoDbClient.safeBatchWrite('test-table', [{ id: '1' }])).resolves.toBeUndefined();
150
190
  });
151
191
  });
152
192
  });
@@ -1 +1 @@
1
- {"version":3,"file":"dynamodb-client.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/clients/dynamodb-client.spec.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE1E,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAEjC,OAAO;QACL,gBAAgB,EAAE;YAChB,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACX,QAAQ,EAAE,YAAY;gBACtB,UAAU,EAAE,cAAc;gBAC1B,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;gBACd,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;gBACd,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;gBACjB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;gBAChB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;gBACf,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;aAClB,CAAC;SACH;QACD,cAAc,EAAE,YAAY;QAC5B,gBAAgB,EAAE,cAAc;KACjC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE;QACN,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;KACjB;CACF,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;AAEvF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,MAAM,SAAS,GAAG,YAAY,CAAC;QAE/B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3B,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,SAAS,GAAG;gBAChB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9B,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC/B,CAAC;YAEF,cAAc,CAAC,qBAAqB,CAAC;gBACnC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE;aACtC,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAElE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC;gBAC1C,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;aAC9C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,cAAc,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAElE,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAElE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,SAAS,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEnD,cAAc,CAAC,qBAAqB,CAAC;gBACnC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE;gBACrC,eAAe,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;aAC7D,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAGlE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACjG,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAE5G,cAAc;iBACX,qBAAqB,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC;iBACjE,qBAAqB,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YAErE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAElE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,cAAc,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAEzC,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAElE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,SAAS,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAEvD,cAAc;iBACX,qBAAqB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;iBACtD,qBAAqB,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAEpE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAGlE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,MAAM,SAAS,GAAG,YAAY,CAAC;QAE/B,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAEnD,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,gBAAgB,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAE3C,MAAM,KAAK,GAAG;gBACZ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9B,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC/B,CAAC;YACF,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEtD,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC;gBAC5C,YAAY,EAAE;oBACZ,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;iBACtF;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,gBAAgB,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAEpE,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAG/C,MAAM,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,gBAAgB,CAAC,qBAAqB,CAAC;gBACrC,gBAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE;aAC9E,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG;gBACZ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC9B,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC/B,CAAC;YACF,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAGtD,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAEvC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3F,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAGtD,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,gBAAgB,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAElG,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3F,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAGtD,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"dynamodb-client.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/clients/dynamodb-client.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ jest.mock('../../clients/index.js', () => ({
2
+ DynamoDbClient: {
3
+ safeGet: jest.fn(),
4
+ queryAll: jest.fn(),
5
+ safeBatchGet: jest.fn(),
6
+ safeBatchQueryByGSI: jest.fn(),
7
+ },
8
+ }));
9
+ import { DynamoDbClient } from '../../clients/index.js';
10
+ import { DestinationsDbService } from '../../services/db/destinations-db-service.js';
11
+ const mockSafeBatchGet = DynamoDbClient.safeBatchGet;
12
+ const mockSafeBatchQueryByGSI = DynamoDbClient.safeBatchQueryByGSI;
13
+ const mockQueryAll = DynamoDbClient.queryAll;
14
+ const mockSafeGet = DynamoDbClient.safeGet;
15
+ describe('DestinationsDbService', () => {
16
+ const TABLE_NAME = 'test-destinations-table';
17
+ const service = new DestinationsDbService(TABLE_NAME);
18
+ beforeEach(() => {
19
+ jest.clearAllMocks();
20
+ });
21
+ afterEach(() => {
22
+ jest.restoreAllMocks();
23
+ });
24
+ describe('batchGetByPixelIds', () => {
25
+ const INDEX_NAME = 'GSI_PIXEL_ID';
26
+ it('returns empty array for empty pixelIds input', async () => {
27
+ mockSafeBatchQueryByGSI.mockResolvedValueOnce([]);
28
+ const result = await service.batchGetByPixelIds(INDEX_NAME, []);
29
+ expect(result).toEqual([]);
30
+ expect(mockSafeBatchQueryByGSI).toHaveBeenCalledWith(TABLE_NAME, INDEX_NAME, 'pixelId', [], 10);
31
+ });
32
+ it('returns destinations for single pixelId', async () => {
33
+ const mockDestination = {
34
+ id: 'dest-1',
35
+ pixelId: 'px-1',
36
+ destination: 'facebook',
37
+ destinationType: 'marketing',
38
+ };
39
+ mockSafeBatchQueryByGSI.mockResolvedValueOnce([mockDestination]);
40
+ const result = await service.batchGetByPixelIds(INDEX_NAME, ['px-1']);
41
+ expect(result).toEqual([mockDestination]);
42
+ expect(mockSafeBatchQueryByGSI).toHaveBeenCalledWith(TABLE_NAME, INDEX_NAME, 'pixelId', ['px-1'], 10);
43
+ });
44
+ it('returns destinations for multiple pixelIds', async () => {
45
+ const mockDestinations = [
46
+ { id: 'dest-1', pixelId: 'px-1', destination: 'facebook' },
47
+ { id: 'dest-2', pixelId: 'px-1', destination: 'tiktok' },
48
+ { id: 'dest-3', pixelId: 'px-2', destination: 'klaviyo' },
49
+ ];
50
+ mockSafeBatchQueryByGSI.mockResolvedValueOnce(mockDestinations);
51
+ const result = await service.batchGetByPixelIds(INDEX_NAME, ['px-1', 'px-2']);
52
+ expect(result).toEqual(mockDestinations);
53
+ expect(mockSafeBatchQueryByGSI).toHaveBeenCalledWith(TABLE_NAME, INDEX_NAME, 'pixelId', ['px-1', 'px-2'], 10);
54
+ });
55
+ it('uses custom concurrency parameter', async () => {
56
+ mockSafeBatchQueryByGSI.mockResolvedValueOnce([]);
57
+ await service.batchGetByPixelIds(INDEX_NAME, ['px-1'], 5);
58
+ expect(mockSafeBatchQueryByGSI).toHaveBeenCalledWith(TABLE_NAME, INDEX_NAME, 'pixelId', ['px-1'], 5);
59
+ });
60
+ it('calls safeBatchQueryByGSI with correct table name from constructor', async () => {
61
+ const customService = new DestinationsDbService('custom-table');
62
+ mockSafeBatchQueryByGSI.mockResolvedValueOnce([]);
63
+ await customService.batchGetByPixelIds(INDEX_NAME, ['px-1']);
64
+ expect(mockSafeBatchQueryByGSI).toHaveBeenCalledWith('custom-table', INDEX_NAME, 'pixelId', ['px-1'], 10);
65
+ });
66
+ });
67
+ describe('batchGetDestinationsById', () => {
68
+ it('returns empty array for empty ids input', async () => {
69
+ mockSafeBatchGet.mockResolvedValueOnce([]);
70
+ const result = await service.batchGetDestinationsById([]);
71
+ expect(result).toEqual([]);
72
+ expect(mockSafeBatchGet).toHaveBeenCalledWith(TABLE_NAME, []);
73
+ });
74
+ it('returns destinations for multiple ids', async () => {
75
+ const mockDestinations = [
76
+ { id: 'dest-1', destination: 'facebook' },
77
+ { id: 'dest-2', destination: 'tiktok' },
78
+ ];
79
+ mockSafeBatchGet.mockResolvedValueOnce(mockDestinations);
80
+ const result = await service.batchGetDestinationsById(['dest-1', 'dest-2']);
81
+ expect(result).toEqual(mockDestinations);
82
+ expect(mockSafeBatchGet).toHaveBeenCalledWith(TABLE_NAME, [
83
+ { id: 'dest-1' },
84
+ { id: 'dest-2' },
85
+ ]);
86
+ });
87
+ it('returns empty array when safeBatchGet returns null', async () => {
88
+ mockSafeBatchGet.mockResolvedValueOnce(null);
89
+ const result = await service.batchGetDestinationsById(['dest-1']);
90
+ expect(result).toEqual([]);
91
+ });
92
+ });
93
+ describe('getDestinationById', () => {
94
+ it('returns destination when found', async () => {
95
+ const mockDestination = { id: 'dest-1', destination: 'facebook' };
96
+ mockSafeGet.mockResolvedValueOnce(mockDestination);
97
+ const result = await service.getDestinationById('dest-1');
98
+ expect(result).toEqual(mockDestination);
99
+ expect(mockSafeGet).toHaveBeenCalledWith(TABLE_NAME, 'id', 'dest-1');
100
+ });
101
+ it('returns null when not found', async () => {
102
+ mockSafeGet.mockResolvedValueOnce(null);
103
+ const result = await service.getDestinationById('nonexistent');
104
+ expect(result).toBeNull();
105
+ });
106
+ });
107
+ describe('getDestinationsByPixel', () => {
108
+ it('returns destinations for pixelId', async () => {
109
+ const mockDestinations = [
110
+ { id: 'dest-1', pixelId: 'px-1' },
111
+ { id: 'dest-2', pixelId: 'px-1' },
112
+ ];
113
+ mockQueryAll.mockResolvedValueOnce(mockDestinations);
114
+ const result = await service.getDestinationsByPixel('GSI_PIXEL', 'px-1');
115
+ expect(result).toEqual(mockDestinations);
116
+ });
117
+ it('returns empty array when no destinations found', async () => {
118
+ mockQueryAll.mockResolvedValueOnce(null);
119
+ const result = await service.getDestinationsByPixel('GSI_PIXEL', 'px-1');
120
+ expect(result).toEqual([]);
121
+ });
122
+ });
123
+ });
124
+ //# sourceMappingURL=destinations-db-service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destinations-db-service.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/db/destinations-db-service.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ jest.mock('../../clients/generic/dynamodb-client.js', () => ({
2
+ DynamoDbClient: {
3
+ safeGet: jest.fn(),
4
+ safeQueryByGSI: jest.fn(),
5
+ safeBatchGet: jest.fn(),
6
+ queryAll: jest.fn(),
7
+ },
8
+ }));
9
+ jest.mock('../../helpers/index.js', () => ({
10
+ Logger: {
11
+ info: jest.fn(),
12
+ warn: jest.fn(),
13
+ error: jest.fn(),
14
+ debug: jest.fn(),
15
+ },
16
+ }));
17
+ import { DynamoDbClient } from '../../clients/generic/dynamodb-client.js';
18
+ import { ShopifyAppInstallsDbService } from '../../services/db/shopify-app-installs-db-service.js';
19
+ const mockSafeBatchGet = DynamoDbClient.safeBatchGet;
20
+ const mockSafeGet = DynamoDbClient.safeGet;
21
+ describe('ShopifyAppInstallsDbService', () => {
22
+ const TABLE_NAME = 'test-shopify-app-installs-table';
23
+ const TABLE_KEY = 'id';
24
+ const service = new ShopifyAppInstallsDbService(TABLE_NAME, TABLE_KEY);
25
+ beforeEach(() => {
26
+ jest.clearAllMocks();
27
+ });
28
+ afterEach(() => {
29
+ jest.restoreAllMocks();
30
+ });
31
+ describe('batchGetByIds', () => {
32
+ it('returns empty array for empty ids input', async () => {
33
+ mockSafeBatchGet.mockResolvedValueOnce([]);
34
+ const result = await service.batchGetByIds([]);
35
+ expect(result).toEqual([]);
36
+ expect(mockSafeBatchGet).toHaveBeenCalledWith(TABLE_NAME, []);
37
+ });
38
+ it('returns installs for single id', async () => {
39
+ const mockInstall = {
40
+ id: 'install-1',
41
+ shop: 'test-shop.myshopify.com',
42
+ pixelId: 'px-1',
43
+ };
44
+ mockSafeBatchGet.mockResolvedValueOnce([mockInstall]);
45
+ const result = await service.batchGetByIds(['install-1']);
46
+ expect(result).toEqual([mockInstall]);
47
+ expect(mockSafeBatchGet).toHaveBeenCalledWith(TABLE_NAME, [{ id: 'install-1' }]);
48
+ });
49
+ it('returns installs for multiple ids', async () => {
50
+ const mockInstalls = [
51
+ { id: 'install-1', shop: 'shop1.myshopify.com', pixelId: 'px-1' },
52
+ { id: 'install-2', shop: 'shop2.myshopify.com', pixelId: 'px-2' },
53
+ { id: 'install-3', shop: 'shop3.myshopify.com', pixelId: 'px-3' },
54
+ ];
55
+ mockSafeBatchGet.mockResolvedValueOnce(mockInstalls);
56
+ const result = await service.batchGetByIds(['install-1', 'install-2', 'install-3']);
57
+ expect(result).toEqual(mockInstalls);
58
+ expect(mockSafeBatchGet).toHaveBeenCalledWith(TABLE_NAME, [
59
+ { id: 'install-1' },
60
+ { id: 'install-2' },
61
+ { id: 'install-3' },
62
+ ]);
63
+ });
64
+ it('returns empty array when safeBatchGet returns null', async () => {
65
+ mockSafeBatchGet.mockResolvedValueOnce(null);
66
+ const result = await service.batchGetByIds(['install-1']);
67
+ expect(result).toEqual([]);
68
+ });
69
+ it('uses custom table key from constructor', async () => {
70
+ const customService = new ShopifyAppInstallsDbService(TABLE_NAME, 'customKey');
71
+ mockSafeBatchGet.mockResolvedValueOnce([]);
72
+ await customService.batchGetByIds(['install-1', 'install-2']);
73
+ expect(mockSafeBatchGet).toHaveBeenCalledWith(TABLE_NAME, [
74
+ { customKey: 'install-1' },
75
+ { customKey: 'install-2' },
76
+ ]);
77
+ });
78
+ it('uses default table key "id" when not specified', async () => {
79
+ const defaultKeyService = new ShopifyAppInstallsDbService('another-table');
80
+ mockSafeBatchGet.mockResolvedValueOnce([]);
81
+ await defaultKeyService.batchGetByIds(['install-1']);
82
+ expect(mockSafeBatchGet).toHaveBeenCalledWith('another-table', [{ id: 'install-1' }]);
83
+ });
84
+ });
85
+ describe('getShopifyAppInstallById', () => {
86
+ it('returns install when found', async () => {
87
+ const mockInstall = {
88
+ id: 'install-1',
89
+ shop: 'test-shop.myshopify.com',
90
+ };
91
+ mockSafeGet.mockResolvedValueOnce(mockInstall);
92
+ const result = await service.getShopifyAppInstallById('id', 'install-1');
93
+ expect(result).toEqual(mockInstall);
94
+ expect(mockSafeGet).toHaveBeenCalledWith(TABLE_NAME, 'id', 'install-1');
95
+ });
96
+ it('returns null when not found', async () => {
97
+ mockSafeGet.mockResolvedValueOnce(null);
98
+ const result = await service.getShopifyAppInstallById('id', 'nonexistent');
99
+ expect(result).toBeNull();
100
+ });
101
+ });
102
+ });
103
+ //# sourceMappingURL=shopify-app-installs-db-service.spec.js.map