mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Implement defaultData on silverstripe-backend
This commit is contained in:
parent
ef6a1f33ee
commit
572d8427e0
@ -1,6 +1,7 @@
|
||||
import fetch from 'isomorphic-fetch';
|
||||
import es6promise from 'es6-promise';
|
||||
import qs from 'qs';
|
||||
import merge from 'merge';
|
||||
|
||||
es6promise.polyfill();
|
||||
|
||||
@ -50,6 +51,8 @@ class SilverStripeBackend {
|
||||
* - responseFormat: the content-type of the response data. Decoding will be handled for you.
|
||||
* - payloadSchema: Definition for how the payload data passed into the created method
|
||||
* will be processed. See "Payload Schema"
|
||||
* - defaultData: Data to merge into the payload
|
||||
* (which is passed into the returned method when invoked)
|
||||
*
|
||||
* # Payload Formats
|
||||
*
|
||||
@ -257,6 +260,7 @@ class SilverStripeBackend {
|
||||
payloadFormat: 'application/x-www-form-url-encoded',
|
||||
responseFormat: 'application/json',
|
||||
payloadSchema: {},
|
||||
defaultData: {},
|
||||
}, endpointSpec);
|
||||
|
||||
// Substitute shorcut format values with their full mime types
|
||||
@ -270,18 +274,20 @@ class SilverStripeBackend {
|
||||
}
|
||||
);
|
||||
|
||||
return (data) => {
|
||||
return (data = {}) => {
|
||||
const headers = {
|
||||
Accept: refinedSpec.responseFormat,
|
||||
'Content-Type': refinedSpec.payloadFormat,
|
||||
};
|
||||
|
||||
const mergedData = merge.recursive({}, refinedSpec.defaultData, data);
|
||||
|
||||
// Replace url placeholders, and add query parameters
|
||||
// from the payload based on the schema spec.
|
||||
const url = applySchemaToUrl(
|
||||
refinedSpec.payloadSchema,
|
||||
refinedSpec.url,
|
||||
data,
|
||||
mergedData,
|
||||
// Always add full payload data to GET requests.
|
||||
// GET requests with a HTTP body are technically legal,
|
||||
// but throw an error in the WHATWG fetch() implementation.
|
||||
@ -292,7 +298,7 @@ class SilverStripeBackend {
|
||||
refinedSpec.payloadFormat,
|
||||
// Filter raw data through the defined schema,
|
||||
// potentially removing keys because they're
|
||||
applySchemaToData(refinedSpec.payloadSchema, data)
|
||||
applySchemaToData(refinedSpec.payloadSchema, mergedData)
|
||||
);
|
||||
|
||||
const args = refinedSpec.method.toLowerCase() === 'get'
|
||||
|
@ -4,6 +4,7 @@
|
||||
jest.unmock('isomorphic-fetch');
|
||||
jest.unmock('../silverstripe-backend');
|
||||
jest.unmock('qs');
|
||||
jest.unmock('merge');
|
||||
|
||||
import backend from '../silverstripe-backend';
|
||||
|
||||
@ -191,10 +192,10 @@ describe('SilverStripeBackend', () => {
|
||||
two: { urlReplacement: ':two' },
|
||||
},
|
||||
});
|
||||
const promise = endpoint({
|
||||
endpoint({
|
||||
one: 1,
|
||||
two: 2,
|
||||
three: 3
|
||||
three: 3,
|
||||
});
|
||||
expect(mock.post.mock.calls[0][0]).toEqual('http://example.com/1/2/?foo=bar');
|
||||
expect(mock.post.mock.calls[0][1]).toEqual('two=2&three=3');
|
||||
@ -217,10 +218,10 @@ describe('SilverStripeBackend', () => {
|
||||
three: { querystring: true },
|
||||
},
|
||||
});
|
||||
const promise = endpoint({
|
||||
endpoint({
|
||||
one: 1,
|
||||
two: 2,
|
||||
three: 3
|
||||
three: 3,
|
||||
});
|
||||
expect(mock.post.mock.calls[0][0]).toEqual('http://example.com/1/2/?foo=bar&three=3');
|
||||
expect(mock.post.mock.calls[0][1]).toEqual('{"two":2}');
|
||||
@ -242,16 +243,43 @@ describe('SilverStripeBackend', () => {
|
||||
three: { querystring: true },
|
||||
},
|
||||
});
|
||||
const promise = endpoint({
|
||||
endpoint({
|
||||
one: 1,
|
||||
two: 2,
|
||||
three: 3
|
||||
three: 3,
|
||||
});
|
||||
expect(mock.get.mock.calls[0][0]).toEqual('http://example.com/1/2/?foo=bar&two=2&three=3');
|
||||
expect(mock.get.mock.calls[0][1]).toEqual({
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/x-www-form-url-encoded'
|
||||
});
|
||||
'Content-Type': 'application/x-www-form-url-encoded',
|
||||
});
|
||||
});
|
||||
|
||||
it('should merge defaultData into data argument', () => {
|
||||
const mock = getBackendMock({
|
||||
text: () => Promise.resolve('{"status":"ok"}'),
|
||||
headers: new Headers({
|
||||
'Content-Type': 'application/json',
|
||||
}),
|
||||
});
|
||||
const endpoint = mock.createEndpointFetcher({
|
||||
url: 'http://example.com/',
|
||||
method: 'post',
|
||||
payloadFormat: 'json',
|
||||
defaultData: { one: 1, two: 2, four: { fourOne: true } },
|
||||
});
|
||||
endpoint({
|
||||
two: 'updated',
|
||||
three: 3,
|
||||
four: { fourTwo: true },
|
||||
});
|
||||
expect(mock.post.mock.calls[0][0]).toEqual('http://example.com/');
|
||||
expect(mock.post.mock.calls[0][1]).toEqual(JSON.stringify({
|
||||
one: 1,
|
||||
two: 'updated',
|
||||
four: { fourOne: true, fourTwo: true },
|
||||
three: 3,
|
||||
}));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
4
npm-shrinkwrap.json
generated
4
npm-shrinkwrap.json
generated
@ -12759,6 +12759,10 @@
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/json-js/-/json-js-1.1.2.tgz"
|
||||
},
|
||||
"merge": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz"
|
||||
},
|
||||
"merge-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.0.tgz",
|
||||
|
@ -46,6 +46,7 @@
|
||||
"isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
|
||||
"jquery-sizes": "^0.33.0",
|
||||
"json-js": "^1.1.2",
|
||||
"merge": "^1.2.0",
|
||||
"page.js": "^4.13.3",
|
||||
"qs": "^6.1.0",
|
||||
"react": "^0.14.8",
|
||||
|
Loading…
Reference in New Issue
Block a user