vaibhav
vaibhav

Reputation: 784

Res.Redirect is not getting called in Jest Test

i am using node-express and am trying to check the redirect when the call from API is successful. I am getting an error that - Expected mock function to have been called, but it was not called.

here is my function:

export function globalAuthHandler (req, res, next) {
    const global_signin_url = config.get('url');
    if (global_signin_url) {
        console.log(global_signin_url);
        fetch(global_signin_url)
            .then((response) => response.json())
            .then((response) => {
                console.log('Response', response);
                if (response.data) {
                    console.log('Success!!!');
                    res.redirect('/signIn');
                } else {
                    console.log('going here 1' + response);
                    res.redirect('/session-expired');
                    throw Error(response.statusText);
                }
            })
            .catch((error) => {
                console.log('going global here 2 ' + error);
                next(error);
            });
    } else {
        console.log('going here 3');
        res.redirect('/session-expired');
    }
}

here is the test :

it('should throw the error and redirect if the API fails with 404.', async () => {
        // Setup
        Config.get = jest.fn();
        Config.get.mockReturnValue(true);
        Config.initialize = jest.fn(() => Promise.resolve({ data: {} }));
        const req = jest.fn(),
            res = { redirect: jest.fn() },
            next = jest.fn();
        //global.fetch = jest.fn(() => new Promise((resolve) => resolve({ response: { ok: false, status: 404 } })));
        global.fetch = jest.fn(
            () =>
                new Promise((resolve) =>
                    resolve({
                        json: () => {
                            return { };
                        }
                        /* data: { ok: true } */
                    })
                )
        );

        // Act
        await middlewares.globalAuthHandler(req, res, next);
        //  Assert
        expect(res.redirect).toHaveBeenCalled();
        expect(res.redirect).toHaveBeenCalledWith('/signIn');
    });

I am not able to figure out that - even after going to the success!!! log, redirect is not getting triggered.

Upvotes: 1

Views: 1361

Answers (1)

Brian Adams
Brian Adams

Reputation: 45840

Calling await on middlewares.globalAuthHandler doesn't wait for it to complete since it isn't returning the Promise.

Return the Promise created by fetch:

export function globalAuthHandler (req, res, next) {
  ...      
    return fetch(global_signin_url)  // <= return the Promise
    ...
}

...and the test will wait for the Promise to resolve before continuing to the expect statements.

That will give res.redirect a chance to be called before it is tested.

Upvotes: 2

Related Questions