How do I unit test a function that needs a cookie with Jest?

Viewed 335

I'm very new to testing and I can't figure out how to test this scenario. I use supertest and Jest for testing. In my Express app I use jwt authentication. I store a jwt token that identifies a user in a http only cookie, and it's been created when a user creates and account or logs in.
Now, I have a route that is responsible for a password change requested by a user:

router.post('/reset-password', async function (req, res, next) {
  try {

    //relevant to the question part here
    //
    const { userToken } = req.cookies
    if (!userToken) {
      res.status(401).json({ error: 'unauthorized' })
      return
    }

    const { email } = jwt.verify(userToken, process.env.JWT_SECRET)
  
    /////////////////////
    
  } catch (err) {
    res.status(401).json({ error: 'unable to verify' })
  }
})

As I understand, in order to test this function, I need to set a cookie in beforeAll. I tried doing so by registering a user that normaly sets required token. Here is my test code:

const request = require('supertest')
const app = require('../app')
const MongoClient = require('mongodb').MongoClient
const client = new MongoClient(`mongodb://localhost:27017/img-test`, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
})

beforeAll(async () => {
  await client.connect()
  app.locals.db = client.db('img-test')
  await request(app).post('/register').send({
    username: 'Bob',
    email: 'bob@email.com',
    password: 'Hardpass0!',
    checkboxTerms: 'on',
    'g-recaptcha-response': 'asdasd',
  })
})

describe('Password reset', () => {
  test('Should reset password', async () => {
    await request(app)
      .post('/api/account/reset-password')
      .send({
        passwordCurrent: 'Hardpass0!',
        passwordNew: 'Hardpass1!',
      })
      .expect(200)
  })
})

afterAll(async () => {
  let db = app.locals.db
  await db.dropDatabase()
  client.close()
})

And of course, it fails. userToken is going to be undefined because as I understand supertest is not setting an http only cookie when a user is registered, and there is no token on req.cookies? How do I test this scenario? What am I doing wrong? Thanks for help.

0 Answers
Related