import CrudHelpers from './crud-helpers'; import { CrudStoreItemsModel, CrudStoreSchemaModel } from '../stores/types/CrudStoreModel'; import { describe, expect, it } from 'vitest'; describe('Crud helpers', () => { it('should get a display field for schema properties', () => { const props1 = { $type: { enum: ['Q.Cms.SampleCms.Domain.Items.Product, Q.Cms.SampleCms.Domain'], isHidden: true }, id: { type: 'string', format: 'guid-input', title: 'Id', required: true, isHidden: true }, created: { type: 'string', format: 'datetime-picker', title: 'Datum aangemaakt', required: true, isHidden: true }, hasDynamicValueTags: { type: 'boolean', title: 'HasDynamicValueTags', required: true, isHidden: true }, name: { type: 'string', format: 'string-input', title: 'Naam' }, name2: { type: 'string', format: 'string-input', title: 'Naam' }, amount: { type: 'integer', title: 'Aantal', required: true }, fallbackProductId: { $ref: '/items/product/schema', type: 'string', title: 'Fallback product', required: true }, expirationDate: { type: 'string', format: 'datetime-picker', title: 'Houdbaarheidsdatum', required: false }, roleId: { $ref: '/items/role/schema', type: 'string', title: 'Fallback role', required: true } }; expect(CrudHelpers.getDisplayFieldForSchemaProperties(props1)).toEqual('name'); expect(CrudHelpers.getDisplayFieldForSchemaProperties(undefined)).toEqual(null); // case with no suitable display attribute const props2 = { $type: { enum: ['Q.Cms.SampleCms.Domain.Items.Product, Q.Cms.SampleCms.Domain'], isHidden: true }, id: { type: 'string', format: 'guid-input', title: 'Id', required: true, isHidden: true }, created: { type: 'string', format: 'datetime-picker', title: 'Datum aangemaakt', required: true, isHidden: true }, hasDynamicValueTags: { type: 'boolean', title: 'HasDynamicValueTags', required: true, isHidden: true }, amount: { type: 'integer', title: 'Aantal', required: true }, fallbackProductId: { $ref: '/items/product/schema', type: 'string', title: 'Fallback product', required: true }, expirationDate: { type: 'string', format: 'datetime-picker', title: 'Houdbaarheidsdatum', required: false }, roleId: { $ref: '/items/role/schema', type: 'string', title: 'Fallback role', required: true } }; expect(CrudHelpers.getDisplayFieldForSchemaProperties(props2)).toEqual('id'); // case was isDisplayTitle const props3 = { $type: { enum: ['Q.Cms.SampleCms.Domain.Items.Product, Q.Cms.SampleCms.Domain'], isHidden: true }, id: { type: 'string', format: 'guid-input', title: 'Id', required: true, isHidden: true }, created: { type: 'string', format: 'datetime-picker', title: 'Datum aangemaakt', required: true, isHidden: true }, hasDynamicValueTags: { type: 'boolean', title: 'HasDynamicValueTags', required: true, isHidden: true }, amount: { type: 'integer', title: 'Aantal', required: true }, name: { type: 'string', format: 'string-input', title: 'Naam' }, name2: { type: 'string', format: 'string-input', title: 'Naam' }, fallbackProductId: { $ref: '/items/product/schema', type: 'string', title: 'Fallback product', required: true }, expirationDate: { type: 'string', format: 'datetime-picker', title: 'Houdbaarheidsdatum', required: false }, roleId: { $ref: '/items/role/schema', type: 'string', title: 'Fallback role', required: true }, sample: { $ref: '/items/role/schema', type: 'string', title: 'Fallback role', required: true, isDisplayTitle: true } }; expect(CrudHelpers.getDisplayFieldForSchemaProperties(props3)).toEqual('sample'); }); const testCases = [ { reference: '/items/baseevent/schema/extra', expected: 'baseevent' }, { reference: '/items/baseEvent/schema/extra', expected: 'baseEvent' }, { reference: '/items/BaseEvent/schema/extra', expected: 'baseEvent' }, { reference: '/items/baseevent/schema', expected: 'baseevent' }, { reference: '/items/baseEvent/schema', expected: 'baseEvent' }, { reference: '/items/BaseEvent/schema', expected: 'baseEvent' }, { reference: '/items/role/schema/extra', expected: 'role' }, { reference: '/items/Role/schema/extra', expected: 'role' }, { reference: '/items/role/schema', expected: 'role' }, { reference: '/items/Role/schema', expected: 'role' }, { reference: '/items/baseevent', expected: null }, { reference: '/items/baseEvent', expected: null }, { reference: '/items/BaseEvent', expected: null }, { reference: '/items/role', expected: null }, { reference: '/items/Role', expected: null }, { reference: 'foo', expected: null }, { reference: 'Foo', expected: null }, { reference: '', expected: null } ]; testCases.forEach(({ reference, expected }) => { it(`should return '${expected}' for reference '${reference}'`, () => { const result = CrudHelpers.getStoreNameForReference(reference); expect(result).toEqual(expected); }); }); it('should get the display field value for a reference', () => { const store1 = { getters: { 'unittest/getItemByGuid': () => { return { foo: 'Foo', bar: 'Bar' }; } }, state: { unittest: { schema: { properties: { $type: { enum: ['Q.Cms.SampleCms.Domain.Items.Product, Q.Cms.SampleCms.Domain'], isHidden: true }, id: { type: 'string', format: 'guid-input', title: 'Id', required: true, isHidden: true }, created: { type: 'string', format: 'datetime-picker', title: 'Datum aangemaakt', required: true, isHidden: true }, hasDynamicValueTags: { type: 'boolean', title: 'HasDynamicValueTags', required: true, isHidden: true }, foo: { type: 'string', format: 'string-input', title: 'Naam' } } } } } }; expect(CrudHelpers.getDisplayFieldValueForReference(store1, '/items/unittest/schema', 'fake-guid')).toEqual('Foo'); expect(CrudHelpers.getDisplayFieldValueForReference(store1, '/items/foobar/schema', 'fake-guid2')).toEqual('fake-guid2'); expect(CrudHelpers.getDisplayFieldValueForReference(store1, 'foobar', 'fake-guid3')).toEqual('fake-guid3'); }); it('should add crud item to empty items', () => { const items: CrudStoreItemsModel[] = []; CrudHelpers.addOrUpdateCrudItem(items, { id: 1 }); expect(items).toEqual([ { id: 1 } ]); }); it('should add crud item to filled items', () => { const items: CrudStoreItemsModel[] = [ { id: 2 }, { id: 3 } ]; CrudHelpers.addOrUpdateCrudItem(items, { id: 1 }); expect(items).toEqual([ { id: 2 }, { id: 3 }, { id: 1 } ]); }); it('should update existing crud item when adding', () => { const items: CrudStoreItemsModel[] = [ { id: 2, foo: 'bar' }, { id: 3 } ]; CrudHelpers.addOrUpdateCrudItem(items, { id: 2, foo: 'baz' }); expect(items).toEqual([ { id: 3 }, { id: 2, foo: 'baz' } ]); }); it('should add isNew property to a new object', () => { const schema: CrudStoreSchemaModel = { properties: { $type: { enum: ['Q.Cms.SampleCms.Domain.Items.Product, Q.Cms.SampleCms.Domain'], isHidden: true }, id: { type: 'string', format: 'guid-input', title: 'Id', required: true, isHidden: true, isDisplayTitle: false }, created: { type: 'string', format: 'datetime-picker', title: 'Datum aangemaakt', required: true, isHidden: true, isDisplayTitle: false }, image: { properties: { $type: { enum: ['Q.Cms.Core.Domain.Atoms.Image, Q.Cms.Core.Domain'], order: 0, isHidden: true }, id: { type: 'string', format: 'asset-picker', title: 'Afbeelding', order: 0, required: true, isDisplayTitle: false }, variantId: { type: 'string', format: 'guid-input', title: 'VariantId', order: 0, required: false, isDisplayTitle: false } }, type: 'object', format: 'image-picker', title: 'Afbeelding', required: true, isDisplayTitle: false, isTranslatable: true } }, type: 'object', title: 'Product', order: 0, isTranslatable: true }; const item = CrudHelpers.initialValues(schema); expect(item).toEqual({ $type: 'Q.Cms.SampleCms.Domain.Items.Product, Q.Cms.SampleCms.Domain', created: undefined, id: undefined, image: { $type: 'Q.Cms.Core.Domain.Atoms.Image, Q.Cms.Core.Domain', id: '', isNew: true, variantId: undefined } }); }); });