Skip to content
Snippets Groups Projects
token.test.js 2.32 KiB
Newer Older
/* eslint-disable global-require, jest/no-done-callback */

describe('token management', () => {
  it('creates and verifies a token', done => {
    const {
      token: { create: createToken, verify: verifyToken },
    } = require('../authentication')

    const token = createToken({ id: 1, username: 'test' })

    const callback = (err, id, user) => {
      if (err) {
        throw new Error()
      }

      expect(user.token).toEqual(token)
      done()
    }

    verifyToken(token, callback)
  })

  it('does not verify an expired token', done => {
    const {
      token: { create: createToken, verify: verifyToken },
    } = require('../authentication')

    const token = createToken({ id: 1, username: 'test' })

    const callback = (err, id, user) => {
      if (err) {
        throw new Error()
      }

      expect(user).toEqual(undefined)
      done()
    }

    // Mock a Date now in 24 hours, the default expiry
    const now = new Date(new Date().getTime() + 24 * 3600 * 1000)
    const realDate = Date.now
    Date.now = jest.fn().mockReturnValue(now)
    verifyToken(token, callback)
    Date.now = realDate
  })

  it('accepts a configuration option for expiry', done => {
    // Resetting modules to reload with the new config
    jest.resetModules()

    process.env.NODE_CONFIG = `{"pubsweet-server":{"tokenExpiresIn":"2 days"}}`

    const {
      token: { create: createToken, verify: verifyToken },
    } = require('../authentication')

    const token = createToken({ id: 1, username: 'test' })

    const tokenValidCallback = (err, id, user) => {
      if (err) throw new Error()
      expect(user.token).toEqual(token)
      done()
    }

    const realDate = Date.now
    // Mock a Date now in 36 hours, more than the default expiry
    let now = new Date(new Date().getTime() + 36 * 3600 * 1000)
    Date.now = jest.fn().mockReturnValue(now)

    // Token should still be valid
    verifyToken(token, tokenValidCallback)

    // Mock a Date now in 48 hours, the configured expiry
    now = new Date(new Date().getTime() + 48 * 3600 * 1000)
    Date.now = jest.fn().mockReturnValue(now)

    const tokenErrorCallback = (err, id, user) => {
      if (err) throw new Error()
      expect(user).toEqual(undefined)
      done()
    }

    // Token should be expired
    verifyToken(token, tokenErrorCallback)
    Date.now = realDate
  })
})