import GroupingPanelModel from "../GroupingPanelModel";

import panelJson from "./groupingPanel.json";
import panelContributionsJson from "./groupingPanelContributions.json";

describe("groupingPanelModel", () => {
  it("should be able to create an empty GroupingPanelModel object", () => {
    const groupingPanel = new GroupingPanelModel();

    expect(groupingPanel).toBeInstanceOf(GroupingPanelModel);
    expect(groupingPanel.type).toBe("GroupingPanel");
    expect(groupingPanel.introtext).toBe("");

    expect(
      GroupingPanelModel.isApplicableModel({
        contributions: {
          resourcetype: "GroupingPanel",
        },
      }),
    ).toBe(true);

    expect(
      GroupingPanelModel.isApplicableModel({
        contributions: {
          resourcetype: "TabGroupingPanel",
        },
      }),
    ).toBe(true);

    expect(
      GroupingPanelModel.isApplicableModel({
        contributions: {
          resourcetype: "CaseTabGroupingPanel",
        },
      }),
    ).toBe(true);
  });

  it("should be able to create a grouping panel from a typical modular UI json structure", () => {
    const groupingPanel = new GroupingPanelModel({
      key: "AskingQuestions",
      data: panelJson,
      contributions: panelContributionsJson,
    });

    expect(groupingPanel).toBeInstanceOf(GroupingPanelModel);

    expect(groupingPanel.key).toBe("AskingQuestions");
    expect(groupingPanel.label).toBe("Asking questions");

    expect(groupingPanel.links).toHaveLength(8);
    expect(groupingPanel.panelLinks).toHaveLength(1);

    expect(groupingPanel.hasIntroText()).toBe(true);

    expect(groupingPanel.getInitialChildModelLinks()).toHaveLength(4);
  });

  it("can handle local taskgroups", () => {
    const groupingPanel = new GroupingPanelModel({
      key: "AskingQuestions",
      data: panelJson,
      contributions: panelContributionsJson,
    });

    expect(groupingPanel.hasTaskGroups()).toBe(true);
    expect(groupingPanel.hasTasks()).toBe(true);
    expect(groupingPanel.taskGroupCollection).toHaveLength(1);
  });

  it("should be able to handle different kind of introtext", () => {
    const groupingPanelOldStructure = new GroupingPanelModel({
      key: "Book",
      data: panelJson,
      contributions: panelContributionsJson,
    });

    expect(groupingPanelOldStructure.introtext).toBe(
      "<p>This is introtext</p>",
    );

    const groupingPanelFromDataPlain = new GroupingPanelModel({
      key: "Book",
      data: {
        _content: { text: { message: "<p>This is introtext</p>" } },
        ...panelJson,
      },
      contributions: panelContributionsJson,
    });

    expect(groupingPanelFromDataPlain.introtext).toBe(
      "<p>This is introtext</p>",
    );

    const groupingPanelFromDataApplicationMessage = new GroupingPanelModel({
      key: "Book",
      data: {
        ...panelJson,
        _content: {
          text: {
            message: "<p>This is introtext</p>",
          },
        },
      },
      contributions: panelContributionsJson,
    });

    expect(groupingPanelFromDataApplicationMessage.introtext).toBe(
      "<p>This is introtext</p>",
    );

    const groupingPanelFromNewContributionsRawTextMessage =
      new GroupingPanelModel({
        key: "Book",
        data: panelJson,
        contributions: {
          ...panelContributionsJson,
          text: {
            message: "<p>This is introtext</p>",
          },
        },
      });

    expect(groupingPanelFromNewContributionsRawTextMessage.introtext).toBe(
      "<p>This is introtext</p>",
    );

    const groupingPanelFromNewContributionsSimpleMessage =
      new GroupingPanelModel({
        key: "Book",
        data: panelJson,
        contributions: {
          ...panelContributionsJson,
          text: "<p>This is introtext</p>",
        },
      });

    expect(groupingPanelFromNewContributionsSimpleMessage.introtext).toBe(
      "<p>This is introtext</p>",
    );
  });
});
