@wix/patterns-cms 1.7.0 → 1.8.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 +12 -4
- package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js +2 -14
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/createCmsSchemaSource.spec.js +38 -0
- package/dist/cjs/adapter/__tests__/createCmsSchemaSource.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js +10 -109
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js.map +1 -1
- package/dist/cjs/adapter/createCmsBackend.js +1 -3
- package/dist/cjs/adapter/createCmsBackend.js.map +1 -1
- package/dist/cjs/adapter/createCmsFieldActions.js +30 -6
- package/dist/cjs/adapter/createCmsFieldActions.js.map +1 -1
- package/dist/cjs/adapter/createCmsSchemaSource.js +43 -0
- package/dist/cjs/adapter/createCmsSchemaSource.js.map +1 -0
- package/dist/cjs/adapter/filterUtils.js +6 -10
- package/dist/cjs/adapter/filterUtils.js.map +1 -1
- package/dist/cjs/adapter/index.js +3 -1
- package/dist/cjs/adapter/index.js.map +1 -1
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js +12 -4
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js +2 -2
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/createCmsSchemaSource.spec.js +41 -0
- package/dist/esm/adapter/__tests__/createCmsSchemaSource.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/filterUtils.spec.js +0 -33
- package/dist/esm/adapter/__tests__/filterUtils.spec.js.map +1 -1
- package/dist/esm/adapter/createCmsBackend.js +0 -2
- package/dist/esm/adapter/createCmsBackend.js.map +1 -1
- package/dist/esm/adapter/createCmsFieldActions.js +17 -16
- package/dist/esm/adapter/createCmsFieldActions.js.map +1 -1
- package/dist/esm/adapter/createCmsSchemaSource.js +41 -0
- package/dist/esm/adapter/createCmsSchemaSource.js.map +1 -0
- package/dist/esm/adapter/filterUtils.js +6 -9
- package/dist/esm/adapter/filterUtils.js.map +1 -1
- package/dist/esm/adapter/index.js +1 -0
- package/dist/esm/adapter/index.js.map +1 -1
- package/dist/types/adapter/__tests__/createCmsSchemaSource.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/createCmsSchemaSource.spec.d.ts.map +1 -0
- package/dist/types/adapter/createCmsBackend.d.ts.map +1 -1
- package/dist/types/adapter/createCmsFieldActions.d.ts.map +1 -1
- package/dist/types/adapter/createCmsSchemaSource.d.ts +12 -0
- package/dist/types/adapter/createCmsSchemaSource.d.ts.map +1 -0
- package/dist/types/adapter/filterUtils.d.ts +1 -4
- package/dist/types/adapter/filterUtils.d.ts.map +1 -1
- package/dist/types/adapter/index.d.ts +1 -0
- package/dist/types/adapter/index.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -58,10 +58,18 @@ const makePatternsField = (overrides = {}) => {
|
|
|
58
58
|
describe('createCmsFieldActions', () => {
|
|
59
59
|
beforeEach(() => {
|
|
60
60
|
jest.clearAllMocks();
|
|
61
|
-
createDataCollectionField.mockResolvedValue(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
createDataCollectionField.mockResolvedValue({
|
|
62
|
+
dataCollection: makeCollection([])
|
|
63
|
+
});
|
|
64
|
+
deleteDataCollectionField.mockResolvedValue({
|
|
65
|
+
dataCollection: makeCollection([])
|
|
66
|
+
});
|
|
67
|
+
patchDataCollection.mockResolvedValue({
|
|
68
|
+
dataCollection: makeCollection([])
|
|
69
|
+
});
|
|
70
|
+
patchDataCollectionField.mockResolvedValue({
|
|
71
|
+
dataCollection: makeCollection([])
|
|
72
|
+
});
|
|
65
73
|
});
|
|
66
74
|
describe('addField', () => {
|
|
67
75
|
it('maps the patterns field type to the CMS type and derives the key from displayName', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_data","require","_createCmsFieldActions","jest","mock","actual","requireActual","collections","createDataCollectionField","fn","patchDataCollectionField","deleteDataCollectionField","patchDataCollection","tasks","createTask","getTask","COLLECTION_ID","makeField","overrides","key","displayName","type","Type","TEXT","systemField","encrypted","makeCollection","fields","_id","makePatternsField","base","id","describe","beforeEach","clearAllMocks","mockResolvedValue","undefined","it","actions","createCmsFieldActions","addField","calledCollectionId","payload","calls","expect","toBe","field","toMatchObject","required","toBeTruthy","not","isPii","helpText","description","validation","numberRange","min","max","NUMBER","toEqual","toBeUndefined","stringLengthRange","minLength","maxLength","rejects","toThrow","toHaveBeenCalled","editField","toHaveBeenCalledWith","patch","toHaveProperty","renameField","deleteField","toHaveBeenCalledTimes","fieldKey","makePrimary","displayField","duplicateField","capabilities","sortable","queryOperators","QueryOperator","EQ","_payload$field$typeMe","_payload$field$typeMe2","sourceField","MULTI_REFERENCE","typeMetadata","multiReference","referencingFieldKey","referencedCollectionId","status","duplicateFieldWithContent","targetFieldKey","copyFieldDataOptions","dataCollectionId","sourceFieldKey","failures","code"],"sources":["../../../../src/adapter/__tests__/cmsFieldActions.spec.ts"],"sourcesContent":["import { collections, tasks } from '@wix/data';\nimport type { Field } from '@wix/bex-core';\nimport { createCmsFieldActions } from '../createCmsFieldActions';\n\njest.mock('@wix/data', () => {\n const actual = jest.requireActual('@wix/data');\n return {\n ...actual,\n collections: {\n ...actual.collections,\n createDataCollectionField: jest.fn(),\n patchDataCollectionField: jest.fn(),\n deleteDataCollectionField: jest.fn(),\n patchDataCollection: jest.fn(),\n },\n tasks: {\n ...actual.tasks,\n createTask: jest.fn(),\n getTask: jest.fn(),\n },\n };\n});\n\n// Typed accessors — the @wix/data SDK exposes overloaded callable types\n// (MaybeContext<...>), and jest.Mocked<typeof collections> resolves to the\n// HttpClient-form overload, which makes mockResolvedValue/mock.calls unusable.\n// Re-typing each mock with the call shape the adapter uses unblocks both.\nconst createDataCollectionField =\n collections.createDataCollectionField as unknown as jest.Mock<\n Promise<void>,\n [collectionId: string, options: { field: collections.Field }]\n >;\nconst patchDataCollectionField =\n collections.patchDataCollectionField as unknown as jest.Mock<\n Promise<void>,\n [collectionId: string, field: collections.Field]\n >;\nconst deleteDataCollectionField =\n collections.deleteDataCollectionField as unknown as jest.Mock<\n Promise<void>,\n [collectionId: string, options: { fieldKey: string }]\n >;\nconst patchDataCollection =\n collections.patchDataCollection as unknown as jest.Mock<\n Promise<void>,\n [collectionId: string, dataCollection: collections.PatchDataCollection]\n >;\n\ninterface CopyTaskState {\n _id: string;\n status: 'NEW' | 'RUNNING' | 'COMPLETED' | 'FAILED';\n failures?: { code?: string; description?: string }[];\n}\n\nconst createTask = tasks.createTask as unknown as jest.Mock<\n Promise<{ _id: string }>,\n [task: { type: string; copyFieldDataOptions: unknown }]\n>;\nconst getTask = tasks.getTask as unknown as jest.Mock<\n Promise<CopyTaskState>,\n [taskId: string]\n>;\n\nconst COLLECTION_ID = 'collection-1';\n\nconst makeField = (\n overrides: Partial<collections.Field> = {},\n): collections.Field => ({\n key: 'sourceField',\n displayName: 'Source Field',\n type: collections.Type.TEXT,\n systemField: false,\n encrypted: false,\n ...overrides,\n});\n\nconst makeCollection = (\n fields: collections.Field[],\n): collections.DataCollection => ({ _id: COLLECTION_ID, fields });\n\nconst makePatternsField = (overrides: Partial<Field> = {}): Field => {\n const base: Field = {\n id: 'ignored-by-addField',\n displayName: 'New Field',\n type: 'SHORT_TEXT',\n };\n return { ...base, ...overrides } as Field;\n};\n\ndescribe('createCmsFieldActions', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n createDataCollectionField.mockResolvedValue(undefined);\n deleteDataCollectionField.mockResolvedValue(undefined);\n patchDataCollection.mockResolvedValue(undefined);\n patchDataCollectionField.mockResolvedValue(undefined);\n });\n\n describe('addField', () => {\n it('maps the patterns field type to the CMS type and derives the key from displayName', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({ displayName: 'My New Field' }),\n );\n\n const [calledCollectionId, payload] =\n createDataCollectionField.mock.calls[0];\n expect(calledCollectionId).toBe(COLLECTION_ID);\n expect(payload.field).toMatchObject({\n displayName: 'My New Field',\n type: collections.Type.TEXT,\n required: false,\n });\n expect(payload.field.key).toBeTruthy();\n });\n\n it('appends a numeric suffix when the generated key collides with an existing field', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'newField' })]),\n );\n\n await actions.addField!(makePatternsField({ displayName: 'New Field' }));\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.key).not.toBe('newField');\n });\n\n it('sets encrypted when isPii is true and description from helpText', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({ isPii: true, helpText: 'Some hint' }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.encrypted).toBe(true);\n expect(payload.field.description).toBe('Some hint');\n });\n\n it('passes numberRange only when the field type is NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({\n type: 'NUMBER',\n validation: { required: false, numberRange: { min: 0, max: 10 } },\n }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.type).toBe(collections.Type.NUMBER);\n expect(payload.field.numberRange).toEqual({ min: 0, max: 10 });\n });\n\n it('ignores numberRange when the field type is not NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({\n type: 'SHORT_TEXT',\n validation: { required: false, numberRange: { min: 0, max: 10 } },\n }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.numberRange).toBeUndefined();\n });\n\n it('passes stringLengthRange only when the field type is SHORT_TEXT', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({\n type: 'SHORT_TEXT',\n validation: {\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 50 },\n },\n }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.stringLengthRange).toEqual({\n minLength: 1,\n maxLength: 50,\n });\n });\n\n it('throws when the patterns type has no CMS mapping', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.addField!(makePatternsField({ type: 'IMAGE' })),\n ).rejects.toThrow('Field type IMAGE not supported yet');\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n\n it('uses validation.required when provided', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({ validation: { required: true } }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.required).toBe(true);\n });\n });\n\n describe('editField', () => {\n it('patches only displayName when only displayName is provided', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.editField!('name', { displayName: 'Renamed' });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n displayName: 'Renamed',\n });\n });\n\n it('maps isPii to encrypted and helpText to description', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.editField!('name', { isPii: true, helpText: 'hint' });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n encrypted: true,\n description: 'hint',\n });\n });\n\n it('includes numberRange in the patch only when the source CMS field is NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'age', type: collections.Type.NUMBER }),\n ]),\n );\n\n await actions.editField!('age', {\n validation: { required: true, numberRange: { min: 0, max: 100 } },\n });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'age',\n required: true,\n numberRange: { min: 0, max: 100 },\n });\n });\n\n it('omits numberRange when the source CMS field is not NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'name', type: collections.Type.TEXT }),\n ]),\n );\n\n await actions.editField!('name', {\n validation: { required: true, numberRange: { min: 0, max: 100 } },\n });\n\n const [, patch] = patchDataCollectionField.mock.calls[0];\n expect(patch).not.toHaveProperty('numberRange');\n expect(patch).toMatchObject({ key: 'name', required: true });\n });\n\n it('includes stringLengthRange in the patch only when the source CMS field is TEXT', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'name', type: collections.Type.TEXT }),\n ]),\n );\n\n await actions.editField!('name', {\n validation: {\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n },\n });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n });\n });\n\n it('omits stringLengthRange when the source CMS field is not TEXT', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'age', type: collections.Type.NUMBER }),\n ]),\n );\n\n await actions.editField!('age', {\n validation: {\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n },\n });\n\n const [, patch] = patchDataCollectionField.mock.calls[0];\n expect(patch).not.toHaveProperty('stringLengthRange');\n });\n });\n\n describe('renameField', () => {\n it('patches the field displayName with the new name', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.renameField!('name', 'Renamed');\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n displayName: 'Renamed',\n });\n });\n });\n\n describe('deleteField', () => {\n it('calls collections.deleteDataCollectionField with the field key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'toDelete' })]),\n );\n\n await actions.deleteField!('toDelete');\n\n expect(deleteDataCollectionField).toHaveBeenCalledTimes(1);\n expect(deleteDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n fieldKey: 'toDelete',\n });\n });\n });\n\n describe('makePrimary', () => {\n it('patches the collection displayField with the given field id', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'newPrimary' })]),\n );\n\n await actions.makePrimary!('newPrimary');\n\n expect(patchDataCollection).toHaveBeenCalledTimes(1);\n expect(patchDataCollection).toHaveBeenCalledWith(COLLECTION_ID, {\n displayField: 'newPrimary',\n });\n });\n });\n\n describe('duplicateField', () => {\n it('clones the source field with a \"(Copy)\" suffix and a fresh key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'sourceField', displayName: 'Source Field' }),\n ]),\n );\n\n await actions.duplicateField!('sourceField');\n\n expect(createDataCollectionField).toHaveBeenCalledTimes(1);\n const [calledCollectionId, payload] =\n createDataCollectionField.mock.calls[0];\n expect(calledCollectionId).toBe(COLLECTION_ID);\n expect(payload.field).toMatchObject({\n displayName: 'Source Field (Copy)',\n type: collections.Type.TEXT,\n });\n expect(payload.field.key).not.toBe('sourceField');\n });\n\n it('strips systemField and capabilities from the cloned field', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({\n systemField: true,\n capabilities: {\n sortable: true,\n queryOperators: [collections.QueryOperator.EQ],\n },\n }),\n ]),\n );\n\n await actions.duplicateField!('sourceField');\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field).not.toHaveProperty('systemField');\n expect(payload.field).not.toHaveProperty('capabilities');\n });\n\n it('clears typeMetadata.multiReference.referencingFieldKey on clone', async () => {\n const sourceField: collections.Field = makeField({\n key: 'multiRef',\n displayName: 'Multi Ref',\n type: collections.Type.MULTI_REFERENCE,\n typeMetadata: {\n multiReference: {\n referencingFieldKey: 'someExistingKey',\n referencedCollectionId: 'other-collection',\n },\n },\n });\n\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([sourceField]),\n );\n\n await actions.duplicateField!('multiRef');\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(\n payload.field.typeMetadata?.multiReference?.referencingFieldKey,\n ).toBeUndefined();\n expect(\n payload.field.typeMetadata?.multiReference?.referencedCollectionId,\n ).toBe('other-collection');\n });\n\n it('appends a numeric suffix when the generated key collides with an existing field', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'sourceField', displayName: 'Source Field' }),\n makeField({ key: 'sourceFieldCopy' }),\n ]),\n );\n\n await actions.duplicateField!('sourceField');\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.key).not.toBe('sourceField');\n expect(payload.field.key).not.toBe('sourceFieldCopy');\n });\n\n it('throws when the source field is not found', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(actions.duplicateField!('missing')).rejects.toThrow(\n 'Field missing not found',\n );\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n });\n\n describe('duplicateFieldWithContent', () => {\n it('creates the cloned field, kicks off a COPY_FIELD_DATA task, and waits for completion', async () => {\n createTask.mockResolvedValue({ _id: 'task-1' });\n getTask.mockResolvedValue({ _id: 'task-1', status: 'COMPLETED' });\n\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'sourceField', displayName: 'Source Field' }),\n ]),\n );\n\n await actions.duplicateFieldWithContent!('sourceField');\n\n expect(createDataCollectionField).toHaveBeenCalledTimes(1);\n const [, payload] = createDataCollectionField.mock.calls[0];\n const targetFieldKey = payload.field.key;\n\n expect(createTask).toHaveBeenCalledTimes(1);\n expect(createTask).toHaveBeenCalledWith({\n type: 'COPY_FIELD_DATA',\n copyFieldDataOptions: {\n dataCollectionId: COLLECTION_ID,\n sourceFieldKey: 'sourceField',\n targetFieldKey,\n },\n });\n expect(getTask).toHaveBeenCalledWith('task-1');\n });\n\n it('throws when the copy task reports FAILED, surfacing the failure code and description', async () => {\n createTask.mockResolvedValue({ _id: 'task-2' });\n getTask.mockResolvedValue({\n _id: 'task-2',\n status: 'FAILED',\n failures: [{ code: 'INTERNAL', description: 'Copy boom' }],\n });\n\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField()]),\n );\n\n await expect(\n actions.duplicateFieldWithContent!('sourceField'),\n ).rejects.toThrow('INTERNAL: Copy boom');\n });\n\n it('throws when the source field is not found and never creates a task', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.duplicateFieldWithContent!('missing'),\n ).rejects.toThrow('Field missing not found');\n expect(createDataCollectionField).not.toHaveBeenCalled();\n expect(createTask).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_data","require","_createCmsFieldActions","jest","mock","actual","requireActual","collections","createDataCollectionField","fn","patchDataCollectionField","deleteDataCollectionField","patchDataCollection","tasks","createTask","getTask","COLLECTION_ID","makeField","overrides","key","displayName","type","Type","TEXT","systemField","encrypted","makeCollection","fields","_id","makePatternsField","base","id","describe","beforeEach","clearAllMocks","mockResolvedValue","dataCollection","it","actions","createCmsFieldActions","addField","calledCollectionId","payload","calls","expect","toBe","field","toMatchObject","required","toBeTruthy","not","isPii","helpText","description","validation","numberRange","min","max","NUMBER","toEqual","toBeUndefined","stringLengthRange","minLength","maxLength","rejects","toThrow","toHaveBeenCalled","editField","toHaveBeenCalledWith","patch","toHaveProperty","renameField","deleteField","toHaveBeenCalledTimes","fieldKey","makePrimary","displayField","duplicateField","capabilities","sortable","queryOperators","QueryOperator","EQ","_payload$field$typeMe","_payload$field$typeMe2","sourceField","MULTI_REFERENCE","typeMetadata","multiReference","referencingFieldKey","referencedCollectionId","status","duplicateFieldWithContent","targetFieldKey","copyFieldDataOptions","dataCollectionId","sourceFieldKey","failures","code"],"sources":["../../../../src/adapter/__tests__/cmsFieldActions.spec.ts"],"sourcesContent":["import { collections, tasks } from '@wix/data';\nimport type { Field } from '@wix/bex-core';\nimport { createCmsFieldActions } from '../createCmsFieldActions';\n\njest.mock('@wix/data', () => {\n const actual = jest.requireActual('@wix/data');\n return {\n ...actual,\n collections: {\n ...actual.collections,\n createDataCollectionField: jest.fn(),\n patchDataCollectionField: jest.fn(),\n deleteDataCollectionField: jest.fn(),\n patchDataCollection: jest.fn(),\n },\n tasks: {\n ...actual.tasks,\n createTask: jest.fn(),\n getTask: jest.fn(),\n },\n };\n});\n\n// Typed accessors — the @wix/data SDK exposes overloaded callable types\n// (MaybeContext<...>), and jest.Mocked<typeof collections> resolves to the\n// HttpClient-form overload, which makes mockResolvedValue/mock.calls unusable.\n// Re-typing each mock with the call shape the adapter uses unblocks both.\nconst createDataCollectionField =\n collections.createDataCollectionField as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, options: { field: collections.Field }]\n >;\nconst patchDataCollectionField =\n collections.patchDataCollectionField as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, field: collections.Field]\n >;\nconst deleteDataCollectionField =\n collections.deleteDataCollectionField as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, options: { fieldKey: string }]\n >;\nconst patchDataCollection =\n collections.patchDataCollection as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, dataCollection: collections.PatchDataCollection]\n >;\n\ninterface CopyTaskState {\n _id: string;\n status: 'NEW' | 'RUNNING' | 'COMPLETED' | 'FAILED';\n failures?: { code?: string; description?: string }[];\n}\n\nconst createTask = tasks.createTask as unknown as jest.Mock<\n Promise<{ _id: string }>,\n [task: { type: string; copyFieldDataOptions: unknown }]\n>;\nconst getTask = tasks.getTask as unknown as jest.Mock<\n Promise<CopyTaskState>,\n [taskId: string]\n>;\n\nconst COLLECTION_ID = 'collection-1';\n\nconst makeField = (\n overrides: Partial<collections.Field> = {},\n): collections.Field => ({\n key: 'sourceField',\n displayName: 'Source Field',\n type: collections.Type.TEXT,\n systemField: false,\n encrypted: false,\n ...overrides,\n});\n\nconst makeCollection = (\n fields: collections.Field[],\n): collections.DataCollection => ({ _id: COLLECTION_ID, fields });\n\nconst makePatternsField = (overrides: Partial<Field> = {}): Field => {\n const base: Field = {\n id: 'ignored-by-addField',\n displayName: 'New Field',\n type: 'SHORT_TEXT',\n };\n return { ...base, ...overrides } as Field;\n};\n\ndescribe('createCmsFieldActions', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n createDataCollectionField.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n deleteDataCollectionField.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n patchDataCollection.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n patchDataCollectionField.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n });\n\n describe('addField', () => {\n it('maps the patterns field type to the CMS type and derives the key from displayName', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({ displayName: 'My New Field' }),\n );\n\n const [calledCollectionId, payload] =\n createDataCollectionField.mock.calls[0];\n expect(calledCollectionId).toBe(COLLECTION_ID);\n expect(payload.field).toMatchObject({\n displayName: 'My New Field',\n type: collections.Type.TEXT,\n required: false,\n });\n expect(payload.field.key).toBeTruthy();\n });\n\n it('appends a numeric suffix when the generated key collides with an existing field', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'newField' })]),\n );\n\n await actions.addField!(makePatternsField({ displayName: 'New Field' }));\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.key).not.toBe('newField');\n });\n\n it('sets encrypted when isPii is true and description from helpText', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({ isPii: true, helpText: 'Some hint' }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.encrypted).toBe(true);\n expect(payload.field.description).toBe('Some hint');\n });\n\n it('passes numberRange only when the field type is NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({\n type: 'NUMBER',\n validation: { required: false, numberRange: { min: 0, max: 10 } },\n }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.type).toBe(collections.Type.NUMBER);\n expect(payload.field.numberRange).toEqual({ min: 0, max: 10 });\n });\n\n it('ignores numberRange when the field type is not NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({\n type: 'SHORT_TEXT',\n validation: { required: false, numberRange: { min: 0, max: 10 } },\n }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.numberRange).toBeUndefined();\n });\n\n it('passes stringLengthRange only when the field type is SHORT_TEXT', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({\n type: 'SHORT_TEXT',\n validation: {\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 50 },\n },\n }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.stringLengthRange).toEqual({\n minLength: 1,\n maxLength: 50,\n });\n });\n\n it('throws when the patterns type has no CMS mapping', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.addField!(makePatternsField({ type: 'IMAGE' })),\n ).rejects.toThrow('Field type IMAGE not supported yet');\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n\n it('uses validation.required when provided', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({ validation: { required: true } }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.required).toBe(true);\n });\n });\n\n describe('editField', () => {\n it('patches only displayName when only displayName is provided', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.editField!('name', { displayName: 'Renamed' });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n displayName: 'Renamed',\n });\n });\n\n it('maps isPii to encrypted and helpText to description', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.editField!('name', { isPii: true, helpText: 'hint' });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n encrypted: true,\n description: 'hint',\n });\n });\n\n it('includes numberRange in the patch only when the source CMS field is NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'age', type: collections.Type.NUMBER }),\n ]),\n );\n\n await actions.editField!('age', {\n validation: { required: true, numberRange: { min: 0, max: 100 } },\n });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'age',\n required: true,\n numberRange: { min: 0, max: 100 },\n });\n });\n\n it('omits numberRange when the source CMS field is not NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'name', type: collections.Type.TEXT }),\n ]),\n );\n\n await actions.editField!('name', {\n validation: { required: true, numberRange: { min: 0, max: 100 } },\n });\n\n const [, patch] = patchDataCollectionField.mock.calls[0];\n expect(patch).not.toHaveProperty('numberRange');\n expect(patch).toMatchObject({ key: 'name', required: true });\n });\n\n it('includes stringLengthRange in the patch only when the source CMS field is TEXT', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'name', type: collections.Type.TEXT }),\n ]),\n );\n\n await actions.editField!('name', {\n validation: {\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n },\n });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n });\n });\n\n it('omits stringLengthRange when the source CMS field is not TEXT', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'age', type: collections.Type.NUMBER }),\n ]),\n );\n\n await actions.editField!('age', {\n validation: {\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n },\n });\n\n const [, patch] = patchDataCollectionField.mock.calls[0];\n expect(patch).not.toHaveProperty('stringLengthRange');\n });\n });\n\n describe('renameField', () => {\n it('patches the field displayName with the new name', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.renameField!('name', 'Renamed');\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n displayName: 'Renamed',\n });\n });\n });\n\n describe('deleteField', () => {\n it('calls collections.deleteDataCollectionField with the field key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'toDelete' })]),\n );\n\n await actions.deleteField!('toDelete');\n\n expect(deleteDataCollectionField).toHaveBeenCalledTimes(1);\n expect(deleteDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n fieldKey: 'toDelete',\n });\n });\n });\n\n describe('makePrimary', () => {\n it('patches the collection displayField with the given field id', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'newPrimary' })]),\n );\n\n await actions.makePrimary!('newPrimary');\n\n expect(patchDataCollection).toHaveBeenCalledTimes(1);\n expect(patchDataCollection).toHaveBeenCalledWith(COLLECTION_ID, {\n displayField: 'newPrimary',\n });\n });\n });\n\n describe('duplicateField', () => {\n it('clones the source field with a \"(Copy)\" suffix and a fresh key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'sourceField', displayName: 'Source Field' }),\n ]),\n );\n\n await actions.duplicateField!('sourceField');\n\n expect(createDataCollectionField).toHaveBeenCalledTimes(1);\n const [calledCollectionId, payload] =\n createDataCollectionField.mock.calls[0];\n expect(calledCollectionId).toBe(COLLECTION_ID);\n expect(payload.field).toMatchObject({\n displayName: 'Source Field (Copy)',\n type: collections.Type.TEXT,\n });\n expect(payload.field.key).not.toBe('sourceField');\n });\n\n it('strips systemField and capabilities from the cloned field', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({\n systemField: true,\n capabilities: {\n sortable: true,\n queryOperators: [collections.QueryOperator.EQ],\n },\n }),\n ]),\n );\n\n await actions.duplicateField!('sourceField');\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field).not.toHaveProperty('systemField');\n expect(payload.field).not.toHaveProperty('capabilities');\n });\n\n it('clears typeMetadata.multiReference.referencingFieldKey on clone', async () => {\n const sourceField: collections.Field = makeField({\n key: 'multiRef',\n displayName: 'Multi Ref',\n type: collections.Type.MULTI_REFERENCE,\n typeMetadata: {\n multiReference: {\n referencingFieldKey: 'someExistingKey',\n referencedCollectionId: 'other-collection',\n },\n },\n });\n\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([sourceField]),\n );\n\n await actions.duplicateField!('multiRef');\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(\n payload.field.typeMetadata?.multiReference?.referencingFieldKey,\n ).toBeUndefined();\n expect(\n payload.field.typeMetadata?.multiReference?.referencedCollectionId,\n ).toBe('other-collection');\n });\n\n it('appends a numeric suffix when the generated key collides with an existing field', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'sourceField', displayName: 'Source Field' }),\n makeField({ key: 'sourceFieldCopy' }),\n ]),\n );\n\n await actions.duplicateField!('sourceField');\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.key).not.toBe('sourceField');\n expect(payload.field.key).not.toBe('sourceFieldCopy');\n });\n\n it('throws when the source field is not found', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(actions.duplicateField!('missing')).rejects.toThrow(\n 'Field missing not found',\n );\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n });\n\n describe('duplicateFieldWithContent', () => {\n it('creates the cloned field, kicks off a COPY_FIELD_DATA task, and waits for completion', async () => {\n createTask.mockResolvedValue({ _id: 'task-1' });\n getTask.mockResolvedValue({ _id: 'task-1', status: 'COMPLETED' });\n\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'sourceField', displayName: 'Source Field' }),\n ]),\n );\n\n await actions.duplicateFieldWithContent!('sourceField');\n\n expect(createDataCollectionField).toHaveBeenCalledTimes(1);\n const [, payload] = createDataCollectionField.mock.calls[0];\n const targetFieldKey = payload.field.key;\n\n expect(createTask).toHaveBeenCalledTimes(1);\n expect(createTask).toHaveBeenCalledWith({\n type: 'COPY_FIELD_DATA',\n copyFieldDataOptions: {\n dataCollectionId: COLLECTION_ID,\n sourceFieldKey: 'sourceField',\n targetFieldKey,\n },\n });\n expect(getTask).toHaveBeenCalledWith('task-1');\n });\n\n it('throws when the copy task reports FAILED, surfacing the failure code and description', async () => {\n createTask.mockResolvedValue({ _id: 'task-2' });\n getTask.mockResolvedValue({\n _id: 'task-2',\n status: 'FAILED',\n failures: [{ code: 'INTERNAL', description: 'Copy boom' }],\n });\n\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField()]),\n );\n\n await expect(\n actions.duplicateFieldWithContent!('sourceField'),\n ).rejects.toThrow('INTERNAL: Copy boom');\n });\n\n it('throws when the source field is not found and never creates a task', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.duplicateFieldWithContent!('missing'),\n ).rejects.toThrow('Field missing not found');\n expect(createDataCollectionField).not.toHaveBeenCalled();\n expect(createTask).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -339,13 +339,7 @@ describe('createCmsBackend', () => {
|
|
|
339
339
|
to: 100
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
|
-
}, {
|
|
343
|
-
filterFieldMapping: {
|
|
344
|
-
price: {
|
|
345
|
-
fieldId: 'price'
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
});
|
|
342
|
+
}, {});
|
|
349
343
|
expect(queryChain.ge).toHaveBeenCalledWith('price', 10);
|
|
350
344
|
expect(queryChain.le).toHaveBeenCalledWith('price', 100);
|
|
351
345
|
});
|
|
@@ -359,13 +353,7 @@ describe('createCmsBackend', () => {
|
|
|
359
353
|
id: 'checked'
|
|
360
354
|
}]
|
|
361
355
|
}
|
|
362
|
-
}, {
|
|
363
|
-
filterFieldMapping: {
|
|
364
|
-
done: {
|
|
365
|
-
fieldId: 'done'
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
});
|
|
356
|
+
}, {});
|
|
369
357
|
expect(queryChain.eq).toHaveBeenCalledWith('done', true);
|
|
370
358
|
});
|
|
371
359
|
it('applies ascending sort from the query', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_data","require","_createCmsBackend","jest","mock","errorHandler","withErrorHandler","fn","mockFindResult","items","totalCount","queryChain","forEach","m","find","Promise","resolve","filterChain","__chains","query","filter","insert","update","remove","bulkRemove","bulkInsert","replaceReferences","backups","queryMock","COLLECTION_ID","fieldsWithRefs","title","id","type","displayName","capabilities","supportedQueryOperators","sortable","author","referenceMetadata","referencedCollectionId","tags","findWithOptions","options","describe","beforeEach","clearAllMocks","it","_id","backend","createCmsBackend","entity","get","expect","toHaveBeenCalledWith","eq","toEqual","include","rejects","toThrow","mockResolvedValue","result","create","undefined","toBe","delete","bulkDelete","offset","limit","skip","returnTotalCount","total","hasNext","searchableFieldIds","not","toHaveBeenCalled","filterableFields","price","done","filters","from","to","filterFieldMapping","fieldId","ge","le","sort","fieldName","order","ascending","descending","search","contains","and","inserted","updated","errors","originalIndex","message","code","a","succeeded","failed","rowIndex"],"sources":["../../../../src/adapter/__tests__/createCmsBackend.spec.ts"],"sourcesContent":["import { items } from '@wix/data';\nimport type { Schema } from '@wix/bex-core';\nimport { createCmsBackend } from '../createCmsBackend';\n\n// `bulkInsert`/`backup` wrap calls in errorHandler.withErrorHandler, which needs an\n// initialized Wix SDK context. In a pure-function unit test there is none, so we\n// stub the wrapper to just invoke its callback (the mapping logic is what we assert).\njest.mock('@wix/essentials', () => ({\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n },\n}));\n\n// A chainable query stub whose terminal `.find()` resolves to a configurable\n// result. `mockFindResult` is reassigned per-test before the backend call.\n// `mock`-prefixed names are the only out-of-scope refs jest.mock() factories allow.\nlet mockFindResult: { items: unknown[]; totalCount?: number } = {\n items: [],\n totalCount: 0,\n};\n\njest.mock('@wix/data', () => {\n const queryChain: Record<string, jest.Mock> = {};\n [\n 'eq',\n 'include',\n 'skip',\n 'limit',\n 'and',\n 'ge',\n 'le',\n 'ascending',\n 'descending',\n ].forEach((m) => {\n queryChain[m] = jest.fn(() => queryChain);\n });\n queryChain.find = jest.fn(() => Promise.resolve(mockFindResult));\n\n const filterChain: Record<string, jest.Mock> = {};\n ['eq', 'contains', 'or', 'and', 'not'].forEach((m) => {\n filterChain[m] = jest.fn(() => filterChain);\n });\n\n return {\n __chains: { queryChain, filterChain },\n items: {\n query: jest.fn(() => queryChain),\n filter: jest.fn(() => filterChain),\n insert: jest.fn(),\n update: jest.fn(),\n remove: jest.fn(),\n bulkRemove: jest.fn(),\n bulkInsert: jest.fn(),\n replaceReferences: jest.fn(),\n },\n backups: {},\n };\n});\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { queryChain, filterChain } = (\n require('@wix/data') as {\n __chains: {\n queryChain: Record<string, jest.Mock>;\n filterChain: Record<string, jest.Mock>;\n };\n }\n).__chains;\n\nconst queryMock = items.query as unknown as jest.Mock;\nconst insert = items.insert as unknown as jest.Mock;\nconst update = items.update as unknown as jest.Mock;\nconst remove = items.remove as unknown as jest.Mock;\nconst bulkRemove = items.bulkRemove as unknown as jest.Mock;\nconst bulkInsert = items.bulkInsert as unknown as jest.Mock;\nconst replaceReferences = items.replaceReferences as unknown as jest.Mock;\n\nconst COLLECTION_ID = 'collection-1';\n\nconst fieldsWithRefs: Schema['fields'] = {\n title: {\n id: 'title',\n type: 'SHORT_TEXT',\n displayName: 'Title',\n capabilities: { supportedQueryOperators: [], sortable: true },\n },\n author: {\n id: 'author',\n type: 'REFERENCE',\n displayName: 'Author',\n referenceMetadata: { referencedCollectionId: 'authors' },\n capabilities: { supportedQueryOperators: [], sortable: false },\n },\n tags: {\n id: 'tags',\n type: 'MULTI_REFERENCE',\n displayName: 'Tags',\n referenceMetadata: { referencedCollectionId: 'tags-collection' },\n capabilities: { supportedQueryOperators: [], sortable: false },\n },\n};\n\ntype FindOptions = {\n searchableFieldIds?: string[];\n filterFieldMapping?: Record<string, { fieldId: string }>;\n};\n\n/** Calls `backend.find` with the per-call options arg (absent from the erased interface). */\nconst findWithOptions = (\n find: unknown,\n query: Parameters<ReturnType<typeof createCmsBackend>['find']>[0],\n options: FindOptions,\n) =>\n (find as (q: typeof query, o: FindOptions) => Promise<unknown>)(\n query,\n options,\n );\n\ndescribe('createCmsBackend', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n mockFindResult = { items: [], totalCount: 0 };\n });\n\n describe('get', () => {\n it('queries by _id and returns the single matching entity', async () => {\n mockFindResult = { items: [{ _id: 'e1', title: 'Hello' }] };\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const entity = await backend.get('e1');\n\n expect(queryMock).toHaveBeenCalledWith(COLLECTION_ID);\n expect(queryChain.eq).toHaveBeenCalledWith('_id', 'e1');\n expect(entity).toEqual({ _id: 'e1', title: 'Hello' });\n });\n\n it('includes reference fields when the schema has them', async () => {\n mockFindResult = { items: [{ _id: 'e1' }] };\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await backend.get('e1');\n\n expect(queryChain.include).toHaveBeenCalledWith('author', 'tags');\n });\n\n it('throws when no entity is found', async () => {\n mockFindResult = { items: [] };\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n await expect(backend.get('missing')).rejects.toThrow(\n 'Entity not found: missing',\n );\n });\n });\n\n describe('create', () => {\n it('inserts the entity and returns it with the created _id', async () => {\n insert.mockResolvedValue({ _id: 'new-1' });\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const result = await backend.create({ title: 'Hi' } as never);\n\n expect(insert).toHaveBeenCalledWith(COLLECTION_ID, { title: 'Hi' });\n expect(result).toEqual({ title: 'Hi', _id: 'new-1' });\n });\n\n it('syncs multi-reference fields via replaceReferences', async () => {\n insert.mockResolvedValue({ _id: 'new-1' });\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await backend.create({\n title: 'Hi',\n tags: [{ _id: 't1' }, { _id: 't2' }],\n } as never);\n\n expect(replaceReferences).toHaveBeenCalledWith(\n COLLECTION_ID,\n 'tags',\n 'new-1',\n ['t1', 't2'],\n );\n });\n });\n\n describe('update', () => {\n it('updates the entity and returns it', async () => {\n update.mockResolvedValue(undefined);\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const entity = { _id: 'e1', title: 'Edited' };\n const result = await backend.update(entity as never);\n\n expect(update).toHaveBeenCalledWith(COLLECTION_ID, entity);\n expect(result).toBe(entity);\n });\n });\n\n describe('delete / bulkDelete', () => {\n it('removes a single entity by id', async () => {\n remove.mockResolvedValue(undefined);\n const backend = createCmsBackend(COLLECTION_ID, {});\n\n await backend.delete('e1');\n\n expect(remove).toHaveBeenCalledWith(COLLECTION_ID, 'e1');\n });\n\n it('bulk-removes entities by ids', async () => {\n bulkRemove.mockResolvedValue(undefined);\n const backend = createCmsBackend(COLLECTION_ID, {});\n\n await backend.bulkDelete(['e1', 'e2']);\n\n expect(bulkRemove).toHaveBeenCalledWith(COLLECTION_ID, ['e1', 'e2']);\n });\n });\n\n describe('find', () => {\n it('applies skip/limit and computes total and hasNext', async () => {\n mockFindResult = {\n items: [{ _id: 'a' }, { _id: 'b' }],\n totalCount: 5,\n };\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const result = await backend.find({\n offset: 0,\n limit: 2,\n } as never);\n\n expect(queryChain.skip).toHaveBeenCalledWith(0);\n expect(queryChain.limit).toHaveBeenCalledWith(2);\n expect(queryChain.find).toHaveBeenCalledWith({ returnTotalCount: true });\n expect(result.items).toEqual([{ _id: 'a' }, { _id: 'b' }]);\n expect(result.total).toBe(5);\n // 0 + 2 < 5 → there is a next page.\n expect(result.hasNext).toBe(true);\n });\n\n it('reports hasNext false on the last page', async () => {\n mockFindResult = {\n items: [{ _id: 'e' }],\n totalCount: 3,\n };\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const result = await backend.find({ offset: 2, limit: 2 } as never);\n\n // 2 + 1 === 3 → no next page.\n expect(result.hasNext).toBe(false);\n });\n\n it('includes only reference fields that are also searchable', async () => {\n mockFindResult = { items: [], totalCount: 0 };\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n // The per-call `options` arg is part of the concrete `createCmsBackend.find`\n // but not the erased `CollectionBackend.find` contract — cast to reach it.\n await findWithOptions(backend.find, { offset: 0, limit: 10 } as never, {\n searchableFieldIds: ['title', 'author'],\n });\n\n // 'author' is a reference and searchable → included; 'tags' is not searchable.\n expect(queryChain.include).toHaveBeenCalledWith('author');\n });\n\n it('does not call include when no reference field is searchable', async () => {\n mockFindResult = { items: [], totalCount: 0 };\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await findWithOptions(backend.find, { offset: 0, limit: 10 } as never, {\n searchableFieldIds: ['title'],\n });\n\n expect(queryChain.include).not.toHaveBeenCalled();\n });\n\n it('includes no reference fields when called with no options (inert default)', async () => {\n mockFindResult = { items: [], totalCount: 0 };\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n // No options → default searchableFieldIds = [] → no refs included, no search.\n await backend.find({ offset: 0, limit: 10 } as never);\n\n expect(queryChain.include).not.toHaveBeenCalled();\n });\n\n // The cases below mirror auto-patterns' end-to-end coverage: the fetch path\n // must actually apply the query's filters/sort/search, not just skip/limit.\n const filterableFields: Schema['fields'] = {\n title: fieldsWithRefs.title,\n price: {\n id: 'price',\n type: 'NUMBER',\n displayName: 'Price',\n capabilities: {\n supportedQueryOperators: ['GTE', 'LTE'],\n sortable: true,\n },\n },\n done: {\n id: 'done',\n type: 'BOOLEAN',\n displayName: 'Done',\n capabilities: { supportedQueryOperators: [], sortable: false },\n },\n };\n\n it('applies a number range filter from the query', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await findWithOptions(\n backend.find,\n {\n offset: 0,\n limit: 10,\n filters: { price: { from: 10, to: 100 } },\n } as never,\n { filterFieldMapping: { price: { fieldId: 'price' } } },\n );\n\n expect(queryChain.ge).toHaveBeenCalledWith('price', 10);\n expect(queryChain.le).toHaveBeenCalledWith('price', 100);\n });\n\n it('applies a checked boolean filter from the query', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await findWithOptions(\n backend.find,\n {\n offset: 0,\n limit: 10,\n filters: { done: [{ id: 'checked' }] },\n } as never,\n { filterFieldMapping: { done: { fieldId: 'done' } } },\n );\n\n expect(queryChain.eq).toHaveBeenCalledWith('done', true);\n });\n\n it('applies ascending sort from the query', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await backend.find({\n offset: 0,\n limit: 10,\n sort: [{ fieldName: 'title', order: 'asc' }],\n } as never);\n\n expect(queryChain.ascending).toHaveBeenCalledWith('title');\n });\n\n it('applies descending sort from the query', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await backend.find({\n offset: 0,\n limit: 10,\n sort: [{ fieldName: 'title', order: 'desc' }],\n } as never);\n\n expect(queryChain.descending).toHaveBeenCalledWith('title');\n });\n\n it('applies the search term as a contains filter on searchable text fields', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await findWithOptions(\n backend.find,\n { offset: 0, limit: 10, search: 'hello' } as never,\n { searchableFieldIds: ['title'] },\n );\n\n expect(filterChain.contains).toHaveBeenCalledWith('title', 'hello');\n expect(queryChain.and).toHaveBeenCalledWith(filterChain);\n });\n });\n\n describe('bulkInsert', () => {\n it('maps inserted/updated to succeeded, errors to failed, and surfaces error rows', async () => {\n bulkInsert.mockResolvedValue({\n inserted: 2,\n updated: 1,\n errors: [{ originalIndex: 4, message: 'bad row', code: 'INVALID' }],\n });\n const backend = createCmsBackend(COLLECTION_ID, {});\n\n const result = await backend.bulkInsert!([{ a: 1 }, { a: 2 }] as never);\n\n expect(bulkInsert).toHaveBeenCalledWith(COLLECTION_ID, [\n { a: 1 },\n { a: 2 },\n ]);\n expect(result.succeeded).toBe(3);\n expect(result.failed).toBe(1);\n expect(result.errors).toEqual([\n { rowIndex: 4, message: 'bad row', code: 'INVALID' },\n ]);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_data","require","_createCmsBackend","jest","mock","errorHandler","withErrorHandler","fn","mockFindResult","items","totalCount","queryChain","forEach","m","find","Promise","resolve","filterChain","__chains","query","filter","insert","update","remove","bulkRemove","bulkInsert","replaceReferences","backups","queryMock","COLLECTION_ID","fieldsWithRefs","title","id","type","displayName","capabilities","supportedQueryOperators","sortable","author","referenceMetadata","referencedCollectionId","tags","findWithOptions","options","describe","beforeEach","clearAllMocks","it","_id","backend","createCmsBackend","entity","get","expect","toHaveBeenCalledWith","eq","toEqual","include","rejects","toThrow","mockResolvedValue","result","create","undefined","toBe","delete","bulkDelete","offset","limit","skip","returnTotalCount","total","hasNext","searchableFieldIds","not","toHaveBeenCalled","filterableFields","price","done","filters","from","to","ge","le","sort","fieldName","order","ascending","descending","search","contains","and","inserted","updated","errors","originalIndex","message","code","a","succeeded","failed","rowIndex"],"sources":["../../../../src/adapter/__tests__/createCmsBackend.spec.ts"],"sourcesContent":["import { items } from '@wix/data';\nimport type { Schema } from '@wix/bex-core';\nimport { createCmsBackend } from '../createCmsBackend';\n\n// `bulkInsert`/`backup` wrap calls in errorHandler.withErrorHandler, which needs an\n// initialized Wix SDK context. In a pure-function unit test there is none, so we\n// stub the wrapper to just invoke its callback (the mapping logic is what we assert).\njest.mock('@wix/essentials', () => ({\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n },\n}));\n\n// A chainable query stub whose terminal `.find()` resolves to a configurable\n// result. `mockFindResult` is reassigned per-test before the backend call.\n// `mock`-prefixed names are the only out-of-scope refs jest.mock() factories allow.\nlet mockFindResult: { items: unknown[]; totalCount?: number } = {\n items: [],\n totalCount: 0,\n};\n\njest.mock('@wix/data', () => {\n const queryChain: Record<string, jest.Mock> = {};\n [\n 'eq',\n 'include',\n 'skip',\n 'limit',\n 'and',\n 'ge',\n 'le',\n 'ascending',\n 'descending',\n ].forEach((m) => {\n queryChain[m] = jest.fn(() => queryChain);\n });\n queryChain.find = jest.fn(() => Promise.resolve(mockFindResult));\n\n const filterChain: Record<string, jest.Mock> = {};\n ['eq', 'contains', 'or', 'and', 'not'].forEach((m) => {\n filterChain[m] = jest.fn(() => filterChain);\n });\n\n return {\n __chains: { queryChain, filterChain },\n items: {\n query: jest.fn(() => queryChain),\n filter: jest.fn(() => filterChain),\n insert: jest.fn(),\n update: jest.fn(),\n remove: jest.fn(),\n bulkRemove: jest.fn(),\n bulkInsert: jest.fn(),\n replaceReferences: jest.fn(),\n },\n backups: {},\n };\n});\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { queryChain, filterChain } = (\n require('@wix/data') as {\n __chains: {\n queryChain: Record<string, jest.Mock>;\n filterChain: Record<string, jest.Mock>;\n };\n }\n).__chains;\n\nconst queryMock = items.query as unknown as jest.Mock;\nconst insert = items.insert as unknown as jest.Mock;\nconst update = items.update as unknown as jest.Mock;\nconst remove = items.remove as unknown as jest.Mock;\nconst bulkRemove = items.bulkRemove as unknown as jest.Mock;\nconst bulkInsert = items.bulkInsert as unknown as jest.Mock;\nconst replaceReferences = items.replaceReferences as unknown as jest.Mock;\n\nconst COLLECTION_ID = 'collection-1';\n\nconst fieldsWithRefs: Schema['fields'] = {\n title: {\n id: 'title',\n type: 'SHORT_TEXT',\n displayName: 'Title',\n capabilities: { supportedQueryOperators: [], sortable: true },\n },\n author: {\n id: 'author',\n type: 'REFERENCE',\n displayName: 'Author',\n referenceMetadata: { referencedCollectionId: 'authors' },\n capabilities: { supportedQueryOperators: [], sortable: false },\n },\n tags: {\n id: 'tags',\n type: 'MULTI_REFERENCE',\n displayName: 'Tags',\n referenceMetadata: { referencedCollectionId: 'tags-collection' },\n capabilities: { supportedQueryOperators: [], sortable: false },\n },\n};\n\ntype FindOptions = {\n searchableFieldIds?: string[];\n};\n\n/** Calls `backend.find` with the per-call options arg (absent from the erased interface). */\nconst findWithOptions = (\n find: unknown,\n query: Parameters<ReturnType<typeof createCmsBackend>['find']>[0],\n options: FindOptions,\n) =>\n (find as (q: typeof query, o: FindOptions) => Promise<unknown>)(\n query,\n options,\n );\n\ndescribe('createCmsBackend', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n mockFindResult = { items: [], totalCount: 0 };\n });\n\n describe('get', () => {\n it('queries by _id and returns the single matching entity', async () => {\n mockFindResult = { items: [{ _id: 'e1', title: 'Hello' }] };\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const entity = await backend.get('e1');\n\n expect(queryMock).toHaveBeenCalledWith(COLLECTION_ID);\n expect(queryChain.eq).toHaveBeenCalledWith('_id', 'e1');\n expect(entity).toEqual({ _id: 'e1', title: 'Hello' });\n });\n\n it('includes reference fields when the schema has them', async () => {\n mockFindResult = { items: [{ _id: 'e1' }] };\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await backend.get('e1');\n\n expect(queryChain.include).toHaveBeenCalledWith('author', 'tags');\n });\n\n it('throws when no entity is found', async () => {\n mockFindResult = { items: [] };\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n await expect(backend.get('missing')).rejects.toThrow(\n 'Entity not found: missing',\n );\n });\n });\n\n describe('create', () => {\n it('inserts the entity and returns it with the created _id', async () => {\n insert.mockResolvedValue({ _id: 'new-1' });\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const result = await backend.create({ title: 'Hi' } as never);\n\n expect(insert).toHaveBeenCalledWith(COLLECTION_ID, { title: 'Hi' });\n expect(result).toEqual({ title: 'Hi', _id: 'new-1' });\n });\n\n it('syncs multi-reference fields via replaceReferences', async () => {\n insert.mockResolvedValue({ _id: 'new-1' });\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await backend.create({\n title: 'Hi',\n tags: [{ _id: 't1' }, { _id: 't2' }],\n } as never);\n\n expect(replaceReferences).toHaveBeenCalledWith(\n COLLECTION_ID,\n 'tags',\n 'new-1',\n ['t1', 't2'],\n );\n });\n });\n\n describe('update', () => {\n it('updates the entity and returns it', async () => {\n update.mockResolvedValue(undefined);\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const entity = { _id: 'e1', title: 'Edited' };\n const result = await backend.update(entity as never);\n\n expect(update).toHaveBeenCalledWith(COLLECTION_ID, entity);\n expect(result).toBe(entity);\n });\n });\n\n describe('delete / bulkDelete', () => {\n it('removes a single entity by id', async () => {\n remove.mockResolvedValue(undefined);\n const backend = createCmsBackend(COLLECTION_ID, {});\n\n await backend.delete('e1');\n\n expect(remove).toHaveBeenCalledWith(COLLECTION_ID, 'e1');\n });\n\n it('bulk-removes entities by ids', async () => {\n bulkRemove.mockResolvedValue(undefined);\n const backend = createCmsBackend(COLLECTION_ID, {});\n\n await backend.bulkDelete(['e1', 'e2']);\n\n expect(bulkRemove).toHaveBeenCalledWith(COLLECTION_ID, ['e1', 'e2']);\n });\n });\n\n describe('find', () => {\n it('applies skip/limit and computes total and hasNext', async () => {\n mockFindResult = {\n items: [{ _id: 'a' }, { _id: 'b' }],\n totalCount: 5,\n };\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const result = await backend.find({\n offset: 0,\n limit: 2,\n } as never);\n\n expect(queryChain.skip).toHaveBeenCalledWith(0);\n expect(queryChain.limit).toHaveBeenCalledWith(2);\n expect(queryChain.find).toHaveBeenCalledWith({ returnTotalCount: true });\n expect(result.items).toEqual([{ _id: 'a' }, { _id: 'b' }]);\n expect(result.total).toBe(5);\n // 0 + 2 < 5 → there is a next page.\n expect(result.hasNext).toBe(true);\n });\n\n it('reports hasNext false on the last page', async () => {\n mockFindResult = {\n items: [{ _id: 'e' }],\n totalCount: 3,\n };\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\n const result = await backend.find({ offset: 2, limit: 2 } as never);\n\n // 2 + 1 === 3 → no next page.\n expect(result.hasNext).toBe(false);\n });\n\n it('includes only reference fields that are also searchable', async () => {\n mockFindResult = { items: [], totalCount: 0 };\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n // The per-call `options` arg is part of the concrete `createCmsBackend.find`\n // but not the erased `CollectionBackend.find` contract — cast to reach it.\n await findWithOptions(backend.find, { offset: 0, limit: 10 } as never, {\n searchableFieldIds: ['title', 'author'],\n });\n\n // 'author' is a reference and searchable → included; 'tags' is not searchable.\n expect(queryChain.include).toHaveBeenCalledWith('author');\n });\n\n it('does not call include when no reference field is searchable', async () => {\n mockFindResult = { items: [], totalCount: 0 };\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await findWithOptions(backend.find, { offset: 0, limit: 10 } as never, {\n searchableFieldIds: ['title'],\n });\n\n expect(queryChain.include).not.toHaveBeenCalled();\n });\n\n it('includes no reference fields when called with no options (inert default)', async () => {\n mockFindResult = { items: [], totalCount: 0 };\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n // No options → default searchableFieldIds = [] → no refs included, no search.\n await backend.find({ offset: 0, limit: 10 } as never);\n\n expect(queryChain.include).not.toHaveBeenCalled();\n });\n\n // The cases below mirror auto-patterns' end-to-end coverage: the fetch path\n // must actually apply the query's filters/sort/search, not just skip/limit.\n const filterableFields: Schema['fields'] = {\n title: fieldsWithRefs.title,\n price: {\n id: 'price',\n type: 'NUMBER',\n displayName: 'Price',\n capabilities: {\n supportedQueryOperators: ['GTE', 'LTE'],\n sortable: true,\n },\n },\n done: {\n id: 'done',\n type: 'BOOLEAN',\n displayName: 'Done',\n capabilities: { supportedQueryOperators: [], sortable: false },\n },\n };\n\n it('applies a number range filter from the query', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await findWithOptions(\n backend.find,\n {\n offset: 0,\n limit: 10,\n filters: { price: { from: 10, to: 100 } },\n } as never,\n {},\n );\n\n expect(queryChain.ge).toHaveBeenCalledWith('price', 10);\n expect(queryChain.le).toHaveBeenCalledWith('price', 100);\n });\n\n it('applies a checked boolean filter from the query', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await findWithOptions(\n backend.find,\n {\n offset: 0,\n limit: 10,\n filters: { done: [{ id: 'checked' }] },\n } as never,\n {},\n );\n\n expect(queryChain.eq).toHaveBeenCalledWith('done', true);\n });\n\n it('applies ascending sort from the query', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await backend.find({\n offset: 0,\n limit: 10,\n sort: [{ fieldName: 'title', order: 'asc' }],\n } as never);\n\n expect(queryChain.ascending).toHaveBeenCalledWith('title');\n });\n\n it('applies descending sort from the query', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await backend.find({\n offset: 0,\n limit: 10,\n sort: [{ fieldName: 'title', order: 'desc' }],\n } as never);\n\n expect(queryChain.descending).toHaveBeenCalledWith('title');\n });\n\n it('applies the search term as a contains filter on searchable text fields', async () => {\n const backend = createCmsBackend(COLLECTION_ID, filterableFields);\n\n await findWithOptions(\n backend.find,\n { offset: 0, limit: 10, search: 'hello' } as never,\n { searchableFieldIds: ['title'] },\n );\n\n expect(filterChain.contains).toHaveBeenCalledWith('title', 'hello');\n expect(queryChain.and).toHaveBeenCalledWith(filterChain);\n });\n });\n\n describe('bulkInsert', () => {\n it('maps inserted/updated to succeeded, errors to failed, and surfaces error rows', async () => {\n bulkInsert.mockResolvedValue({\n inserted: 2,\n updated: 1,\n errors: [{ originalIndex: 4, message: 'bad row', code: 'INVALID' }],\n });\n const backend = createCmsBackend(COLLECTION_ID, {});\n\n const result = await backend.bulkInsert!([{ a: 1 }, { a: 2 }] as never);\n\n expect(bulkInsert).toHaveBeenCalledWith(COLLECTION_ID, [\n { a: 1 },\n { a: 2 },\n ]);\n expect(result.succeeded).toBe(3);\n expect(result.failed).toBe(1);\n expect(result.errors).toEqual([\n { rowIndex: 4, message: 'bad row', code: 'INVALID' },\n ]);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _createCmsSchemaSource = require("../createCmsSchemaSource");
|
|
4
|
+
// loadCmsSchema imports errorHandler at evaluation time; stub it so importing
|
|
5
|
+
// the source factory is side-effect free. The loader itself isn't run here.
|
|
6
|
+
jest.mock('@wix/essentials', () => ({
|
|
7
|
+
errorHandler: {
|
|
8
|
+
withErrorHandler: fn => fn()
|
|
9
|
+
}
|
|
10
|
+
}));
|
|
11
|
+
const httpClient = {};
|
|
12
|
+
describe('createCmsSchemaSource', () => {
|
|
13
|
+
it('offers the CMS creatable field types in display order', () => {
|
|
14
|
+
const source = (0, _createCmsSchemaSource.createCmsSchemaSource)({
|
|
15
|
+
collectionId: 'Pokemon',
|
|
16
|
+
httpClient
|
|
17
|
+
});
|
|
18
|
+
expect(source.creatableFieldTypes.map(t => t.patternsType)).toEqual(['SHORT_TEXT', 'NUMBER', 'BOOLEAN', 'DATE']);
|
|
19
|
+
});
|
|
20
|
+
it('carries label keys for the UI to resolve', () => {
|
|
21
|
+
const source = (0, _createCmsSchemaSource.createCmsSchemaSource)({
|
|
22
|
+
collectionId: 'Pokemon',
|
|
23
|
+
httpClient
|
|
24
|
+
});
|
|
25
|
+
const shortText = source.creatableFieldTypes.find(t => t.patternsType === 'SHORT_TEXT');
|
|
26
|
+
expect(shortText == null ? void 0 : shortText.labelKey).toBe('cairo.customFields.fieldType.shortText');
|
|
27
|
+
expect(shortText == null ? void 0 : shortText.namePlaceholderKey).toBe('cairo.customFields.fieldType.shortText.Name.placeholder');
|
|
28
|
+
});
|
|
29
|
+
it('names the collection query after the collectionId', () => {
|
|
30
|
+
const source = (0, _createCmsSchemaSource.createCmsSchemaSource)({
|
|
31
|
+
collectionId: 'Pokemon',
|
|
32
|
+
httpClient
|
|
33
|
+
});
|
|
34
|
+
expect(source.collectionId).toBe('Pokemon');
|
|
35
|
+
expect(source.collectionConfig.queryName).toBe('Pokemon');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=createCmsSchemaSource.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_createCmsSchemaSource","require","jest","mock","errorHandler","withErrorHandler","fn","httpClient","describe","it","source","createCmsSchemaSource","collectionId","expect","creatableFieldTypes","map","t","patternsType","toEqual","shortText","find","labelKey","toBe","namePlaceholderKey","collectionConfig","queryName"],"sources":["../../../../src/adapter/__tests__/createCmsSchemaSource.spec.ts"],"sourcesContent":["import { createCmsSchemaSource } from '../createCmsSchemaSource';\nimport type { CreateCmsSchemaSourceDeps } from '../createCmsSchemaSource';\n\n// loadCmsSchema imports errorHandler at evaluation time; stub it so importing\n// the source factory is side-effect free. The loader itself isn't run here.\njest.mock('@wix/essentials', () => ({\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n },\n}));\n\nconst httpClient = {} as unknown as CreateCmsSchemaSourceDeps['httpClient'];\n\ndescribe('createCmsSchemaSource', () => {\n it('offers the CMS creatable field types in display order', () => {\n const source = createCmsSchemaSource({\n collectionId: 'Pokemon',\n httpClient,\n });\n\n expect(source.creatableFieldTypes.map((t) => t.patternsType)).toEqual([\n 'SHORT_TEXT',\n 'NUMBER',\n 'BOOLEAN',\n 'DATE',\n ]);\n });\n\n it('carries label keys for the UI to resolve', () => {\n const source = createCmsSchemaSource({\n collectionId: 'Pokemon',\n httpClient,\n });\n\n const shortText = source.creatableFieldTypes.find(\n (t) => t.patternsType === 'SHORT_TEXT',\n );\n expect(shortText?.labelKey).toBe('cairo.customFields.fieldType.shortText');\n expect(shortText?.namePlaceholderKey).toBe(\n 'cairo.customFields.fieldType.shortText.Name.placeholder',\n );\n });\n\n it('names the collection query after the collectionId', () => {\n const source = createCmsSchemaSource({\n collectionId: 'Pokemon',\n httpClient,\n });\n\n expect(source.collectionId).toBe('Pokemon');\n expect(source.collectionConfig.queryName).toBe('Pokemon');\n });\n});\n"],"mappings":";;AAAA,IAAAA,sBAAA,GAAAC,OAAA;AAGA;AACA;AACAC,IAAI,CAACC,IAAI,CAAC,iBAAiB,EAAE,OAAO;EAClCC,YAAY,EAAE;IACZC,gBAAgB,EAAGC,EAAiB,IAAKA,EAAE,CAAC;EAC9C;AACF,CAAC,CAAC,CAAC;AAEH,MAAMC,UAAU,GAAG,CAAC,CAAuD;AAE3EC,QAAQ,CAAC,uBAAuB,EAAE,MAAM;EACtCC,EAAE,CAAC,uDAAuD,EAAE,MAAM;IAChE,MAAMC,MAAM,GAAG,IAAAC,4CAAqB,EAAC;MACnCC,YAAY,EAAE,SAAS;MACvBL;IACF,CAAC,CAAC;IAEFM,MAAM,CAACH,MAAM,CAACI,mBAAmB,CAACC,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,YAAY,CAAC,CAAC,CAACC,OAAO,CAAC,CACpE,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,MAAM,CACP,CAAC;EACJ,CAAC,CAAC;EAEFT,EAAE,CAAC,0CAA0C,EAAE,MAAM;IACnD,MAAMC,MAAM,GAAG,IAAAC,4CAAqB,EAAC;MACnCC,YAAY,EAAE,SAAS;MACvBL;IACF,CAAC,CAAC;IAEF,MAAMY,SAAS,GAAGT,MAAM,CAACI,mBAAmB,CAACM,IAAI,CAC9CJ,CAAC,IAAKA,CAAC,CAACC,YAAY,KAAK,YAC5B,CAAC;IACDJ,MAAM,CAACM,SAAS,oBAATA,SAAS,CAAEE,QAAQ,CAAC,CAACC,IAAI,CAAC,wCAAwC,CAAC;IAC1ET,MAAM,CAACM,SAAS,oBAATA,SAAS,CAAEI,kBAAkB,CAAC,CAACD,IAAI,CACxC,yDACF,CAAC;EACH,CAAC,CAAC;EAEFb,EAAE,CAAC,mDAAmD,EAAE,MAAM;IAC5D,MAAMC,MAAM,GAAG,IAAAC,4CAAqB,EAAC;MACnCC,YAAY,EAAE,SAAS;MACvBL;IACF,CAAC,CAAC;IAEFM,MAAM,CAACH,MAAM,CAACE,YAAY,CAAC,CAACU,IAAI,CAAC,SAAS,CAAC;IAC3CT,MAAM,CAACH,MAAM,CAACc,gBAAgB,CAACC,SAAS,CAAC,CAACH,IAAI,CAAC,SAAS,CAAC;EAC3D,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -44,12 +44,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
44
44
|
to: 10
|
|
45
45
|
}
|
|
46
46
|
}),
|
|
47
|
-
fields: numberFields
|
|
48
|
-
filterFieldMapping: {
|
|
49
|
-
numberField: {
|
|
50
|
-
fieldId: 'numberField'
|
|
51
|
-
}
|
|
52
|
-
}
|
|
47
|
+
fields: numberFields
|
|
53
48
|
});
|
|
54
49
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'ge')).toEqual(['numberField', 5]);
|
|
55
50
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'le')).toEqual(['numberField', 10]);
|
|
@@ -75,30 +70,11 @@ describe('addFiltersToDataQuery', () => {
|
|
|
75
70
|
sortable: true
|
|
76
71
|
}
|
|
77
72
|
}
|
|
78
|
-
},
|
|
79
|
-
filterFieldMapping: {
|
|
80
|
-
numberField: {
|
|
81
|
-
fieldId: 'numberField'
|
|
82
|
-
}
|
|
83
73
|
}
|
|
84
74
|
});
|
|
85
75
|
expect((0, _wixDataQueryRecorder.wasCalled)(dataQuery, 'ge')).toBe(false);
|
|
86
76
|
expect((0, _wixDataQueryRecorder.wasCalled)(dataQuery, 'le')).toBe(false);
|
|
87
77
|
});
|
|
88
|
-
it('returns the query untouched when filterFieldMapping is absent', () => {
|
|
89
|
-
const dataQuery = _data.items.query('collectionId');
|
|
90
|
-
(0, _filterUtils.addFiltersToDataQuery)({
|
|
91
|
-
dataQuery: dataQuery,
|
|
92
|
-
query: makeQuery({
|
|
93
|
-
numberField: {
|
|
94
|
-
from: 5,
|
|
95
|
-
to: 10
|
|
96
|
-
}
|
|
97
|
-
}),
|
|
98
|
-
fields: numberFields
|
|
99
|
-
});
|
|
100
|
-
expect(dataQuery.calls).toHaveLength(0);
|
|
101
|
-
});
|
|
102
78
|
describe('BOOLEAN array filter', () => {
|
|
103
79
|
const booleanFields = {
|
|
104
80
|
booleanField: {
|
|
@@ -120,12 +96,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
120
96
|
id: _constants.BooleanFilters.checked
|
|
121
97
|
}]
|
|
122
98
|
}),
|
|
123
|
-
fields: booleanFields
|
|
124
|
-
filterFieldMapping: {
|
|
125
|
-
booleanField: {
|
|
126
|
-
fieldId: 'booleanField'
|
|
127
|
-
}
|
|
128
|
-
}
|
|
99
|
+
fields: booleanFields
|
|
129
100
|
});
|
|
130
101
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'eq')).toEqual(['booleanField', true]);
|
|
131
102
|
});
|
|
@@ -138,12 +109,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
138
109
|
id: _constants.BooleanFilters.unchecked
|
|
139
110
|
}]
|
|
140
111
|
}),
|
|
141
|
-
fields: booleanFields
|
|
142
|
-
filterFieldMapping: {
|
|
143
|
-
booleanField: {
|
|
144
|
-
fieldId: 'booleanField'
|
|
145
|
-
}
|
|
146
|
-
}
|
|
112
|
+
fields: booleanFields
|
|
147
113
|
});
|
|
148
114
|
|
|
149
115
|
// No direct eq(true) on the data query — the false-or-undefined branch wraps in .and().
|
|
@@ -179,12 +145,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
179
145
|
id: _constants.HasValueFilters.hasValue
|
|
180
146
|
}]
|
|
181
147
|
}),
|
|
182
|
-
fields: richContentFields
|
|
183
|
-
filterFieldMapping: {
|
|
184
|
-
richField: {
|
|
185
|
-
fieldId: 'richField'
|
|
186
|
-
}
|
|
187
|
-
}
|
|
148
|
+
fields: richContentFields
|
|
188
149
|
});
|
|
189
150
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'isNotEmpty')).toEqual(['richField']);
|
|
190
151
|
expect((0, _wixDataQueryRecorder.wasCalled)(dataQuery, 'isEmpty')).toBe(false);
|
|
@@ -198,12 +159,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
198
159
|
id: _constants.HasValueFilters.noValue
|
|
199
160
|
}]
|
|
200
161
|
}),
|
|
201
|
-
fields: richContentFields
|
|
202
|
-
filterFieldMapping: {
|
|
203
|
-
richField: {
|
|
204
|
-
fieldId: 'richField'
|
|
205
|
-
}
|
|
206
|
-
}
|
|
162
|
+
fields: richContentFields
|
|
207
163
|
});
|
|
208
164
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'isEmpty')).toEqual(['richField']);
|
|
209
165
|
expect((0, _wixDataQueryRecorder.wasCalled)(dataQuery, 'isNotEmpty')).toBe(false);
|
|
@@ -219,12 +175,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
219
175
|
id: _constants.HasValueFilters.noValue
|
|
220
176
|
}]
|
|
221
177
|
}),
|
|
222
|
-
fields: richContentFields
|
|
223
|
-
filterFieldMapping: {
|
|
224
|
-
richField: {
|
|
225
|
-
fieldId: 'richField'
|
|
226
|
-
}
|
|
227
|
-
}
|
|
178
|
+
fields: richContentFields
|
|
228
179
|
});
|
|
229
180
|
expect((0, _wixDataQueryRecorder.wasCalled)(dataQuery, 'isEmpty')).toBe(false);
|
|
230
181
|
expect((0, _wixDataQueryRecorder.wasCalled)(dataQuery, 'isNotEmpty')).toBe(false);
|
|
@@ -251,11 +202,6 @@ describe('addFiltersToDataQuery', () => {
|
|
|
251
202
|
sortable: false
|
|
252
203
|
}
|
|
253
204
|
}
|
|
254
|
-
},
|
|
255
|
-
filterFieldMapping: {
|
|
256
|
-
tagsField: {
|
|
257
|
-
fieldId: 'tagsField'
|
|
258
|
-
}
|
|
259
205
|
}
|
|
260
206
|
});
|
|
261
207
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'hasSome')).toEqual(['tagsField', ['a', 'b']]);
|
|
@@ -282,12 +228,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
282
228
|
value: 'foo'
|
|
283
229
|
}
|
|
284
230
|
}),
|
|
285
|
-
fields: textFields
|
|
286
|
-
filterFieldMapping: {
|
|
287
|
-
textField: {
|
|
288
|
-
fieldId: 'textField'
|
|
289
|
-
}
|
|
290
|
-
}
|
|
231
|
+
fields: textFields
|
|
291
232
|
});
|
|
292
233
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'contains')).toEqual(['textField', 'foo']);
|
|
293
234
|
});
|
|
@@ -300,12 +241,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
300
241
|
operator: _bexCore.FilterOperator.IS_EMPTY
|
|
301
242
|
}
|
|
302
243
|
}),
|
|
303
|
-
fields: textFields
|
|
304
|
-
filterFieldMapping: {
|
|
305
|
-
textField: {
|
|
306
|
-
fieldId: 'textField'
|
|
307
|
-
}
|
|
308
|
-
}
|
|
244
|
+
fields: textFields
|
|
309
245
|
});
|
|
310
246
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'isEmpty')).toEqual(['textField']);
|
|
311
247
|
});
|
|
@@ -318,12 +254,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
318
254
|
operator: _bexCore.FilterOperator.EXISTS
|
|
319
255
|
}
|
|
320
256
|
}),
|
|
321
|
-
fields: textFields
|
|
322
|
-
filterFieldMapping: {
|
|
323
|
-
textField: {
|
|
324
|
-
fieldId: 'textField'
|
|
325
|
-
}
|
|
326
|
-
}
|
|
257
|
+
fields: textFields
|
|
327
258
|
});
|
|
328
259
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'isNotEmpty')).toEqual(['textField']);
|
|
329
260
|
});
|
|
@@ -337,12 +268,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
337
268
|
value: 'bar'
|
|
338
269
|
}
|
|
339
270
|
}),
|
|
340
|
-
fields: textFields
|
|
341
|
-
filterFieldMapping: {
|
|
342
|
-
textField: {
|
|
343
|
-
fieldId: 'textField'
|
|
344
|
-
}
|
|
345
|
-
}
|
|
271
|
+
fields: textFields
|
|
346
272
|
});
|
|
347
273
|
const notArgs = (0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'not');
|
|
348
274
|
expect(notArgs).toBeDefined();
|
|
@@ -369,11 +295,6 @@ describe('addFiltersToDataQuery', () => {
|
|
|
369
295
|
sortable: false
|
|
370
296
|
}
|
|
371
297
|
}
|
|
372
|
-
},
|
|
373
|
-
filterFieldMapping: {
|
|
374
|
-
addressField: {
|
|
375
|
-
fieldId: 'addressField'
|
|
376
|
-
}
|
|
377
298
|
}
|
|
378
299
|
});
|
|
379
300
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'contains')).toEqual(['addressField.formatted', 'NYC']);
|
|
@@ -397,30 +318,10 @@ describe('addFiltersToDataQuery', () => {
|
|
|
397
318
|
sortable: false
|
|
398
319
|
}
|
|
399
320
|
}
|
|
400
|
-
},
|
|
401
|
-
filterFieldMapping: {
|
|
402
|
-
addressField: {
|
|
403
|
-
fieldId: 'addressField'
|
|
404
|
-
}
|
|
405
321
|
}
|
|
406
322
|
});
|
|
407
323
|
expect((0, _wixDataQueryRecorder.firstCallArgs)(dataQuery, 'isEmpty')).toEqual(['addressField']);
|
|
408
324
|
});
|
|
409
325
|
});
|
|
410
|
-
it('skips filters for fields not present in filterFieldMapping', () => {
|
|
411
|
-
const dataQuery = _data.items.query('collectionId');
|
|
412
|
-
(0, _filterUtils.addFiltersToDataQuery)({
|
|
413
|
-
dataQuery: dataQuery,
|
|
414
|
-
query: makeQuery({
|
|
415
|
-
numberField: {
|
|
416
|
-
from: 5,
|
|
417
|
-
to: 10
|
|
418
|
-
}
|
|
419
|
-
}),
|
|
420
|
-
fields: numberFields,
|
|
421
|
-
filterFieldMapping: {}
|
|
422
|
-
});
|
|
423
|
-
expect(dataQuery.calls).toHaveLength(0);
|
|
424
|
-
});
|
|
425
326
|
});
|
|
426
327
|
//# sourceMappingURL=filterUtils.spec.js.map
|