/* eslint-disable jest/no-test-callback */
import { createBrands, truncate } from "./utils/common";

import models from "../models";
import Brands from "../rules/Brands";
import Cars from "../rules/Cars";
import Middelware from "../index";

describe("getAll", () => {
  beforeAll(done => {
    createBrands(40, done);
  });
  afterAll(done => {
    truncate(["Brands", "Cars"], done);
  });

  test("It should return a 401 when guest tries to get all item", async done => {
    const middleware = new Middelware(Cars, models);
    const req = {
      method: "GET",
      user: null,
      params: {},
      query: {}
    };

    middleware.getAll(req, (err, res) => {
      expect(res).toBeUndefined();
      expect(parseFloat(err.errorCode)).toBe(401.1);

      done();
    });
  });

  test("It should return a empty result allowed role get items from empty collection", async done => {
    const middleware = new Middelware(Cars, models);
    const req = {
      method: "GET",
      user: {
        role: "user"
      },
      params: {},
      query: {}
    };

    middleware.getAll(req, (err, res) => {
      expect(err).toBeUndefined();
      expect(res).toBeUndefined();

      done();
    });
  });

  test("It should return all items when allowed role call getAll without filters", async done => {
    const middleware = new Middelware(Brands, models);
    const req = {
      method: "GET",
      user: {
        role: "user"
      },
      params: {},
      query: {},
      protocol: "http",
      get: () => {
        return "internal.test/";
      },
      originalUrl: "v1/"
    };

    middleware.getAll(req, (err, res) => {
      expect(err).toBeNull();
      expect(res).toHaveProperty("data");
      expect(res).toHaveProperty("paging");
      expect(res).toHaveProperty("total");
      expect(res).toHaveProperty("maxPage");

      expect(res.data.length).toBe(40);
      expect(res.total).toBe(40);
      expect(res.maxPage).toBe(1);

      expect(res.paging.first).toBeUndefined();
      expect(res.paging.prev).toBeUndefined();
      expect(res.paging.next).toBeUndefined();
      expect(res.paging.last).toBeUndefined();

      done();
    });
  });

  test("It should return 5 items when allowed role call getAll with limit filter", async done => {
    const middleware = new Middelware(Brands, models);
    const req = {
      method: "GET",
      user: {
        role: "user"
      },
      params: {},
      query: {
        limit: 5,
        page: 3
      },
      protocol: "http",
      get: () => {
        return "internal.test/";
      },
      originalUrl: "v1/?page=3&limit=5"
    };

    middleware.getAll(req, (err, res) => {
      expect(err).toBeNull();
      expect(res).toHaveProperty("data");
      expect(res).toHaveProperty("paging");
      expect(res).toHaveProperty("total");
      expect(res).toHaveProperty("maxPage");

      expect(res.data.length).toBe(5);
      expect(res.total).toBe(40);
      expect(res.maxPage).toBe(8);

      expect(res.data[0]).toHaveProperty("id");
      expect(res.data[0]).toHaveProperty("name");
      expect(res.data[0]).not.toHaveProperty("createdAt");
      expect(res.data[0]).not.toHaveProperty("created");
      expect(res.data[0]).not.toHaveProperty("updatedAt");
      expect(res.data[0]).not.toHaveProperty("updated");

      expect(res.paging.first.href).toBe(
        "http://internal.test/v1/?page=1&limit=5"
      );
      expect(res.paging.prev.href).toBe(
        "http://internal.test/v1/?page=2&limit=5"
      );
      expect(res.paging.next.href).toBe(
        "http://internal.test/v1/?page=4&limit=5"
      );
      expect(res.paging.last.href).toBe(
        "http://internal.test/v1/?page=8&limit=5"
      );

      done();
    });
  });
});