react-form-controlled
Version:
Intuitive react forms for building powerful applications
578 lines (495 loc) • 14.1 kB
JavaScript
import React from 'react';
import { mount } from 'enzyme';
import Form, { Input, Fieldset, FieldsetIndex, If, Last } from '../src';
describe('Fieldset', () => {
it('should be able to create object', done => {
const value = {
data: {
inputValue: 123
}
};
function onChange(state) {
expect(state.data.inputValue).toBe('222');
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(
Fieldset,
{ name: 'data' },
React.createElement(Input, { name: 'inputValue' })
)
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').props().value).toBe(123);
wrapper.find('input').simulate('change', { target: {
value: '222'
} });
});
it('should be able to create object as html fieldset', done => {
const value = {
data: {
inputValue: 123
}
};
function onChange(state) {
expect(state.data.inputValue).toBe('222');
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(
'fieldset',
{ name: 'data' },
React.createElement(Input, { name: 'inputValue' })
)
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').props().value).toBe(123);
wrapper.find('input').simulate('change', { target: {
value: '222'
} });
});
it('should be able to create complex object', done => {
const value = {
data: [{
inputValue: 123
}]
};
function onChange(state) {
expect(state.data[0].inputValue).toBe('222');
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(
Fieldset,
{ name: 'data', skipMap: true },
React.createElement(
Fieldset,
{ name: '0' },
React.createElement(Input, { name: 'inputValue' })
)
)
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').props().value).toBe(123);
wrapper.find('input').simulate('change', { target: {
value: '222'
} });
});
it('should be able to simplify complex object', done => {
const value = {
data: [{
inputValue: 123
}]
};
function onChange(state) {
expect(state.data[0].inputValue).toBe('222');
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(
Fieldset,
{ name: 'data.0' },
React.createElement(Input, { name: 'inputValue' })
)
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').props().value).toBe(123);
wrapper.find('input').simulate('change', { target: {
value: '222'
} });
});
it('should be able to simplify complex object by array notation', done => {
const value = {
data: [{
inputValue: 123
}]
};
function onChange(state) {
expect(state.data[0].inputValue).toBe('222');
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(
Fieldset,
{ name: 'data[0]' },
React.createElement(Input, { name: 'inputValue' })
)
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').props().value).toBe(123);
wrapper.find('input').simulate('change', { target: {
value: '222'
} });
});
it('should be able to simplify complex object by dot and array notation', done => {
const value = {
data: [{
inputValue: 123
}]
};
function onChange(state) {
expect(state.data[0].inputValue).toBe('222');
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(Input, { name: 'data[0].inputValue' })
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').props().value).toBe(123);
wrapper.find('input').simulate('change', { target: {
value: '222'
} });
});
it('should be able to simplify array object', done => {
const value = {
data: [{
inputValue: 123
}, {
inputValue: 222
}]
};
function onChange(state) {
expect(state.data[0].inputValue).toBe('333');
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(
Fieldset,
{ name: 'data' },
React.createElement(Input, { name: 'inputValue' })
)
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').at(0).props().value).toBe(123);
expect(wrapper.find('input').at(1).props().value).toBe(222);
wrapper.find('input').first().simulate('change', { target: {
value: '333'
} });
});
it('should be able to simplify array object with complex array', () => {
const value = {
data: [[1, 2, 3], [4, 5, 6]]
};
const wrapper = mount(React.createElement(
Form,
{ value: value },
React.createElement(
'fieldset',
{ name: 'data' },
React.createElement(Input, { name: '.' })
)
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').length).toBe(6);
expect(wrapper.find('input').get(0).value).toBe('1');
expect(wrapper.find('input').get(1).value).toBe('2');
expect(wrapper.find('input').get(2).value).toBe('3');
expect(wrapper.find('input').get(3).value).toBe('4');
});
it('should be able to simplify array object with index', () => {
const value = {
data: [{
inputValue: 123
}, {
inputValue: 222
}]
};
const wrapper = mount(React.createElement(
Form,
{ value: value },
React.createElement(
Fieldset,
{ name: 'data' },
React.createElement(FieldsetIndex, {
render: ({ index }) => React.createElement(
'span',
null,
`${index + 1}.`
)
}),
React.createElement(Input, { name: 'inputValue' })
)
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('span').length).toBe(2);
expect(wrapper.find('span').at(0).text()).toBe('1.');
expect(wrapper.find('span').at(1).text()).toBe('2.');
});
it('should be able to get original path for event onChange', done => {
const value = {
data: [{
inputValue: 123
}, {
inputValue: 222
}]
};
function onChange(state, component) {
expect(component.getPath()).toBe('data.0.inputValue');
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(
Fieldset,
{ name: 'data' },
React.createElement(Input, { name: 'inputValue' })
)
));
wrapper.find('input').first().simulate('change', { target: {
value: '333'
} });
});
it('should be able to use simple array', () => {
const value = {
data: [123, 222]
};
const wrapper = mount(React.createElement(
Form,
{ value: value },
React.createElement(
Fieldset,
{ name: 'data' },
React.createElement(Input, { name: '.' })
)
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').length).toBe(2);
expect(wrapper.find('input').at(0).props().value).toBe('123');
expect(wrapper.find('input').at(1).props().value).toBe('222');
});
it('should be able to use provideIndex', done => {
const value = {
data: [123, 222]
};
function onClick(index, evn, id) {
expect(index).toBe(0);
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value },
React.createElement(
Fieldset,
{ name: 'data' },
React.createElement(Input, { name: '.' }),
React.createElement(FieldsetIndex, {
render: ({ index }) => React.createElement('button', { onClick: evn => onClick(index, evn) })
})
)
));
wrapper.find('button').first().simulate('click');
});
it('should be able to use provideIndex on child', done => {
const value = {
data: [123, 222]
};
function onClick(index, evn, id) {
expect(index).toBe(0);
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value },
React.createElement(
Fieldset,
{ name: 'data' },
React.createElement(Input, { name: '.' }),
React.createElement(FieldsetIndex, {
render: ({ index }) => React.createElement('button', { onClick: evn => onClick(index, evn) })
})
)
));
wrapper.find('button').first().simulate('click');
});
it('should be able to get parent value', done => {
const value = {
test: '111',
data: [{
options: [1, 2, 3],
selected: 2
}]
};
let count = 0;
function onChange(state) {
count += 1;
if (count === 1) {
expect(state.data[0].selected).toBe('222');
expect(wrapper.find('textarea').at(0).props().value).toBe(1);
wrapper.find('textarea').first().simulate('change', { target: {
value: '33333'
} });
} else if (count === 2) {
expect(state.data[0].options[0]).toBe('33333');
done();
}
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(
'fieldset',
{ name: 'data' },
React.createElement(
'fieldset',
{ name: 'options' },
React.createElement('textarea', { name: '.' }),
React.createElement('input', { type: 'radio', name: '..selected' })
)
)
));
expect(wrapper.find('textarea').get(0).value).toBe('1');
expect(wrapper.find('input').length).toBe(3);
expect(wrapper.find('input').get(0).value).toBe('2');
wrapper.find('input').first().simulate('change', { target: {
value: '222'
} });
});
/*
it('should be able to get index value', () => {
const value = {
test: 0,
data: [123, 222],
};
const wrapper = mount((
<Form value={value}>
<Fieldset name="data">
<Input type="radio" name="..test" valueIndex />
</Fieldset>
</Form>
));
expect(wrapper.find('input').get(0).checked).toBe(true);
});
it('should be able to get indexes', (done) => {
const value = {
test: 0,
data: [123, 222],
};
function onClick(names, evn, id) {
expect(names[0]).toBe(0);
done();
}
const wrapper = mount((
<Form value={value}>
<Fieldset name="data">
<button onClick={onClick} provideIndexes />
</Fieldset>
</Form>
));
wrapper.find('button').first().simulate('click');
});
*/
it('should be able to use if', () => {
const value = {
data: [{
selected: true,
options: [1]
}]
};
function checkValue(value) {
return value === true;
}
const wrapper = mount(React.createElement(
Form,
{ value: value },
React.createElement(
'fieldset',
{ name: 'data' },
React.createElement(
'fieldset',
{ name: 'options' },
React.createElement(
If,
{ name: '..selected', cond: value => checkValue(value) },
React.createElement('textarea', { name: '..selected' })
)
)
)
));
expect(wrapper.find('textarea').get(0).value).toBe('true');
});
it('should be able to use if', () => {
const value = {
data: [{
selected: false,
options: [1]
}]
};
function checkValue(value) {
if (value !== false) {
throw new Error('value must be false');
}
return value === true;
}
const wrapper = mount(React.createElement(
Form,
{ value: value },
React.createElement(
'fieldset',
{ name: 'data' },
React.createElement(
'fieldset',
{ name: 'options' },
React.createElement(
If,
{ name: '..selected', cond: value => checkValue(value) },
React.createElement('textarea', { name: '..selected' })
)
)
)
));
expect(wrapper.find('textarea').length).toBe(0);
});
it('should be able to use render', done => {
const value = {
data: [{
inputValue: 123
}, {
inputValue: 222
}]
};
function onChange(state) {
expect(state.data[0].inputValue).toBe('333');
done();
}
const wrapper = mount(React.createElement(
Form,
{ value: value, onChange: onChange },
React.createElement(Fieldset, {
name: 'data',
render: ({ value }) => React.createElement(
'div',
null,
value.map((val, index) => {
return React.createElement(
'fieldset',
{ name: index, key: index },
React.createElement('input', { name: 'inputValue' })
);
})
)
})
));
expect(wrapper.find('form').length).toBe(1);
expect(wrapper.find('input').get(0).value).toBe('123');
expect(wrapper.find('input').get(1).value).toBe('222');
wrapper.find('input').first().simulate('change', { target: {
value: '333'
} });
});
});
//# sourceMappingURL=Fieldset.test.js.map