const request = require('supertest');

const createServer = require('../createServer');

const clearBlacklist = require('./utils/clearBlacklist');
const withBlacklist = require('./utils/withBlacklist');

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

  it('redirects /_meta to ?meta', done => {
    request(server)
      .get('/_meta/react')
      .end((err, res) => {
        expect(res.statusCode).toBe(301);
        expect(res.headers.location).toBe('/react?meta');
        done();
      });
  });

  it('redirects ?json to ?meta', done => {
    request(server)
      .get('/react?json')
      .end((err, res) => {
        expect(res.statusCode).toBe(301);
        expect(res.headers.location).toBe('/react?meta');
        done();
      });
  });

  it('redirects invalid query params', done => {
    request(server)
      .get('/react?main=index&invalid')
      .end((err, res) => {
        expect(res.statusCode).toBe(302);
        expect(res.headers.location).toBe('/react?main=index');
        done();
      });
  });

  it('rejects invalid package names', done => {
    request(server)
      .get('/_invalid/index.js')
      .end((err, res) => {
        expect(res.statusCode).toBe(403);
        done();
      });
  });

  describe('blacklisted packages', () => {
    afterEach(clearBlacklist);

    it('does not serve blacklisted packages', done => {
      withBlacklist(['bad-package'], () => {
        request(server)
          .get('/bad-package/index.js')
          .end((err, res) => {
            expect(res.statusCode).toBe(403);
            done();
          });
      });
    });
  });
});