UNPKG

@serenity-js/rest

Version:

Serenity/JS Screenplay Pattern library for interacting with REST and other HTTP-based services, supporting comprehensive API testing and blended testing scenarios

51 lines (40 loc) 1.85 kB
import { Duration } from '@serenity-js/core'; import axios, { Axios, type AxiosInstance, type AxiosRequestConfig } from 'axios'; import type { AxiosRequestConfigDefaults, AxiosRequestConfigProxyDefaults } from './AxiosRequestConfigDefaults'; import { axiosProxyOverridesFor } from './proxy'; /** * Creates an Axios instance with desired configuration and proxy support. * * @param axiosInstanceOrConfig */ export function createAxios(axiosInstanceOrConfig: AxiosInstance | AxiosRequestConfigDefaults = {}): AxiosInstance { const axiosInstanceGiven = isAxiosInstance(axiosInstanceOrConfig); const axiosInstance = axiosInstanceGiven ? axiosInstanceOrConfig : axios.create({ timeout: Duration.ofSeconds(10).inMilliseconds(), ...omit(axiosInstanceOrConfig, 'proxy'), }); const proxyConfig: AxiosRequestConfigProxyDefaults | false | undefined = axiosInstanceGiven ? axiosInstanceOrConfig.defaults.proxy : axiosInstanceOrConfig.proxy; const proxyOverrides = axiosProxyOverridesFor({ ...axiosInstance.defaults, proxy: proxyConfig || undefined, }); return withOverrides(axiosInstance, proxyOverrides); } function isAxiosInstance(axiosInstanceOrConfig: any): axiosInstanceOrConfig is AxiosInstance { return axiosInstanceOrConfig && (axiosInstanceOrConfig instanceof Axios || axiosInstanceOrConfig.defaults); } function withOverrides<Data = any>(axiosInstance: AxiosInstance, overrides: AxiosRequestConfig<Data>): AxiosInstance { for (const [key, override] of Object.entries(overrides)) { axiosInstance.defaults[key] = override; } return axiosInstance; } function omit<T extends object, K extends keyof T>(record: T, key: K): Omit<T, K> { const { [key]: omitted_, ...rest } = record; return rest; }