Search code examples
javascripttypescriptaxiosplaywrightreact-fullstack

How to use same token until expires?


In the code below, I will call LoginAPI for authorization and writes token as a state(Login.e2e.ts ).By the way using axios interceptors.request in my axios.ts file.

My question is;

If I use below code logic, when I send request with customAxios in my project,everytime await LoginAPI.API.Signin.run() will run for every API request. Soon,I can have 100 API call. I don t want run every time await LoginAPI.API.Signin.run(),because I can take 429 error.

The new logic should be like this;

I want to take a token first and then use it until it expires. If the token expired then send a new request and get a new token. How can do this using JavaScript or TypeScript?

This is my Login.e2e.ts file

import api from "api/core"
import { expect } from "@playwright/test";

export const LoginAPI = {

  States: {
    token: {} as string
  },

  API: {
    Signin: {
      notes: "user login",
      run: async () => {
        let res: any = await api.test.LoginPost(process.env.NAME, process.env.PASS)
        LoginAPI.States.token = res.data.token
        expect(res.status).toBe(200)
      },
    },

  },
};

This is my axios.ts file

import axios from "axios";
import { LoginAPI } from "../playwright/tests/login/login.api";

const customAxios = axios.create({
    baseURL: process.env.ENV === '1' ? "https://test1" : process.env.ENV === '2' ? "https://test2" : "https://test3",
});


customAxios.interceptors.request.use(
    async (config) => {
       await LoginAPI.API.Signin.run()
        if (config.headers) {
            config.headers['Authorization'] = `Bearer ${LoginAPI.States.token}`;
            return config;
        }
        return config;
    },
    (error) => {
        Promise.reject(error);
    }
);
export default customAxios

take a token first and then use it until it expires. If the token expired then send a new request and get a new token.The above code should be changed the this logic


Solution

  • I would suggest you to log in once and get cookies from the browser.context() and save them as JSON file then use this cookie state/session for the rest of the test. That way you won't have to log in every time for new tests or test suites.

    More information using storageState(options) here in official docs.

    Example of using storageState(options) in your global setup and teardown here in official docs.