amis/__tests__/renderers/Wizard.test.tsx
2019-04-30 11:11:25 +08:00

1302 lines
35 KiB
TypeScript

import React = require('react');
import * as renderer from 'react-test-renderer';
import {render, fireEvent, cleanup} from 'react-testing-library';
import '../../src/themes/default';
import {
render as amisRender
} from '../../src/index';
import { wait, makeEnv } from '../helper';
import { clearStoresCache } from '../../src/factory';
afterEach(() => {
cleanup();
clearStoresCache();
});
test('Renderer:Wizard', () => {
const component = renderer.create(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
required: true
},
{
name: "name",
label: "名称",
type: "text",
required: true
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv()));
let tree = component.toJSON();
expect(tree).toMatchSnapshot();
});
test('Renderer:Wizard readOnly', () => {
const component = renderer.create(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
readOnly: true,
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
value: "xxx@xxx.com"
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv()));
let tree = component.toJSON();
expect(tree).toMatchSnapshot();
});
test('Renderer:Wizard initApi', async () => {
const fetcher = jest.fn().mockImplementationOnce(() => Promise.resolve({
data: {
status: 0,
msg: 'ok',
data: {
author: 'fex',
date: 1555382395,
info: '',
name: 'Amis renderer'
}
}
}));
const component = renderer.create(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
initApi: "/api/mock2/form/initData?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
required: true
},
{
name: "name",
label: "名称",
type: "text",
required: true
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
await wait(500);
expect(component.toJSON()).toMatchSnapshot();
expect(fetcher).toHaveBeenCalled();
});
test('Renderer:Wizard initApi show loading', async () => {
let done:Function;
let wating = new Promise((resolve) => {
done = resolve;
});
const fetcher = jest.fn().mockImplementationOnce(() => {
return new Promise(async (resolve) => {
await wait(100, () => expect(component.toJSON()).toMatchSnapshot());
await wait(100, () => resolve({
data: {
status: 0,
msg: 'ok',
data: {
a: 3
}
}
}));
await wait(100, done);
});
});
const component = renderer.create(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
initApi: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
required: true
},
{
name: "name",
label: "名称",
type: "text",
required: true
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
await wating;
let tree = component.toJSON();
expect(tree).toMatchSnapshot();
});
test('Renderer:Wizard initApi initFetch:false', async () => {
const fetcher = jest.fn().mockImplementationOnce(() => Promise.resolve({
data: {
status: 0,
msg: 'ok',
data: {
author: 'fex',
date: 1555382395,
info: '',
name: 'Amis renderer'
}
}
}));
renderer.create(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
initApi: "/api/mock2/form/initData?waitSeconds=2",
initFetch: false,
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
required: true
},
{
name: "name",
label: "名称",
type: "text",
required: true
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
await wait(500);
expect(fetcher).not.toHaveBeenCalled();
});
test('Renderer:Wizard initApi initFetch:true', async () => {
const fetcher = jest.fn().mockImplementationOnce(() => Promise.resolve({
data: {
status: 0,
msg: 'ok',
data: {
author: 'fex',
date: 1555382395,
info: '',
name: 'Amis renderer'
}
}
}));
renderer.create(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
initApi: "/api/mock2/form/initData?waitSeconds=2",
initFetch: true,
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
required: true
},
{
name: "name",
label: "名称",
type: "text",
required: true
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
await wait(500);
expect(fetcher).toHaveBeenCalled();
});
test('Renderer:Wizard initApi initFetchOn:false', async () => {
const fetcher = jest.fn().mockImplementationOnce(() => Promise.resolve({
data: {
status: 0,
msg: 'ok',
data: {
author: 'fex',
date: 1555382395,
info: '',
name: 'Amis renderer'
}
}
}));
renderer.create(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
initApi: "/api/mock2/form/initData?waitSeconds=2",
initFetchOn: 'this.goFetch',
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
required: true
},
{
name: "name",
label: "名称",
type: "text",
required: true
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {
data: {
goFetch: false
}
}, makeEnv({
fetcher
})));
await wait(500);
expect(fetcher).not.toHaveBeenCalled();
});
test('Renderer:Wizard initApi initFetchOn:true', async () => {
const fetcher = jest.fn().mockImplementationOnce(() => Promise.resolve({
data: {
status: 0,
msg: 'ok',
data: {
author: 'fex',
date: 1555382395,
info: '',
name: 'Amis renderer'
}
}
}));
renderer.create(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
initApi: "/api/mock2/form/initData?waitSeconds=2",
initFetchOn: 'this.goFetch',
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
required: true
},
{
name: "name",
label: "名称",
type: "text",
required: true
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {
data: {
goFetch: true
}
}, makeEnv({
fetcher
})));
await wait(500);
expect(fetcher).toHaveBeenCalled();
});
test('Renderer:Wizard actionPrevLabel actionNextLabel actionFinishLabel className actionClassName', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: '保存成功',
data: {}
}
}));
const {
getByText,
container
} = render(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
className: "wizard-class-name",
actionClassName: "btn-lg btn-primary",
actionPrevLabel: 'PrevStep',
actionNextLabel: 'NextStep',
actionFinishLabel: 'Submit',
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url"
},
{
name: "name",
label: "名称",
type: "text"
}
]
},
{
title: "Step 2",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
await wait(1000);
fireEvent.click(getByText(/NextStep/));
await wait(1000);
fireEvent.click(getByText(/Submit/));
await wait(1000);
expect(container).toMatchSnapshot();
expect(fetcher).toHaveBeenCalled();
fireEvent.click(getByText(/PrevStep/));
expect(container).toMatchSnapshot();
});
test('Renderer:Wizard actionNextSaveLabel', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: '保存成功',
data: {}
}
}));
const {
getByText
} = render(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
actionNextSaveLabel: 'saveAndNext',
steps: [
{
title: "Step 1",
api: "/api/mock2/form/saveForm?waitSeconds=2",
controls: [
{
name: "website",
label: "网址",
type: "url"
},
{
name: "name",
label: "名称",
type: "text"
}
]
},
{
title: "Step 2",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
await wait(1000);
fireEvent.click(getByText(/saveAndNext/));
await wait(1000);
expect(fetcher).toHaveBeenCalled();
});
test('Renderer:Wizard send data', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: '保存成功',
data: {}
}
}));
const {
getByText,
container
} = render(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
await wait(1000);
fireEvent.click(getByText(/下一步/));
await wait(1000);
fireEvent.click(getByText(/完成/));
await wait(1000);
expect(fetcher).toHaveBeenCalled();
expect(fetcher.mock.calls[0][0]).toMatchObject({
data: {
name: "Amis",
website: "http://amis.baidu.com"
}
});
expect(container).toMatchSnapshot();
});
test('Renderer:Wizard step api', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: '保存成功',
data: {}
}
}));
const {
getByText
} = render(amisRender({
type: "wizard",
steps: [
{
title: "Step 1",
api: "/api/mock2/form/saveForm?waitSeconds=2",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
expect(fetcher).not.toHaveBeenCalled();
fireEvent.click(getByText(/下一步/));
await wait(1000);
expect(fetcher).toHaveBeenCalled();
});
test('Renderer:Wizard step initApi', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: 'ok',
data: {
author: "fex",
date: 1555382395,
email: "xxx@xxx.com"
}
}
}));
const {
getByText,
container
} = render(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
initApi: "/api/mock2/form/saveForm?waitSeconds=2",
controls: [
{
name: "email",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
expect(fetcher).not.toHaveBeenCalled();
fireEvent.click(getByText(/下一步/));
await wait(1000);
expect(fetcher).toHaveBeenCalled();
expect(container).toMatchSnapshot();
});
test('Renderer:Wizard step initFetch:false', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: '保存成功',
data: {}
}
}));
const {
getByText
} = render(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
initApi: "/api/mock2/form/saveForm?waitSeconds=2",
initFetch: false,
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
expect(fetcher).not.toHaveBeenCalled();
fireEvent.click(getByText(/下一步/));
await wait(1000);
expect(fetcher).not.toHaveBeenCalled();
});
test('Renderer:Wizard step initFetch:true', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: '保存成功',
data: {}
}
}));
const {
getByText
} = render(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
initApi: "/api/mock2/form/saveForm?waitSeconds=2",
initFetch: true,
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv({
fetcher
})));
expect(fetcher).not.toHaveBeenCalled();
fireEvent.click(getByText(/下一步/));
await wait(1000);
expect(fetcher).toHaveBeenCalled();
});
test('Renderer:Wizard step initFetchOn:false', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: '保存成功',
data: {}
}
}));
const {
getByText
} = render(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
initApi: "/api/mock2/form/saveForm?waitSeconds=2",
initFetchOn: 'this.goFetch',
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {
data: {
goFetch: false
}
}, makeEnv({
fetcher
})));
expect(fetcher).not.toHaveBeenCalled();
fireEvent.click(getByText(/下一步/));
await wait(1000);
expect(fetcher).not.toHaveBeenCalled();
});
test('Renderer:Wizard step initFetchOn:true', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: '保存成功',
data: {}
}
}));
const {
getByText
} = render(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
initApi: "/api/mock2/form/saveForm?waitSeconds=2",
initFetchOn: 'this.goFetch',
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {
data: {
goFetch: true
}
}, makeEnv({
fetcher
})));
expect(fetcher).not.toHaveBeenCalled();
fireEvent.click(getByText(/下一步/));
await wait(1000);
expect(fetcher).toHaveBeenCalled();
});
test('Renderer:Wizard validate', async () => {
const {
getByText,
container
} = render(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http",
required: true
},
{
name: "name",
label: "名称",
type: "text",
required: true
}
]
},
{
title: "Step 2",
controls: [
{
name: "email2",
label: "邮箱",
type: "email",
required: true
}
]
},
{
title: "Step 3",
controls: [
"这是最后一步了"
]
}
]
}, {}, makeEnv()));
fireEvent.click(getByText(/下一步/));
await wait(1000);
expect(container).toMatchSnapshot();
});
test('Renderer:Wizard initApi reload', async () => {
const fetcher = jest.fn().mockImplementation(() => Promise.resolve({
data: {
status: 0,
msg: 'ok',
data: {}
}
}));
const {
container,
getByText
} = render(amisRender({
type: "page",
name: "thePage",
initApi: "/api/xxx",
body: {
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
reload: "thePage",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
controls: [
"这是最后一步了"
]
}
]
}}, {}, makeEnv({
fetcher
})));
await wait(500);
expect(container).toMatchSnapshot();
fireEvent.click(getByText(/下一步/));
await wait(500);
expect(container).toMatchSnapshot();
fireEvent.click(getByText(/完成/));
await wait(1000);
expect(fetcher).toHaveBeenCalledTimes(3);
expect(container).toMatchSnapshot();
});
test('Renderer:Wizard steps not array', () => {
const component = renderer.create(amisRender({
type: "wizard",
api: "/api/mock2/form/saveForm?waitSeconds=2",
steps: ''
}));
let tree = component.toJSON();
expect(tree).toMatchSnapshot();
});
test('Renderer:Wizard target', async () => {
const {
getByText,
container
} = render(amisRender({
type: "page",
body: [
{
type: "wizard",
target: "theForm",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
}
]
},
{
title: "Step 2",
controls: [
"这是最后一步了"
]
}
]
},
{
type: "form",
name: "theForm",
controls: [
{
type: "text",
name: "website",
label: "Website"
},
{
type: "text",
name: "name",
label: "Name"
}
]
}
]
}, {}));
await wait(1000);
fireEvent.click(getByText(/下一步/));
await wait(1000);
fireEvent.click(getByText(/完成/));
await wait(1000);
expect(container).toMatchSnapshot();
});
test('Renderer:Wizard dialog', async () => {
const {
getByText,
container
} = render(amisRender({
type: "page",
body: [
{
type: "wizard",
steps: [
{
title: "Step 1",
controls: [
{
name: "website",
label: "网址",
type: "url",
value: "http://amis.baidu.com"
},
{
name: "name",
label: "名称",
type: "text",
value: "Amis"
},
{
type: "button",
label: "OpenDialog",
actionType: "dialog",
dialog: {
title: "添加",
body: {
type: "form",
controls: [
{
"type": "text",
"name": "name",
"label": "Name"
}
]
}
}
}
]
},
{
title: "Step 2",
controls: [
"这是最后一步了"
]
}
]
}
]
}, {}, makeEnv({
getModalContainer: () => container
})));
fireEvent.click(getByText(/OpenDialog/));
expect(container).toMatchSnapshot();
fireEvent.click(getByText(/取消/));
await wait(1000);
expect(container).toMatchSnapshot();
});