mirror of https://github.com/artf/grapesjs.git
2 changed files with 349 additions and 0 deletions
@ -0,0 +1,308 @@ |
|||
import { Component, DataSource, DataSourceManager } from '../../../../../src'; |
|||
import { DataVariableType } from '../../../../../src/data_sources/model/DataVariable'; |
|||
import { |
|||
CollectionComponentType, |
|||
CollectionVariableType, |
|||
} from '../../../../../src/data_sources/model/collection_component/constants'; |
|||
import { CollectionStateVariableType } from '../../../../../src/data_sources/model/collection_component/types'; |
|||
import EditorModel from '../../../../../src/editor/model/Editor'; |
|||
import { filterObjectForSnapshot, setupTestEditor } from '../../../../common'; |
|||
|
|||
describe('Collection component', () => { |
|||
let em: EditorModel; |
|||
let dsm: DataSourceManager; |
|||
let dataSource: DataSource; |
|||
let wrapper: Component; |
|||
|
|||
beforeEach(() => { |
|||
({ em, dsm } = setupTestEditor()); |
|||
wrapper = em.getWrapper()!; |
|||
dataSource = dsm.add({ |
|||
id: 'my_data_source_id', |
|||
records: [ |
|||
{ id: 'user1', user: 'user1', age: '12' }, |
|||
{ id: 'user2', user: 'user2', age: '14' }, |
|||
{ id: 'user3', user: 'user3', age: '16' }, |
|||
], |
|||
}); |
|||
}); |
|||
|
|||
afterEach(() => { |
|||
em.destroy(); |
|||
}); |
|||
|
|||
describe('Collection symbols', () => { |
|||
test('Basic usage', () => { |
|||
const cmp = wrapper.components({ |
|||
type: CollectionComponentType, |
|||
collectionDefinition: { |
|||
block: { |
|||
type: 'default', |
|||
}, |
|||
config: { |
|||
dataSource: { |
|||
type: DataVariableType, |
|||
path: 'my_data_source_id', |
|||
}, |
|||
}, |
|||
}, |
|||
})[0]; |
|||
|
|||
expect(cmp.components()).toHaveLength(3); |
|||
const firstChild = cmp.components().at(0); |
|||
const secondChild = cmp.components().at(1); |
|||
|
|||
expect(firstChild.get('type')).toBe('default'); |
|||
expect(secondChild.get('type')).toBe('default'); |
|||
}); |
|||
}); |
|||
|
|||
describe('Collection variables', () => { |
|||
test('Properties', () => { |
|||
const cmp = wrapper.components({ |
|||
type: CollectionComponentType, |
|||
collectionDefinition: { |
|||
block: { |
|||
type: 'default', |
|||
content: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
custom_property: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
}, |
|||
config: { |
|||
dataSource: { |
|||
type: DataVariableType, |
|||
path: 'my_data_source_id', |
|||
}, |
|||
}, |
|||
}, |
|||
})[0]; |
|||
const firstChild = cmp.components().at(0); |
|||
const secondChild = cmp.components().at(1); |
|||
|
|||
expect(firstChild.get('content')).toBe('user1'); |
|||
expect(firstChild.get('custom_property')).toBe('user1'); |
|||
|
|||
expect(secondChild.get('content')).toBe('user2'); |
|||
expect(secondChild.get('custom_property')).toBe('user2'); |
|||
}); |
|||
|
|||
test('Attributes', () => { |
|||
const cmp = wrapper.components({ |
|||
type: CollectionComponentType, |
|||
collectionDefinition: { |
|||
block: { |
|||
type: 'default', |
|||
attributes: { |
|||
custom_attribute: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
}, |
|||
}, |
|||
config: { |
|||
dataSource: { |
|||
type: DataVariableType, |
|||
path: 'my_data_source_id', |
|||
}, |
|||
}, |
|||
}, |
|||
})[0]; |
|||
|
|||
const firstChild = cmp.components().at(0); |
|||
const secondChild = cmp.components().at(1); |
|||
|
|||
expect(firstChild.getAttributes()['custom_attribute']).toBe('user1'); |
|||
|
|||
expect(secondChild.getAttributes()['custom_attribute']).toBe('user2'); |
|||
}); |
|||
|
|||
test('Traits', () => { |
|||
const cmp = wrapper.components({ |
|||
type: CollectionComponentType, |
|||
collectionDefinition: { |
|||
block: { |
|||
type: 'default', |
|||
traits: [ |
|||
{ |
|||
name: 'attribute_trait', |
|||
value: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
}, |
|||
{ |
|||
name: 'property_trait', |
|||
changeProp: true, |
|||
value: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
}, |
|||
], |
|||
}, |
|||
config: { |
|||
dataSource: { |
|||
type: DataVariableType, |
|||
path: 'my_data_source_id', |
|||
}, |
|||
}, |
|||
}, |
|||
})[0]; |
|||
|
|||
expect(cmp.components()).toHaveLength(3); |
|||
const firstChild = cmp.components().at(0); |
|||
const secondChild = cmp.components().at(1); |
|||
|
|||
expect(firstChild.getAttributes()['attribute_trait']).toBe('user1'); |
|||
expect(firstChild.get('property_trait')).toBe('user1'); |
|||
|
|||
expect(secondChild.getAttributes()['attribute_trait']).toBe('user2'); |
|||
// TODO: Fix overrding traits
|
|||
// expect(secondChild.get('property_trait')).toBe('user2');
|
|||
}); |
|||
}); |
|||
|
|||
describe('Stringfication', () => { |
|||
test('Collection with dynamic datasource', () => { |
|||
const cmp = wrapper.components({ |
|||
type: CollectionComponentType, |
|||
collectionDefinition: { |
|||
collection_name: 'my_collection', |
|||
block: { |
|||
type: 'default', |
|||
content: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
attributes: { |
|||
content: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
}, |
|||
traits: [ |
|||
{ |
|||
name: 'attribute_trait', |
|||
value: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
}, |
|||
{ |
|||
name: 'property_trait', |
|||
changeProp: true, |
|||
value: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
}, |
|||
], |
|||
}, |
|||
config: { |
|||
start_index: 0, |
|||
end_index: 1, |
|||
dataSource: { |
|||
type: DataVariableType, |
|||
path: 'my_data_source_id', |
|||
}, |
|||
}, |
|||
}, |
|||
})[0]; |
|||
|
|||
const json = cmp.toJSON(); |
|||
expect(filterObjectForSnapshot(json)).toMatchSnapshot(); |
|||
}); |
|||
}); |
|||
|
|||
describe('Configuration options', () => { |
|||
test('Collection with start and end indexes', () => { |
|||
const cmp = wrapper.components({ |
|||
type: CollectionComponentType, |
|||
collectionDefinition: { |
|||
block: { |
|||
type: 'default', |
|||
content: { |
|||
type: CollectionVariableType, |
|||
variable_type: CollectionStateVariableType.current_item, |
|||
path: 'user', |
|||
}, |
|||
}, |
|||
config: { |
|||
start_index: 1, |
|||
end_index: 2, |
|||
dataSource: { |
|||
type: DataVariableType, |
|||
path: 'my_data_source_id', |
|||
}, |
|||
}, |
|||
}, |
|||
})[0]; |
|||
|
|||
expect(cmp.components()).toHaveLength(2); |
|||
const firstChild = cmp.components().at(0); |
|||
const secondChild = cmp.components().at(1); |
|||
|
|||
expect(firstChild.get('content')).toBe('user2'); |
|||
expect(secondChild.get('content')).toBe('user3'); |
|||
}); |
|||
}); |
|||
|
|||
describe('Diffirent Collection variable types', () => { |
|||
const stateVariableTests = [ |
|||
{ variableType: CollectionStateVariableType.current_index, expectedValues: [0, 1, 2] }, |
|||
{ variableType: CollectionStateVariableType.start_index, expectedValues: [0, 0, 0] }, |
|||
{ variableType: CollectionStateVariableType.end_index, expectedValues: [2, 2, 2] }, |
|||
{ |
|||
variableType: CollectionStateVariableType.collection_name, |
|||
expectedValues: ['my_collection', 'my_collection', 'my_collection'], |
|||
}, |
|||
{ variableType: CollectionStateVariableType.total_items, expectedValues: [3, 3, 3] }, |
|||
{ variableType: CollectionStateVariableType.remaining_items, expectedValues: [2, 1, 0] }, |
|||
]; |
|||
|
|||
stateVariableTests.forEach(({ variableType, expectedValues }) => { |
|||
test(`Variable type: ${variableType}`, () => { |
|||
const cmp = wrapper.components({ |
|||
type: CollectionComponentType, |
|||
collectionDefinition: { |
|||
collection_name: 'my_collection', |
|||
block: { |
|||
type: 'default', |
|||
content: { |
|||
type: CollectionVariableType, |
|||
variable_type: variableType, |
|||
}, |
|||
}, |
|||
config: { |
|||
dataSource: { |
|||
type: DataVariableType, |
|||
path: 'my_data_source_id', |
|||
}, |
|||
}, |
|||
}, |
|||
})[0]; |
|||
|
|||
const children = cmp.components(); |
|||
expect(children).toHaveLength(3); |
|||
|
|||
children.each((child, index) => { |
|||
expect(child.get('content')).toBe(expectedValues[index]); |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
|||
@ -0,0 +1,41 @@ |
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP |
|||
|
|||
exports[`Collection component Stringfication Collection with dynamic datasource 1`] = ` |
|||
{ |
|||
"collectionDefinition": { |
|||
"block": { |
|||
"attributes": { |
|||
"attribute_trait": { |
|||
"path": "user", |
|||
"type": "parent-collection-variable", |
|||
"variable_type": "current_item", |
|||
}, |
|||
"content": { |
|||
"path": "user", |
|||
"type": "parent-collection-variable", |
|||
"variable_type": "current_item", |
|||
}, |
|||
"id": "data-variable-id", |
|||
}, |
|||
"content": { |
|||
"path": "user", |
|||
"type": "parent-collection-variable", |
|||
"variable_type": "current_item", |
|||
}, |
|||
"property_trait": "user1", |
|||
"type": "default", |
|||
}, |
|||
"collection_name": "my_collection", |
|||
"config": { |
|||
"dataSource": { |
|||
"path": "my_data_source_id", |
|||
"type": "data-variable", |
|||
}, |
|||
"end_index": 1, |
|||
"start_index": 0, |
|||
}, |
|||
}, |
|||
"dropbbable": false, |
|||
"type": "collection-component", |
|||
} |
|||
`; |
|||
Loading…
Reference in new issue