Merge pull request #7684 from 2betop/chore-api803

chore: 调整 responseData 当接口返回错误但是有数据返回时也有用 Close: #7680
This commit is contained in:
hsm-lv 2023-08-08 13:02:37 +08:00 committed by GitHub
commit c2abaec30e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 140 additions and 11 deletions

View File

@ -14,7 +14,8 @@ import {
extendObject,
qsparse,
uuid,
JSONTraverse
JSONTraverse,
isEmpty
} from './helper';
import isPlainObject from 'lodash/isPlainObject';
import {debug, warning} from './debug';
@ -432,19 +433,11 @@ export function responseAdaptor(ret: fetcherResult, api: ApiObject) {
debug('api', 'response', payload);
if (payload.ok && api.responseData) {
if (api.responseData && (payload.ok || !isEmpty(payload.data))) {
debug('api', 'before dataMapping', payload.data);
const responseData = dataMapping(
api.responseData,
createObject(
{api},
(Array.isArray(payload.data)
? {
items: payload.data
}
: payload.data) || {}
),
createObject({api}, normalizeApiResponseData(payload.data)),
undefined,
api.convertKeyToPath
);

View File

@ -509,3 +509,139 @@ test('api:requestAdaptor2', async () => {
expect(container.querySelector('input[name="id"]')).toBeInTheDocument();
expect((container.querySelector('input[name="id"]') as any).value).toBe('2');
});
test('api:responseData1', async () => {
const notify = jest.fn();
const fetcher = jest.fn().mockImplementation(() =>
Promise.resolve({
data: {
status: 0,
msg: 'ok',
data: {
id: 1
}
}
})
);
const {container, getByText} = render(
amisRender(
{
type: 'page',
body: [
{
type: 'form',
id: 'form_submit',
submitText: '提交表单',
api: {
method: 'post',
url: '/api/mock2/form/saveForm',
responseData: {
id: '${id}',
id2: '${id + 1}'
}
},
body: [
{
type: 'input-text',
name: 'id',
label: 'Id'
},
{
type: 'input-text',
name: 'id2',
label: 'Id2'
}
]
}
]
},
{},
makeEnv({
notify,
fetcher
})
)
);
await waitFor(() => {
expect(getByText('提交表单')).toBeInTheDocument();
});
fireEvent.click(getByText(/提交表单/));
await wait(300);
expect(fetcher).toHaveBeenCalledTimes(1);
expect(container.querySelector('input[name="id"]')).toBeInTheDocument();
expect((container.querySelector('input[name="id"]') as any).value).toBe('1');
expect(container.querySelector('input[name="id2"]')).toBeInTheDocument();
expect((container.querySelector('input[name="id2"]') as any).value).toBe('2');
});
test('api:responseData2', async () => {
const notify = jest.fn();
const fetcher = jest.fn().mockImplementation(() =>
Promise.resolve({
data: {
status: 500,
msg: 'ok',
data: {
id: 1
}
}
})
);
const {container, getByText} = render(
amisRender(
{
type: 'page',
body: [
{
type: 'form',
id: 'form_submit',
submitText: '提交表单',
api: {
method: 'post',
url: '/api/mock2/form/saveForm',
responseData: {
id: '${id}',
id2: '${id + 1}'
}
},
body: [
{
type: 'input-text',
name: 'id',
label: 'Id'
},
{
type: 'input-text',
name: 'id2',
label: 'Id2'
}
]
}
]
},
{},
makeEnv({
notify,
fetcher
})
)
);
await waitFor(() => {
expect(getByText('提交表单')).toBeInTheDocument();
});
fireEvent.click(getByText(/提交表单/));
await wait(300);
expect(fetcher).toHaveBeenCalledTimes(1);
expect(container.querySelector('input[name="id"]')).toBeInTheDocument();
expect((container.querySelector('input[name="id"]') as any).value).toBe('1');
expect(container.querySelector('input[name="id2"]')).toBeInTheDocument();
expect((container.querySelector('input[name="id2"]') as any).value).toBe('2');
});