import { renderCell } from "./TableUtilities";
import { ColumnTypes } from "widgets/TableWidget/component/Constants";

describe("Test table columnType Image render", () => {
  it("columnType Image accepts single image url and renders image correctly", () => {
    const value =
      "http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back02.jpg";

    const expected = [
      "http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back02.jpg",
    ];
    const ImageCellComponent = renderCell(
      value,
      ColumnTypes.IMAGE,
      false,
      // @ts-expect-error: other Props are missing
      { isCellVisible: true },
      930,
      true,
    );
    const result = ImageCellComponent.props.children.map((imageDiv: any) => {
      return imageDiv.props.children.props.style.backgroundImage
        .slice(4, -1)
        .replace(/"/g, "");
    });

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

  it("columnType Image accepts single base64 url and renders image correctly", () => {
    const value =
      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";

    const expected = [
      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
    ];
    const ImageCellComponent = renderCell(
      value,
      ColumnTypes.IMAGE,
      false,
      // @ts-expect-error: other Props are missing
      { isCellVisible: true },
      930,
      true,
    );
    const result = ImageCellComponent.props.children.map((imageDiv: any) => {
      return imageDiv.props.children.props.style.backgroundImage
        .slice(4, -1)
        .replace(/"/g, "");
    });

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

  it("columnType Image accepts comma separeted image urls and renders all images correctly", () => {
    const value =
      "http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back02.jpg,http://commondatastorage.googleapis.com/codeskulptor-assets/gutenberg.jpg,http://commondatastorage.googleapis.com/codeskulptor-assets/gutenberg.jpg";

    const expected = [
      "http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back02.jpg",
      "http://commondatastorage.googleapis.com/codeskulptor-assets/gutenberg.jpg",
      "http://commondatastorage.googleapis.com/codeskulptor-assets/gutenberg.jpg",
    ];
    const ImageCellComponent = renderCell(
      value,
      ColumnTypes.IMAGE,
      false,
      // @ts-expect-error: other Props are missing
      { isCellVisible: true },
      930,
      true,
    );
    const result = ImageCellComponent.props.children.map((imageDiv: any) => {
      return imageDiv.props.children.props.style.backgroundImage
        .slice(4, -1)
        .replace(/"/g, "");
    });

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

  it("columnType Image accepts comma separeted image urls that has base64 image and renders images correctly", () => {
    const value =
      "http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back02.jpg,data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";

    const expected = [
      "http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back02.jpg",
      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
    ];
    const ImageCellComponent = renderCell(
      value,
      ColumnTypes.IMAGE,
      false,
      // @ts-expect-error: other Props are missing
      { isCellVisible: true },
      930,
      true,
    );
    const result = ImageCellComponent.props.children.map((imageDiv: any) => {
      return imageDiv.props.children.props.style.backgroundImage
        .slice(4, -1)
        .replace(/"/g, "");
    });

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

  it("columnType Image accepts image url that may have incorrect use of comma and renders image correctly", () => {
    const value =
      "http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back02.jpg, ";

    const expected = [
      "http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back02.jpg",
      undefined,
    ];
    const ImageCellComponent = renderCell(
      value,
      ColumnTypes.IMAGE,
      false,
      // @ts-expect-error: other Props are missing
      { isCellVisible: true },
      930,
      true,
    );
    const result = ImageCellComponent.props.children.map((imageDiv: any) => {
      // check and get img url if exist
      const imageDivProps = imageDiv.props.children.props;
      if (imageDivProps) {
        return imageDivProps.style.backgroundImage
          .slice(4, -1)
          .replace(/"/g, "");
      } else {
        return undefined;
      }
    });

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

  it("columnType Text accepts undefined value and render empty string ", () => {
    const value = undefined;
    const expected = "";
    const renderedCell = renderCell(
      value,
      ColumnTypes.TEXT,
      false,
      // @ts-expect-error: other Props are missing
      { isCellVisible: true },
      930,
      true,
    );

    expect(expected).toEqual(renderedCell.props.children);
  });

  it("columnType Text accepts null value and render empty string ", () => {
    const value = null;
    const expected = "";
    const renderedCell = renderCell(
      value,
      ColumnTypes.TEXT,
      false,
      // @ts-expect-error: other Props are missing
      { isCellVisible: true },
      930,
      true,
    );

    expect(expected).toEqual(renderedCell.props.children);
  });

  it("columnType Number accepts 0 as value and renders 0 ", () => {
    const value = 0;
    const expected = "0";
    const renderedCell = renderCell(
      value,
      ColumnTypes.NUMBER,
      false,
      // @ts-expect-error: other Props are missing
      { isCellVisible: true },
      930,
      true,
    );

    expect(expected).toEqual(renderedCell.props.children);
  });

  it("columnType Number accepts NaN as value and renders empty string ", () => {
    const value = NaN;
    const expected = "";
    const renderedCell = renderCell(
      value,
      ColumnTypes.NUMBER,
      false,
      // @ts-expect-error: other Props are missing
      { isCellVisible: true },
      930,
      true,
    );

    expect(expected).toEqual(renderedCell.props.children);
  });
});
