import { withDimensions } from "..";

describe("withDimensions", () => {
  const width = 300;
  const height = 200;

  it("only width in the beginning", () => {
    const url = "https://some_url?width=511&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(
      `https://some_url?width=${width}&quality=95&sharpen=true`
    );
  });

  it("only width in the middle", () => {
    const url = "https://some_url?quality=95&width=511&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(
      `https://some_url?quality=95&width=${width}&sharpen=true`
    );
  });

  it("only height in the beginning", () => {
    const url = "https://some_url?height=511&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(
      `https://some_url?height=${height}&quality=95&sharpen=true`
    );
  });

  it("only height in the middle", () => {
    const url = "https://some_url?quality=95&height=511&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(
      `https://some_url?quality=95&height=${height}&sharpen=true`
    );
  });

  it("width and height", () => {
    const url = "https://some_url?width=511&quality=95&height=400&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(
      `https://some_url?width=${width}&quality=95&height=${height}&sharpen=true`
    );
  });

  it("no width and no height", () => {
    const url = "https://some_url?quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual("https://some_url?quality=95&sharpen=true");
  });

  it("undefined width", () => {
    const url = "https://some_url?width=511&quality=95&sharpen=true";

    const result = withDimensions(url, undefined, height);

    expect(result).toEqual(
      "https://some_url?width=511&quality=95&sharpen=true"
    );
  });

  it("undefined height", () => {
    const url = "https://some_url?height=511&quality=95&sharpen=true";

    const result = withDimensions(url, width, undefined);

    expect(result).toEqual(
      "https://some_url?height=511&quality=95&sharpen=true"
    );
  });

  it("only Width", () => {
    const url = "https://some_url?Width=511&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(
      `https://some_url?Width=${width}&quality=95&sharpen=true`
    );
  });

  it("only heighT", () => {
    const url = "https://some_url?heighT=511&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(
      `https://some_url?heighT=${height}&quality=95&sharpen=true`
    );
  });

  it("no params", () => {
    const url = "https://some_url";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("round input width", () => {
    const width = 243.42857142857142;
    const url = "https://some_url?width=511&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(
      "https://some_url?width=243&quality=95&sharpen=true"
    );
  });

  it("takes original width when provided width more than original", () => {
    const width = 1024;
    const url = "https://some_url?width=511&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("takes original height when provided height more than original", () => {
    const height = 1024;
    const url = "https://some_url?height=511&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("doesnt touch url if no width value is provided", () => {
    const url = "https://some_url?width=&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("doesnt touch url if width=0", () => {
    const url = "https://some_url?width=0&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("doesnt touch url if no height value is provided", () => {
    const url = "https://some_url?height=&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("doesnt touch url if height=0", () => {
    const url = "https://some_url?height=0&quality=95&sharpen=true";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("returns original url ir url is undefined", () => {
    const url = undefined;

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("returns original url ir url is empty string", () => {
    const url = "";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("returns original url ir url is invalid", () => {
    const url = "invalid_url";

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });

  it("returns original url ir url is invalid", () => {
    const url = 1 as unknown as string;

    const result = withDimensions(url, width, height);

    expect(result).toEqual(url);
  });
});
