@powersync/service-module-mongodb-storage 0.0.0-dev-20250730153301 → 0.0.0-dev-20250804094552

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/CHANGELOG.md CHANGED
@@ -1,11 +1,12 @@
1
1
  # @powersync/service-module-mongodb-storage
2
2
 
3
- ## 0.0.0-dev-20250730153301
3
+ ## 0.0.0-dev-20250804094552
4
4
 
5
5
  ### Minor Changes
6
6
 
7
7
  - d56eeb9: Delay switching over to new sync rules until we have a consistent checkpoint.
8
8
  - d4db4e2: MySQL:
9
+
9
10
  - Added schema change handling
10
11
  - Except for some edge cases, the following schema changes are now handled automatically:
11
12
  - Creation, renaming, dropping and truncation of tables.
@@ -29,11 +30,11 @@
29
30
  - Updated dependencies [d56eeb9]
30
31
  - Updated dependencies [a700ec9]
31
32
  - Updated dependencies [d4db4e2]
32
- - @powersync/service-core@0.0.0-dev-20250730153301
33
- - @powersync/service-types@0.0.0-dev-20250730153301
34
- - @powersync/lib-services-framework@0.0.0-dev-20250730153301
35
- - @powersync/service-sync-rules@0.0.0-dev-20250730153301
36
- - @powersync/lib-service-mongodb@0.0.0-dev-20250730153301
33
+ - @powersync/service-core@0.0.0-dev-20250804094552
34
+ - @powersync/service-types@0.0.0-dev-20250804094552
35
+ - @powersync/lib-services-framework@0.0.0-dev-20250804094552
36
+ - @powersync/service-sync-rules@0.0.0-dev-20250804094552
37
+ - @powersync/lib-service-mongodb@0.0.0-dev-20250804094552
37
38
 
38
39
  ## 0.10.4
39
40
 
@@ -48,6 +48,11 @@ export class MongoReportStorage {
48
48
  users: { $size: '$user_ids' },
49
49
  clients: { $size: '$client_ids' }
50
50
  }
51
+ },
52
+ {
53
+ $sort: {
54
+ sdk: 1
55
+ }
51
56
  }
52
57
  ]
53
58
  }
@@ -183,8 +188,12 @@ export class MongoReportStorage {
183
188
  });
184
189
  }
