import * as Hapi from "@hapi/hapi";
import { makePlugin } from ".";

const plugin = makePlugin();

describe("plugin option validation", () => {
  let server;
  beforeEach(async () => {
    server = new Hapi.Server();
  });

  it("should throw when no connection details defined", async () => {
    expect(server.register(plugin)).rejects.toThrow();
  });
});

const defaultOpts = {
  connection: "postgresql://amigo:amigo@127.0.0.1:5432/postgres",
};
describe("basic plugin runtime", () => {
  let server;
  beforeEach(async () => {
    server = new Hapi.Server({ port: 0 });
    await server.register({
      plugin,
      options: defaultOpts,
    });
    await server.start();
  });
  afterEach(async () => {
    await server.stop();
  });

  it("should decorate db and pgp into server and request", async () => {
    expect.assertions(5);
    server.route({
      method: "GET",
      path: "/",
      handler(req) {
        expect(req.db).toBeInstanceOf(Function);
        expect(req.server.db).toBeInstanceOf(Function);
        expect(req.pgp).toBeInstanceOf(Function);
        expect(req.server.pgp).toBeInstanceOf(Function);
        return "OK";
      },
    });

    const { statusCode } = await server.inject({
      method: "get",
      url: "/",
    });
    expect(statusCode).toBe(200);
  });
});

describe("plugin runtime", () => {
  let server;
  beforeEach(async () => {
    server = new Hapi.Server({ port: 0 });
  });
  afterEach(async () => {
    await server.stop();
  });
  it("should decorate db and pgp into server and request with custom name", async () => {
    expect.assertions(5);

    await server.register({
      plugin,
      options: {
        ...defaultOpts,
        logSql: true,
        decorateAs: {
          pgp: "foobar",
          db: "poprocks",
        },
      },
    });

    await server.start();

    await server.route({
      method: "GET",
      path: "/",
      handler(req) {
        expect(req.poprocks).toBeInstanceOf(Function);
        expect(req.server.poprocks).toBeInstanceOf(Function);
        expect(req.foobar).toBeInstanceOf(Function);
        expect(req.server.foobar).toBeInstanceOf(Function);
        return "OK";
      },
    });

    const { statusCode } = await server.inject({
      method: "get",
      url: "/",
    });
    expect(statusCode).toBe(200);
  });
});
