@kineticdata/react
Version:
A React library for the Kinetic Platform
265 lines (262 loc) • 9.18 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
var _http = require("./http");
var _immutable = require("immutable");
jest.mock('../helpers', function () {
return {
bundle: {
spaceLocation: function spaceLocation() {
return '/kinetic/acme';
},
kappSlug: function kappSlug() {
return 'catalog';
}
}
};
});
describe('http module', function () {
describe('#handleErrors', function () {
// What scenarios do we handle?
describe('when there is a 500 with an error object', function () {
test('returns an object with "error"', function () {
var errorResponse = {
response: {
status: 500,
statusText: 'Internal server error',
data: {
error: 'There were no attributes, QQ'
}
}
};
var _handleErrors = (0, _http.handleErrors)(errorResponse),
error = _handleErrors.error;
expect(error).toEqual({
key: null,
message: 'There were no attributes, QQ',
statusCode: 500
});
});
});
// What scenarios do we handle?
describe('when there is a 500 with empty data object', function () {
test('returns an object without "error"', function () {
var errorResponse = {
response: {
status: 500,
statusText: 'Internal server error',
data: {}
}
};
var _handleErrors2 = (0, _http.handleErrors)(errorResponse),
error = _handleErrors2.error;
expect(error).toEqual({
statusCode: 500,
key: null,
message: 'Internal server error'
});
});
});
});
describe('corePath', function () {
describe('kapp forms and submissions', function () {
test('builds url with specified kapp', function () {
expect((0, _http.corePath)({
form: 'ipad-request',
kapp: 'services'
})).toBe('/kinetic/acme/services/ipad-request');
});
test('builds url with the submission id', function () {
expect((0, _http.corePath)({
submission: 'abc123'
})).toBe('/kinetic/acme/submissions/abc123');
});
});
describe('space forms and submissions', function () {
test('builds url to form', function () {
expect((0, _http.corePath)({
form: 'cars'
})).toBe('/kinetic/acme/app/forms/cars');
});
test('builds url with the submission id', function () {
expect((0, _http.corePath)({
submission: 'abc123'
})).toBe('/kinetic/acme/submissions/abc123');
});
});
});
describe('headerBuilder', function () {
test('defaults to setting the X-Kinetic-AuthAssumed header to true', function () {
expect((0, _http.headerBuilder)({})).toEqual({
'X-Kinetic-AuthAssumed': 'true'
});
});
test('omits X-Kinetic-AuthAssumed when public is true', function () {
expect((0, _http.headerBuilder)({
"public": true
})).toEqual({});
});
});
// The `paramBuilder` only strips out unnecessary options.
describe('#paramBuilder', function () {
test('returns parameter values', function () {
var params = [['include', 'include'], ['limit', 1], ['pageToken', 'pageToken'], ['q', 'q'], ['direction', 'direction'], ['orderBy', 'orderBy'], ['manage', 'manage'], ['export', 'export']];
params.forEach(function (_ref) {
var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
param = _ref2[0],
value = _ref2[1];
return expect((0, _http.paramBuilder)((0, _defineProperty2["default"])({}, param, value))).toMatchObject((0, _defineProperty2["default"])({}, param, value));
});
});
test('does not return non-parameter values', function () {
expect((0, _http.paramBuilder)({
limit: 'limit',
foobar: 'foobar'
})).not.toMatchObject({
foobar: 'foobar'
});
});
test('does not return parameters not passed', function () {
expect((0, _http.paramBuilder)({
limit: 'limit',
foobar: 'foobar'
})).not.toMatchObject({
include: undefined
});
});
});
describe('search operations', function () {
test('startsWith', function () {
var op = _http.operations.get('startsWith');
expect(op('field', 'value')).toEqual('field =* "value"');
});
test('equals', function () {
var op = _http.operations.get('equals');
expect(op('field', 'value')).toEqual('field = "value"');
});
test('lt', function () {
var op = _http.operations.get('lt');
expect(op('field', 'value')).toEqual('field < "value"');
});
test('lteq', function () {
var op = _http.operations.get('lteq');
expect(op('field', 'value')).toEqual('field <= "value"');
});
test('gt', function () {
var op = _http.operations.get('gt');
expect(op('field', 'value')).toEqual('field > "value"');
});
test('gteq', function () {
var op = _http.operations.get('gteq');
expect(op('field', 'value')).toEqual('field >= "value"');
});
test('between', function () {
var op = _http.operations.get('between');
expect(op('field', (0, _immutable.List)(['v1', 'v2']))).toEqual('field BETWEEN ("v1", "v2")');
});
test('in', function () {
var op = _http.operations.get('in');
expect(op('field', (0, _immutable.List)(['v1', 'v2']))).toEqual('field IN ("v1", "v2")');
});
});
// The `paramBuilder` only strips out unnecessary options.
describe('#formDataBuilder', function () {
test('simple values only', function () {
var data = {
name: 'foo'
};
var formData = (0, _http.formDataBuilder)(data);
expect(formData.getAll('name')).toContain('foo');
});
test('with array values', function () {
var data = {
name: ['foo', 'bar']
};
var formData = (0, _http.formDataBuilder)(data);
expect(formData.getAll('name')).toContain('foo');
expect(formData.getAll('name')).toContain('bar');
});
test('with array of objects', function () {
var data = {
array: [{
name: 'foo'
}, {
name: 'bar'
}]
};
var formData = (0, _http.formDataBuilder)(data);
expect(formData.getAll('array[0][name]')).toContain('foo');
expect(formData.getAll('array[1][name]')).toContain('bar');
});
test('with File', function () {
var data = {
file: new File(['test'], 'test')
};
var formData = (0, _http.formDataBuilder)(data);
expect(formData.get('file') instanceof File).toBeTruthy();
});
test('with multiple Files', function () {
var data = {
files: [new File(['test'], 'test'), new File(['test2'], 'test2')]
};
var formData = (0, _http.formDataBuilder)(data);
expect(formData.getAll('files')[0] instanceof File).toBeTruthy();
expect(formData.getAll('files')[1] instanceof File).toBeTruthy();
});
test('nested values', function () {
var data = {
name: 'foo',
child: {
name: 'bar'
}
};
var formData = (0, _http.formDataBuilder)(data);
expect(formData.getAll('name')).toContain('foo');
expect(formData.get('child')).toBeNull();
expect(formData.getAll('child[name]')).toContain('bar');
});
test('nested values with array', function () {
var data = {
child: {
name: ['bar', 'baz']
}
};
var formData = (0, _http.formDataBuilder)(data);
expect(formData.getAll('child[name]')).toContain('bar');
expect(formData.getAll('child[name]')).toContain('baz');
});
test('nested values with File', function () {
var data = {
child: {
file: new File(['test'], 'test')
}
};
var formData = (0, _http.formDataBuilder)(data);
expect(formData.get('child[file]') instanceof File).toBeTruthy();
});
test('deeply nested data', function () {
var data = {
name: 'foo',
child: {
array: ['bar', 'baz'],
sub: {
file: new File(['test'], 'test'),
last: {
slug: 'foobar'
}
}
}
};
var formData = (0, _http.formDataBuilder)(data);
expect(formData.getAll('name')).toContain('foo');
expect(formData.get('child')).toBeNull();
expect(formData.getAll('child[array]')).toContain('bar');
expect(formData.getAll('child[array]')).toContain('baz');
expect(formData.get('child[sub]')).toBeNull();
expect(formData.get('child[sub][file]') instanceof File).toBeTruthy();
expect(formData.get('child[sub][last]')).toBeNull();
expect(formData.getAll('child[sub][last][slug]')).toContain('foobar');
});
});
});