Returned an undefined when resolving JWTVerifyStub- Mocha/Chai

15 views Asked by At

I'm working on creating test scripts for my validateAuth function, but I've encountered an issue where I'm getting an undefined value from this line of code const {_id} = jwt.verify(token, process.env.SECRET);. Instead of the expected value "fakeUserId," I'm seeing {_id: undefined} when I log it. Can someone please help me identify where I might be making a mistake?

Test Script:

const expect = chai.expect;
const sinon = require('sinon');
const validateAuth = require('../middleware/validateAuth');
const User = require('../models/userModel');
const jwt = require('jsonwebtoken');

process.env.SECRET = 'your_test_secret';

describe('validate authentication', () => {
  let req, res, next, jwtVerifyStub, findOneStub;
  const mockUserDocument = { _id: 'fakeUserId' };

  beforeEach(() => {
    jwtVerifyStub = sinon.stub(jwt, 'verify')
    findOneStub = sinon.stub(User, 'findOne').resolves(mockUserDocument);
    next = sinon.spy();
    req = {
      headers: {
        authorization: 'Bearer fakeEncryptedToken'
      }
    }
    res = {
      status: sinon.stub(),
      json: sinon.stub()
    }
    res.status.returns(res)
  })
  afterEach(() => {
    sinon.restore();
  })
  it('successfully validates authorized user', async () => {
    jwtVerifyStub.withArgs('fakeEncryptedToken', 'your_test_secret').resolves({_id: 'fakeUserId'})

    await validateAuth(req, res, next);
    
    expect(next.calledOnce).to.be.true
  })
})

validateAuth.js

const jwt = require('jsonwebtoken');
const User = require('../models/userModel');

const validateAuth = async (req, res, next) => {
  const { authorization } = req.headers;

  if (!authorization) {
    return res.status(401).json({error: 'require authorization token'});
  };

  const token = authorization.split(' ')[1];
  try {
    const {_id} = jwt.verify(token, process.env.SECRET);

    req.user = await User.findOne({_id}).select('_id');
    next();
  }
  catch(err) {
    res.status(401).json({error: 'request is not authorized'})
  }
}

module.exports = validateAuth;
0

There are 0 answers