@expo/entity-database-adapter-knex-testing-utils 0.57.0

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/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @expo/entity-database-adapter-knex-testing-utils
2
+
3
+ Testing utilities for applications using Entity with Knex database adapter.
@@ -0,0 +1,27 @@
1
+ import { EntityConfiguration, FieldTransformerMap } from '@expo/entity';
2
+ import { BasePostgresEntityDatabaseAdapter, SQLFragment, TableFieldMultiValueEqualityCondition, TableFieldSingleValueEqualityCondition, TableQuerySelectionModifiers } from '@expo/entity-database-adapter-knex';
3
+ export declare class StubPostgresDatabaseAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields> extends BasePostgresEntityDatabaseAdapter<TFields, TIDField> {
4
+ private readonly entityConfiguration2;
5
+ private readonly dataStore;
6
+ constructor(entityConfiguration2: EntityConfiguration<TFields, TIDField>, dataStore: Map<string, Readonly<{
7
+ [key: string]: any;
8
+ }>[]>);
9
+ static convertFieldObjectsToDataStore<TFields extends Record<string, any>, TIDField extends keyof TFields>(entityConfiguration: EntityConfiguration<TFields, TIDField>, dataStore: Map<string, Readonly<TFields>[]>): Map<string, Readonly<{
10
+ [key: string]: any;
11
+ }>[]>;
12
+ getObjectCollectionForTable(tableName: string): {
13
+ [key: string]: any;
14
+ }[];
15
+ protected getFieldTransformerMap(): FieldTransformerMap;
16
+ private static uniqBy;
17
+ protected fetchManyWhereInternalAsync(_queryInterface: any, tableName: string, tableColumns: readonly string[], tableTuples: (readonly any[])[]): Promise<object[]>;
18
+ protected fetchOneWhereInternalAsync(queryInterface: any, tableName: string, tableColumns: readonly string[], tableTuple: readonly any[]): Promise<object | null>;
19
+ private static compareByOrderBys;
20
+ protected fetchManyByFieldEqualityConjunctionInternalAsync(_queryInterface: any, tableName: string, tableFieldSingleValueEqualityOperands: TableFieldSingleValueEqualityCondition[], tableFieldMultiValueEqualityOperands: TableFieldMultiValueEqualityCondition[], querySelectionModifiers: TableQuerySelectionModifiers<TFields>): Promise<object[]>;
21
+ protected fetchManyByRawWhereClauseInternalAsync(_queryInterface: any, _tableName: string, _rawWhereClause: string, _bindings: object | any[], _querySelectionModifiers: TableQuerySelectionModifiers<TFields>): Promise<object[]>;
22
+ protected fetchManyBySQLFragmentInternalAsync(_queryInterface: any, _tableName: string, _sqlFragment: SQLFragment<TFields>, _querySelectionModifiers: TableQuerySelectionModifiers<TFields>): Promise<object[]>;
23
+ private generateRandomID;
24
+ protected insertInternalAsync(_queryInterface: any, tableName: string, object: object): Promise<object[]>;
25
+ protected updateInternalAsync(_queryInterface: any, tableName: string, tableIdField: string, id: any, object: object): Promise<object[]>;
26
+ protected deleteInternalAsync(_queryInterface: any, tableName: string, tableIdField: string, id: any): Promise<number>;
27
+ }
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StubPostgresDatabaseAdapter = void 0;
7
+ const entity_1 = require("@expo/entity");
8
+ const entity_database_adapter_knex_1 = require("@expo/entity-database-adapter-knex");
9
+ const invariant_1 = __importDefault(require("invariant"));
10
+ const uuid_1 = require("uuid");
11
+ class StubPostgresDatabaseAdapter extends entity_database_adapter_knex_1.BasePostgresEntityDatabaseAdapter {
12
+ entityConfiguration2;
13
+ dataStore;
14
+ constructor(entityConfiguration2, dataStore) {
15
+ super(entityConfiguration2);
16
+ this.entityConfiguration2 = entityConfiguration2;
17
+ this.dataStore = dataStore;
18
+ }
19
+ static convertFieldObjectsToDataStore(entityConfiguration, dataStore) {
20
+ return (0, entity_1.mapMap)(dataStore, (objectsForTable) => objectsForTable.map((objectForTable) => (0, entity_1.transformFieldsToDatabaseObject)(entityConfiguration, new Map(), objectForTable)));
21
+ }
22
+ getObjectCollectionForTable(tableName) {
23
+ return (0, entity_1.computeIfAbsent)(this.dataStore, tableName, () => []);
24
+ }
25
+ getFieldTransformerMap() {
26
+ return new Map();
27
+ }
28
+ static uniqBy(a, keyExtractor) {
29
+ const seen = new Set();
30
+ return a.filter((item) => {
31
+ const k = keyExtractor(item);
32
+ if (seen.has(k)) {
33
+ return false;
34
+ }
35
+ seen.add(k);
36
+ return true;
37
+ });
38
+ }
39
+ async fetchManyWhereInternalAsync(_queryInterface, tableName, tableColumns, tableTuples) {
40
+ const objectCollection = this.getObjectCollectionForTable(tableName);
41
+ const results = StubPostgresDatabaseAdapter.uniqBy(tableTuples, (tuple) => tuple.join(':')).reduce((acc, tableTuple) => {
42
+ return acc.concat(objectCollection.filter((obj) => {
43
+ return tableColumns.every((tableColumn, index) => {
44
+ return obj[tableColumn] === tableTuple[index];
45
+ });
46
+ }));
47
+ }, []);
48
+ return [...results];
49
+ }
50
+ async fetchOneWhereInternalAsync(queryInterface, tableName, tableColumns, tableTuple) {
51
+ const results = await this.fetchManyWhereInternalAsync(queryInterface, tableName, tableColumns, [tableTuple]);
52
+ return results[0] ?? null;
53
+ }
54
+ static compareByOrderBys(orderBys, objectA, objectB) {
55
+ if (orderBys.length === 0) {
56
+ return 0;
57
+ }
58
+ const currentOrderBy = orderBys[0];
59
+ if (!('columnName' in currentOrderBy)) {
60
+ throw new Error('SQL fragment order by not supported for StubDatabaseAdapter');
61
+ }
62
+ const aField = objectA[currentOrderBy.columnName];
63
+ const bField = objectB[currentOrderBy.columnName];
64
+ // Determine effective nulls ordering:
65
+ // - If explicitly set, use that
66
+ // - Otherwise use PostgreSQL defaults: NULLS LAST for ASC, NULLS FIRST for DESC
67
+ const nullsFirst = currentOrderBy.nulls !== undefined
68
+ ? currentOrderBy.nulls === entity_database_adapter_knex_1.NullsOrdering.FIRST
69
+ : currentOrderBy.order === entity_database_adapter_knex_1.OrderByOrdering.DESCENDING;
70
+ if (aField === null && bField === null) {
71
+ return this.compareByOrderBys(orderBys.slice(1), objectA, objectB);
72
+ }
73
+ else if (aField === null) {
74
+ return nullsFirst ? -1 : 1;
75
+ }
76
+ else if (bField === null) {
77
+ return nullsFirst ? 1 : -1;
78
+ }
79
+ switch (currentOrderBy.order) {
80
+ case entity_database_adapter_knex_1.OrderByOrdering.DESCENDING: {
81
+ return aField > bField
82
+ ? -1
83
+ : aField < bField
84
+ ? 1
85
+ : this.compareByOrderBys(orderBys.slice(1), objectA, objectB);
86
+ }
87
+ case entity_database_adapter_knex_1.OrderByOrdering.ASCENDING: {
88
+ return bField > aField
89
+ ? -1
90
+ : bField < aField
91
+ ? 1
92
+ : this.compareByOrderBys(orderBys.slice(1), objectA, objectB);
93
+ }
94
+ }
95
+ }
96
+ async fetchManyByFieldEqualityConjunctionInternalAsync(_queryInterface, tableName, tableFieldSingleValueEqualityOperands, tableFieldMultiValueEqualityOperands, querySelectionModifiers) {
97
+ let filteredObjects = this.getObjectCollectionForTable(tableName);
98
+ for (const { tableField, tableValue } of tableFieldSingleValueEqualityOperands) {
99
+ filteredObjects = filteredObjects.filter((obj) => obj[tableField] === tableValue);
100
+ }
101
+ for (const { tableField, tableValues } of tableFieldMultiValueEqualityOperands) {
102
+ filteredObjects = filteredObjects.filter((obj) => tableValues.includes(obj[tableField]));
103
+ }
104
+ const orderBy = querySelectionModifiers.orderBy;
105
+ if (orderBy !== undefined) {
106
+ filteredObjects = filteredObjects.sort((a, b) => StubPostgresDatabaseAdapter.compareByOrderBys(orderBy, a, b));
107
+ }
108
+ const offset = querySelectionModifiers.offset;
109
+ if (offset !== undefined) {
110
+ filteredObjects = filteredObjects.slice(offset);
111
+ }
112
+ const limit = querySelectionModifiers.limit;
113
+ if (limit !== undefined) {
114
+ filteredObjects = filteredObjects.slice(0, 0 + limit);
115
+ }
116
+ return filteredObjects;
117
+ }
118
+ fetchManyByRawWhereClauseInternalAsync(_queryInterface, _tableName, _rawWhereClause, _bindings, _querySelectionModifiers) {
119
+ throw new Error('Raw WHERE clauses not supported for StubDatabaseAdapter');
120
+ }
121
+ fetchManyBySQLFragmentInternalAsync(_queryInterface, _tableName, _sqlFragment, _querySelectionModifiers) {
122
+ throw new Error('SQL fragments not supported for StubDatabaseAdapter');
123
+ }
124
+ generateRandomID() {
125
+ const idSchemaField = this.entityConfiguration2.schema.get(this.entityConfiguration2.idField);
126
+ (0, invariant_1.default)(idSchemaField, `No schema field found for ${String(this.entityConfiguration2.idField)}`);
127
+ if (idSchemaField instanceof entity_1.StringField) {
128
+ return (0, uuid_1.v7)();
129
+ }
130
+ else if (idSchemaField instanceof entity_1.IntField) {
131
+ return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
132
+ }
133
+ else {
134
+ throw new Error(`Unsupported ID type for StubPostgresDatabaseAdapter: ${idSchemaField.constructor.name}`);
135
+ }
136
+ }
137
+ async insertInternalAsync(_queryInterface, tableName, object) {
138
+ const objectCollection = this.getObjectCollectionForTable(tableName);
139
+ const idField = (0, entity_1.getDatabaseFieldForEntityField)(this.entityConfiguration2, this.entityConfiguration2.idField);
140
+ const objectToInsert = {
141
+ [idField]: this.generateRandomID(),
142
+ ...object,
143
+ };
144
+ objectCollection.push(objectToInsert);
145
+ return [objectToInsert];
146
+ }
147
+ async updateInternalAsync(_queryInterface, tableName, tableIdField, id, object) {
148
+ // SQL does not support empty updates, mirror behavior here for better test simulation
149
+ if (Object.keys(object).length === 0) {
150
+ throw new Error(`Empty update (${tableIdField} = ${id})`);
151
+ }
152
+ const objectCollection = this.getObjectCollectionForTable(tableName);
153
+ const objectIndex = objectCollection.findIndex((obj) => {
154
+ return obj[tableIdField] === id;
155
+ });
156
+ // SQL updates to a nonexistent row succeed but affect 0 rows,
157
+ // mirror that behavior here for better test simulation
158
+ if (objectIndex < 0) {
159
+ return [];
160
+ }
161
+ objectCollection[objectIndex] = {
162
+ ...objectCollection[objectIndex],
163
+ ...object,
164
+ };
165
+ return [objectCollection[objectIndex]];
166
+ }
167
+ async deleteInternalAsync(_queryInterface, tableName, tableIdField, id) {
168
+ const objectCollection = this.getObjectCollectionForTable(tableName);
169
+ const objectIndex = objectCollection.findIndex((obj) => {
170
+ return obj[tableIdField] === id;
171
+ });
172
+ // SQL deletes to a nonexistent row succeed and affect 0 rows,
173
+ // mirror that behavior here for better test simulation
174
+ if (objectIndex < 0) {
175
+ return 0;
176
+ }
177
+ objectCollection.splice(objectIndex, 1);
178
+ return 1;
179
+ }
180
+ }
181
+ exports.StubPostgresDatabaseAdapter = StubPostgresDatabaseAdapter;
182
+ //# sourceMappingURL=StubPostgresDatabaseAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StubPostgresDatabaseAdapter.js","sourceRoot":"","sources":["../../src/StubPostgresDatabaseAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { EntityConfiguration, EntityDatabaseAdapter, IEntityDatabaseAdapterProvider } from '@expo/entity';
2
+ export declare class StubPostgresDatabaseAdapterProvider implements IEntityDatabaseAdapterProvider {
3
+ private readonly objectCollection;
4
+ getDatabaseAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields>(entityConfiguration: EntityConfiguration<TFields, TIDField>): EntityDatabaseAdapter<TFields, TIDField>;
5
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StubPostgresDatabaseAdapterProvider = void 0;
4
+ const StubPostgresDatabaseAdapter_1 = require("./StubPostgresDatabaseAdapter");
5
+ class StubPostgresDatabaseAdapterProvider {
6
+ objectCollection = new Map();
7
+ getDatabaseAdapter(entityConfiguration) {
8
+ return new StubPostgresDatabaseAdapter_1.StubPostgresDatabaseAdapter(entityConfiguration, this.objectCollection);
9
+ }
10
+ }
11
+ exports.StubPostgresDatabaseAdapterProvider = StubPostgresDatabaseAdapterProvider;
12
+ //# sourceMappingURL=StubPostgresDatabaseAdapterProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StubPostgresDatabaseAdapterProvider.js","sourceRoot":"","sources":["../../src/StubPostgresDatabaseAdapterProvider.ts"],"names":[],"mappings":";;;AAMA,+EAA4E;AAE5E,MAAa,mCAAmC;IAC7B,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAC;IAE9C,kBAAkB,CAChB,mBAA2D;QAE3D,OAAO,IAAI,yDAA2B,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrF,CAAC;CACF;AARD,kFAQC"}
@@ -0,0 +1,6 @@
1
+ import { EntityCompanionProvider, IEntityMetricsAdapter } from '@expo/entity';
2
+ /**
3
+ * Entity companion provider for use in knex unit tests. All database and cache implementations
4
+ * are replaced with in-memory simulations.
5
+ */
6
+ export declare const createUnitTestPostgresEntityCompanionProvider: (metricsAdapter?: IEntityMetricsAdapter) => EntityCompanionProvider;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createUnitTestPostgresEntityCompanionProvider = void 0;
4
+ const entity_1 = require("@expo/entity");
5
+ const entity_testing_utils_1 = require("@expo/entity-testing-utils");
6
+ const StubPostgresDatabaseAdapterProvider_1 = require("./StubPostgresDatabaseAdapterProvider");
7
+ const queryContextProvider = new entity_testing_utils_1.StubQueryContextProvider();
8
+ /**
9
+ * Entity companion provider for use in knex unit tests. All database and cache implementations
10
+ * are replaced with in-memory simulations.
11
+ */
12
+ const createUnitTestPostgresEntityCompanionProvider = (metricsAdapter = new entity_1.NoOpEntityMetricsAdapter()) => {
13
+ return new entity_1.EntityCompanionProvider(metricsAdapter, new Map([
14
+ [
15
+ 'postgres',
16
+ {
17
+ adapterProvider: new StubPostgresDatabaseAdapterProvider_1.StubPostgresDatabaseAdapterProvider(),
18
+ queryContextProvider,
19
+ },
20
+ ],
21
+ ]), new Map([
22
+ [
23
+ 'redis',
24
+ {
25
+ cacheAdapterProvider: new entity_testing_utils_1.InMemoryFullCacheStubCacheAdapterProvider(),
26
+ },
27
+ ],
28
+ ]));
29
+ };
30
+ exports.createUnitTestPostgresEntityCompanionProvider = createUnitTestPostgresEntityCompanionProvider;
31
+ //# sourceMappingURL=createUnitTestPostgresEntityCompanionProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createUnitTestPostgresEntityCompanionProvider.js","sourceRoot":"","sources":["../../src/createUnitTestPostgresEntityCompanionProvider.ts"],"names":[],"mappings":";;;AAAA,yCAIsB;AACtB,qEAGoC;AAEpC,+FAA4F;AAE5F,MAAM,oBAAoB,GAAG,IAAI,+CAAwB,EAAE,CAAC;AAE5D;;;GAGG;AACI,MAAM,6CAA6C,GAAG,CAC3D,iBAAwC,IAAI,iCAAwB,EAAE,EAC7C,EAAE;IAC3B,OAAO,IAAI,gCAAuB,CAChC,cAAc,EACd,IAAI,GAAG,CAAC;QACN;YACE,UAAU;YACV;gBACE,eAAe,EAAE,IAAI,yEAAmC,EAAE;gBAC1D,oBAAoB;aACrB;SACF;KACF,CAAC,EACF,IAAI,GAAG,CAAC;QACN;YACE,OAAO;YACP;gBACE,oBAAoB,EAAE,IAAI,gEAAyC,EAAE;aACtE;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAvBW,QAAA,6CAA6C,iDAuBxD"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * @module @expo/entity-database-adapter-knex-testing-utils
4
+ */
5
+ export * from './createUnitTestPostgresEntityCompanionProvider';
6
+ export * from './StubPostgresDatabaseAdapter';
7
+ export * from './StubPostgresDatabaseAdapterProvider';
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /* eslint-disable tsdoc/syntax */
3
+ /**
4
+ * @packageDocumentation
5
+ * @module @expo/entity-database-adapter-knex-testing-utils
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ __exportStar(require("./createUnitTestPostgresEntityCompanionProvider"), exports);
23
+ __exportStar(require("./StubPostgresDatabaseAdapter"), exports);
24
+ __exportStar(require("./StubPostgresDatabaseAdapterProvider"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,iCAAiC;AACjC;;;GAGG;;;;;;;;;;;;;;;;AAEH,kFAAgE;AAChE,gEAA8C;AAC9C,wEAAsD"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@expo/entity-database-adapter-knex-testing-utils",
3
+ "version": "0.57.0",
4
+ "description": "Testing utilities for applications using Entity with Knex database adapter",
5
+ "files": [
6
+ "build",
7
+ "!*.tsbuildinfo",
8
+ "!__*",
9
+ "src"
10
+ ],
11
+ "main": "build/src/index.js",
12
+ "types": "build/src/index.d.ts",
13
+ "scripts": {
14
+ "build": "tsc --build",
15
+ "prepack": "rm -rf build && yarn build",
16
+ "clean": "yarn build --clean",
17
+ "lint": "yarn run --top-level eslint src",
18
+ "lint-fix": "yarn run lint --fix",
19
+ "test": "yarn test:all --rootDir $(pwd)"
20
+ },
21
+ "engines": {
22
+ "node": ">=16"
23
+ },
24
+ "keywords": [
25
+ "entity"
26
+ ],
27
+ "author": "Expo",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "@expo/entity": "^0.57.0",
31
+ "@expo/entity-database-adapter-knex": "^0.57.0",
32
+ "invariant": "^2.2.4",
33
+ "uuid": "^13.0.0"
34
+ },
35
+ "peerDependencies": {
36
+ "@jest/globals": "*"
37
+ },
38
+ "devDependencies": {
39
+ "@jest/globals": "30.2.0",
40
+ "@types/invariant": "2.2.37",
41
+ "@types/node": "24.10.13",
42
+ "@types/uuid": "10.0.0",
43
+ "typescript": "5.9.3"
44
+ },
45
+ "gitHead": "e876cfb27bb9b0004d81b40c9067481e3e0c2beb"
46
+ }