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

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

let createdBrand = null;

describe("createOne", () => {
  afterAll(done => {
    truncate(["Brands", "Cars"], done);
  });

  test("It should return a 401 when guest tries to create new item", async done => {
    const middleware = new Middelware(Brands, models);
    const req = {
      method: "POST",
      user: null,
      body: {
        name: uuid()
      }
    };

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

      done();
    });
  });

  test("It should return a 401 when unauthorized role tries to create new item", async done => {
    const middleware = new Middelware(Brands, models);

    middleware.createOne(
      {
        method: "POST",
        user: {
          role: "user"
        },
        body: {
          name: uuid()
        }
      },
      (err, res) => {
        expect(res).toBeUndefined();
        expect(parseFloat(err.errorCode)).toBe(401.1);

        done();
      }
    );
  });

  test("It should return a 406 when authorized role tries to create new item with missing required values", async done => {
    const middleware = new Middelware(Brands, models);

    middleware.createOne(
      {
        method: "POST",
        user: {
          role: "admin"
        },
        body: {}
      },
      (err, res) => {
        expect(res).toBeUndefined();
        expect(parseFloat(err.errorCode)).toBe(406.1);

        done();
      }
    );
  });

  test("It should return new item when authorized role create new item", async done => {
    const middleware = new Middelware(Brands, models);
    const name = uuid();

    middleware.createOne(
      {
        method: "POST",
        user: {
          role: "admin"
        },
        body: {
          name
        }
      },
      (err, res) => {
        expect(err).toBeNull();
        expect(res).toHaveProperty("id");
        expect(res).toHaveProperty("created");
        expect(res).toHaveProperty("updated");
        expect(res).not.toHaveProperty("createdAt");
        expect(res).not.toHaveProperty("updatedAt");
        expect(res.name).toBe(name);

        createdBrand = res;

        done();
      }
    );
  });

  test("It should return errorCode 409.1 when authorized role tries to create new item with same unique field", async done => {
    const middleware = new Middelware(Brands, models);

    middleware.createOne(
      {
        method: "POST",
        user: {
          role: "admin"
        },
        body: {
          name: createdBrand.name
        }
      },
      (err, res) => {
        expect(res).toBeUndefined();
        expect(parseFloat(err.errorCode)).toBe(409.1);

        done();
      }
    );
  });

  test("It should return errorCode 406.2 when authorized role tries to create new item with bad foreign id", async done => {
    const middleware = new Middelware(Cars, models);
    const name = uuid();

    middleware.createOne(
      {
        method: "POST",
        user: {
          role: "admin"
        },
        body: {
          name,
          year: 2004,
          brandId: createdBrand.id + 2
        }
      },
      (err, res) => {
        expect(res).toBeUndefined();
        expect(parseFloat(err.errorCode)).toBe(406.2);

        done();
      }
    );
  });

  test("It should return errorCode 500 when authorized role tries to create new item with too long value", async done => {
    const middleware = new Middelware(Cars, models);

    middleware.createOne(
      {
        method: "POST",
        user: {
          role: "admin"
        },
        body: {
          name:
            "ThohWaigohhieHogahthoxohpheeDah0geetai0cieNgu1The2foQueeloochoH9eulizieshuf1nivohkied8jei5oph2Lajem6ohviijai6booTh8ienaic9eipheixa4ki1iek2pheihe7een7nei7epahngaerieghoe3ahbeil3yied0ievee1moh8jeeN5quoh6uiph6HaeZ0Eiyohshafohniewaer7gaegiefi5eiquiequoow5ohtheiw6ZeihieMoM8Ejoh7leiNeavi7uapheiwoophitoi3queiBeVeip5too8cah9Ohpaetaogahw1tei0eibuyaef3aht8aighuma6ahK4huP4cew6ohd0aiSh2umeeng7Hizahtoo6xoocePhu4ahtheex3jaijooph9iexaiqu3Nu0Ebeich6iTe",
          year: 2004
        }
      },
      (err, res) => {
        expect(res).toBeUndefined();
        expect(parseFloat(err.errorCode)).toBe(500.0);

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