import request from 'supertest';

import createServer from '../createServer';
import withRevokedToken from './utils/withRevokedToken';
import withToken from './utils/withToken';

describe('The /_auth endpoint', () => {
  let server;
  beforeEach(() => {
    server = createServer();
  });

  describe('POST /_auth', () => {
    it('creates a new auth token', done => {
      request(server)
        .post('/_auth')
        .end((err, res) => {
          expect(res.body).toHaveProperty('token');
          done();
        });
    });
  });

  describe('GET /_auth', () => {
    describe('with no auth', () => {
      it('echoes back null', done => {
        request(server)
          .get('/_auth')
          .end((err, res) => {
            expect(res.body).toHaveProperty('auth');
            expect(res.body.auth).toBe(null);
            done();
          });
      });
    });

    describe('with a revoked auth token', () => {
      it('echoes back null', done => {
        withRevokedToken({ some: { scope: true } }, token => {
          request(server)
            .get('/_auth?token=' + token)
            .end((err, res) => {
              expect(res.body).toHaveProperty('auth');
              expect(res.body.auth).toBe(null);
              done();
            });
        });
      });
    });

    describe('with a valid auth token', () => {
      it('echoes back the auth payload', done => {
        withToken({ some: { scope: true } }, token => {
          request(server)
            .get('/_auth?token=' + token)
            .end((err, res) => {
              expect(res.body).toHaveProperty('auth');
              expect(typeof res.body.auth).toBe('object');
              done();
            });
        });
      });
    });
  });
});