import axios from 'axios'; import Cookies from 'js-cookie'; import { initAjaxHandlersCSRFToken } from '../ajax-handlers-csrf-token'; import { isSameOrigin } from '../utils'; jest.mock('axios', () => ({ defaults: {}, interceptors: { request: { use: jest.fn() } } })); jest.mock('../utils'); type RequestInterceptorConfig = Parameters< NonNullable[0]> >[0]; describe(`[ajax-handlers] ${initAjaxHandlersCSRFToken.name}`, () => { describe('request interceptor', () => { let config: RequestInterceptorConfig; beforeAll(() => initAjaxHandlersCSRFToken()); beforeEach(() => (config = {} as RequestInterceptorConfig)); const subject = () => { const interceptors = jest.mocked(axios.interceptors.request.use).mock.calls; let configResult = config; for (const interceptor of interceptors) { configResult = interceptor[0]?.(configResult) as RequestInterceptorConfig; } return configResult; }; test('does not add headers', () => { expect(subject().headers).toBeUndefined(); }); describe('with same origin URL', () => { beforeEach(() => jest.mocked(isSameOrigin).mockReturnValue(true)); test('adds X-Requested-With header', () => { expect(subject()).toEqual({ ...config, headers: expect.objectContaining({ 'X-Requested-With': 'XMLHttpRequest' }), }); }); describe('with X-CSRF-Token cookie', () => { const tokenName = 'X-CSRF-Token'; const token = 'foo-bar'; beforeEach(() => Cookies.set(tokenName, token)); afterEach(() => Cookies.remove(tokenName)); test('adds X-CSRF-Token token to header', () => { expect(subject()).toEqual({ ...config, headers: expect.objectContaining({ [tokenName]: token }), }); }); }); }); }); });