@wix/patterns-cms 1.14.0 → 1.16.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.map +1 -1
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js +107 -14
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js +7 -7
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/searchUtils.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/sortUtils.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/useCmsSchemaSource.spec.js +50 -11
- package/dist/cjs/adapter/__tests__/useCmsSchemaSource.spec.js.map +1 -1
- package/dist/cjs/adapter/cmsBackup.js.map +1 -1
- package/dist/cjs/adapter/cmsFieldTypeMap.js.map +1 -1
- package/dist/cjs/adapter/cmsPermissions.js.map +1 -1
- package/dist/cjs/adapter/constants.js.map +1 -1
- package/dist/cjs/adapter/createCmsBackend.js +33 -10
- package/dist/cjs/adapter/createCmsBackend.js.map +1 -1
- package/dist/cjs/adapter/createCmsFieldActions.js.map +1 -1
- package/dist/cjs/adapter/fetchExternalDbConnections.js.map +1 -1
- package/dist/cjs/adapter/filterUtils.js +7 -7
- package/dist/cjs/adapter/filterUtils.js.map +1 -1
- package/dist/cjs/adapter/loadCmsSchema.js +1 -0
- package/dist/cjs/adapter/loadCmsSchema.js.map +1 -1
- package/dist/cjs/adapter/searchUtils.js.map +1 -1
- package/dist/cjs/adapter/sortUtils.js.map +1 -1
- package/dist/cjs/adapter/transformCmsSchema.js.map +1 -1
- package/dist/cjs/adapter/useCmsSchemaSource.js +72 -12
- package/dist/cjs/adapter/useCmsSchemaSource.js.map +1 -1
- package/dist/cjs/testkit/cmsFetchMocks.js +2 -2
- package/dist/cjs/testkit/cmsFetchMocks.js.map +1 -1
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js +15 -3
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js +68 -12
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/filterUtils.spec.js +1 -1
- package/dist/esm/adapter/__tests__/filterUtils.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/searchUtils.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/sortUtils.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/useCmsSchemaSource.spec.js +48 -6
- package/dist/esm/adapter/__tests__/useCmsSchemaSource.spec.js.map +1 -1
- package/dist/esm/adapter/createCmsBackend.js +33 -10
- package/dist/esm/adapter/createCmsBackend.js.map +1 -1
- package/dist/esm/adapter/createCmsFieldActions.js.map +1 -1
- package/dist/esm/adapter/filterUtils.js +2 -2
- package/dist/esm/adapter/filterUtils.js.map +1 -1
- package/dist/esm/adapter/loadCmsSchema.js +1 -0
- package/dist/esm/adapter/loadCmsSchema.js.map +1 -1
- package/dist/esm/adapter/searchUtils.js.map +1 -1
- package/dist/esm/adapter/sortUtils.js.map +1 -1
- package/dist/esm/adapter/transformCmsSchema.js.map +1 -1
- package/dist/esm/adapter/useCmsSchemaSource.js +72 -9
- package/dist/esm/adapter/useCmsSchemaSource.js.map +1 -1
- package/dist/esm/testkit/cmsFetchMocks.js +1 -1
- package/dist/esm/testkit/cmsFetchMocks.js.map +1 -1
- package/dist/types/adapter/cmsBackup.d.ts +1 -1
- package/dist/types/adapter/cmsFieldTypeMap.d.ts +1 -1
- package/dist/types/adapter/cmsPermissions.d.ts +1 -1
- package/dist/types/adapter/constants.d.ts +1 -1
- package/dist/types/adapter/createCmsBackend.d.ts +1 -1
- package/dist/types/adapter/createCmsBackend.d.ts.map +1 -1
- package/dist/types/adapter/createCmsFieldActions.d.ts +1 -1
- package/dist/types/adapter/createCmsFieldActions.d.ts.map +1 -1
- package/dist/types/adapter/fetchExternalDbConnections.d.ts +1 -1
- package/dist/types/adapter/filterUtils.d.ts +2 -1
- package/dist/types/adapter/filterUtils.d.ts.map +1 -1
- package/dist/types/adapter/loadCmsSchema.d.ts +5 -1
- package/dist/types/adapter/loadCmsSchema.d.ts.map +1 -1
- package/dist/types/adapter/searchUtils.d.ts +2 -1
- package/dist/types/adapter/searchUtils.d.ts.map +1 -1
- package/dist/types/adapter/sortUtils.d.ts +2 -1
- package/dist/types/adapter/sortUtils.d.ts.map +1 -1
- package/dist/types/adapter/transformCmsSchema.d.ts +1 -1
- package/dist/types/adapter/transformCmsSchema.d.ts.map +1 -1
- package/dist/types/adapter/useCmsSchemaSource.d.ts +8 -2
- package/dist/types/adapter/useCmsSchemaSource.d.ts.map +1 -1
- package/dist/types/testkit/cmsFetchMocks.d.ts +2 -2
- package/dist/types/testkit/cmsFetchMocks.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_data","require","_createCmsFieldActions","jest","mock","actual","requireActual","collections","createDataCollectionField","fn","patchDataCollectionField","deleteDataCollectionField","patchDataCollection","updateDataCollection","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","mockImplementation","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","existing","addFields","toHaveBeenCalledTimes","Object","keys","color","editField","toHaveBeenCalledWith","patch","toHaveProperty","renameField","deleteField","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 updateDataCollection: 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// updateDataCollection resolves with the updated collection directly (not\n// wrapped in `{ dataCollection }`, unlike the field mutations).\nconst updateDataCollection =\n collections.updateDataCollection as unknown as jest.Mock<\n Promise<collections.DataCollection>,\n [dataCollection: collections.DataCollection]\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 updateDataCollection.mockImplementation(async (dataCollection) => dataCollection);\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('addFields', () => {\n it('appends all new fields in one updateDataCollection call, keyed by field.id, preserving existing fields', async () => {\n const existing = makeField({ key: 'name', displayName: 'Name' });\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([existing]),\n );\n\n await actions.addFields!([\n makePatternsField({ id: 'color', displayName: 'Color', type: 'SHORT_TEXT' }),\n makePatternsField({ id: 'count', displayName: 'Count', type: 'NUMBER' }),\n ]);\n\n expect(updateDataCollection).toHaveBeenCalledTimes(1);\n const [dataCollection] = updateDataCollection.mock.calls[0];\n expect(dataCollection._id).toBe(COLLECTION_ID);\n // Existing field kept; new fields appended under their given ids as keys.\n expect(dataCollection.fields).toEqual([\n existing,\n {\n key: 'color',\n displayName: 'Color',\n type: collections.Type.TEXT,\n required: false,\n },\n {\n key: 'count',\n displayName: 'Count',\n type: collections.Type.NUMBER,\n required: false,\n },\n ]);\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n\n it('resolves with the full updated fields map (existing + added), keyed by field key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name', displayName: 'Name' })]),\n );\n\n const fields = await actions.addFields!([\n makePatternsField({ id: 'color', displayName: 'Color', type: 'SHORT_TEXT' }),\n ]);\n\n expect(Object.keys(fields)).toEqual(['name', 'color']);\n expect(fields.color).toMatchObject({ id: 'color', displayName: 'Color' });\n });\n\n it('throws before any write when a field type has no CMS mapping', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.addFields!([makePatternsField({ id: 'pic', type: 'IMAGE' })]),\n ).rejects.toThrow('Field type IMAGE not supported yet');\n expect(updateDataCollection).not.toHaveBeenCalled();\n });\n\n it('throws when the collection cannot be read', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () => null);\n\n await expect(\n actions.addFields!([makePatternsField({ id: 'color' })]),\n ).rejects.toThrow(`Collection ${COLLECTION_ID} not found`);\n expect(updateDataCollection).not.toHaveBeenCalled();\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","updateDataCollection","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","mockImplementation","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","existing","addFields","toHaveBeenCalledTimes","Object","keys","color","editField","toHaveBeenCalledWith","patch","toHaveProperty","renameField","deleteField","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/patterns';\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 updateDataCollection: 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// updateDataCollection resolves with the updated collection directly (not\n// wrapped in `{ dataCollection }`, unlike the field mutations).\nconst updateDataCollection =\n collections.updateDataCollection as unknown as jest.Mock<\n Promise<collections.DataCollection>,\n [dataCollection: collections.DataCollection]\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 updateDataCollection.mockImplementation(\n async (dataCollection) => dataCollection,\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('addFields', () => {\n it('appends all new fields in one updateDataCollection call, keyed by field.id, preserving existing fields', async () => {\n const existing = makeField({ key: 'name', displayName: 'Name' });\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([existing]),\n );\n\n await actions.addFields!([\n makePatternsField({\n id: 'color',\n displayName: 'Color',\n type: 'SHORT_TEXT',\n }),\n makePatternsField({\n id: 'count',\n displayName: 'Count',\n type: 'NUMBER',\n }),\n ]);\n\n expect(updateDataCollection).toHaveBeenCalledTimes(1);\n const [dataCollection] = updateDataCollection.mock.calls[0];\n expect(dataCollection._id).toBe(COLLECTION_ID);\n // Existing field kept; new fields appended under their given ids as keys.\n expect(dataCollection.fields).toEqual([\n existing,\n {\n key: 'color',\n displayName: 'Color',\n type: collections.Type.TEXT,\n required: false,\n },\n {\n key: 'count',\n displayName: 'Count',\n type: collections.Type.NUMBER,\n required: false,\n },\n ]);\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n\n it('resolves with the full updated fields map (existing + added), keyed by field key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name', displayName: 'Name' })]),\n );\n\n const fields = await actions.addFields!([\n makePatternsField({\n id: 'color',\n displayName: 'Color',\n type: 'SHORT_TEXT',\n }),\n ]);\n\n expect(Object.keys(fields)).toEqual(['name', 'color']);\n expect(fields.color).toMatchObject({ id: 'color', displayName: 'Color' });\n });\n\n it('throws before any write when a field type has no CMS mapping', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.addFields!([makePatternsField({ id: 'pic', type: 'IMAGE' })]),\n ).rejects.toThrow('Field type IMAGE not supported yet');\n expect(updateDataCollection).not.toHaveBeenCalled();\n });\n\n it('throws when the collection cannot be read', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () => null);\n\n await expect(\n actions.addFields!([makePatternsField({ id: 'color' })]),\n ).rejects.toThrow(`Collection ${COLLECTION_ID} not found`);\n expect(updateDataCollection).not.toHaveBeenCalled();\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":[]}
|
|
@@ -194,6 +194,100 @@ describe('createCmsBackend', () => {
|
|
|
194
194
|
expect(result).toBe(entity);
|
|
195
195
|
});
|
|
196
196
|
});
|
|
197
|
+
|
|
198
|
+
// The editors keep a reference as `{ _id, <displayField>, <imageField> }` so
|
|
199
|
+
// they can render a label without refetching, and the service takes that shape
|
|
200
|
+
// as-is — the write is not reshaped (parity with auto-patterns). A
|
|
201
|
+
// MULTI_REFERENCE isn't stored on the item, so it also goes through
|
|
202
|
+
// `replaceReferences`.
|
|
203
|
+
describe('reference values on write', () => {
|
|
204
|
+
beforeEach(() => {
|
|
205
|
+
update.mockResolvedValue(undefined);
|
|
206
|
+
insert.mockResolvedValue({
|
|
207
|
+
_id: 'new-1'
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
const payload = () => update.mock.calls[0][1];
|
|
211
|
+
it('sends a single reference exactly as the editor wrote it', async () => {
|
|
212
|
+
const backend = (0, _createCmsBackend.createCmsBackend)(COLLECTION_ID, fieldsWithRefs);
|
|
213
|
+
const author = {
|
|
214
|
+
_id: 'a1',
|
|
215
|
+
title_fld: 'Nitzan Listman',
|
|
216
|
+
image_fld: 'wix:image://v1/abc/x.png'
|
|
217
|
+
};
|
|
218
|
+
await backend.update({
|
|
219
|
+
_id: 'e1',
|
|
220
|
+
title: 'Luna',
|
|
221
|
+
author
|
|
222
|
+
});
|
|
223
|
+
expect(payload()).toEqual({
|
|
224
|
+
_id: 'e1',
|
|
225
|
+
title: 'Luna',
|
|
226
|
+
author
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
it('keeps a multi-reference in the payload and links it', async () => {
|
|
230
|
+
const backend = (0, _createCmsBackend.createCmsBackend)(COLLECTION_ID, fieldsWithRefs);
|
|
231
|
+
const tags = [{
|
|
232
|
+
_id: 't1',
|
|
233
|
+
name: 'One'
|
|
234
|
+
}];
|
|
235
|
+
await backend.update({
|
|
236
|
+
_id: 'e1',
|
|
237
|
+
title: 'Luna',
|
|
238
|
+
tags
|
|
239
|
+
});
|
|
240
|
+
expect(payload()).toEqual({
|
|
241
|
+
_id: 'e1',
|
|
242
|
+
title: 'Luna',
|
|
243
|
+
tags
|
|
244
|
+
});
|
|
245
|
+
expect(replaceReferences).toHaveBeenCalledWith(COLLECTION_ID, 'tags', 'e1', ['t1']);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// Removing the last chip writes an empty value; the references have to go.
|
|
249
|
+
it('unlinks every reference when a multi-reference is cleared', async () => {
|
|
250
|
+
const backend = (0, _createCmsBackend.createCmsBackend)(COLLECTION_ID, fieldsWithRefs);
|
|
251
|
+
await backend.update({
|
|
252
|
+
_id: 'e1',
|
|
253
|
+
tags: null
|
|
254
|
+
});
|
|
255
|
+
expect(replaceReferences).toHaveBeenCalledWith(COLLECTION_ID, 'tags', 'e1', []);
|
|
256
|
+
});
|
|
257
|
+
it('leaves a multi-reference the entity does not carry untouched', async () => {
|
|
258
|
+
const backend = (0, _createCmsBackend.createCmsBackend)(COLLECTION_ID, fieldsWithRefs);
|
|
259
|
+
await backend.update({
|
|
260
|
+
_id: 'e1',
|
|
261
|
+
title: 'Luna'
|
|
262
|
+
});
|
|
263
|
+
expect(replaceReferences).not.toHaveBeenCalled();
|
|
264
|
+
});
|
|
265
|
+
it('accepts multi-reference values given as bare ids', async () => {
|
|
266
|
+
const backend = (0, _createCmsBackend.createCmsBackend)(COLLECTION_ID, fieldsWithRefs);
|
|
267
|
+
await backend.update({
|
|
268
|
+
_id: 'e1',
|
|
269
|
+
tags: ['t1', 't2']
|
|
270
|
+
});
|
|
271
|
+
expect(replaceReferences).toHaveBeenCalledWith(COLLECTION_ID, 'tags', 'e1', ['t1', 't2']);
|
|
272
|
+
});
|
|
273
|
+
it('sends create the same way, then links its multi-references', async () => {
|
|
274
|
+
const backend = (0, _createCmsBackend.createCmsBackend)(COLLECTION_ID, fieldsWithRefs);
|
|
275
|
+
const entity = {
|
|
276
|
+
title: 'Luna',
|
|
277
|
+
author: {
|
|
278
|
+
_id: 'a1',
|
|
279
|
+
title_fld: 'Nitzan Listman'
|
|
280
|
+
},
|
|
281
|
+
tags: [{
|
|
282
|
+
_id: 't1',
|
|
283
|
+
name: 'One'
|
|
284
|
+
}]
|
|
285
|
+
};
|
|
286
|
+
await backend.create(entity);
|
|
287
|
+
expect(insert).toHaveBeenCalledWith(COLLECTION_ID, entity);
|
|
288
|
+
expect(replaceReferences).toHaveBeenCalledWith(COLLECTION_ID, 'tags', 'new-1', ['t1']);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
197
291
|
describe('delete / bulkDelete', () => {
|
|
198
292
|
it('removes a single entity by id', async () => {
|
|
199
293
|
remove.mockResolvedValue(undefined);
|
|
@@ -257,7 +351,10 @@ describe('createCmsBackend', () => {
|
|
|
257
351
|
// 2 + 1 === 3 → no next page.
|
|
258
352
|
expect(result.hasNext).toBe(false);
|
|
259
353
|
});
|
|
260
|
-
|
|
354
|
+
|
|
355
|
+
// Rows have to arrive with their referenced items expanded: the reference
|
|
356
|
+
// cells read the label off the value, so a bare id renders blank.
|
|
357
|
+
it('expands every reference field, whether or not it is searchable', async () => {
|
|
261
358
|
mockFindResult = {
|
|
262
359
|
items: [],
|
|
263
360
|
totalCount: 0
|
|
@@ -270,34 +367,30 @@ describe('createCmsBackend', () => {
|
|
|
270
367
|
offset: 0,
|
|
271
368
|
limit: 10
|
|
272
369
|
}, {
|
|
273
|
-
searchableFieldIds: ['title'
|
|
370
|
+
searchableFieldIds: ['title']
|
|
274
371
|
});
|
|
275
|
-
|
|
276
|
-
// 'author' is a reference and searchable → included; 'tags' is not searchable.
|
|
277
|
-
expect(queryChain.include).toHaveBeenCalledWith('author');
|
|
372
|
+
expect(queryChain.include).toHaveBeenCalledWith('author', 'tags');
|
|
278
373
|
});
|
|
279
|
-
it('
|
|
374
|
+
it('expands reference fields when called with no options', async () => {
|
|
280
375
|
mockFindResult = {
|
|
281
376
|
items: [],
|
|
282
377
|
totalCount: 0
|
|
283
378
|
};
|
|
284
379
|
const backend = (0, _createCmsBackend.createCmsBackend)(COLLECTION_ID, fieldsWithRefs);
|
|
285
|
-
await
|
|
380
|
+
await backend.find({
|
|
286
381
|
offset: 0,
|
|
287
382
|
limit: 10
|
|
288
|
-
}, {
|
|
289
|
-
searchableFieldIds: ['title']
|
|
290
383
|
});
|
|
291
|
-
expect(queryChain.include).
|
|
384
|
+
expect(queryChain.include).toHaveBeenCalledWith('author', 'tags');
|
|
292
385
|
});
|
|
293
|
-
it('
|
|
386
|
+
it('does not call include for a schema with no reference fields', async () => {
|
|
294
387
|
mockFindResult = {
|
|
295
388
|
items: [],
|
|
296
389
|
totalCount: 0
|
|
297
390
|
};
|
|
298
|
-
const backend = (0, _createCmsBackend.createCmsBackend)(COLLECTION_ID,
|
|
299
|
-
|
|
300
|
-
|
|
391
|
+
const backend = (0, _createCmsBackend.createCmsBackend)(COLLECTION_ID, {
|
|
392
|
+
title: fieldsWithRefs.title
|
|
393
|
+
});
|
|
301
394
|
await backend.find({
|
|
302
395
|
offset: 0,
|
|
303
396
|
limit: 10
|
|
@@ -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","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":[]}
|
|
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","payload","calls","title_fld","image_fld","name","not","toHaveBeenCalled","delete","bulkDelete","offset","limit","skip","returnTotalCount","total","hasNext","searchableFieldIds","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/patterns/schema';\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 // The editors keep a reference as `{ _id, <displayField>, <imageField> }` so\n // they can render a label without refetching, and the service takes that shape\n // as-is — the write is not reshaped (parity with auto-patterns). A\n // MULTI_REFERENCE isn't stored on the item, so it also goes through\n // `replaceReferences`.\n describe('reference values on write', () => {\n beforeEach(() => {\n update.mockResolvedValue(undefined);\n insert.mockResolvedValue({ _id: 'new-1' });\n });\n\n const payload = () => update.mock.calls[0][1];\n\n it('sends a single reference exactly as the editor wrote it', async () => {\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n const author = {\n _id: 'a1',\n title_fld: 'Nitzan Listman',\n image_fld: 'wix:image://v1/abc/x.png',\n };\n\n await backend.update({ _id: 'e1', title: 'Luna', author } as never);\n\n expect(payload()).toEqual({ _id: 'e1', title: 'Luna', author });\n });\n\n it('keeps a multi-reference in the payload and links it', async () => {\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n const tags = [{ _id: 't1', name: 'One' }];\n\n await backend.update({ _id: 'e1', title: 'Luna', tags } as never);\n\n expect(payload()).toEqual({ _id: 'e1', title: 'Luna', tags });\n expect(replaceReferences).toHaveBeenCalledWith(\n COLLECTION_ID,\n 'tags',\n 'e1',\n ['t1'],\n );\n });\n\n // Removing the last chip writes an empty value; the references have to go.\n it('unlinks every reference when a multi-reference is cleared', async () => {\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await backend.update({ _id: 'e1', tags: null } as never);\n\n expect(replaceReferences).toHaveBeenCalledWith(\n COLLECTION_ID,\n 'tags',\n 'e1',\n [],\n );\n });\n\n it('leaves a multi-reference the entity does not carry untouched', async () => {\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await backend.update({ _id: 'e1', title: 'Luna' } as never);\n\n expect(replaceReferences).not.toHaveBeenCalled();\n });\n\n it('accepts multi-reference values given as bare ids', async () => {\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await backend.update({ _id: 'e1', tags: ['t1', 't2'] } as never);\n\n expect(replaceReferences).toHaveBeenCalledWith(\n COLLECTION_ID,\n 'tags',\n 'e1',\n ['t1', 't2'],\n );\n });\n\n it('sends create the same way, then links its multi-references', async () => {\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n const entity = {\n title: 'Luna',\n author: { _id: 'a1', title_fld: 'Nitzan Listman' },\n tags: [{ _id: 't1', name: 'One' }],\n };\n\n await backend.create(entity as never);\n\n expect(insert).toHaveBeenCalledWith(COLLECTION_ID, entity);\n expect(replaceReferences).toHaveBeenCalledWith(\n COLLECTION_ID,\n 'tags',\n 'new-1',\n ['t1'],\n );\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 // Rows have to arrive with their referenced items expanded: the reference\n // cells read the label off the value, so a bare id renders blank.\n it('expands every reference field, whether or not it is 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'],\n });\n\n expect(queryChain.include).toHaveBeenCalledWith('author', 'tags');\n });\n\n it('expands reference fields when called with no options', async () => {\n mockFindResult = { items: [], totalCount: 0 };\n const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);\n\n await backend.find({ offset: 0, limit: 10 } as never);\n\n expect(queryChain.include).toHaveBeenCalledWith('author', 'tags');\n });\n\n it('does not call include for a schema with no reference fields', async () => {\n mockFindResult = { items: [], totalCount: 0 };\n const backend = createCmsBackend(COLLECTION_ID, {\n title: fieldsWithRefs.title,\n });\n\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":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _data = require("@wix/data");
|
|
4
|
-
var
|
|
4
|
+
var _patterns = require("@wix/patterns");
|
|
5
5
|
var _filterUtils = require("../filterUtils");
|
|
6
6
|
var _constants = require("../constants");
|
|
7
7
|
var _wixDataQueryRecorder = require("./wixDataQueryRecorder");
|
|
@@ -224,7 +224,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
224
224
|
dataQuery: dataQuery,
|
|
225
225
|
query: makeQuery({
|
|
226
226
|
textField: {
|
|
227
|
-
operator:
|
|
227
|
+
operator: _patterns.FilterOperator.CONTAINS,
|
|
228
228
|
value: 'foo'
|
|
229
229
|
}
|
|
230
230
|
}),
|
|
@@ -238,7 +238,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
238
238
|
dataQuery: dataQuery,
|
|
239
239
|
query: makeQuery({
|
|
240
240
|
textField: {
|
|
241
|
-
operator:
|
|
241
|
+
operator: _patterns.FilterOperator.IS_EMPTY
|
|
242
242
|
}
|
|
243
243
|
}),
|
|
244
244
|
fields: textFields
|
|
@@ -251,7 +251,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
251
251
|
dataQuery: dataQuery,
|
|
252
252
|
query: makeQuery({
|
|
253
253
|
textField: {
|
|
254
|
-
operator:
|
|
254
|
+
operator: _patterns.FilterOperator.EXISTS
|
|
255
255
|
}
|
|
256
256
|
}),
|
|
257
257
|
fields: textFields
|
|
@@ -264,7 +264,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
264
264
|
dataQuery: dataQuery,
|
|
265
265
|
query: makeQuery({
|
|
266
266
|
textField: {
|
|
267
|
-
operator:
|
|
267
|
+
operator: _patterns.FilterOperator.NOT_CONTAINS,
|
|
268
268
|
value: 'bar'
|
|
269
269
|
}
|
|
270
270
|
}),
|
|
@@ -281,7 +281,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
281
281
|
dataQuery: dataQuery,
|
|
282
282
|
query: makeQuery({
|
|
283
283
|
addressField: {
|
|
284
|
-
operator:
|
|
284
|
+
operator: _patterns.FilterOperator.CONTAINS,
|
|
285
285
|
value: 'NYC'
|
|
286
286
|
}
|
|
287
287
|
}),
|
|
@@ -305,7 +305,7 @@ describe('addFiltersToDataQuery', () => {
|
|
|
305
305
|
dataQuery: dataQuery,
|
|
306
306
|
query: makeQuery({
|
|
307
307
|
addressField: {
|
|
308
|
-
operator:
|
|
308
|
+
operator: _patterns.FilterOperator.IS_EMPTY
|
|
309
309
|
}
|
|
310
310
|
}),
|
|
311
311
|
fields: {
|