@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 +7 -6
- package/dist/storage/MongoReportStorage.js +11 -2
- package/dist/storage/MongoReportStorage.js.map +1 -1
- package/dist/storage/implementation/MongoTestReportStorageFactoryGenerator.d.ts +7 -0
- package/dist/storage/implementation/MongoTestReportStorageFactoryGenerator.js +13 -0
- package/dist/storage/implementation/MongoTestReportStorageFactoryGenerator.js.map +1 -0
- package/package.json +7 -7
- package/src/storage/MongoReportStorage.ts +19 -7
- package/src/storage/implementation/MongoTestReportStorageFactoryGenerator.ts +22 -0
- package/test/src/__snapshots__/sdk-report-storage.test.ts.snap +188 -0
- package/test/src/sdk-report-storage.test.ts +256 -0
- package/test/src/util.ts +6 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# @powersync/service-module-mongodb-storage
|
|
2
2
|
|
|
3
|
-
## 0.0.0-dev-
|
|
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-
|
|
33
|
-
- @powersync/service-types@0.0.0-dev-
|
|
34
|
-
- @powersync/lib-services-framework@0.0.0-dev-
|
|
35
|
-
- @powersync/service-sync-rules@0.0.0-dev-
|
|
36
|
-
- @powersync/lib-service-mongodb@0.0.0-dev-
|
|
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
|
|
187
|
-
await this.db.sdk_report_events.findOneAndUpdate(
|
|
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":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,MAAM,OAAO,kBAAkB;IACZ,MAAM,CAAoB;IAC3B,EAAE,CAAiB;IAEnC,YAAY,EAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAEO,WAAW,CAAC,IAAU;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI;YACJ,KAAK;YACL,KAAK;YACL,GAAG;YACH,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,OAAO;YACL,MAAM,EAAE;gBACN,YAAY,EAAE;oBACZ;wBACE,MAAM,EAAE;4BACN,GAAG,EAAE,UAAU;yBAChB;qBACF;oBACD;wBACE,MAAM,EAAE,OAAO;qBAChB;iBACF;gBACD,kBAAkB,EAAE;oBAClB;wBACE,MAAM,EAAE;4BACN,GAAG,EAAE,MAAM;4BACX,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;4BAClB,UAAU,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;4BACvC,QAAQ,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;yBACpC;qBACF;oBACD;wBACE,QAAQ,EAAE;4BACR,GAAG,EAAE,CAAC;4BACN,GAAG,EAAE,MAAM;4BACX,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;4BAC7B,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;yBAClC;qBACF;oBACD;wBACE,KAAK,EAAE;4BACL,GAAG,EAAE,CAAC;yBACP;qBACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,OAAO;YACL,QAAQ,EAAE;gBACR,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACrE,IAAI,EAAE,qBAAqB;aAC5B;SACF,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,MAAc,EAAE,QAAgB;QACtD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE;gBACV,8DAA8D;gBAC9D,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;gBAClC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;aACpC;SACF,CAAC;IACJ,CAAC;IAEO,wBAAwB,CAAC,IAA+C;QAC9E,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAClF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,SAAS;SACf,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,SAAiC,EAAE,WAAmB,CAAC;QAC5E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACxE,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACrF,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC3C,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;gBAClD,OAAO;oBACL,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;iBAChE,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,0CAA0C;gBAC1C,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC;gBACtD,OAAO;oBACL,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC;oBAC/C,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;iBAC1D,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,OAAO;oBACL,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC;iBAC7C,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,SAAiC,EAAE,WAAmB,CAAC;QAClF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACxE,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACnE,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC3C,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC9D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;gBAC/D,OAAO;oBACL,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;iBAClC,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC;gBACtD,OAAO;oBACL,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC;iBAChD,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,OAAO;oBACL,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC;iBAC7C,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAkC;QACvD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QACrC,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC;YACxD,UAAU,EAAE,eAAe;YAC3B,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;SACjH,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CACT,OAAO,QAAQ,IAAI,SAAS,KAAK,MAAM,CAAC,YAAY,8DAA8D,CACnH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAsC;QACxD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QACrC,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,iBAAiB;aAC3C,SAAS,CAAqC;YAC7C;gBACE,MAAM,EAAE;oBACN,UAAU,EAAE,eAAe;iBAC5B;aACF;YACD,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,kBAAkB,EAAE;SAC1B,CAAC;aACD,OAAO,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAsC;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAU,CAAC,CAAC;QACzE,MAAM,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,gBAAgB,CAC9C,YAAY,EACZ;YACE,IAAI,EAAE,IAAI;YACV,MAAM,EAAE;gBACN,aAAa,EAAE,EAAE;aAClB;SACF,EACD;YACE,MAAM,EAAE,IAAI;SACb,CACF,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,mBAAmB,CAAC,IAAwC;QAChE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAChD,MAAM,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,gBAAgB,CAC9C;YACE,SAAS;YACT,OAAO;YACP,UAAU;SACX,EACD;YACE,IAAI,EAAE;gBACJ,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,EAAE;aACZ;SACF,CACF,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,sBAAsB,CAC1B,IAA+C;QAE/C,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,iBAAiB;aAC3C,SAAS,CAAqC;YAC7C;gBACE,MAAM,EAAE;oBACN,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;oBACjC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE;oBAC5B,UAAU,EAAE,eAAe;iBAC5B;aACF;YACD,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,kBAAkB,EAAE;SAC1B,CAAC;aACD,OAAO,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACzB,QAAQ;IACV,CAAC;CACF"}
|
|
@@ -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-
|
|
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-
|
|
31
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
32
|
-
"@powersync/service-core": "0.0.0-dev-
|
|
33
|
-
"@powersync/service-types": "0.0.0-dev-
|
|
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-
|
|
35
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20250804094552"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@powersync/service-core-tests": "0.0.0-dev-
|
|
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
|
|
209
|
-
await this.db.sdk_report_events.findOneAndUpdate(
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
214
|
-
|
|
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
|
+
});
|