Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Testing Api with Next.Js in Jest

I wanted to write test cases for my Api file using Jest. That uses Next.js. I tried many things but was not able to get any coverage of file.

ApiFile.js

const axios = require('axios');
import getConfig from 'next/config';

export default async (req, res) => {
  const {query: { param }} = req;
  const response = await customerInfo(param);

  if (!response.data || response.data == null) 
    res.status(200).send({ data: [], status: response.status});
  else
    res.status(200).send({ data: response.data.results, status: response.status });
};
async function customerInfo(params) {
    const { serverRuntimeConfig } = getConfig();
    const URL = serverRuntimeConfig.API;
    const config = {
      timeout: 15000,
      headers: {
        'content-type': 'application/json'
      },
    };
    const customer_id = params[0];
    const url = `${URL}/customer/${customer_id}`;
    return await axios
      .get(`${url}`, config)
      .then(response => {
        return response
      })
      .catch(function(error) {
        throw error;
      });
  }

TestFile.js

import mockAxios from "axios";
import mockData from "./customerMock.json";
import customerInfo from "../[...param]";

describe('fetchData', () => {
  it('fetches successfully data from an API', async () => {
    const data = mockData.data; 
    jest.spyOn(mockAxios, 'default');
    const endpoint = '${URL}/customer/abcdef';
    const method = 'get';
    const params = {
      customer_id : 'abcdef'
    }
    customerInfo(params);
    expect(mockAxios.default).toBeCalledWith(params);
  });
  it('fetches erroneously data from an API', async () => {
    const errorMessage = 'Network Error'; 
    mockAxios.get.mockImplementationOnce(() =>
      Promise.reject(new Error(errorMessage)),
    ); 
    await expect(customerInfo('react')).rejects.toThrow(errorMessage);
  });
});

I have tried many ways. Any reference or suggestion will work. Thanks in advance

like image 484
Enigmatic Avatar asked Oct 26 '22 18:10

Enigmatic


1 Answers

Here's an example of how I unit tested a flight data API using Jest and next-test-api-route-handler, a package (I created!) for writing unit tests for Next API routes. My tests are structured very similarly to your own.

To generate coverage data through Jest (assuming you have Node installed), I run the following command:

npx jest --coverage --collectCoverageFrom 'src/**/*.ts' --collectCoverageFrom 'lib/**/*.ts'

Specifically, --coverage tells Jest to collect coverage data, usually into the directory ./coverage, and the optional --collectCoverageFrom X tells Jest to collect coverage only from a specific directory (or directories if multiple are specified).

like image 94
Xunnamius Avatar answered Nov 15 '22 12:11

Xunnamius