fix: relax content types when setting cache
This commit is contained in:
parent
3cc3d2960f
commit
1565bc81ca
2 changed files with 33 additions and 2 deletions
|
|
@ -31,10 +31,10 @@ const isMethodSupported = (methods, method) => methods.includes(method.toLowerCa
|
||||||
* @param {string[]|undefined} contentTypes
|
* @param {string[]|undefined} contentTypes
|
||||||
* @returns {boolean} `true` if the contentTypes property is not an array, or if the value of the Content-Type header is in the array
|
* @returns {boolean} `true` if the contentTypes property is not an array, or if the value of the Content-Type header is in the array
|
||||||
*/
|
*/
|
||||||
const isResponseContentTypeSupported = (response, contentTypes) => {
|
export const isResponseContentTypeSupported = (response, contentTypes) => {
|
||||||
if (!Array.isArray(contentTypes)) return true;
|
if (!Array.isArray(contentTypes)) return true;
|
||||||
|
|
||||||
return contentTypes.includes(String(response.headers.get('Content-Type')));
|
return !!contentTypes.find(ct => String(response.headers.get('Content-Type')).includes(ct));
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { expect } from '@open-wc/testing';
|
import { expect } from '@open-wc/testing';
|
||||||
import * as sinon from 'sinon';
|
import * as sinon from 'sinon';
|
||||||
import { Ajax, createCacheInterceptors } from '@lion/ajax';
|
import { Ajax, createCacheInterceptors } from '@lion/ajax';
|
||||||
|
import { isResponseContentTypeSupported } from '../../src/interceptors/cacheInterceptors.js';
|
||||||
|
|
||||||
// TODO: these are private API? should they be exposed? if not why do we test them?
|
// TODO: these are private API? should they be exposed? if not why do we test them?
|
||||||
import { extendCacheOptions, resetCacheSession, ajaxCache } from '../../src/cacheManager.js';
|
import { extendCacheOptions, resetCacheSession, ajaxCache } from '../../src/cacheManager.js';
|
||||||
|
|
@ -72,6 +73,36 @@ describe('cache interceptors', () => {
|
||||||
sinon.restore();
|
sinon.restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('isResponseContentTypeSupported', () => {
|
||||||
|
/** @type {Response} */
|
||||||
|
let r;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
r = new Response('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('matches default content type', () => {
|
||||||
|
r.headers.set('Content-Type', 'application/json');
|
||||||
|
expect(isResponseContentTypeSupported(r, ['application/json'])).to.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns false when it doesnt match', () => {
|
||||||
|
r.headers.set('Content-Type', 'text/json');
|
||||||
|
expect(isResponseContentTypeSupported(r, ['application/json'])).to.equal(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('partially matches content type', () => {
|
||||||
|
r.headers.set('Content-Type', 'text/plain;charset=UTF-8;');
|
||||||
|
expect(isResponseContentTypeSupported(r, ['text/plain'])).to.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns true if `contentTypes` is not an array', () => {
|
||||||
|
r.headers.set('Content-Type', 'foo');
|
||||||
|
// @ts-ignore needed for test
|
||||||
|
expect(isResponseContentTypeSupported(r, 'string')).to.equal(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('Original ajax instance', () => {
|
describe('Original ajax instance', () => {
|
||||||
it('allows direct ajax calls without cache interceptors configured', async () => {
|
it('allows direct ajax calls without cache interceptors configured', async () => {
|
||||||
await ajax.fetch('/test');
|
await ajax.fetch('/test');
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue