Skip to content

Commit bd2541f

Browse files
committed
Add tests for resolve props
1 parent 5c3b1c5 commit bd2541f

File tree

1 file changed

+207
-4
lines changed

1 file changed

+207
-4
lines changed

packages/react-form-renderer/src/tests/form-renderer/render-form.test.js

Lines changed: 207 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,6 +1396,7 @@ describe('renderForm function', () => {
13961396
{
13971397
component: componentTypes.TEXT_FIELD,
13981398
name: 'unmounted',
1399+
key: 'unmounted-1',
13991400
initialValue: true,
14001401
initializeOnMount: true,
14011402
condition: {
@@ -1469,10 +1470,7 @@ describe('renderForm function', () => {
14691470
}
14701471
];
14711472

1472-
const CustomComponent = (props) => {
1473-
const { label } = useFieldApi(props);
1474-
return <label>{label}</label>;
1475-
};
1473+
const CustomComponent = ({ label }) => <label>{label}</label>;
14761474

14771475
const wrapper = mount(
14781476
<FormRenderer
@@ -1502,6 +1500,95 @@ describe('renderForm function', () => {
15021500
).toEqual('standard label');
15031501
});
15041502

1503+
it('should use actions from componentMapper', () => {
1504+
const mapperLabel = 'mapper label';
1505+
1506+
const actionMapper = 'loadLabelMapper';
1507+
1508+
const customActionMapper = {
1509+
[actionMapper]: () => mapperLabel
1510+
};
1511+
1512+
const formFields = [
1513+
{
1514+
component: 'custom-component',
1515+
name: 'foo',
1516+
label: 'standard label'
1517+
}
1518+
];
1519+
1520+
const CustomComponent = ({ label }) => <label>{label}</label>;
1521+
1522+
const wrapper = mount(
1523+
<FormRenderer
1524+
FormTemplate={(props) => <FormTemplate {...props} />}
1525+
componentMapper={{
1526+
'custom-component': {
1527+
component: CustomComponent,
1528+
actions: {
1529+
label: [actionMapper]
1530+
}
1531+
}
1532+
}}
1533+
schema={{ fields: formFields }}
1534+
onSubmit={jest.fn()}
1535+
actionMapper={customActionMapper}
1536+
/>
1537+
);
1538+
1539+
expect(wrapper.find('label').text()).toEqual(mapperLabel);
1540+
});
1541+
1542+
it('field actions has a priority over mappers and they are merged', () => {
1543+
const fieldLabel = 'field label';
1544+
const mapperLabel = 'mapper label';
1545+
const mappedId = 'mapper id';
1546+
1547+
const actionField = 'loadLabelField';
1548+
const actionMapper = 'loadLabelMapper';
1549+
const idActionmapper = 'loadId';
1550+
1551+
const customActionMapper = {
1552+
[actionField]: () => fieldLabel,
1553+
[actionMapper]: () => mapperLabel,
1554+
[idActionmapper]: () => mappedId
1555+
};
1556+
1557+
const formFields = [
1558+
{
1559+
component: 'custom-component',
1560+
name: 'foo',
1561+
label: 'standard label',
1562+
actions: {
1563+
label: [actionField]
1564+
}
1565+
}
1566+
];
1567+
1568+
const CustomComponent = ({ label, id }) => <label id={id}>{label}</label>;
1569+
1570+
const wrapper = mount(
1571+
<FormRenderer
1572+
FormTemplate={(props) => <FormTemplate {...props} />}
1573+
componentMapper={{
1574+
'custom-component': {
1575+
component: CustomComponent,
1576+
actions: {
1577+
label: [actionMapper],
1578+
id: [idActionmapper]
1579+
}
1580+
}
1581+
}}
1582+
schema={{ fields: formFields }}
1583+
onSubmit={jest.fn()}
1584+
actionMapper={customActionMapper}
1585+
/>
1586+
);
1587+
1588+
expect(wrapper.find('label').text()).toEqual(fieldLabel);
1589+
expect(wrapper.find('label').props().id).toEqual(mappedId);
1590+
});
1591+
15051592
it('composite mapper component', () => {
15061593
const schema = {
15071594
fields: [
@@ -1531,4 +1618,120 @@ describe('renderForm function', () => {
15311618
expect(className).toEqual('composite-class');
15321619
expect(type).toEqual('number');
15331620
});
1621+
1622+
it('resolve props resolve props', () => {
1623+
const label = 'Some super label';
1624+
const resolveProps = jest.fn().mockImplementation(() => ({ label }));
1625+
1626+
const formFields = [
1627+
{
1628+
component: 'custom-component',
1629+
name: 'foo',
1630+
label: 'standard label',
1631+
resolveProps
1632+
}
1633+
];
1634+
1635+
const CustomComponent = (props) => {
1636+
const { label } = useFieldApi(props);
1637+
return <label>{label}</label>;
1638+
};
1639+
1640+
const wrapper = mount(
1641+
<FormRenderer
1642+
FormTemplate={(props) => <FormTemplate {...props} />}
1643+
componentMapper={{
1644+
'custom-component': CustomComponent
1645+
}}
1646+
schema={{ fields: formFields }}
1647+
onSubmit={jest.fn()}
1648+
/>
1649+
);
1650+
1651+
expect(wrapper.find('label').text()).toEqual(label);
1652+
expect(resolveProps).toHaveBeenCalledWith(
1653+
{ label: 'standard label' },
1654+
expect.objectContaining({ meta: expect.any(Object), input: expect.any(Object) }),
1655+
expect.any(Object)
1656+
);
1657+
});
1658+
1659+
it('resolve props are merged and field has priority ', () => {
1660+
const id = 'someId';
1661+
const mapperLabel = 'mappers label';
1662+
const label = 'Some super label';
1663+
1664+
const formFields = [
1665+
{
1666+
component: 'custom-component',
1667+
name: 'foo',
1668+
label: 'standard label',
1669+
resolveProps: () => ({ label })
1670+
}
1671+
];
1672+
1673+
const CustomComponent = (props) => {
1674+
const { label, id } = useFieldApi(props);
1675+
return <label id={id}>{label}</label>;
1676+
};
1677+
1678+
const wrapper = mount(
1679+
<FormRenderer
1680+
FormTemplate={(props) => <FormTemplate {...props} />}
1681+
componentMapper={{
1682+
'custom-component': {
1683+
component: CustomComponent,
1684+
resolveProps: () => ({
1685+
id,
1686+
label: mapperLabel
1687+
})
1688+
}
1689+
}}
1690+
schema={{ fields: formFields }}
1691+
onSubmit={jest.fn()}
1692+
/>
1693+
);
1694+
1695+
expect(wrapper.find('label').text()).toEqual(label);
1696+
expect(wrapper.find('label').props().id).toEqual(id);
1697+
});
1698+
1699+
it('actions can return resolveProps and it has priority over fields', () => {
1700+
const id = 'someId';
1701+
const label = 'Some super label';
1702+
1703+
const actionMapper = {
1704+
resolveProps: () => () => ({ label })
1705+
};
1706+
1707+
const formFields = [
1708+
{
1709+
component: 'custom-component',
1710+
name: 'foo',
1711+
label: 'standard label',
1712+
resolveProps: () => ({ id, label: 'nonsense' }),
1713+
actions: { resolveProps: ['resolveProps'] }
1714+
}
1715+
];
1716+
1717+
const CustomComponent = (props) => {
1718+
const { label, id } = useFieldApi(props);
1719+
return <label id={id}>{label}</label>;
1720+
};
1721+
1722+
const wrapper = mount(
1723+
<FormRenderer
1724+
FormTemplate={(props) => <FormTemplate {...props} />}
1725+
componentMapper={{
1726+
'custom-component': CustomComponent
1727+
}}
1728+
schema={{ fields: formFields }}
1729+
onSubmit={jest.fn()}
1730+
actionMapper={actionMapper}
1731+
/>
1732+
);
1733+
1734+
expect(wrapper.find('label').text()).toEqual(label);
1735+
expect(wrapper.find('label').props().id).toEqual(id);
1736+
});
15341737
});

0 commit comments

Comments
 (0)