npm package: @rflcstnunes/axios-mock-helper
Description: An Axios mocking helper for testing environments.
Author: Rafael da Costa Nunes
Latest version: 1.17.0

# Axios Mock Helper

Este helper foi projeto para fornecer uma interface simples para criar instâncias do Axios com suporte a respostas simuladas (mocks) durante o desenvolvimento ou testes. Ele oferece a capacidade de configurar respostas simuladas personalizadas para diferentes chamadas HTTP e, ao mesmo tempo, manter a funcionalidade padrão do Axios para chamadas reais quando necessário.

# Fluxo de Uso

## Inicialização

Chame a função `initializeAxios` ao iniciar sua aplicação, configurando se o ambiente é de teste ou produção.

```javascript
import { initializeAxios } from "@rflcstnunes/axios-mock-helper";

initializeAxios({ isTesting: true }); // Ativa o modo mock para testes
```

## Requisição Simulada:

Utilize o método `getAxiosInstance` para obter a instância do Axios configurada e fazer requisições, incluindo o cabeçalho `mock-key` para definir a resposta simulada.

## Remover o Mock para Produção

Simplesmente desabilite o modo de teste (`isTesting: false`) e as requisições passarão a ser reais, sem retornar mocks.

## Estrutura do Helper

`initializeAxios(options: AxiosMockHelperOptions): void`
Inicializa a instância do Axios com base nas opções fornecidas. Essa função deve ser chamada antes de utilizar o helper para garantir que o Axios está configurado corretamente.

### Parâmetros:

- `options` (opcional): Um objeto do tipo `AxiosMockHelperOptions` que aceita as seguintes propriedades:
  - `isTesting` (boolean): Se `true`, ativa o modo de simulação (mock) para interceptar as requisições e retornar respostas simuladas.
  - `mockResponses (AxiosMockResponse)`: Um objeto contendo as definições das respostas simuladas. Se não fornecido, o helper utilizará o arquivo `mockResponses.ts` padrão.
  - `globalMockDelay` (number): Um valor (em milissegundos) para definir um atraso global em todas as respostas simuladas.

`getAxiosInstance(): AxiosInstance`
Retorna a instância do Axios criada com base na configuração. Se a função `initializeAxios` ainda não tiver sido chamada, lança um erro.

### Exemplo de Uso:

```javascript
import { getAxiosInstance } from "@rflcstnunes/axios-mock-helper";

const axiosInstance = getAxiosInstance();

axiosInstance
  .post("/oauth2/token", requestData, {
    headers: {
      "mock-key": "authorization_token", // Define a resposta simulada com base no 'mock-key'
    },
  })
  .then((response) => {
    console.log("Mocked Response Data:", response.data);
  })
  .catch((error) => {
    console.error("Error:", error);
  });
```

## Arquivo de Configuração de Mock (`mockResponses.ts`)

O arquivo `mockResponses.ts` define as respostas simuladas para diferentes endpoints. Ele segue o formato de um objeto `MockResponses`, onde cada chave do objeto representa um mock único identificado por uma string (chave do mock).
Estrutura do Mock:

```javascript
{
  url: string,  // A URL que deve ser interceptada
  method: string, // O método HTTP esperado (GET, POST, etc.)
  delay?: number, // Atraso opcional antes de retornar a resposta
  response: {
    data: any, // Os dados simulados que devem ser retornados
    status: number, // O status HTTP da resposta (ex: 200)
    statusText: string, // O texto de status (ex: "OK")
    headers?: Record<string, string>, // Cabeçalhos opcionais da resposta
  },
}
```

## Arquivo de Configuração Axios (`axiosConfig.ts`)

O arquivo `axiosConfig.ts` define as funções e tipos relacionados à configuração do Axios com suporte a respostas simuladas.

### Funções e Tipos Importantes:

- `createAxiosInstance(options: AxiosMockHelperOptions): AxiosInstance`: Cria uma instância do Axios com base nas opções fornecidas. Se o modo de simulação (`isTesting`) estiver ativado, o Axios intercepta as requisições e retorna as respostas mock definidas.
- `MockResponses`: Interface que define as respostas simuladas, organizadas por chave de mock.
- `MockResponse`: Interface que define a estrutura da resposta mock (dados, status, headers, etc.).

## Personalização dos Mocks

As respostas simuladas podem ser personalizadas sendo passadas para a função `initializeAxios`.

### Exemplo de Uso:

```javascript
const mockResponses = {
  get_user_info: {
    url: "/api/user",
    method: "GET",
    response: {
      data: { name: "Mocked User", id: 123 },
      status: 200,
      statusText: "OK",
    },
  },
};
```

## Atributo mock-key

Para que uma requisição utilize uma resposta simulada, é necessário incluir o cabeçalho `mock-key` com o valor da chave do mock que você deseja utilizar.

### Exemplo de Requisição Simulada:

```javascript
axiosInstance
  .get("/api/user", {
    headers: {
      "mock-key": "get_user_info", // Requisição será interceptada e retornará a resposta mock definida
    },
  })
  .then((response) => {
    console.log("Mocked User Info:", response.data);
  });
```

## Remoção de Mocks para Produção

O helper é projetado para que os mocks sejam ignorados quando `isTesting` for `false`. Assim, as requisições serão enviadas normalmente sem qualquer interceptação quando o ambiente de teste não estiver ativo.