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;