185
190
  async reportSdkDisconnect(data) {
186
- const updateFilter = this.updateDocFilter(data.user_id, data.client_id);
187
- await this.db.sdk_report_events.findOneAndUpdate(updateFilter, {
191
+ const { connect_at, user_id, client_id } = data;
192
+ await this.db.sdk_report_events.findOneAndUpdate({
193
+ client_id,
194
+ user_id,
195
+ connect_at
196
+ }, {
188
197
  $set: {
189
198
  disconnect_at: data.disconnect_at
190
199
  },
@@ -1 +1 @@
1
- {"version":3,"file":"MongoReportStorage.js","sourceRoot":"","sources":["../../src/storage/MongoReportStorage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MongoReportStorage.js","sourceRoot":"","sources":["../../src/storage/MongoReportStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { TestStorageOptions } from '@powersync/service-core';
2
+ import { MongoReportStorage } from '../MongoReportStorage.js';
3
+ export type MongoTestStorageOptions = {
4
+ url: string;
5
+ isCI: boolean;
6
+ };
7
+ export declare const MongoTestReportStorageFactoryGenerator: (factoryOptions: MongoTestStorageOptions) => (options?: TestStorageOptions) => Promise<MongoReportStorage>;
@@ -0,0 +1,13 @@
1
+ import { connectMongoForTests } from './util.js';
2
+ import { MongoReportStorage } from '../MongoReportStorage.js';
3
+ export const MongoTestReportStorageFactoryGenerator = (factoryOptions) => {
4
+ return async (options) => {
5
+ const db = connectMongoForTests(factoryOptions.url, factoryOptions.isCI);
6
+ await db.createSdkReportingCollection();
7
+ if (!options?.doNotClear) {
8
+ await db.clear();
9
+ }
10
+ return new MongoReportStorage(db);
11
+ };
12
+ };
13
+ //# sourceMappingURL=MongoTestReportStorageFactoryGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoTestReportStorageFactoryGenerator.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoTestReportStorageFactoryGenerator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAO9D,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,cAAuC,EAAE,EAAE;IAChG,OAAO,KAAK,EAAE,OAA4B,EAAE,EAAE;QAC5C,MAAM,EAAE,GAAG,oBAAoB,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QAEzE,MAAM,EAAE,CAAC,4BAA4B,EAAE,CAAC;QAExC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;YACzB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC,CAAC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@powersync/service-module-mongodb-storage",
3
3
  "repository": "https://github.com/powersync-ja/powersync-service",
4
4
  "types": "dist/index.d.ts",
5
- "version": "0.0.0-dev-20250730153301",
5
+ "version": "0.0.0-dev-20250804094552",
6
6
  "main": "dist/index.js",
7
7
  "license": "FSL-1.1-Apache-2.0",
8
8
  "type": "module",
@@ -27,15 +27,15 @@
27
27
  "lru-cache": "^10.2.2",
28
28
  "ts-codec": "^1.3.0",
29
29
  "uuid": "^11.1.0",
30
- "@powersync/lib-service-mongodb": "0.0.0-dev-20250730153301",
31
- "@powersync/lib-services-framework": "0.0.0-dev-20250730153301",
32
- "@powersync/service-core": "0.0.0-dev-20250730153301",
33
- "@powersync/service-types": "0.0.0-dev-20250730153301",
30
+ "@powersync/lib-service-mongodb": "0.0.0-dev-20250804094552",
31
+ "@powersync/lib-services-framework": "0.0.0-dev-20250804094552",
32
+ "@powersync/service-core": "0.0.0-dev-20250804094552",
33
+ "@powersync/service-types": "0.0.0-dev-20250804094552",
34
34
  "@powersync/service-jsonbig": "0.17.10",
35
- "@powersync/service-sync-rules": "0.0.0-dev-20250730153301"
35
+ "@powersync/service-sync-rules": "0.0.0-dev-20250804094552"
36
36
  },
37
37
  "devDependencies": {
38
- "@powersync/service-core-tests": "0.0.0-dev-20250730153301"
38
+ "@powersync/service-core-tests": "0.0.0-dev-20250804094552"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsc -b",
@@ -56,6 +56,11 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
56
56
  users: { $size: '$user_ids' },
57
57
  clients: { $size: '$client_ids' }
58
58
  }
59
+ },
60
+ {
61
+ $sort: {
62
+ sdk: 1
63
+ }
59
64
  }
60
65
  ]
61
66
  }
@@ -205,15 +210,22 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
205
210
  );
206
211
  }
207
212
  async reportSdkDisconnect(data: event_types.SdkDisconnectEventData): Promise<void> {
208
- const updateFilter = this.updateDocFilter(data.user_id, data.client_id!);
209
- await this.db.sdk_report_events.findOneAndUpdate(updateFilter, {
210
- $set: {
211
- disconnect_at: data.disconnect_at
213
+ const { connect_at, user_id, client_id } = data;
214
+ await this.db.sdk_report_events.findOneAndUpdate(
215
+ {
216
+ client_id,
217
+ user_id,
218
+ connect_at
212
219
  },
213
- $unset: {
214
- jwt_exp: ''
220
+ {
221
+ $set: {
222
+ disconnect_at: data.disconnect_at
223
+ },
224
+ $unset: {
225
+ jwt_exp: ''
226
+ }
215
227
  }
216
- });
228
+ );
217
229
  }
218
230
  async listCurrentConnections(
219
231
  data: event_types.ListCurrentConnectionsRequest
@@ -0,0 +1,22 @@
1
+ import { TestStorageOptions } from '@powersync/service-core';
2
+ import { connectMongoForTests } from './util.js';
3
+ import { MongoReportStorage } from '../MongoReportStorage.js';
4
+
5
+ export type MongoTestStorageOptions = {
6
+ url: string;
7
+ isCI: boolean;
8
+ };
9
+
10
+ export const MongoTestReportStorageFactoryGenerator = (factoryOptions: MongoTestStorageOptions) => {
11
+ return async (options?: TestStorageOptions) => {
12
+ const db = connectMongoForTests(factoryOptions.url, factoryOptions.isCI);
13
+
14
+ await db.createSdkReportingCollection();
15
+
16
+ if (!options?.doNotClear) {
17
+ await db.clear();
18
+ }
19
+
20
+ return new MongoReportStorage(db);
21
+ };
22
+ };
@@ -0,0 +1,188 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`SDK reporting storage > Should create a sdk event if its after a day 1`] = `
4
+ [
5
+ {
6
+ "client_id": "client_week",
7
+ "sdk": "powersync-js/1.24.5",
8
+ "user_agent": "powersync-js/1.21.0 powersync-web Firefox/141 linux",
9
+ "user_id": "user_week",
10
+ },
11
+ {
12
+ "client_id": "client_week",
13
+ "sdk": "powersync-js/1.24.5",
14
+ "user_agent": "powersync-js/1.21.0 powersync-web Firefox/141 linux",
15
+ "user_id": "user_week",
16
+ },
17
+ ]
18
+ `;
19
+
20
+ exports[`SDK reporting storage > Should delete rows older than specified range 1`] = `
21
+ {
22
+ "sdks": [
23
+ {
24
+ "clients": 1,
25
+ "sdk": "powersync-dart/1.6.4",
26
+ "users": 1,
27
+ },
28
+ {
29
+ "clients": 1,
30
+ "sdk": "powersync-js/1.21.1",
31
+ "users": 1,
32
+ },
33
+ {
34
+ "clients": 1,
35
+ "sdk": "powersync-js/1.21.2",
36
+ "users": 1,
37
+ },
38
+ {
39
+ "clients": 1,
40
+ "sdk": "powersync-js/1.21.4",
41
+ "users": 1,
42
+ },
43
+ ],
44
+ "users": 4,
45
+ }
46
+ `;
47
+
48
+ exports[`SDK reporting storage > Should show SDK scrape data for user over the past day 1`] = `
49
+ {
50
+ "sdks": [
51
+ {
52
+ "clients": 1,
53
+ "sdk": "powersync-dart/1.6.4",
54
+ "users": 1,
55
+ },
56
+ {
57
+ "clients": 1,
58
+ "sdk": "powersync-js/1.21.1",
59
+ "users": 1,
60
+ },
61
+ {
62
+ "clients": 1,
63
+ "sdk": "powersync-js/1.21.4",
64
+ "users": 1,
65
+ },
66
+ ],
67
+ "users": 3,
68
+ }
69
+ `;
70
+
71
+ exports[`SDK reporting storage > Should show SDK scrape data for user over the past month 1`] = `
72
+ {
73
+ "sdks": [
74
+ {
75
+ "clients": 1,
76
+ "sdk": "powersync-dart/1.6.4",
77
+ "users": 1,
78
+ },
79
+ {
80
+ "clients": 1,
81
+ "sdk": "powersync-js/1.21.1",
82
+ "users": 1,
83
+ },
84
+ {
85
+ "clients": 1,
86
+ "sdk": "powersync-js/1.21.2",
87
+ "users": 1,
88
+ },
89
+ {
90
+ "clients": 1,
91
+ "sdk": "powersync-js/1.21.4",
92
+ "users": 1,
93
+ },
94
+ {
95
+ "clients": 1,
96
+ "sdk": "powersync-js/1.23.6",
97
+ "users": 1,
98
+ },
99
+ {
100
+ "clients": 1,
101
+ "sdk": "powersync-js/1.23.7",
102
+ "users": 1,
103
+ },
104
+ {
105
+ "clients": 1,
106
+ "sdk": "powersync-js/1.24.5",
107
+ "users": 1,
108
+ },
109
+ ],
110
+ "users": 7,
111
+ }
112
+ `;
113
+
114
+ exports[`SDK reporting storage > Should show SDK scrape data for user over the past week 1`] = `
115
+ {
116
+ "sdks": [
117
+ {
118
+ "clients": 1,
119
+ "sdk": "powersync-dart/1.6.4",
120
+ "users": 1,
121
+ },
122
+ {
123
+ "clients": 1,
124
+ "sdk": "powersync-js/1.21.1",
125
+ "users": 1,
126
+ },
127
+ {
128
+ "clients": 1,
129
+ "sdk": "powersync-js/1.21.2",
130
+ "users": 1,
131
+ },
132
+ {
133
+ "clients": 1,
134
+ "sdk": "powersync-js/1.21.4",
135
+ "users": 1,
136
+ },
137
+ ],
138
+ "users": 4,
139
+ }
140
+ `;
141
+
142
+ exports[`SDK reporting storage > Should show connected users with start range 1`] = `
143
+ {
144
+ "sdks": [
145
+ {
146
+ "clients": 1,
147
+ "sdk": "powersync-dart/1.6.4",
148
+ "users": 1,
149
+ },
150
+ ],
151
+ "users": 1,
152
+ }
153
+ `;
154
+
155
+ exports[`SDK reporting storage > Should show connected users with start range and end range 1`] = `
156
+ {
157
+ "sdks": [
158
+ {
159
+ "clients": 1,
160
+ "sdk": "powersync-js/1.21.1",
161
+ "users": 1,
162
+ },
163
+ ],
164
+ "users": 1,
165
+ }
166
+ `;
167
+
168
+ exports[`SDK reporting storage > Should update a connected sdk event and make it disconnected 1`] = `
169
+ [
170
+ {
171
+ "client_id": "client_three",
172
+ "sdk": "powersync-js/1.21.2",
173
+ "user_agent": "powersync-js/1.21.0 powersync-web Firefox/141 linux",
174
+ "user_id": "user_three",
175
+ },
176
+ ]
177
+ `;
178
+
179
+ exports[`SDK reporting storage > Should update a sdk event if its within a day 1`] = `
180
+ [
181
+ {
182
+ "client_id": "client_one",
183
+ "sdk": "powersync-dart/1.6.4",
184
+ "user_agent": "powersync-dart/1.6.4 Dart (flutter-web) Chrome/128 android",
185
+ "user_id": "user_one",
186
+ },
187
+ ]
188
+ `;
@@ -0,0 +1,256 @@
1
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
2
+ import { INITIALIZED_MONGO_REPORT_STORAGE_FACTORY } from './util.js';
3
+ import { event_types } from '@powersync/service-types';
4
+
5
+ function removeVolatileFields(
6
+ sdks: event_types.SdkConnectDocument[]
7
+ ): Partial<event_types.SdkConnectDocument & { _id: string }>[] {
8
+ return sdks.map((sdk: Partial<event_types.SdkConnectDocument & { _id: string }>) => {
9
+ const { _id, disconnect_at, connect_at, jwt_exp, ...rest } = sdk;
10
+ return {
11
+ ...rest
12
+ };
13
+ });
14
+ }
15
+
16
+ describe('SDK reporting storage', async () => {
17
+ const factory = await INITIALIZED_MONGO_REPORT_STORAGE_FACTORY();
18
+ const now = new Date();
19
+ const nowAdd5minutes = new Date(
20
+ now.getFullYear(),
21
+ now.getMonth(),
22
+ now.getDate(),
23
+ now.getHours(),
24
+ now.getMinutes() + 5
25
+ );
26
+ const nowLess5minutes = new Date(
27
+ now.getFullYear(),
28
+ now.getMonth(),
29
+ now.getDate(),
30
+ now.getHours(),
31
+ now.getMinutes() - 5
32
+ );
33
+ const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
34
+ const weekAgo = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7);
35
+ const monthAgo = new Date(now.getFullYear(), now.getMonth() - 1, now.getDate());
36
+ const user_one = {
37
+ user_id: 'user_one',
38
+ client_id: 'client_one',
39
+ connect_at: now,
40
+ sdk: 'powersync-dart/1.6.4',
41
+ user_agent: 'powersync-dart/1.6.4 Dart (flutter-web) Chrome/128 android',
42
+ jwt_exp: nowAdd5minutes
43
+ };
44
+ const user_two = {
45
+ user_id: 'user_two',
46
+ client_id: 'client_two',
47
+ connect_at: nowLess5minutes,
48
+ sdk: 'powersync-js/1.21.1',
49
+ user_agent: 'powersync-js/1.21.0 powersync-web Chromium/138 linux',
50
+ jwt_exp: nowAdd5minutes
51
+ };
52
+ const user_three = {
53
+ user_id: 'user_three',
54
+ client_id: 'client_three',
55
+ connect_at: yesterday,
56
+ sdk: 'powersync-js/1.21.2',
57
+ user_agent: 'powersync-js/1.21.0 powersync-web Firefox/141 linux',
58
+ disconnect_at: yesterday
59
+ };
60
+
61
+ const user_four = {
62
+ user_id: 'user_four',
63
+ client_id: 'client_four',
64
+ connect_at: now,
65
+ sdk: 'powersync-js/1.21.4',
66
+ user_agent: 'powersync-js/1.21.0 powersync-web Firefox/141 linux',
67
+ jwt_exp: nowLess5minutes
68
+ };
69
+
70
+ const user_week = {
71
+ user_id: 'user_week',
72
+ client_id: 'client_week',
73
+ connect_at: weekAgo,
74
+ sdk: 'powersync-js/1.24.5',
75
+ user_agent: 'powersync-js/1.21.0 powersync-web Firefox/141 linux',
76
+ disconnect_at: weekAgo
77
+ };
78
+
79
+ const user_month = {
80
+ user_id: 'user_month',
81
+ client_id: 'client_month',
82
+ connect_at: monthAgo,
83
+ sdk: 'powersync-js/1.23.6',
84
+ user_agent: 'powersync-js/1.23.0 powersync-web Firefox/141 linux',
85
+ disconnect_at: monthAgo
86
+ };
87
+
88
+ const user_expired = {
89
+ user_id: 'user_expired',
90
+ client_id: 'client_expired',
91
+ connect_at: monthAgo,
92
+ sdk: 'powersync-js/1.23.7',
93
+ user_agent: 'powersync-js/1.23.0 powersync-web Firefox/141 linux',
94
+ jwt_exp: monthAgo
95
+ };
96
+
97
+ async function loadData() {
98
+ await factory.db.sdk_report_events.insertMany([
99
+ user_one,
100
+ user_two,
101
+ user_three,
102
+ user_four,
103
+ user_week,
104
+ user_month,
105
+ user_expired
106
+ ]);
107
+ }
108
+
109
+ function deleteData() {
110
+ return factory.db.sdk_report_events.deleteMany();
111
+ }
112
+
113
+ beforeAll(async () => {
114
+ await loadData();
115
+ });
116
+
117
+ afterAll(async () => {
118
+ await deleteData();
119
+ });
120
+ it('Should show connected users with start range', async () => {
121
+ const current = await factory.listCurrentConnections({
122
+ range: {
123
+ start_date: new Date(
124
+ now.getFullYear(),
125
+ now.getMonth(),
126
+ now.getDate(),
127
+ now.getHours(),
128
+ now.getMinutes() - 1
129
+ ).toISOString()
130
+ }
131
+ });
132
+ expect(current).toMatchSnapshot();
133
+ });
134
+ it('Should show connected users with start range and end range', async () => {
135
+ const current = await factory.listCurrentConnections({
136
+ range: {
137
+ end_date: nowLess5minutes.toISOString(),
138
+ start_date: new Date(
139
+ now.getFullYear(),
140
+ now.getMonth(),
141
+ now.getDate(),
142
+ now.getHours(),
143
+ now.getMinutes() - 6
144
+ ).toISOString()
145
+ }
146
+ });
147
+ expect(current).toMatchSnapshot();
148
+ });
149
+ it('Should show SDK scrape data for user over the past month', async () => {
150
+ const sdk = await factory.scrapeSdkData({
151
+ interval: 1,
152
+ timeframe: 'month'
153
+ });
154
+ expect(sdk).toMatchSnapshot();
155
+ });
156
+ it('Should show SDK scrape data for user over the past week', async () => {
157
+ const sdk = await factory.scrapeSdkData({
158
+ interval: 1,
159
+ timeframe: 'week'
160
+ });
161
+ expect(sdk).toMatchSnapshot();
162
+ });
163
+ it('Should show SDK scrape data for user over the past day', async () => {
164
+ const sdk = await factory.scrapeSdkData({
165
+ interval: 1,
166
+ timeframe: 'day'
167
+ });
168
+ expect(sdk).toMatchSnapshot();
169
+ });
170
+
171
+ it('Should update a sdk event if its within a day', async () => {
172
+ const newConnectAt = new Date(
173
+ now.getFullYear(),
174
+ now.getMonth(),
175
+ now.getDate(),
176
+ now.getHours(),
177
+ now.getMinutes() + 20
178
+ );
179
+ const jwtExp = new Date(newConnectAt.getFullYear(), newConnectAt.getMonth(), newConnectAt.getDate() + 1);
180
+ await factory.reportSdkConnect({
181
+ sdk: user_one.sdk,
182
+ connect_at: newConnectAt,
183
+ jwt_exp: jwtExp,
184
+ client_id: user_one.client_id,
185
+ user_id: user_one.user_id,
186
+ user_agent: user_one.user_agent
187
+ });
188
+
189
+ const sdk = await factory.db.sdk_report_events.find({ user_id: user_one.user_id }).toArray();
190
+ expect(sdk).toHaveLength(1);
191
+ expect(new Date(sdk[0].connect_at)).toEqual(newConnectAt);
192
+ expect(new Date(sdk[0].jwt_exp!)).toEqual(jwtExp);
193
+ expect(sdk[0].disconnect_at).toBeUndefined();
194
+ const cleaned = removeVolatileFields(sdk);
195
+ expect(cleaned).toMatchSnapshot();
196
+ });
197
+
198
+ it('Should update a connected sdk event and make it disconnected', async () => {
199
+ const disconnectAt = new Date(
200
+ now.getFullYear(),
201
+ now.getMonth(),
202
+ now.getDate(),
203
+ now.getHours(),
204
+ now.getMinutes() + 20
205
+ );
206
+ const jwtExp = new Date(disconnectAt.getFullYear(), disconnectAt.getMonth(), disconnectAt.getDate() + 1);
207
+
208
+ await factory.reportSdkDisconnect({
209
+ disconnect_at: disconnectAt,
210
+ jwt_exp: jwtExp,
211
+ client_id: user_three.client_id,
212
+ user_id: user_three.user_id,
213
+ user_agent: user_three.user_agent,
214
+ connect_at: user_three.connect_at
215
+ });
216
+
217
+ const sdk = await factory.db.sdk_report_events.find({ user_id: user_three.user_id }).toArray();
218
+ expect(sdk).toHaveLength(1);
219
+ expect(new Date(sdk[0].disconnect_at!)).toEqual(disconnectAt);
220
+ const cleaned = removeVolatileFields(sdk);
221
+ expect(cleaned).toMatchSnapshot();
222
+ });
223
+
224
+ it('Should create a sdk event if its after a day', async () => {
225
+ const newConnectAt = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, now.getHours());
226
+ const jwtExp = new Date(newConnectAt.getFullYear(), newConnectAt.getMonth(), newConnectAt.getDate() + 1);
227
+
228
+ await factory.reportSdkConnect({
229
+ sdk: user_week.sdk,
230
+ connect_at: newConnectAt,
231
+ jwt_exp: jwtExp,
232
+ client_id: user_week.client_id,
233
+ user_id: user_week.user_id,
234
+ user_agent: user_week.user_agent
235
+ });
236
+
237
+ const sdk = await factory.db.sdk_report_events.find({ user_id: user_week.user_id }).toArray();
238
+ expect(sdk).toHaveLength(2);
239
+ const cleaned = removeVolatileFields(sdk);
240
+ expect(cleaned).toMatchSnapshot();
241
+ });
242
+
243
+ it('Should delete rows older than specified range', async () => {
244
+ await deleteData();
245
+ await loadData();
246
+ await factory.deleteOldSdkData({
247
+ interval: 1,
248
+ timeframe: 'week'
249
+ });
250
+ const sdk = await factory.scrapeSdkData({
251
+ interval: 1,
252
+ timeframe: 'month'
253
+ });
254
+ expect(sdk).toMatchSnapshot();
255
+ });
256
+ });
package/test/src/util.ts CHANGED
@@ -1,8 +1,14 @@
1
1
  import { env } from './env.js';
2
2
 
3
3
  import { MongoTestStorageFactoryGenerator } from '@module/storage/implementation/MongoTestStorageFactoryGenerator.js';
4
+ import { MongoTestReportStorageFactoryGenerator } from '@module/storage/implementation/MongoTestReportStorageFactoryGenerator.js';
4
5
 
5
6
  export const INITIALIZED_MONGO_STORAGE_FACTORY = MongoTestStorageFactoryGenerator({
6
7
  url: env.MONGO_TEST_URL,
7
8
  isCI: env.CI
8
9
  });
10
+
11
+ export const INITIALIZED_MONGO_REPORT_STORAGE_FACTORY = MongoTestReportStorageFactoryGenerator({
12
+ url: env.MONGO_TEST_URL,
13
+ isCI: env.CI
14
+ });