text: const request = require('supertest-as-promised');
  const httpStatus = require('http-status');
  const jwt = require('jsonwebtoken');
  const chai = require('chai'); // eslint-disable-line import/newline-after-import
  const expect = chai.expect; // eslint-disable-line prefer-destructuring
  const app = require('../../index');
  const config = require('../../config/config');
  
  chai.config.includeStack = true;
  
  describe('## Auth APIs', () => {
    const validUserCredentials = {
      username: 'react',
      password: 'express'
    };
  
    const invalidUserCredentials = {
      username: 'react',
      password: 'IDontKnow'
    };
  
    let jwtToken;
  
    describe('# POST /api/auth/login', () => {
      it('should return Authentication error', (done) => {
        request(app)
          .post('/api/auth/login')
          .send(invalidUserCredentials)
          .expect(httpStatus.UNAUTHORIZED)
          .then((res) => {
            expect(res.body.message).to.equal('Authentication error');
            done();
          })
          .catch(done);
      });
  
      it('should get valid JWT token', (done) => {
        request(app)
          .post('/api/auth/login')
          .send(validUserCredentials)
          .expect(httpStatus.OK)
          .then((res) => {
            expect(res.body).to.have.property('token');
            jwt.verify(res.body.token, config.jwtSecret, (err, decoded) => {
              expect(err).to.not.be.ok; // eslint-disable-line no-unused-expressions
              expect(decoded.username).to.equal(validUserCredentials.username);
              jwtToken = `Bearer ${res.body.token}`;
              done();
            });
          })
          .catch(done);
      });
    });
  
    describe('# GET /api/auth/random-number', () => {
      it('should fail to get random number because of missing Authorization', (done) => {
        request(app)
          .get('/api/auth/random-number')
          .expect(httpStatus.UNAUTHORIZED)
          .then((res) => {
            expect(res.body.message).to.equal('Unauthorized');
            done();
          })
          .catch(done);
      });
  
      it('should fail to get random number because of wrong token', (done) => {
        request(app)
          .get('/api/auth/random-number')
          .set('Authorization', 'Bearer inValidToken')
          .expect(httpStatus.UNAUTHORIZED)
          .then((res) => {
            expect(res.body.message).to.equal('Unauthorized');
            done();
          })
          .catch(done);
      });
  
      it('should get a random number', (done) => {
        request(app)
          .get('/api/auth/random-number')
          .set('Authorization', jwtToken)
          .expect(httpStatus.OK)
          .then((res) => {
            expect(res.body.num).to.be.a('number');
            done();
          })
          .catch(done);
      });
    });
  });
  