const { expect } = require('chai')
const { ObjectId } = require('mongodb')
const User = require('./helpers/User').promises

describe('Authentication', function () {
  let user
  beforeEach('init vars', function () {
    user = new User()
  })

  describe('CSRF regeneration on login', function () {
    it('should prevent use of csrf token from before login', function (done) {
      user.logout(err => {
        if (err) {
          return done(err)
        }
        user.getCsrfToken(err => {
          if (err) {
            return done(err)
          }
          const oldToken = user.csrfToken
          user.login(err => {
            if (err) {
              return done(err)
            }
            expect(oldToken === user.csrfToken).to.equal(false)
            user.request.post(
              {
                headers: {
                  'x-csrf-token': oldToken
                },
                url: '/project/new',
                json: { projectName: 'test' }
              },
              (err, response, body) => {
                expect(err).to.not.exist
                expect(response.statusCode).to.equal(403)
                expect(body).to.equal('Forbidden')
                done()
              }
            )
          })
        })
      })
    })
  })

  describe('login', function () {
    beforeEach('doLogin', async function () {
      await user.login()
    })

    it('should log the user in', async function () {
      const {
        response: { statusCode }
      } = await user.doRequest('GET', '/project')
      expect(statusCode).to.equal(200)
    })

    it('should emit an user auditLog entry for the login', async function () {
      const {
        auditLog: [auditLogEntry]
      } = await user.get()
      expect(auditLogEntry).to.exist
      expect(auditLogEntry.timestamp).to.exist
      delete auditLogEntry.timestamp
      expect(auditLogEntry).to.deep.equal({
        operation: 'login',
        ipAddress: '127.0.0.1',
        initiatorId: ObjectId(user.id)
      })
    })
  })
})
