@expo/entity-testing-utils 0.41.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 +3 -0
- package/build/PrivacyPolicyRuleTestUtils.d.ts +24 -0
- package/build/PrivacyPolicyRuleTestUtils.js +52 -0
- package/build/PrivacyPolicyRuleTestUtils.js.map +1 -0
- package/build/StubCacheAdapter.d.ts +25 -0
- package/build/StubCacheAdapter.js +103 -0
- package/build/StubCacheAdapter.js.map +1 -0
- package/build/StubDatabaseAdapter.d.ts +23 -0
- package/build/StubDatabaseAdapter.js +158 -0
- package/build/StubDatabaseAdapter.js.map +1 -0
- package/build/StubDatabaseAdapterProvider.d.ts +5 -0
- package/build/StubDatabaseAdapterProvider.js +14 -0
- package/build/StubDatabaseAdapterProvider.js.map +1 -0
- package/build/StubQueryContextProvider.d.ts +6 -0
- package/build/StubQueryContextProvider.js +16 -0
- package/build/StubQueryContextProvider.js.map +1 -0
- package/build/TSMockitoExtensions.d.ts +9 -0
- package/build/TSMockitoExtensions.js +63 -0
- package/build/TSMockitoExtensions.js.map +1 -0
- package/build/createUnitTestEntityCompanionProvider.d.ts +6 -0
- package/build/createUnitTestEntityCompanionProvider.js +35 -0
- package/build/createUnitTestEntityCompanionProvider.js.map +1 -0
- package/build/describeFieldTestCase.d.ts +2 -0
- package/build/describeFieldTestCase.js +18 -0
- package/build/describeFieldTestCase.js.map +1 -0
- package/build/index.d.ts +12 -0
- package/build/index.js +38 -0
- package/build/index.js.map +1 -0
- package/build/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +48 -0
- package/src/PrivacyPolicyRuleTestUtils.ts +138 -0
- package/src/StubCacheAdapter.ts +167 -0
- package/src/StubDatabaseAdapter.ts +249 -0
- package/src/StubDatabaseAdapterProvider.ts +17 -0
- package/src/StubQueryContextProvider.ts +19 -0
- package/src/TSMockitoExtensions.ts +69 -0
- package/src/__testfixtures__/DateIDTestEntity.ts +62 -0
- package/src/__testfixtures__/SimpleTestEntity.ts +95 -0
- package/src/__testfixtures__/TestEntity.ts +130 -0
- package/src/__testfixtures__/TestEntityNumberKey.ts +62 -0
- package/src/__tests__/FileConsistentcyWithEntity-test.ts +32 -0
- package/src/__tests__/PrivacyPolicyRuleTestUtils-test.ts +44 -0
- package/src/__tests__/StubCacheAdapter-test.ts +134 -0
- package/src/__tests__/StubDatabaseAdapter-test.ts +607 -0
- package/src/__tests__/TSMockitoExtensions-test.ts +65 -0
- package/src/createUnitTestEntityCompanionProvider.ts +40 -0
- package/src/describeFieldTestCase.ts +21 -0
- package/src/index.ts +14 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EntityPrivacyPolicyEvaluationContext, EntityQueryContext, ReadonlyEntity, ViewerContext, PrivacyPolicyRule } from '@expo/entity';
|
|
2
|
+
export interface Case<TFields extends Record<string, any>, TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>, TSelectedFields extends keyof TFields> {
|
|
3
|
+
viewerContext: TViewerContext;
|
|
4
|
+
queryContext: EntityQueryContext;
|
|
5
|
+
evaluationContext: EntityPrivacyPolicyEvaluationContext<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
|
|
6
|
+
entity: TEntity;
|
|
7
|
+
}
|
|
8
|
+
export type CaseMap<TFields extends Record<string, any>, TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>, TSelectedFields extends keyof TFields> = Map<string, () => Promise<Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>>>;
|
|
9
|
+
/**
|
|
10
|
+
* Useful for defining test cases that have async preconditions.
|
|
11
|
+
*/
|
|
12
|
+
export declare const describePrivacyPolicyRuleWithAsyncTestCase: <TFields extends Record<string, any>, TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>, TSelectedFields extends keyof TFields = keyof TFields>(privacyPolicyRule: PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>, { allowCases, skipCases, denyCases, }: {
|
|
13
|
+
allowCases?: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
|
|
14
|
+
skipCases?: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
|
|
15
|
+
denyCases?: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
|
|
16
|
+
}) => void;
|
|
17
|
+
/**
|
|
18
|
+
* For test simple privacy rules that don't have complex async preconditions.
|
|
19
|
+
*/
|
|
20
|
+
export declare const describePrivacyPolicyRule: <TFields extends Record<string, any>, TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>, TSelectedFields extends keyof TFields = keyof TFields>(privacyPolicyRule: PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>, { allowCases, skipCases, denyCases, }: {
|
|
21
|
+
allowCases?: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[];
|
|
22
|
+
skipCases?: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[];
|
|
23
|
+
denyCases?: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[];
|
|
24
|
+
}) => void;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.describePrivacyPolicyRule = exports.describePrivacyPolicyRuleWithAsyncTestCase = void 0;
|
|
4
|
+
const entity_1 = require("@expo/entity");
|
|
5
|
+
/**
|
|
6
|
+
* Useful for defining test cases that have async preconditions.
|
|
7
|
+
*/
|
|
8
|
+
const describePrivacyPolicyRuleWithAsyncTestCase = (privacyPolicyRule, { allowCases = new Map(), skipCases = new Map(), denyCases = new Map(), }) => {
|
|
9
|
+
describe(privacyPolicyRule.constructor.name, () => {
|
|
10
|
+
if (allowCases && allowCases.size > 0) {
|
|
11
|
+
describe('allow cases', () => {
|
|
12
|
+
test.each(Array.from(allowCases.keys()))('%p', async (caseKey) => {
|
|
13
|
+
const { viewerContext, queryContext, evaluationContext, entity } = await allowCases.get(caseKey)();
|
|
14
|
+
await expect(privacyPolicyRule.evaluateAsync(viewerContext, queryContext, evaluationContext, entity)).resolves.toEqual(entity_1.RuleEvaluationResult.ALLOW);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (skipCases && skipCases.size > 0) {
|
|
19
|
+
describe('skip cases', () => {
|
|
20
|
+
test.each(Array.from(skipCases.keys()))('%p', async (caseKey) => {
|
|
21
|
+
const { viewerContext, queryContext, evaluationContext, entity } = await skipCases.get(caseKey)();
|
|
22
|
+
await expect(privacyPolicyRule.evaluateAsync(viewerContext, queryContext, evaluationContext, entity)).resolves.toEqual(entity_1.RuleEvaluationResult.SKIP);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (denyCases && denyCases.size > 0) {
|
|
27
|
+
describe('deny cases', () => {
|
|
28
|
+
test.each(Array.from(denyCases.keys()))('%p', async (caseKey) => {
|
|
29
|
+
const { viewerContext, queryContext, evaluationContext, entity } = await denyCases.get(caseKey)();
|
|
30
|
+
await expect(privacyPolicyRule.evaluateAsync(viewerContext, queryContext, evaluationContext, entity)).resolves.toEqual(entity_1.RuleEvaluationResult.DENY);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
exports.describePrivacyPolicyRuleWithAsyncTestCase = describePrivacyPolicyRuleWithAsyncTestCase;
|
|
37
|
+
/**
|
|
38
|
+
* For test simple privacy rules that don't have complex async preconditions.
|
|
39
|
+
*/
|
|
40
|
+
const describePrivacyPolicyRule = (privacyPolicyRule, { allowCases = [], skipCases = [], denyCases = [], }) => {
|
|
41
|
+
const makeCasesMap = (cases) => cases.reduce((acc, testCase, index) => {
|
|
42
|
+
acc.set(`case ${index}`, async () => testCase);
|
|
43
|
+
return acc;
|
|
44
|
+
}, new Map());
|
|
45
|
+
(0, exports.describePrivacyPolicyRuleWithAsyncTestCase)(privacyPolicyRule, {
|
|
46
|
+
allowCases: makeCasesMap(allowCases),
|
|
47
|
+
skipCases: makeCasesMap(skipCases),
|
|
48
|
+
denyCases: makeCasesMap(denyCases),
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
exports.describePrivacyPolicyRule = describePrivacyPolicyRule;
|
|
52
|
+
//# sourceMappingURL=PrivacyPolicyRuleTestUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrivacyPolicyRuleTestUtils.js","sourceRoot":"","sources":["../src/PrivacyPolicyRuleTestUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EntityConfiguration, IEntityCacheAdapter, IEntityCacheAdapterProvider, IEntityLoadKey, IEntityLoadValue, CacheLoadResult } from '@expo/entity';
|
|
2
|
+
export declare class NoCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
|
|
3
|
+
getCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields>(_entityConfiguration: EntityConfiguration<TFields, TIDField>): IEntityCacheAdapter<TFields, TIDField>;
|
|
4
|
+
}
|
|
5
|
+
export declare class NoCacheStubCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields> implements IEntityCacheAdapter<TFields, TIDField> {
|
|
6
|
+
loadManyAsync<TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>, TSerializedLoadValue, TLoadValue extends IEntityLoadValue<TSerializedLoadValue>>(key: TLoadKey, values: readonly TLoadValue[]): Promise<ReadonlyMap<TLoadValue, CacheLoadResult<TFields>>>;
|
|
7
|
+
cacheManyAsync<TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>, TSerializedLoadValue, TLoadValue extends IEntityLoadValue<TSerializedLoadValue>>(_key: TLoadKey, _objectMap: ReadonlyMap<TLoadValue, Readonly<TFields>>): Promise<void>;
|
|
8
|
+
cacheDBMissesAsync<TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>, TSerializedLoadValue, TLoadValue extends IEntityLoadValue<TSerializedLoadValue>>(_key: TLoadKey, _values: readonly TLoadValue[]): Promise<void>;
|
|
9
|
+
invalidateManyAsync<TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>, TSerializedLoadValue, TLoadValue extends IEntityLoadValue<TSerializedLoadValue>>(_key: TLoadKey, _values: readonly TLoadValue[]): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare const DOES_NOT_EXIST: unique symbol;
|
|
12
|
+
export declare class InMemoryFullCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
|
|
13
|
+
private readonly cache;
|
|
14
|
+
getCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields>(entityConfiguration: EntityConfiguration<TFields, TIDField>): IEntityCacheAdapter<TFields, TIDField>;
|
|
15
|
+
}
|
|
16
|
+
export declare class InMemoryFullCacheStubCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields> implements IEntityCacheAdapter<TFields, TIDField> {
|
|
17
|
+
private readonly entityConfiguration;
|
|
18
|
+
private readonly cache;
|
|
19
|
+
constructor(entityConfiguration: EntityConfiguration<TFields, TIDField>, cache: Map<string, Readonly<TFields> | typeof DOES_NOT_EXIST>);
|
|
20
|
+
loadManyAsync<TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>, TSerializedLoadValue, TLoadValue extends IEntityLoadValue<TSerializedLoadValue>>(key: TLoadKey, values: readonly TLoadValue[]): Promise<ReadonlyMap<TLoadValue, CacheLoadResult<TFields>>>;
|
|
21
|
+
cacheManyAsync<TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>, TSerializedLoadValue, TLoadValue extends IEntityLoadValue<TSerializedLoadValue>>(key: TLoadKey, objectMap: ReadonlyMap<TLoadValue, Readonly<TFields>>): Promise<void>;
|
|
22
|
+
cacheDBMissesAsync<TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>, TSerializedLoadValue, TLoadValue extends IEntityLoadValue<TSerializedLoadValue>>(key: TLoadKey, values: readonly TLoadValue[]): Promise<void>;
|
|
23
|
+
invalidateManyAsync<TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>, TSerializedLoadValue, TLoadValue extends IEntityLoadValue<TSerializedLoadValue>>(key: TLoadKey, values: readonly TLoadValue[]): Promise<void>;
|
|
24
|
+
private createCacheKey;
|
|
25
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
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.InMemoryFullCacheStubCacheAdapter = exports.InMemoryFullCacheStubCacheAdapterProvider = exports.DOES_NOT_EXIST = exports.NoCacheStubCacheAdapter = exports.NoCacheStubCacheAdapterProvider = void 0;
|
|
7
|
+
const entity_1 = require("@expo/entity");
|
|
8
|
+
const invariant_1 = __importDefault(require("invariant"));
|
|
9
|
+
class NoCacheStubCacheAdapterProvider {
|
|
10
|
+
getCacheAdapter(_entityConfiguration) {
|
|
11
|
+
return new NoCacheStubCacheAdapter();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.NoCacheStubCacheAdapterProvider = NoCacheStubCacheAdapterProvider;
|
|
15
|
+
class NoCacheStubCacheAdapter {
|
|
16
|
+
async loadManyAsync(key, values) {
|
|
17
|
+
return values.reduce((acc, v) => {
|
|
18
|
+
acc.set(v, {
|
|
19
|
+
status: entity_1.CacheStatus.MISS,
|
|
20
|
+
});
|
|
21
|
+
return acc;
|
|
22
|
+
}, key.vendNewLoadValueMap());
|
|
23
|
+
}
|
|
24
|
+
async cacheManyAsync(_key, _objectMap) { }
|
|
25
|
+
async cacheDBMissesAsync(_key, _values) { }
|
|
26
|
+
async invalidateManyAsync(_key, _values) { }
|
|
27
|
+
}
|
|
28
|
+
exports.NoCacheStubCacheAdapter = NoCacheStubCacheAdapter;
|
|
29
|
+
// Sentinel value we store in the in-memory cache to negatively cache a database miss.
|
|
30
|
+
// The sentinel value is distinct from any (positively) cached value.
|
|
31
|
+
exports.DOES_NOT_EXIST = Symbol('inMemoryCacheDoesNotExistValue');
|
|
32
|
+
class InMemoryFullCacheStubCacheAdapterProvider {
|
|
33
|
+
cache = new Map();
|
|
34
|
+
getCacheAdapter(entityConfiguration) {
|
|
35
|
+
return new InMemoryFullCacheStubCacheAdapter(entityConfiguration, this.cache);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.InMemoryFullCacheStubCacheAdapterProvider = InMemoryFullCacheStubCacheAdapterProvider;
|
|
39
|
+
class InMemoryFullCacheStubCacheAdapter {
|
|
40
|
+
entityConfiguration;
|
|
41
|
+
cache;
|
|
42
|
+
constructor(entityConfiguration, cache) {
|
|
43
|
+
this.entityConfiguration = entityConfiguration;
|
|
44
|
+
this.cache = cache;
|
|
45
|
+
}
|
|
46
|
+
async loadManyAsync(key, values) {
|
|
47
|
+
const results = key.vendNewLoadValueMap();
|
|
48
|
+
values.forEach((value) => {
|
|
49
|
+
const cacheKey = this.createCacheKey(key, value);
|
|
50
|
+
if (!this.cache.has(cacheKey)) {
|
|
51
|
+
results.set(value, {
|
|
52
|
+
status: entity_1.CacheStatus.MISS,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const objectForFieldValue = this.cache.get(cacheKey);
|
|
57
|
+
(0, invariant_1.default)(objectForFieldValue !== undefined, 'should have set value for key');
|
|
58
|
+
if (objectForFieldValue === exports.DOES_NOT_EXIST) {
|
|
59
|
+
results.set(value, {
|
|
60
|
+
status: entity_1.CacheStatus.NEGATIVE,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
results.set(value, {
|
|
65
|
+
status: entity_1.CacheStatus.HIT,
|
|
66
|
+
item: objectForFieldValue,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return results;
|
|
72
|
+
}
|
|
73
|
+
async cacheManyAsync(key, objectMap) {
|
|
74
|
+
objectMap.forEach((obj, value) => {
|
|
75
|
+
const cacheKey = this.createCacheKey(key, value);
|
|
76
|
+
this.cache.set(cacheKey, obj);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async cacheDBMissesAsync(key, values) {
|
|
80
|
+
values.forEach((value) => {
|
|
81
|
+
const cacheKey = this.createCacheKey(key, value);
|
|
82
|
+
this.cache.set(cacheKey, exports.DOES_NOT_EXIST);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async invalidateManyAsync(key, values) {
|
|
86
|
+
values.forEach((value) => {
|
|
87
|
+
const cacheKey = this.createCacheKey(key, value);
|
|
88
|
+
this.cache.delete(cacheKey);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
createCacheKey(key, value) {
|
|
92
|
+
const cacheKeyType = key.getLoadMethodType();
|
|
93
|
+
const parts = key.createCacheKeyPartsForLoadValue(this.entityConfiguration, value);
|
|
94
|
+
return [
|
|
95
|
+
this.entityConfiguration.tableName,
|
|
96
|
+
cacheKeyType,
|
|
97
|
+
`v${this.entityConfiguration.cacheKeyVersion}`,
|
|
98
|
+
...parts,
|
|
99
|
+
].join(':');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.InMemoryFullCacheStubCacheAdapter = InMemoryFullCacheStubCacheAdapter;
|
|
103
|
+
//# sourceMappingURL=StubCacheAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StubCacheAdapter.js","sourceRoot":"","sources":["../src/StubCacheAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { EntityConfiguration, EntityDatabaseAdapter, TableFieldSingleValueEqualityCondition, TableFieldMultiValueEqualityCondition, TableQuerySelectionModifiers, FieldTransformerMap } from '@expo/entity';
|
|
2
|
+
export default class StubDatabaseAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields> extends EntityDatabaseAdapter<TFields, TIDField> {
|
|
3
|
+
private readonly entityConfiguration2;
|
|
4
|
+
private readonly dataStore;
|
|
5
|
+
constructor(entityConfiguration2: EntityConfiguration<TFields, TIDField>, dataStore: Map<string, Readonly<{
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}>[]>);
|
|
8
|
+
static convertFieldObjectsToDataStore<TFields extends Record<string, any>, TIDField extends keyof TFields>(entityConfiguration: EntityConfiguration<TFields, TIDField>, dataStore: Map<string, Readonly<TFields>[]>): Map<string, Readonly<{
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}>[]>;
|
|
11
|
+
getObjectCollectionForTable(tableName: string): {
|
|
12
|
+
[key: string]: any;
|
|
13
|
+
}[];
|
|
14
|
+
protected getFieldTransformerMap(): FieldTransformerMap;
|
|
15
|
+
protected fetchManyWhereInternalAsync(_queryInterface: any, tableName: string, tableColumns: readonly string[], tableTuples: (readonly any[])[]): Promise<object[]>;
|
|
16
|
+
private static compareByOrderBys;
|
|
17
|
+
protected fetchManyByFieldEqualityConjunctionInternalAsync(_queryInterface: any, tableName: string, tableFieldSingleValueEqualityOperands: TableFieldSingleValueEqualityCondition[], tableFieldMultiValueEqualityOperands: TableFieldMultiValueEqualityCondition[], querySelectionModifiers: TableQuerySelectionModifiers): Promise<object[]>;
|
|
18
|
+
protected fetchManyByRawWhereClauseInternalAsync(_queryInterface: any, _tableName: string, _rawWhereClause: string, _bindings: object | any[], _querySelectionModifiers: TableQuerySelectionModifiers): Promise<object[]>;
|
|
19
|
+
private generateRandomID;
|
|
20
|
+
protected insertInternalAsync(_queryInterface: any, tableName: string, object: object): Promise<object[]>;
|
|
21
|
+
protected updateInternalAsync(_queryInterface: any, tableName: string, tableIdField: string, id: any, object: object): Promise<object[]>;
|
|
22
|
+
protected deleteInternalAsync(_queryInterface: any, tableName: string, tableIdField: string, id: any): Promise<number>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
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
|
+
const entity_1 = require("@expo/entity");
|
|
7
|
+
const invariant_1 = __importDefault(require("invariant"));
|
|
8
|
+
const uuidv7_1 = require("uuidv7");
|
|
9
|
+
class StubDatabaseAdapter extends entity_1.EntityDatabaseAdapter {
|
|
10
|
+
entityConfiguration2;
|
|
11
|
+
dataStore;
|
|
12
|
+
constructor(entityConfiguration2, dataStore) {
|
|
13
|
+
super(entityConfiguration2);
|
|
14
|
+
this.entityConfiguration2 = entityConfiguration2;
|
|
15
|
+
this.dataStore = dataStore;
|
|
16
|
+
}
|
|
17
|
+
static convertFieldObjectsToDataStore(entityConfiguration, dataStore) {
|
|
18
|
+
return (0, entity_1.mapMap)(dataStore, (objectsForTable) => objectsForTable.map((objectForTable) => (0, entity_1.transformFieldsToDatabaseObject)(entityConfiguration, new Map(), objectForTable)));
|
|
19
|
+
}
|
|
20
|
+
getObjectCollectionForTable(tableName) {
|
|
21
|
+
return (0, entity_1.computeIfAbsent)(this.dataStore, tableName, () => []);
|
|
22
|
+
}
|
|
23
|
+
getFieldTransformerMap() {
|
|
24
|
+
return new Map();
|
|
25
|
+
}
|
|
26
|
+
async fetchManyWhereInternalAsync(_queryInterface, tableName, tableColumns, tableTuples) {
|
|
27
|
+
const objectCollection = this.getObjectCollectionForTable(tableName);
|
|
28
|
+
const results = tableTuples.reduce((acc, tableTuple) => {
|
|
29
|
+
return acc.concat(objectCollection.filter((obj) => {
|
|
30
|
+
return tableColumns.every((tableColumn, index) => {
|
|
31
|
+
return obj[tableColumn] === tableTuple[index];
|
|
32
|
+
});
|
|
33
|
+
}));
|
|
34
|
+
}, []);
|
|
35
|
+
return [...results];
|
|
36
|
+
}
|
|
37
|
+
static compareByOrderBys(orderBys, objectA, objectB) {
|
|
38
|
+
if (orderBys.length === 0) {
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
const currentOrderBy = orderBys[0];
|
|
42
|
+
const aField = objectA[currentOrderBy.columnName];
|
|
43
|
+
const bField = objectB[currentOrderBy.columnName];
|
|
44
|
+
switch (currentOrderBy.order) {
|
|
45
|
+
case entity_1.OrderByOrdering.DESCENDING: {
|
|
46
|
+
// simulate NULLS FIRST for DESC
|
|
47
|
+
if (aField === null && bField === null) {
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
else if (aField === null) {
|
|
51
|
+
return -1;
|
|
52
|
+
}
|
|
53
|
+
else if (bField === null) {
|
|
54
|
+
return 1;
|
|
55
|
+
}
|
|
56
|
+
return aField > bField
|
|
57
|
+
? -1
|
|
58
|
+
: aField < bField
|
|
59
|
+
? 1
|
|
60
|
+
: this.compareByOrderBys(orderBys.slice(1), objectA, objectB);
|
|
61
|
+
}
|
|
62
|
+
case entity_1.OrderByOrdering.ASCENDING: {
|
|
63
|
+
// simulate NULLS LAST for ASC
|
|
64
|
+
if (aField === null && bField === null) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
else if (bField === null) {
|
|
68
|
+
return -1;
|
|
69
|
+
}
|
|
70
|
+
else if (aField === null) {
|
|
71
|
+
return 1;
|
|
72
|
+
}
|
|
73
|
+
return bField > aField
|
|
74
|
+
? -1
|
|
75
|
+
: bField < aField
|
|
76
|
+
? 1
|
|
77
|
+
: this.compareByOrderBys(orderBys.slice(1), objectA, objectB);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async fetchManyByFieldEqualityConjunctionInternalAsync(_queryInterface, tableName, tableFieldSingleValueEqualityOperands, tableFieldMultiValueEqualityOperands, querySelectionModifiers) {
|
|
82
|
+
let filteredObjects = this.getObjectCollectionForTable(tableName);
|
|
83
|
+
for (const { tableField, tableValue } of tableFieldSingleValueEqualityOperands) {
|
|
84
|
+
filteredObjects = filteredObjects.filter((obj) => obj[tableField] === tableValue);
|
|
85
|
+
}
|
|
86
|
+
for (const { tableField, tableValues } of tableFieldMultiValueEqualityOperands) {
|
|
87
|
+
filteredObjects = filteredObjects.filter((obj) => tableValues.includes(obj[tableField]));
|
|
88
|
+
}
|
|
89
|
+
const orderBy = querySelectionModifiers.orderBy;
|
|
90
|
+
if (orderBy !== undefined) {
|
|
91
|
+
filteredObjects = filteredObjects.sort((a, b) => StubDatabaseAdapter.compareByOrderBys(orderBy, a, b));
|
|
92
|
+
}
|
|
93
|
+
const offset = querySelectionModifiers.offset;
|
|
94
|
+
if (offset !== undefined) {
|
|
95
|
+
filteredObjects = filteredObjects.slice(offset);
|
|
96
|
+
}
|
|
97
|
+
const limit = querySelectionModifiers.limit;
|
|
98
|
+
if (limit !== undefined) {
|
|
99
|
+
filteredObjects = filteredObjects.slice(0, 0 + limit);
|
|
100
|
+
}
|
|
101
|
+
return filteredObjects;
|
|
102
|
+
}
|
|
103
|
+
fetchManyByRawWhereClauseInternalAsync(_queryInterface, _tableName, _rawWhereClause, _bindings, _querySelectionModifiers) {
|
|
104
|
+
throw new Error('Raw WHERE clauses not supported for StubDatabaseAdapter');
|
|
105
|
+
}
|
|
106
|
+
generateRandomID() {
|
|
107
|
+
const idSchemaField = this.entityConfiguration2.schema.get(this.entityConfiguration2.idField);
|
|
108
|
+
(0, invariant_1.default)(idSchemaField, `No schema field found for ${String(this.entityConfiguration2.idField)}`);
|
|
109
|
+
if (idSchemaField instanceof entity_1.StringField) {
|
|
110
|
+
return (0, uuidv7_1.uuidv7)();
|
|
111
|
+
}
|
|
112
|
+
else if (idSchemaField instanceof entity_1.IntField) {
|
|
113
|
+
return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
throw new Error(`Unsupported ID type for StubDatabaseAdapter: ${idSchemaField.constructor.name}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async insertInternalAsync(_queryInterface, tableName, object) {
|
|
120
|
+
const objectCollection = this.getObjectCollectionForTable(tableName);
|
|
121
|
+
const idField = (0, entity_1.getDatabaseFieldForEntityField)(this.entityConfiguration2, this.entityConfiguration2.idField);
|
|
122
|
+
const objectToInsert = {
|
|
123
|
+
[idField]: this.generateRandomID(),
|
|
124
|
+
...object,
|
|
125
|
+
};
|
|
126
|
+
objectCollection.push(objectToInsert);
|
|
127
|
+
return [objectToInsert];
|
|
128
|
+
}
|
|
129
|
+
async updateInternalAsync(_queryInterface, tableName, tableIdField, id, object) {
|
|
130
|
+
// SQL does not support empty updates, mirror behavior here for better test simulation
|
|
131
|
+
if (Object.keys(object).length === 0) {
|
|
132
|
+
throw new Error(`Empty update (${tableIdField} = ${id})`);
|
|
133
|
+
}
|
|
134
|
+
const objectCollection = this.getObjectCollectionForTable(tableName);
|
|
135
|
+
const objectIndex = objectCollection.findIndex((obj) => {
|
|
136
|
+
return obj[tableIdField] === id;
|
|
137
|
+
});
|
|
138
|
+
(0, invariant_1.default)(objectIndex >= 0, 'should exist');
|
|
139
|
+
objectCollection[objectIndex] = {
|
|
140
|
+
...objectCollection[objectIndex],
|
|
141
|
+
...object,
|
|
142
|
+
};
|
|
143
|
+
return [objectCollection[objectIndex]];
|
|
144
|
+
}
|
|
145
|
+
async deleteInternalAsync(_queryInterface, tableName, tableIdField, id) {
|
|
146
|
+
const objectCollection = this.getObjectCollectionForTable(tableName);
|
|
147
|
+
const objectIndex = objectCollection.findIndex((obj) => {
|
|
148
|
+
return obj[tableIdField] === id;
|
|
149
|
+
});
|
|
150
|
+
if (objectIndex < 0) {
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
objectCollection.splice(objectIndex, 1);
|
|
154
|
+
return 1;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.default = StubDatabaseAdapter;
|
|
158
|
+
//# sourceMappingURL=StubDatabaseAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StubDatabaseAdapter.js","sourceRoot":"","sources":["../src/StubDatabaseAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { EntityConfiguration, EntityDatabaseAdapter, IEntityDatabaseAdapterProvider } from '@expo/entity';
|
|
2
|
+
export default class StubDatabaseAdapterProvider 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,14 @@
|
|
|
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
|
+
const StubDatabaseAdapter_1 = __importDefault(require("./StubDatabaseAdapter"));
|
|
7
|
+
class StubDatabaseAdapterProvider {
|
|
8
|
+
objectCollection = new Map();
|
|
9
|
+
getDatabaseAdapter(entityConfiguration) {
|
|
10
|
+
return new StubDatabaseAdapter_1.default(entityConfiguration, this.objectCollection);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.default = StubDatabaseAdapterProvider;
|
|
14
|
+
//# sourceMappingURL=StubDatabaseAdapterProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StubDatabaseAdapterProvider.js","sourceRoot":"","sources":["../src/StubDatabaseAdapterProvider.ts"],"names":[],"mappings":";;;;;AAMA,gFAAwD;AAExD,MAAqB,2BAA2B;IAC7B,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAC;IAE9C,kBAAkB,CAChB,mBAA2D;QAE3D,OAAO,IAAI,6BAAmB,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7E,CAAC;CACF;AARD,8CAQC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TransactionConfig, EntityQueryContextProvider } from '@expo/entity';
|
|
2
|
+
export default class StubQueryContextProvider extends EntityQueryContextProvider {
|
|
3
|
+
protected getQueryInterface(): any;
|
|
4
|
+
protected createTransactionRunner<T>(_transactionConfig?: TransactionConfig): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
5
|
+
protected createNestedTransactionRunner<T>(_outerQueryInterface: any): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const entity_1 = require("@expo/entity");
|
|
4
|
+
class StubQueryContextProvider extends entity_1.EntityQueryContextProvider {
|
|
5
|
+
getQueryInterface() {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
createTransactionRunner(_transactionConfig) {
|
|
9
|
+
return (transactionScope) => Promise.resolve(transactionScope({}));
|
|
10
|
+
}
|
|
11
|
+
createNestedTransactionRunner(_outerQueryInterface) {
|
|
12
|
+
return (transactionScope) => Promise.resolve(transactionScope({}));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.default = StubQueryContextProvider;
|
|
16
|
+
//# sourceMappingURL=StubQueryContextProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StubQueryContextProvider.js","sourceRoot":"","sources":["../src/StubQueryContextProvider.ts"],"names":[],"mappings":";;AAAA,yCAA6E;AAE7E,MAAqB,wBAAyB,SAAQ,mCAA0B;IACpE,iBAAiB;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAES,uBAAuB,CAC/B,kBAAsC;QAEtC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAES,6BAA6B,CACrC,oBAAyB;QAEzB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;CACF;AAhBD,2CAgBC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Matcher } from 'ts-mockito/lib/matcher/type/Matcher';
|
|
2
|
+
export declare function isEqualWithEntityAware(expected: any, actual: any): boolean;
|
|
3
|
+
export declare class DeepEqualEntityAwareMatcher<T> extends Matcher {
|
|
4
|
+
private readonly expectedValue;
|
|
5
|
+
constructor(expectedValue: T);
|
|
6
|
+
match(value: any): boolean;
|
|
7
|
+
toString(): string;
|
|
8
|
+
}
|
|
9
|
+
export declare function deepEqualEntityAware<T>(expectedValue: T): T;
|
|
@@ -0,0 +1,63 @@
|
|
|
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.DeepEqualEntityAwareMatcher = void 0;
|
|
7
|
+
exports.isEqualWithEntityAware = isEqualWithEntityAware;
|
|
8
|
+
exports.deepEqualEntityAware = deepEqualEntityAware;
|
|
9
|
+
const entity_1 = require("@expo/entity");
|
|
10
|
+
const isEqualWith_1 = __importDefault(require("lodash/isEqualWith"));
|
|
11
|
+
const Matcher_1 = require("ts-mockito/lib/matcher/type/Matcher");
|
|
12
|
+
function isEqualWithEntityAware(expected, actual) {
|
|
13
|
+
return (0, isEqualWith_1.default)(expected, actual, (expected, actual) => {
|
|
14
|
+
if (expected instanceof Matcher_1.Matcher) {
|
|
15
|
+
return expected.match(actual);
|
|
16
|
+
}
|
|
17
|
+
if (expected instanceof entity_1.SingleFieldHolder && actual instanceof entity_1.SingleFieldHolder) {
|
|
18
|
+
return expected.fieldName === actual.fieldName;
|
|
19
|
+
}
|
|
20
|
+
if (expected instanceof entity_1.SingleFieldValueHolder && actual instanceof entity_1.SingleFieldValueHolder) {
|
|
21
|
+
return expected.fieldValue === actual.fieldValue;
|
|
22
|
+
}
|
|
23
|
+
if (expected instanceof entity_1.CompositeFieldHolder && actual instanceof entity_1.CompositeFieldHolder) {
|
|
24
|
+
return expected.serialize() === actual.serialize();
|
|
25
|
+
}
|
|
26
|
+
if (expected instanceof entity_1.CompositeFieldValueHolder &&
|
|
27
|
+
actual instanceof entity_1.CompositeFieldValueHolder) {
|
|
28
|
+
return expected.serialize() === actual.serialize();
|
|
29
|
+
}
|
|
30
|
+
if (expected instanceof entity_1.SerializableKeyMap && actual instanceof entity_1.SerializableKeyMap) {
|
|
31
|
+
for (const [key, value] of expected.entries()) {
|
|
32
|
+
if (!actual.has(key) || !(0, isEqualWith_1.default)(value, actual.get(key))) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
class DeepEqualEntityAwareMatcher extends Matcher_1.Matcher {
|
|
42
|
+
expectedValue;
|
|
43
|
+
constructor(expectedValue) {
|
|
44
|
+
super();
|
|
45
|
+
this.expectedValue = expectedValue;
|
|
46
|
+
}
|
|
47
|
+
match(value) {
|
|
48
|
+
return isEqualWithEntityAware(this.expectedValue, value);
|
|
49
|
+
}
|
|
50
|
+
toString() {
|
|
51
|
+
if (this.expectedValue instanceof Array) {
|
|
52
|
+
return `deepEqualEntityAware([${this.expectedValue}])`;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
return `deepEqualEntityAware(${this.expectedValue})`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.DeepEqualEntityAwareMatcher = DeepEqualEntityAwareMatcher;
|
|
60
|
+
function deepEqualEntityAware(expectedValue) {
|
|
61
|
+
return new DeepEqualEntityAwareMatcher(expectedValue);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=TSMockitoExtensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TSMockitoExtensions.js","sourceRoot":"","sources":["../src/TSMockitoExtensions.ts"],"names":[],"mappings":";;;;;;AAUA,wDAoCC;AAoBD,oDAEC;AApED,yCAMsB;AACtB,qEAA6C;AAC7C,iEAA8D;AAE9D,SAAgB,sBAAsB,CAAC,QAAa,EAAE,MAAW;IAC/D,OAAO,IAAA,qBAAW,EAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,QAAa,EAAE,MAAW,EAAuB,EAAE;QACvF,IAAI,QAAQ,YAAY,iBAAO,EAAE,CAAC;YAChC,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,QAAQ,YAAY,0BAAiB,IAAI,MAAM,YAAY,0BAAiB,EAAE,CAAC;YACjF,OAAO,QAAQ,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,CAAC;QACjD,CAAC;QAED,IAAI,QAAQ,YAAY,+BAAsB,IAAI,MAAM,YAAY,+BAAsB,EAAE,CAAC;YAC3F,OAAO,QAAQ,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,CAAC;QACnD,CAAC;QAED,IAAI,QAAQ,YAAY,6BAAoB,IAAI,MAAM,YAAY,6BAAoB,EAAE,CAAC;YACvF,OAAO,QAAQ,CAAC,SAAS,EAAE,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QACrD,CAAC;QAED,IACE,QAAQ,YAAY,kCAAyB;YAC7C,MAAM,YAAY,kCAAyB,EAC3C,CAAC;YACD,OAAO,QAAQ,CAAC,SAAS,EAAE,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,QAAQ,YAAY,2BAAkB,IAAI,MAAM,YAAY,2BAAkB,EAAE,CAAC;YACnF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAA,qBAAW,EAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBAC7D,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAa,2BAA+B,SAAQ,iBAAO;IAC5B;IAA7B,YAA6B,aAAgB;QAC3C,KAAK,EAAE,CAAC;QADmB,kBAAa,GAAb,aAAa,CAAG;IAE7C,CAAC;IAEe,KAAK,CAAC,KAAU;QAC9B,OAAO,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAEe,QAAQ;QACtB,IAAI,IAAI,CAAC,aAAa,YAAY,KAAK,EAAE,CAAC;YACxC,OAAO,yBAAyB,IAAI,CAAC,aAAa,IAAI,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,OAAO,wBAAwB,IAAI,CAAC,aAAa,GAAG,CAAC;QACvD,CAAC;IACH,CAAC;CACF;AAhBD,kEAgBC;AAED,SAAgB,oBAAoB,CAAI,aAAgB;IACtD,OAAO,IAAI,2BAA2B,CAAC,aAAa,CAAQ,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { EntityCompanionProvider, IEntityMetricsAdapter } from '@expo/entity';
|
|
2
|
+
/**
|
|
3
|
+
* Entity companion provider for use in unit tests. All database and cache implementations
|
|
4
|
+
* are replaced with in-memory simulations.
|
|
5
|
+
*/
|
|
6
|
+
export declare const createUnitTestEntityCompanionProvider: (metricsAdapter?: IEntityMetricsAdapter) => EntityCompanionProvider;
|
|
@@ -0,0 +1,35 @@
|
|
|
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.createUnitTestEntityCompanionProvider = void 0;
|
|
7
|
+
const entity_1 = require("@expo/entity");
|
|
8
|
+
const StubCacheAdapter_1 = require("./StubCacheAdapter");
|
|
9
|
+
const StubDatabaseAdapterProvider_1 = __importDefault(require("./StubDatabaseAdapterProvider"));
|
|
10
|
+
const StubQueryContextProvider_1 = __importDefault(require("./StubQueryContextProvider"));
|
|
11
|
+
const queryContextProvider = new StubQueryContextProvider_1.default();
|
|
12
|
+
/**
|
|
13
|
+
* Entity companion provider for use in unit tests. All database and cache implementations
|
|
14
|
+
* are replaced with in-memory simulations.
|
|
15
|
+
*/
|
|
16
|
+
const createUnitTestEntityCompanionProvider = (metricsAdapter = new entity_1.NoOpEntityMetricsAdapter()) => {
|
|
17
|
+
return new entity_1.EntityCompanionProvider(metricsAdapter, new Map([
|
|
18
|
+
[
|
|
19
|
+
'postgres',
|
|
20
|
+
{
|
|
21
|
+
adapterProvider: new StubDatabaseAdapterProvider_1.default(),
|
|
22
|
+
queryContextProvider,
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
]), new Map([
|
|
26
|
+
[
|
|
27
|
+
'redis',
|
|
28
|
+
{
|
|
29
|
+
cacheAdapterProvider: new StubCacheAdapter_1.InMemoryFullCacheStubCacheAdapterProvider(),
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
]));
|
|
33
|
+
};
|
|
34
|
+
exports.createUnitTestEntityCompanionProvider = createUnitTestEntityCompanionProvider;
|
|
35
|
+
//# sourceMappingURL=createUnitTestEntityCompanionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createUnitTestEntityCompanionProvider.js","sourceRoot":"","sources":["../src/createUnitTestEntityCompanionProvider.ts"],"names":[],"mappings":";;;;;;AAAA,yCAIsB;AAEtB,yDAA+E;AAC/E,gGAAwE;AACxE,0FAAkE;AAElE,MAAM,oBAAoB,GAAG,IAAI,kCAAwB,EAAE,CAAC;AAE5D;;;GAGG;AACI,MAAM,qCAAqC,GAAG,CACnD,iBAAwC,IAAI,iCAAwB,EAAE,EAC7C,EAAE;IAC3B,OAAO,IAAI,gCAAuB,CAChC,cAAc,EACd,IAAI,GAAG,CAAC;QACN;YACE,UAAU;YACV;gBACE,eAAe,EAAE,IAAI,qCAA2B,EAAE;gBAClD,oBAAoB;aACrB;SACF;KACF,CAAC,EACF,IAAI,GAAG,CAAC;QACN;YACE,OAAO;YACP;gBACE,oBAAoB,EAAE,IAAI,4DAAyC,EAAE;aACtE;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAvBW,QAAA,qCAAqC,yCAuBhD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = describeFieldTestCase;
|
|
4
|
+
function describeFieldTestCase(fieldDefinition, validValues, invalidValues) {
|
|
5
|
+
describe(fieldDefinition.constructor.name, () => {
|
|
6
|
+
if (validValues.length > 0) {
|
|
7
|
+
test.each(validValues)(`${fieldDefinition.constructor.name}.valid %p`, (value) => {
|
|
8
|
+
expect(fieldDefinition.validateInputValue(value)).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
if (invalidValues.length > 0) {
|
|
12
|
+
test.each(invalidValues)(`${fieldDefinition.constructor.name}.invalid %p`, (value) => {
|
|
13
|
+
expect(fieldDefinition.validateInputValue(value)).toBe(false);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=describeFieldTestCase.js.map
|