@sword-health/ui-http-mapper
Version:
UI clients tool for consumption of easy to read/config endpoint maps
184 lines (157 loc) • 5.66 kB
JavaScript
import EndpointDecoder from '../src/scripts/Decoder';
import endpoints from './mocks/endpoints.js';
import * as dymmyConfigs from './mocks/dummy-configs.js';
import { getRandomItemFromArray } from './tooling/helpers.js';
const decoderInstance = new EndpointDecoder(endpoints);
// at start of test you want to suppress
console.log = console.warn = console.error = jest.fn();
test('Endpoint decoder is defined', () => {
expect(decoderInstance).toBeDefined();
});
// Do not accept invalid namespaces
describe('Name space is protected for any given malformed input', () => {
dymmyConfigs.invalidNamespaces.forEach((namespace, index) => {
//const foundConfig = decoderInstance.$http(namespace, { 'dosent': 'matter' });
//expect(foundConfig).toBeDefined();
test(`Testing malformed namespace ${index + 1}/${dymmyConfigs.invalidNamespaces.length}`, () => {
const foundConfig = decoderInstance.$http(namespace, { 'dosent': 'matter' });
expect(foundConfig).toBeUndefined();
});
});
});
describe('Can find configurations for any method type (obs. Ensure possible configs are defined)', () => {
const oneNamespacePerMethodType = [
{
method: 'GET',
namespace: getRandomItemFromArray(dymmyConfigs.dumbNamespacesByType.get),
}, {
method: 'POST',
namespace: getRandomItemFromArray(dymmyConfigs.dumbNamespacesByType.post),
}, {
method: 'PUT',
namespace: getRandomItemFromArray(dymmyConfigs.dumbNamespacesByType.put),
}, {
method: 'DELETE',
namespace: getRandomItemFromArray(dymmyConfigs.dumbNamespacesByType.delete),
},
];
oneNamespacePerMethodType.forEach(({ method, namespace }) => {
test(`Finding config for random ${method} method`, () => {
const foundConfig = decoderInstance.$http(namespace, { 'dosent': 'matter' });
expect(foundConfig).toBeDefined();
});
});
});
test('Could find N level deep endpoint configuration', () => {
const deepEndpointConfig = decoderInstance.$http('patient/assessments/justAnotherLevelDeep/anodaOne', { 'dosent': 'matter' });
expect(deepEndpointConfig).toBeDefined();
});
// Correctly forms url based on config and urlData passed on each call
test('Correctly forms URLs based on configs provided through urlData param on each call', () => {
const urlData = {
patientId: 451,
formId: 669,
};
const expectURL = `clinical-forms/api/v1/451/669`;
const endpointConfig = decoderInstance.$http('patient/assessments/deleteForm', urlData);
expect(endpointConfig.url).toBe(expectURL);
});
// Could handle values modules
test('Could find configs on the various modules provided', () => {
});
// Only returns suitable configurations
test('Only returns suitable configurations', () => {
const urlData = {
patientId: 451,
formId: 669,
};
const endpointConfig = decoderInstance.$http('patient/assessments', urlData);
expect(endpointConfig).toBeUndefined();
});
// Correctly returns endpoint metadata when available
test('Correctly returns endpoint metadata populated when available', () => {
const urlData = {
patientId: 451,
};
const expectedMeta = { mockDir: '/some/mocked/data/path' };
const endpointConfig = decoderInstance.$http('patient/assessments/getForms', urlData);
expect(endpointConfig.meta).toMatchObject(expectedMeta);
});
// Merges configs giving prioprity to adhhoc ones
test('Merges default request configs with adhoc ones, giving priority to adhoc ones', () => {
const urlData = {
patientId: 451,
};
const requestConfigs = {
config: {
headers: 'Boda',
},
};
//TODO SEE CAST HERE
const expectedConfigs = {
timeout: '5000',
headers: 'Boda',
};
const endpointConfig = decoderInstance.$http('patient/assessments/getForms', urlData, requestConfigs);
expect(endpointConfig.requestArgs).toStrictEqual([expectedConfigs]);
});
// drops request payload on get requests
test('Drops request payload if found method ends up being \'get\' type', () => {
const urlData = {
patientId: 451,
};
const requestConfigs = {
body: {
will: 'drop',
},
config: {
headers: 'Boda',
},
};
//TODO SEE CAST HERE
const expectedConfigs = {
timeout: '5000',
headers: 'Boda',
};
const endpointConfig = decoderInstance.$http('patient/assessments/getForms', urlData, requestConfigs);
expect(endpointConfig.requestArgs).toStrictEqual([expectedConfigs]);
});
test('Keeps request payload if request is POST, PUT, PATCH or DELETE', () => {
const urlData = {
patientId: 451,
};
const requestConfigs = {
body: {
will: 'drop',
},
config: {
headers: 'Boda',
},
};
const expectedPayload = {
will: 'drop',
};
//TODO SEE CAST HERE
const expectedConfigs = {
headers: 'Boda',
};
const namespacessThatRequirePayload = [
'patient/assessments/generateForm',
'patient/assessments/reactivateForm',
'patient/assessments/patchForm',
'patient/assessments/deleteForm',
];
namespacessThatRequirePayload.forEach(namespace => {
const endpointConfig = decoderInstance.$http(namespace, urlData, requestConfigs);
expect(endpointConfig.requestArgs).toStrictEqual([expectedPayload, expectedConfigs]);
});
});
// Do nit explocde if theren't modules available
test('Does not explode is user does not provide any module to spec structure', () => {
const urlData = {
patientId: 451,
};
const decoderInstanceWithoutModules = new EndpointDecoder({});
const endpointConfig = decoderInstanceWithoutModules.$http('patient/assessments/getForms', urlData);
expect(endpointConfig).toBeUndefined();
});