@wix/patterns-cms 1.1.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/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js +436 -0
- package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/cmsPermissions.spec.js +175 -0
- package/dist/cjs/adapter/__tests__/cmsPermissions.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js +440 -0
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js +426 -0
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/getFieldKey.spec.js +24 -0
- package/dist/cjs/adapter/__tests__/getFieldKey.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/loadCmsSchema.spec.js +166 -0
- package/dist/cjs/adapter/__tests__/loadCmsSchema.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/searchUtils.spec.js +116 -0
- package/dist/cjs/adapter/__tests__/searchUtils.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/sortUtils.spec.js +118 -0
- package/dist/cjs/adapter/__tests__/sortUtils.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js +210 -0
- package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/wixDataQueryRecorder.js +54 -0
- package/dist/cjs/adapter/__tests__/wixDataQueryRecorder.js.map +1 -0
- package/dist/cjs/adapter/cmsBackup.js +52 -0
- package/dist/cjs/adapter/cmsBackup.js.map +1 -0
- package/dist/cjs/adapter/cmsFieldTypeMap.js +43 -0
- package/dist/cjs/adapter/cmsFieldTypeMap.js.map +1 -0
- package/dist/cjs/adapter/cmsPermissions.js +94 -0
- package/dist/cjs/adapter/cmsPermissions.js.map +1 -0
- package/dist/cjs/adapter/constants.js +20 -0
- package/dist/cjs/adapter/constants.js.map +1 -0
- package/dist/cjs/adapter/createCmsBackend.js +131 -0
- package/dist/cjs/adapter/createCmsBackend.js.map +1 -0
- package/dist/cjs/adapter/createCmsFieldActions.js +182 -0
- package/dist/cjs/adapter/createCmsFieldActions.js.map +1 -0
- package/dist/cjs/adapter/fetchExternalDbConnections.js +24 -0
- package/dist/cjs/adapter/fetchExternalDbConnections.js.map +1 -0
- package/dist/cjs/adapter/fetchUserPermissions.js +24 -0
- package/dist/cjs/adapter/fetchUserPermissions.js.map +1 -0
- package/dist/cjs/adapter/filterUtils.js +128 -0
- package/dist/cjs/adapter/filterUtils.js.map +1 -0
- package/dist/cjs/adapter/getFieldKey.js +19 -0
- package/dist/cjs/adapter/getFieldKey.js.map +1 -0
- package/dist/cjs/adapter/index.js +36 -0
- package/dist/cjs/adapter/index.js.map +1 -0
- package/dist/cjs/adapter/loadCmsSchema.js +51 -0
- package/dist/cjs/adapter/loadCmsSchema.js.map +1 -0
- package/dist/cjs/adapter/pollUntilReady.js +30 -0
- package/dist/cjs/adapter/pollUntilReady.js.map +1 -0
- package/dist/cjs/adapter/searchUtils.js +32 -0
- package/dist/cjs/adapter/searchUtils.js.map +1 -0
- package/dist/cjs/adapter/sortUtils.js +34 -0
- package/dist/cjs/adapter/sortUtils.js.map +1 -0
- package/dist/cjs/adapter/transformCmsSchema.js +75 -0
- package/dist/cjs/adapter/transformCmsSchema.js.map +1 -0
- package/dist/cjs/index.js +10 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js +335 -0
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/cmsPermissions.spec.js +173 -0
- package/dist/esm/adapter/__tests__/cmsPermissions.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js +307 -0
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/filterUtils.spec.js +298 -0
- package/dist/esm/adapter/__tests__/filterUtils.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/getFieldKey.spec.js +22 -0
- package/dist/esm/adapter/__tests__/getFieldKey.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/loadCmsSchema.spec.js +147 -0
- package/dist/esm/adapter/__tests__/loadCmsSchema.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/searchUtils.spec.js +109 -0
- package/dist/esm/adapter/__tests__/searchUtils.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/sortUtils.spec.js +85 -0
- package/dist/esm/adapter/__tests__/sortUtils.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/transformCmsSchema.spec.js +201 -0
- package/dist/esm/adapter/__tests__/transformCmsSchema.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/wixDataQueryRecorder.js +42 -0
- package/dist/esm/adapter/__tests__/wixDataQueryRecorder.js.map +1 -0
- package/dist/esm/adapter/cmsBackup.js +34 -0
- package/dist/esm/adapter/cmsBackup.js.map +1 -0
- package/dist/esm/adapter/cmsFieldTypeMap.js +37 -0
- package/dist/esm/adapter/cmsFieldTypeMap.js.map +1 -0
- package/dist/esm/adapter/cmsPermissions.js +91 -0
- package/dist/esm/adapter/cmsPermissions.js.map +1 -0
- package/dist/esm/adapter/constants.js +25 -0
- package/dist/esm/adapter/constants.js.map +1 -0
- package/dist/esm/adapter/createCmsBackend.js +113 -0
- package/dist/esm/adapter/createCmsBackend.js.map +1 -0
- package/dist/esm/adapter/createCmsFieldActions.js +159 -0
- package/dist/esm/adapter/createCmsFieldActions.js.map +1 -0
- package/dist/esm/adapter/fetchExternalDbConnections.js +17 -0
- package/dist/esm/adapter/fetchExternalDbConnections.js.map +1 -0
- package/dist/esm/adapter/fetchUserPermissions.js +15 -0
- package/dist/esm/adapter/fetchUserPermissions.js.map +1 -0
- package/dist/esm/adapter/filterUtils.js +126 -0
- package/dist/esm/adapter/filterUtils.js.map +1 -0
- package/dist/esm/adapter/getFieldKey.js +13 -0
- package/dist/esm/adapter/getFieldKey.js.map +1 -0
- package/dist/esm/adapter/index.js +15 -0
- package/dist/esm/adapter/index.js.map +1 -0
- package/dist/esm/adapter/loadCmsSchema.js +48 -0
- package/dist/esm/adapter/loadCmsSchema.js.map +1 -0
- package/dist/esm/adapter/pollUntilReady.js +24 -0
- package/dist/esm/adapter/pollUntilReady.js.map +1 -0
- package/dist/esm/adapter/searchUtils.js +24 -0
- package/dist/esm/adapter/searchUtils.js.map +1 -0
- package/dist/esm/adapter/sortUtils.js +21 -0
- package/dist/esm/adapter/sortUtils.js.map +1 -0
- package/dist/esm/adapter/transformCmsSchema.js +70 -0
- package/dist/esm/adapter/transformCmsSchema.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/types/adapter/__tests__/cmsFieldActions.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/cmsFieldActions.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/cmsPermissions.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/cmsPermissions.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/createCmsBackend.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/createCmsBackend.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/filterUtils.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/filterUtils.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/getFieldKey.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/getFieldKey.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/loadCmsSchema.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/loadCmsSchema.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/searchUtils.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/searchUtils.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/sortUtils.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/sortUtils.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/transformCmsSchema.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/transformCmsSchema.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/wixDataQueryRecorder.d.ts +40 -0
- package/dist/types/adapter/__tests__/wixDataQueryRecorder.d.ts.map +1 -0
- package/dist/types/adapter/cmsBackup.d.ts +7 -0
- package/dist/types/adapter/cmsBackup.d.ts.map +1 -0
- package/dist/types/adapter/cmsFieldTypeMap.d.ts +8 -0
- package/dist/types/adapter/cmsFieldTypeMap.d.ts.map +1 -0
- package/dist/types/adapter/cmsPermissions.d.ts +21 -0
- package/dist/types/adapter/cmsPermissions.d.ts.map +1 -0
- package/dist/types/adapter/constants.d.ts +14 -0
- package/dist/types/adapter/constants.d.ts.map +1 -0
- package/dist/types/adapter/createCmsBackend.d.ts +9 -0
- package/dist/types/adapter/createCmsBackend.d.ts.map +1 -0
- package/dist/types/adapter/createCmsFieldActions.d.ts +8 -0
- package/dist/types/adapter/createCmsFieldActions.d.ts.map +1 -0
- package/dist/types/adapter/fetchExternalDbConnections.d.ts +11 -0
- package/dist/types/adapter/fetchExternalDbConnections.d.ts.map +1 -0
- package/dist/types/adapter/fetchUserPermissions.d.ts +7 -0
- package/dist/types/adapter/fetchUserPermissions.d.ts.map +1 -0
- package/dist/types/adapter/filterUtils.d.ts +14 -0
- package/dist/types/adapter/filterUtils.d.ts.map +1 -0
- package/dist/types/adapter/getFieldKey.d.ts +3 -0
- package/dist/types/adapter/getFieldKey.d.ts.map +1 -0
- package/dist/types/adapter/index.d.ts +15 -0
- package/dist/types/adapter/index.d.ts.map +1 -0
- package/dist/types/adapter/loadCmsSchema.d.ts +29 -0
- package/dist/types/adapter/loadCmsSchema.d.ts.map +1 -0
- package/dist/types/adapter/pollUntilReady.d.ts +11 -0
- package/dist/types/adapter/pollUntilReady.d.ts.map +1 -0
- package/dist/types/adapter/searchUtils.d.ts +12 -0
- package/dist/types/adapter/searchUtils.d.ts.map +1 -0
- package/dist/types/adapter/sortUtils.d.ts +11 -0
- package/dist/types/adapter/sortUtils.d.ts.map +1 -0
- package/dist/types/adapter/transformCmsSchema.d.ts +12 -0
- package/dist/types/adapter/transformCmsSchema.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +123 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { items } from '@wix/data';
|
|
2
|
+
import { createCmsBackend } from '../createCmsBackend';
|
|
3
|
+
// `bulkInsert`/`backup` wrap calls in errorHandler.withErrorHandler, which needs an
|
|
4
|
+
// initialized Wix SDK context. In a pure-function unit test there is none, so we
|
|
5
|
+
// stub the wrapper to just invoke its callback (the mapping logic is what we assert).
|
|
6
|
+
jest.mock('@wix/essentials', () => ({
|
|
7
|
+
errorHandler: {
|
|
8
|
+
withErrorHandler: (fn) => fn(),
|
|
9
|
+
},
|
|
10
|
+
}));
|
|
11
|
+
// A chainable query stub whose terminal `.find()` resolves to a configurable
|
|
12
|
+
// result. `mockFindResult` is reassigned per-test before the backend call.
|
|
13
|
+
// `mock`-prefixed names are the only out-of-scope refs jest.mock() factories allow.
|
|
14
|
+
let mockFindResult = {
|
|
15
|
+
items: [],
|
|
16
|
+
totalCount: 0,
|
|
17
|
+
};
|
|
18
|
+
jest.mock('@wix/data', () => {
|
|
19
|
+
const queryChain = {};
|
|
20
|
+
[
|
|
21
|
+
'eq',
|
|
22
|
+
'include',
|
|
23
|
+
'skip',
|
|
24
|
+
'limit',
|
|
25
|
+
'and',
|
|
26
|
+
'ge',
|
|
27
|
+
'le',
|
|
28
|
+
'ascending',
|
|
29
|
+
'descending',
|
|
30
|
+
].forEach((m) => {
|
|
31
|
+
queryChain[m] = jest.fn(() => queryChain);
|
|
32
|
+
});
|
|
33
|
+
queryChain.find = jest.fn(() => Promise.resolve(mockFindResult));
|
|
34
|
+
const filterChain = {};
|
|
35
|
+
['eq', 'contains', 'or', 'and', 'not'].forEach((m) => {
|
|
36
|
+
filterChain[m] = jest.fn(() => filterChain);
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
__chains: { queryChain, filterChain },
|
|
40
|
+
items: {
|
|
41
|
+
query: jest.fn(() => queryChain),
|
|
42
|
+
filter: jest.fn(() => filterChain),
|
|
43
|
+
insert: jest.fn(),
|
|
44
|
+
update: jest.fn(),
|
|
45
|
+
remove: jest.fn(),
|
|
46
|
+
bulkRemove: jest.fn(),
|
|
47
|
+
bulkInsert: jest.fn(),
|
|
48
|
+
replaceReferences: jest.fn(),
|
|
49
|
+
},
|
|
50
|
+
backups: {},
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
54
|
+
const { queryChain, filterChain } = require('@wix/data').__chains;
|
|
55
|
+
const queryMock = items.query;
|
|
56
|
+
const insert = items.insert;
|
|
57
|
+
const update = items.update;
|
|
58
|
+
const remove = items.remove;
|
|
59
|
+
const bulkRemove = items.bulkRemove;
|
|
60
|
+
const bulkInsert = items.bulkInsert;
|
|
61
|
+
const replaceReferences = items.replaceReferences;
|
|
62
|
+
const COLLECTION_ID = 'collection-1';
|
|
63
|
+
const fieldsWithRefs = {
|
|
64
|
+
title: {
|
|
65
|
+
id: 'title',
|
|
66
|
+
type: 'SHORT_TEXT',
|
|
67
|
+
displayName: 'Title',
|
|
68
|
+
capabilities: { supportedQueryOperators: [], sortable: true },
|
|
69
|
+
},
|
|
70
|
+
author: {
|
|
71
|
+
id: 'author',
|
|
72
|
+
type: 'REFERENCE',
|
|
73
|
+
displayName: 'Author',
|
|
74
|
+
referenceMetadata: { referencedCollectionId: 'authors' },
|
|
75
|
+
capabilities: { supportedQueryOperators: [], sortable: false },
|
|
76
|
+
},
|
|
77
|
+
tags: {
|
|
78
|
+
id: 'tags',
|
|
79
|
+
type: 'MULTI_REFERENCE',
|
|
80
|
+
displayName: 'Tags',
|
|
81
|
+
referenceMetadata: { referencedCollectionId: 'tags-collection' },
|
|
82
|
+
capabilities: { supportedQueryOperators: [], sortable: false },
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
/** Calls `backend.find` with the per-call options arg (absent from the erased interface). */
|
|
86
|
+
const findWithOptions = (find, query, options) => find(query, options);
|
|
87
|
+
describe('createCmsBackend', () => {
|
|
88
|
+
beforeEach(() => {
|
|
89
|
+
jest.clearAllMocks();
|
|
90
|
+
mockFindResult = { items: [], totalCount: 0 };
|
|
91
|
+
});
|
|
92
|
+
describe('get', () => {
|
|
93
|
+
it('queries by _id and returns the single matching entity', async () => {
|
|
94
|
+
mockFindResult = { items: [{ _id: 'e1', title: 'Hello' }] };
|
|
95
|
+
const backend = createCmsBackend(COLLECTION_ID, {
|
|
96
|
+
title: fieldsWithRefs.title,
|
|
97
|
+
});
|
|
98
|
+
const entity = await backend.get('e1');
|
|
99
|
+
expect(queryMock).toHaveBeenCalledWith(COLLECTION_ID);
|
|
100
|
+
expect(queryChain.eq).toHaveBeenCalledWith('_id', 'e1');
|
|
101
|
+
expect(entity).toEqual({ _id: 'e1', title: 'Hello' });
|
|
102
|
+
});
|
|
103
|
+
it('includes reference fields when the schema has them', async () => {
|
|
104
|
+
mockFindResult = { items: [{ _id: 'e1' }] };
|
|
105
|
+
const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
|
|
106
|
+
await backend.get('e1');
|
|
107
|
+
expect(queryChain.include).toHaveBeenCalledWith('author', 'tags');
|
|
108
|
+
});
|
|
109
|
+
it('throws when no entity is found', async () => {
|
|
110
|
+
mockFindResult = { items: [] };
|
|
111
|
+
const backend = createCmsBackend(COLLECTION_ID, {
|
|
112
|
+
title: fieldsWithRefs.title,
|
|
113
|
+
});
|
|
114
|
+
await expect(backend.get('missing')).rejects.toThrow('Entity not found: missing');
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('create', () => {
|
|
118
|
+
it('inserts the entity and returns it with the created _id', async () => {
|
|
119
|
+
insert.mockResolvedValue({ _id: 'new-1' });
|
|
120
|
+
const backend = createCmsBackend(COLLECTION_ID, {
|
|
121
|
+
title: fieldsWithRefs.title,
|
|
122
|
+
});
|
|
123
|
+
const result = await backend.create({ title: 'Hi' });
|
|
124
|
+
expect(insert).toHaveBeenCalledWith(COLLECTION_ID, { title: 'Hi' });
|
|
125
|
+
expect(result).toEqual({ title: 'Hi', _id: 'new-1' });
|
|
126
|
+
});
|
|
127
|
+
it('syncs multi-reference fields via replaceReferences', async () => {
|
|
128
|
+
insert.mockResolvedValue({ _id: 'new-1' });
|
|
129
|
+
const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
|
|
130
|
+
await backend.create({
|
|
131
|
+
title: 'Hi',
|
|
132
|
+
tags: [{ _id: 't1' }, { _id: 't2' }],
|
|
133
|
+
});
|
|
134
|
+
expect(replaceReferences).toHaveBeenCalledWith(COLLECTION_ID, 'tags', 'new-1', ['t1', 't2']);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('update', () => {
|
|
138
|
+
it('updates the entity and returns it', async () => {
|
|
139
|
+
update.mockResolvedValue(undefined);
|
|
140
|
+
const backend = createCmsBackend(COLLECTION_ID, {
|
|
141
|
+
title: fieldsWithRefs.title,
|
|
142
|
+
});
|
|
143
|
+
const entity = { _id: 'e1', title: 'Edited' };
|
|
144
|
+
const result = await backend.update(entity);
|
|
145
|
+
expect(update).toHaveBeenCalledWith(COLLECTION_ID, entity);
|
|
146
|
+
expect(result).toBe(entity);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe('delete / bulkDelete', () => {
|
|
150
|
+
it('removes a single entity by id', async () => {
|
|
151
|
+
remove.mockResolvedValue(undefined);
|
|
152
|
+
const backend = createCmsBackend(COLLECTION_ID, {});
|
|
153
|
+
await backend.delete('e1');
|
|
154
|
+
expect(remove).toHaveBeenCalledWith(COLLECTION_ID, 'e1');
|
|
155
|
+
});
|
|
156
|
+
it('bulk-removes entities by ids', async () => {
|
|
157
|
+
bulkRemove.mockResolvedValue(undefined);
|
|
158
|
+
const backend = createCmsBackend(COLLECTION_ID, {});
|
|
159
|
+
await backend.bulkDelete(['e1', 'e2']);
|
|
160
|
+
expect(bulkRemove).toHaveBeenCalledWith(COLLECTION_ID, ['e1', 'e2']);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('find', () => {
|
|
164
|
+
it('applies skip/limit and computes total and hasNext', async () => {
|
|
165
|
+
mockFindResult = {
|
|
166
|
+
items: [{ _id: 'a' }, { _id: 'b' }],
|
|
167
|
+
totalCount: 5,
|
|
168
|
+
};
|
|
169
|
+
const backend = createCmsBackend(COLLECTION_ID, {
|
|
170
|
+
title: fieldsWithRefs.title,
|
|
171
|
+
});
|
|
172
|
+
const result = await backend.find({
|
|
173
|
+
offset: 0,
|
|
174
|
+
limit: 2,
|
|
175
|
+
});
|
|
176
|
+
expect(queryChain.skip).toHaveBeenCalledWith(0);
|
|
177
|
+
expect(queryChain.limit).toHaveBeenCalledWith(2);
|
|
178
|
+
expect(queryChain.find).toHaveBeenCalledWith({ returnTotalCount: true });
|
|
179
|
+
expect(result.items).toEqual([{ _id: 'a' }, { _id: 'b' }]);
|
|
180
|
+
expect(result.total).toBe(5);
|
|
181
|
+
// 0 + 2 < 5 → there is a next page.
|
|
182
|
+
expect(result.hasNext).toBe(true);
|
|
183
|
+
});
|
|
184
|
+
it('reports hasNext false on the last page', async () => {
|
|
185
|
+
mockFindResult = {
|
|
186
|
+
items: [{ _id: 'e' }],
|
|
187
|
+
totalCount: 3,
|
|
188
|
+
};
|
|
189
|
+
const backend = createCmsBackend(COLLECTION_ID, {
|
|
190
|
+
title: fieldsWithRefs.title,
|
|
191
|
+
});
|
|
192
|
+
const result = await backend.find({ offset: 2, limit: 2 });
|
|
193
|
+
// 2 + 1 === 3 → no next page.
|
|
194
|
+
expect(result.hasNext).toBe(false);
|
|
195
|
+
});
|
|
196
|
+
it('includes only reference fields that are also searchable', async () => {
|
|
197
|
+
mockFindResult = { items: [], totalCount: 0 };
|
|
198
|
+
const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
|
|
199
|
+
// The per-call `options` arg is part of the concrete `createCmsBackend.find`
|
|
200
|
+
// but not the erased `CollectionBackend.find` contract — cast to reach it.
|
|
201
|
+
await findWithOptions(backend.find, { offset: 0, limit: 10 }, {
|
|
202
|
+
searchableFieldIds: ['title', 'author'],
|
|
203
|
+
});
|
|
204
|
+
// 'author' is a reference and searchable → included; 'tags' is not searchable.
|
|
205
|
+
expect(queryChain.include).toHaveBeenCalledWith('author');
|
|
206
|
+
});
|
|
207
|
+
it('does not call include when no reference field is searchable', async () => {
|
|
208
|
+
mockFindResult = { items: [], totalCount: 0 };
|
|
209
|
+
const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
|
|
210
|
+
await findWithOptions(backend.find, { offset: 0, limit: 10 }, {
|
|
211
|
+
searchableFieldIds: ['title'],
|
|
212
|
+
});
|
|
213
|
+
expect(queryChain.include).not.toHaveBeenCalled();
|
|
214
|
+
});
|
|
215
|
+
it('includes no reference fields when called with no options (inert default)', async () => {
|
|
216
|
+
mockFindResult = { items: [], totalCount: 0 };
|
|
217
|
+
const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
|
|
218
|
+
// No options → default searchableFieldIds = [] → no refs included, no search.
|
|
219
|
+
await backend.find({ offset: 0, limit: 10 });
|
|
220
|
+
expect(queryChain.include).not.toHaveBeenCalled();
|
|
221
|
+
});
|
|
222
|
+
// The cases below mirror auto-patterns' end-to-end coverage: the fetch path
|
|
223
|
+
// must actually apply the query's filters/sort/search, not just skip/limit.
|
|
224
|
+
const filterableFields = {
|
|
225
|
+
title: fieldsWithRefs.title,
|
|
226
|
+
price: {
|
|
227
|
+
id: 'price',
|
|
228
|
+
type: 'NUMBER',
|
|
229
|
+
displayName: 'Price',
|
|
230
|
+
capabilities: {
|
|
231
|
+
supportedQueryOperators: ['GTE', 'LTE'],
|
|
232
|
+
sortable: true,
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
done: {
|
|
236
|
+
id: 'done',
|
|
237
|
+
type: 'BOOLEAN',
|
|
238
|
+
displayName: 'Done',
|
|
239
|
+
capabilities: { supportedQueryOperators: [], sortable: false },
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
it('applies a number range filter from the query', async () => {
|
|
243
|
+
const backend = createCmsBackend(COLLECTION_ID, filterableFields);
|
|
244
|
+
await findWithOptions(backend.find, {
|
|
245
|
+
offset: 0,
|
|
246
|
+
limit: 10,
|
|
247
|
+
filters: { price: { from: 10, to: 100 } },
|
|
248
|
+
}, { filterFieldMapping: { price: { fieldId: 'price' } } });
|
|
249
|
+
expect(queryChain.ge).toHaveBeenCalledWith('price', 10);
|
|
250
|
+
expect(queryChain.le).toHaveBeenCalledWith('price', 100);
|
|
251
|
+
});
|
|
252
|
+
it('applies a checked boolean filter from the query', async () => {
|
|
253
|
+
const backend = createCmsBackend(COLLECTION_ID, filterableFields);
|
|
254
|
+
await findWithOptions(backend.find, {
|
|
255
|
+
offset: 0,
|
|
256
|
+
limit: 10,
|
|
257
|
+
filters: { done: [{ id: 'checked' }] },
|
|
258
|
+
}, { filterFieldMapping: { done: { fieldId: 'done' } } });
|
|
259
|
+
expect(queryChain.eq).toHaveBeenCalledWith('done', true);
|
|
260
|
+
});
|
|
261
|
+
it('applies ascending sort from the query', async () => {
|
|
262
|
+
const backend = createCmsBackend(COLLECTION_ID, filterableFields);
|
|
263
|
+
await backend.find({
|
|
264
|
+
offset: 0,
|
|
265
|
+
limit: 10,
|
|
266
|
+
sort: [{ fieldName: 'title', order: 'asc' }],
|
|
267
|
+
});
|
|
268
|
+
expect(queryChain.ascending).toHaveBeenCalledWith('title');
|
|
269
|
+
});
|
|
270
|
+
it('applies descending sort from the query', async () => {
|
|
271
|
+
const backend = createCmsBackend(COLLECTION_ID, filterableFields);
|
|
272
|
+
await backend.find({
|
|
273
|
+
offset: 0,
|
|
274
|
+
limit: 10,
|
|
275
|
+
sort: [{ fieldName: 'title', order: 'desc' }],
|
|
276
|
+
});
|
|
277
|
+
expect(queryChain.descending).toHaveBeenCalledWith('title');
|
|
278
|
+
});
|
|
279
|
+
it('applies the search term as a contains filter on searchable text fields', async () => {
|
|
280
|
+
const backend = createCmsBackend(COLLECTION_ID, filterableFields);
|
|
281
|
+
await findWithOptions(backend.find, { offset: 0, limit: 10, search: 'hello' }, { searchableFieldIds: ['title'] });
|
|
282
|
+
expect(filterChain.contains).toHaveBeenCalledWith('title', 'hello');
|
|
283
|
+
expect(queryChain.and).toHaveBeenCalledWith(filterChain);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
describe('bulkInsert', () => {
|
|
287
|
+
it('maps inserted/updated to succeeded, errors to failed, and surfaces error rows', async () => {
|
|
288
|
+
bulkInsert.mockResolvedValue({
|
|
289
|
+
inserted: 2,
|
|
290
|
+
updated: 1,
|
|
291
|
+
errors: [{ originalIndex: 4, message: 'bad row', code: 'INVALID' }],
|
|
292
|
+
});
|
|
293
|
+
const backend = createCmsBackend(COLLECTION_ID, {});
|
|
294
|
+
const result = await backend.bulkInsert([{ a: 1 }, { a: 2 }]);
|
|
295
|
+
expect(bulkInsert).toHaveBeenCalledWith(COLLECTION_ID, [
|
|
296
|
+
{ a: 1 },
|
|
297
|
+
{ a: 2 },
|
|
298
|
+
]);
|
|
299
|
+
expect(result.succeeded).toBe(3);
|
|
300
|
+
expect(result.failed).toBe(1);
|
|
301
|
+
expect(result.errors).toEqual([
|
|
302
|
+
{ rowIndex: 4, message: 'bad row', code: 'INVALID' },
|
|
303
|
+
]);
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
//# sourceMappingURL=createCmsBackend.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createCmsBackend.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/createCmsBackend.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { items } from '@wix/data';
|
|
2
|
+
import { FilterOperator } from '@wix/bex-core';
|
|
3
|
+
import { addFiltersToDataQuery } from '../filterUtils';
|
|
4
|
+
import { BooleanFilters, HasValueFilters } from '../constants';
|
|
5
|
+
import { firstCallArgs, wasCalled, } from './wixDataQueryRecorder';
|
|
6
|
+
// Replace the `@wix/data` `items` builders with chainable recorders so we can
|
|
7
|
+
// assert which WQL operator methods the util produced.
|
|
8
|
+
jest.mock('@wix/data', () => {
|
|
9
|
+
const recorder = require('./wixDataQueryRecorder');
|
|
10
|
+
return {
|
|
11
|
+
items: {
|
|
12
|
+
query: jest.fn(() => recorder.createQueryRecorder()),
|
|
13
|
+
filter: jest.fn(() => recorder.createQueryRecorder()),
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
const makeQuery = (filters) => ({ filters });
|
|
18
|
+
describe('addFiltersToDataQuery', () => {
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
jest.clearAllMocks();
|
|
21
|
+
});
|
|
22
|
+
const numberFields = {
|
|
23
|
+
numberField: {
|
|
24
|
+
id: 'numberField',
|
|
25
|
+
type: 'NUMBER',
|
|
26
|
+
displayName: 'Number Field',
|
|
27
|
+
capabilities: { supportedQueryOperators: ['GTE', 'LTE'], sortable: true },
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
it('applies a number range filter as ge (from) and le (to)', () => {
|
|
31
|
+
const dataQuery = items.query('collectionId');
|
|
32
|
+
addFiltersToDataQuery({
|
|
33
|
+
dataQuery: dataQuery,
|
|
34
|
+
query: makeQuery({ numberField: { from: 5, to: 10 } }),
|
|
35
|
+
fields: numberFields,
|
|
36
|
+
filterFieldMapping: { numberField: { fieldId: 'numberField' } },
|
|
37
|
+
});
|
|
38
|
+
expect(firstCallArgs(dataQuery, 'ge')).toEqual(['numberField', 5]);
|
|
39
|
+
expect(firstCallArgs(dataQuery, 'le')).toEqual(['numberField', 10]);
|
|
40
|
+
});
|
|
41
|
+
it('ignores range props whose operator is not supported by the field', () => {
|
|
42
|
+
const dataQuery = items.query('collectionId');
|
|
43
|
+
addFiltersToDataQuery({
|
|
44
|
+
dataQuery: dataQuery,
|
|
45
|
+
query: makeQuery({ numberField: { from: 5, to: 10 } }),
|
|
46
|
+
fields: {
|
|
47
|
+
numberField: {
|
|
48
|
+
id: 'numberField',
|
|
49
|
+
type: 'NUMBER',
|
|
50
|
+
displayName: 'Number Field',
|
|
51
|
+
// Only EQ supported → GTE/LTE range props are dropped.
|
|
52
|
+
capabilities: { supportedQueryOperators: ['EQ'], sortable: true },
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
filterFieldMapping: { numberField: { fieldId: 'numberField' } },
|
|
56
|
+
});
|
|
57
|
+
expect(wasCalled(dataQuery, 'ge')).toBe(false);
|
|
58
|
+
expect(wasCalled(dataQuery, 'le')).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
it('returns the query untouched when filterFieldMapping is absent', () => {
|
|
61
|
+
const dataQuery = items.query('collectionId');
|
|
62
|
+
addFiltersToDataQuery({
|
|
63
|
+
dataQuery: dataQuery,
|
|
64
|
+
query: makeQuery({ numberField: { from: 5, to: 10 } }),
|
|
65
|
+
fields: numberFields,
|
|
66
|
+
});
|
|
67
|
+
expect(dataQuery.calls).toHaveLength(0);
|
|
68
|
+
});
|
|
69
|
+
describe('BOOLEAN array filter', () => {
|
|
70
|
+
const booleanFields = {
|
|
71
|
+
booleanField: {
|
|
72
|
+
id: 'booleanField',
|
|
73
|
+
type: 'BOOLEAN',
|
|
74
|
+
displayName: 'Boolean Field',
|
|
75
|
+
capabilities: { supportedQueryOperators: ['EQ'], sortable: true },
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
it('applies eq(field, true) when "checked" is selected', () => {
|
|
79
|
+
const dataQuery = items.query('collectionId');
|
|
80
|
+
addFiltersToDataQuery({
|
|
81
|
+
dataQuery: dataQuery,
|
|
82
|
+
query: makeQuery({ booleanField: [{ id: BooleanFilters.checked }] }),
|
|
83
|
+
fields: booleanFields,
|
|
84
|
+
filterFieldMapping: { booleanField: { fieldId: 'booleanField' } },
|
|
85
|
+
});
|
|
86
|
+
expect(firstCallArgs(dataQuery, 'eq')).toEqual(['booleanField', true]);
|
|
87
|
+
});
|
|
88
|
+
it('applies and(eq false OR eq undefined) when "checked" is not selected', () => {
|
|
89
|
+
const dataQuery = items.query('collectionId');
|
|
90
|
+
addFiltersToDataQuery({
|
|
91
|
+
dataQuery: dataQuery,
|
|
92
|
+
query: makeQuery({ booleanField: [{ id: BooleanFilters.unchecked }] }),
|
|
93
|
+
fields: booleanFields,
|
|
94
|
+
filterFieldMapping: { booleanField: { fieldId: 'booleanField' } },
|
|
95
|
+
});
|
|
96
|
+
// No direct eq(true) on the data query — the false-or-undefined branch wraps in .and().
|
|
97
|
+
expect(wasCalled(dataQuery, 'eq')).toBe(false);
|
|
98
|
+
const andArgs = firstCallArgs(dataQuery, 'and');
|
|
99
|
+
expect(andArgs).toBeDefined();
|
|
100
|
+
// The argument is the `falseFilter.or(undefinedFilter)` recorder.
|
|
101
|
+
const falseFilter = andArgs[0];
|
|
102
|
+
const eqValues = falseFilter.calls
|
|
103
|
+
.filter((c) => c.method === 'eq')
|
|
104
|
+
.map((c) => c.args[1]);
|
|
105
|
+
expect(eqValues).toContain(false);
|
|
106
|
+
expect(wasCalled(falseFilter, 'or')).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe('HAS_VALUE array filter', () => {
|
|
110
|
+
const richContentFields = {
|
|
111
|
+
richField: {
|
|
112
|
+
id: 'richField',
|
|
113
|
+
type: 'RICH_CONTENT',
|
|
114
|
+
displayName: 'Rich Field',
|
|
115
|
+
capabilities: { supportedQueryOperators: [], sortable: false },
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
it('applies isNotEmpty when only "hasValue" is selected', () => {
|
|
119
|
+
const dataQuery = items.query('collectionId');
|
|
120
|
+
addFiltersToDataQuery({
|
|
121
|
+
dataQuery: dataQuery,
|
|
122
|
+
query: makeQuery({ richField: [{ id: HasValueFilters.hasValue }] }),
|
|
123
|
+
fields: richContentFields,
|
|
124
|
+
filterFieldMapping: { richField: { fieldId: 'richField' } },
|
|
125
|
+
});
|
|
126
|
+
expect(firstCallArgs(dataQuery, 'isNotEmpty')).toEqual(['richField']);
|
|
127
|
+
expect(wasCalled(dataQuery, 'isEmpty')).toBe(false);
|
|
128
|
+
});
|
|
129
|
+
it('applies isEmpty when only "noValue" is selected', () => {
|
|
130
|
+
const dataQuery = items.query('collectionId');
|
|
131
|
+
addFiltersToDataQuery({
|
|
132
|
+
dataQuery: dataQuery,
|
|
133
|
+
query: makeQuery({ richField: [{ id: HasValueFilters.noValue }] }),
|
|
134
|
+
fields: richContentFields,
|
|
135
|
+
filterFieldMapping: { richField: { fieldId: 'richField' } },
|
|
136
|
+
});
|
|
137
|
+
expect(firstCallArgs(dataQuery, 'isEmpty')).toEqual(['richField']);
|
|
138
|
+
expect(wasCalled(dataQuery, 'isNotEmpty')).toBe(false);
|
|
139
|
+
});
|
|
140
|
+
it('applies neither when both hasValue and noValue are selected', () => {
|
|
141
|
+
const dataQuery = items.query('collectionId');
|
|
142
|
+
addFiltersToDataQuery({
|
|
143
|
+
dataQuery: dataQuery,
|
|
144
|
+
query: makeQuery({
|
|
145
|
+
richField: [
|
|
146
|
+
{ id: HasValueFilters.hasValue },
|
|
147
|
+
{ id: HasValueFilters.noValue },
|
|
148
|
+
],
|
|
149
|
+
}),
|
|
150
|
+
fields: richContentFields,
|
|
151
|
+
filterFieldMapping: { richField: { fieldId: 'richField' } },
|
|
152
|
+
});
|
|
153
|
+
expect(wasCalled(dataQuery, 'isEmpty')).toBe(false);
|
|
154
|
+
expect(wasCalled(dataQuery, 'isNotEmpty')).toBe(false);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
it('applies hasSome for a generic (non-boolean, non-has-value) array filter', () => {
|
|
158
|
+
const dataQuery = items.query('collectionId');
|
|
159
|
+
addFiltersToDataQuery({
|
|
160
|
+
dataQuery: dataQuery,
|
|
161
|
+
query: makeQuery({
|
|
162
|
+
tagsField: [{ id: 'a' }, { id: 'b' }],
|
|
163
|
+
}),
|
|
164
|
+
fields: {
|
|
165
|
+
tagsField: {
|
|
166
|
+
id: 'tagsField',
|
|
167
|
+
type: 'SHORT_TEXT',
|
|
168
|
+
displayName: 'Tags Field',
|
|
169
|
+
capabilities: { supportedQueryOperators: [], sortable: false },
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
filterFieldMapping: { tagsField: { fieldId: 'tagsField' } },
|
|
173
|
+
});
|
|
174
|
+
expect(firstCallArgs(dataQuery, 'hasSome')).toEqual([
|
|
175
|
+
'tagsField',
|
|
176
|
+
['a', 'b'],
|
|
177
|
+
]);
|
|
178
|
+
});
|
|
179
|
+
describe('operator object filter', () => {
|
|
180
|
+
const textFields = {
|
|
181
|
+
textField: {
|
|
182
|
+
id: 'textField',
|
|
183
|
+
type: 'SHORT_TEXT',
|
|
184
|
+
displayName: 'Text Field',
|
|
185
|
+
capabilities: { supportedQueryOperators: [], sortable: false },
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
it('maps CONTAINS to .contains', () => {
|
|
189
|
+
const dataQuery = items.query('collectionId');
|
|
190
|
+
addFiltersToDataQuery({
|
|
191
|
+
dataQuery: dataQuery,
|
|
192
|
+
query: makeQuery({
|
|
193
|
+
textField: { operator: FilterOperator.CONTAINS, value: 'foo' },
|
|
194
|
+
}),
|
|
195
|
+
fields: textFields,
|
|
196
|
+
filterFieldMapping: { textField: { fieldId: 'textField' } },
|
|
197
|
+
});
|
|
198
|
+
expect(firstCallArgs(dataQuery, 'contains')).toEqual([
|
|
199
|
+
'textField',
|
|
200
|
+
'foo',
|
|
201
|
+
]);
|
|
202
|
+
});
|
|
203
|
+
it('maps IS_EMPTY to .isEmpty(field) (no value argument)', () => {
|
|
204
|
+
const dataQuery = items.query('collectionId');
|
|
205
|
+
addFiltersToDataQuery({
|
|
206
|
+
dataQuery: dataQuery,
|
|
207
|
+
query: makeQuery({
|
|
208
|
+
textField: { operator: FilterOperator.IS_EMPTY },
|
|
209
|
+
}),
|
|
210
|
+
fields: textFields,
|
|
211
|
+
filterFieldMapping: { textField: { fieldId: 'textField' } },
|
|
212
|
+
});
|
|
213
|
+
expect(firstCallArgs(dataQuery, 'isEmpty')).toEqual(['textField']);
|
|
214
|
+
});
|
|
215
|
+
it('maps EXISTS to .isNotEmpty(field)', () => {
|
|
216
|
+
const dataQuery = items.query('collectionId');
|
|
217
|
+
addFiltersToDataQuery({
|
|
218
|
+
dataQuery: dataQuery,
|
|
219
|
+
query: makeQuery({
|
|
220
|
+
textField: { operator: FilterOperator.EXISTS },
|
|
221
|
+
}),
|
|
222
|
+
fields: textFields,
|
|
223
|
+
filterFieldMapping: { textField: { fieldId: 'textField' } },
|
|
224
|
+
});
|
|
225
|
+
expect(firstCallArgs(dataQuery, 'isNotEmpty')).toEqual(['textField']);
|
|
226
|
+
});
|
|
227
|
+
it('maps NOT_CONTAINS to .not(filter().contains(...))', () => {
|
|
228
|
+
const dataQuery = items.query('collectionId');
|
|
229
|
+
addFiltersToDataQuery({
|
|
230
|
+
dataQuery: dataQuery,
|
|
231
|
+
query: makeQuery({
|
|
232
|
+
textField: { operator: FilterOperator.NOT_CONTAINS, value: 'bar' },
|
|
233
|
+
}),
|
|
234
|
+
fields: textFields,
|
|
235
|
+
filterFieldMapping: { textField: { fieldId: 'textField' } },
|
|
236
|
+
});
|
|
237
|
+
const notArgs = firstCallArgs(dataQuery, 'not');
|
|
238
|
+
expect(notArgs).toBeDefined();
|
|
239
|
+
const innerFilter = notArgs[0];
|
|
240
|
+
expect(firstCallArgs(innerFilter, 'contains')).toEqual([
|
|
241
|
+
'textField',
|
|
242
|
+
'bar',
|
|
243
|
+
]);
|
|
244
|
+
});
|
|
245
|
+
it('queries the .formatted nested property for ADDRESS text operators', () => {
|
|
246
|
+
const dataQuery = items.query('collectionId');
|
|
247
|
+
addFiltersToDataQuery({
|
|
248
|
+
dataQuery: dataQuery,
|
|
249
|
+
query: makeQuery({
|
|
250
|
+
addressField: { operator: FilterOperator.CONTAINS, value: 'NYC' },
|
|
251
|
+
}),
|
|
252
|
+
fields: {
|
|
253
|
+
addressField: {
|
|
254
|
+
id: 'addressField',
|
|
255
|
+
type: 'ADDRESS',
|
|
256
|
+
displayName: 'Address Field',
|
|
257
|
+
capabilities: { supportedQueryOperators: [], sortable: false },
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
filterFieldMapping: { addressField: { fieldId: 'addressField' } },
|
|
261
|
+
});
|
|
262
|
+
expect(firstCallArgs(dataQuery, 'contains')).toEqual([
|
|
263
|
+
'addressField.formatted',
|
|
264
|
+
'NYC',
|
|
265
|
+
]);
|
|
266
|
+
});
|
|
267
|
+
it('queries the ADDRESS field directly for existence operators (no .formatted)', () => {
|
|
268
|
+
const dataQuery = items.query('collectionId');
|
|
269
|
+
addFiltersToDataQuery({
|
|
270
|
+
dataQuery: dataQuery,
|
|
271
|
+
query: makeQuery({
|
|
272
|
+
addressField: { operator: FilterOperator.IS_EMPTY },
|
|
273
|
+
}),
|
|
274
|
+
fields: {
|
|
275
|
+
addressField: {
|
|
276
|
+
id: 'addressField',
|
|
277
|
+
type: 'ADDRESS',
|
|
278
|
+
displayName: 'Address Field',
|
|
279
|
+
capabilities: { supportedQueryOperators: [], sortable: false },
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
filterFieldMapping: { addressField: { fieldId: 'addressField' } },
|
|
283
|
+
});
|
|
284
|
+
expect(firstCallArgs(dataQuery, 'isEmpty')).toEqual(['addressField']);
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
it('skips filters for fields not present in filterFieldMapping', () => {
|
|
288
|
+
const dataQuery = items.query('collectionId');
|
|
289
|
+
addFiltersToDataQuery({
|
|
290
|
+
dataQuery: dataQuery,
|
|
291
|
+
query: makeQuery({ numberField: { from: 5, to: 10 } }),
|
|
292
|
+
fields: numberFields,
|
|
293
|
+
filterFieldMapping: {},
|
|
294
|
+
});
|
|
295
|
+
expect(dataQuery.calls).toHaveLength(0);
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
//# sourceMappingURL=filterUtils.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterUtils.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/filterUtils.spec.ts"],"names":[],"mappings":"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"}
|