1
resposta

[Dúvida] Error: Response for preflight has invalid HTTP status code 404 em testes de integração no front com JEST

Olá pessoal, venho compartilhar meu caso que está me deixando biruta

Estou realizando testes de integração sem mockagem no front, justamente para testar em tempo real a api, utilizo banco de testes e subo o back na minha máquina, e o front também, ambos possuo acesso através de features nesses projetos do github. O backend é feito em nestjs e node, e o front em nextjs (usando axios).

Ao renderizar um componente navbar da aplicação com o usuario logado, deve renderizar os pontos acumulados deste usuário. Este é o meu teste onde uso o jsdom como environment:

beforeAll(async () => {
  await act(async () => {
    const credentials = {documento: process.env.CREDENTIAL_USER || "", senha: process.env.CREDENTIAL_PASS || ""}
    await authService.login(credentials)
  });
})

beforeEach(() => [
  render(
  <NavBar/>
  )
])
describe('Navbar',() => {
  it('should get success request to api and render the poins on navbar', async () => {
    const displayPontos = await screen.findByTestId('display-pontos')
  
    await act(async () => {
      const getPontos = await ApiClient().get('ponto/total/user')
      expect(displayPontos).toHaveTextContent(`${getPontos.data.total}`)
    })
  })
})

ao rodar este teste acontece a falha do componente em receber o valor vindo da api:

Navbar › should get success request to api and render the poins on navbar

    expect(element).toHaveTextContent()

    Expected element to have text content:
      737178
    Received:
      0

      43 |     await act(async () => {
      44 |       const getPontos = await ApiClient().get('ponto/total/user')
    > 45 |       expect(displayPontos).toHaveTextContent(`${getPontos.data.total}`)
         |                             ^
      46 |     })
      47 |   })
      48 |
e o erro de preflight vem junto, este erro descobri que tem relação com a configuração do CORS:
Error: Response for preflight has invalid HTTP status code 404.

Meu arquivo next.config.js possui esta configuração:

...(process.env.NODE_ENV === "development" && {async headers() {
    return [
      {
        // matching all API routes
        source: "/api/:path*",
        headers: [
          { key: "Access-Control-Allow-Credentials", value: "true" },
          { key: "Access-Control-Allow-Origin", value: "*" },
          { key: "Access-Control-Allow-Methods", value: "GET, DELETE, PATCH, POST, PUT, OPTIONS" },
          { key: "Access-Control-Allow-Headers", value: "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, Connection, Keep-Alive, Authorization, Vary" },
        ]
      }
    ]
  }}) 

E no main.ts do meu back possui esta configuração do CORS:

app.enableCors({
   origin: '*',
   methods: 'GET, DELETE, PATCH, POST, PUT, OPTIONS',
   allowedHeaders: [
     'X-CSRF-Token',
     'X-Requested-With',
     'Accept',
     'Accept-Version',
     'Content-Length',
     'Content-MD5',
     'Content-Type',
     'Date',
     'X-Api-Version',
     'Connection',
     'Keep-Alive',
     'Authorization',
     'vary',
     'access-control-allow-credentials',
   ],
   credentials: true,
 });

Alguém consegue me dar uma luz no que posso estar fazendo de errado? Estou esquecendo de algo? Agradeço desde já.

1 resposta

Olá, Amanda! Tudo bem?

Pelo que você descreveu, parece que o erro de preflight com status 404 pode estar relacionado à forma como as rotas estão sendo gerenciadas no seu backend ou uma possível má configuração no CORS.

  1. Verificação de Rotas no Backend: primeiramente, confirme se a rota 'ponto/total/user' realmente existe no seu backend e está corretamente implementada. Um erro 404 indica que a rota não foi encontrada, o que pode sugerir um problema na definição da rota ou no servidor que a hospeda.

  2. Configuração do CORS: sua configuração CORS parece estar correta em ambos, frontend e backend. No entanto, você está permitindo credenciais (credentials: true), mas no frontend você está usando Access-Control-Allow-Origin com o valor "*". Isso pode causar problemas, pois quando se usa credenciais, o "*" não é um valor válido para Access-Control-Allow-Origin. Você deve especificar exatamente a origem que está permitida a fazer as requisições. Tente ajustar isso para ver se resolve o problema.

    Exemplo:

    // No next.config.js
    headers: [
      {
        source: "/api/:path*",
        headers: [
          { key: "Access-Control-Allow-Credentials", value: "true" },
          { key: "Access-Control-Allow-Origin", value: "http://localhost:3000" }, // Ajuste para sua URL específica
          { key: "Access-Control-Allow-Methods", value: "GET, DELETE, PATCH, POST, PUT, OPTIONS" },
          { key: "Access-Control-Allow-Headers", value: "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, Connection, Keep-Alive, Authorization, Vary" },
        ]
      }
    ]
    
  3. Testar o Endpoint Isoladamente: use ferramentas como Postman ou Insomnia para testar o endpoint diretamente. Isso pode ajudar a verificar se o problema está no frontend ou no backend.

  4. Revisão do Código de Teste: no seu teste, você está usando ApiClient().get('ponto/total/user') para buscar os pontos. Certifique-se de que este cliente API está configurado corretamente para apontar para a URL correta do backend, especialmente considerando que você está rodando localmente.

Espero que essas sugestões ajudem a resolver o problema.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.