import CaseViewModel from "../CaseViewModel";
import DetailModel from "../../detail/DetailModel";

import caseviewJson from "./caseview.json";
import caseviewLocalTaskgroupJson from "./caseview_local_taskgroup.json";
import caseviewContributionsJson from "./caseviewContributions.json";

import IllegalStateException from "../../../exceptions/IllegalStateException";

describe("caseViewModel", () => {
  it("should be able to create an empty casedetail", () => {
    const caseview = new CaseViewModel({});

    expect(caseview).toBeInstanceOf(CaseViewModel);
    expect(caseview.getInitialChildModelLinks()).toHaveLength(0);
    expect(caseview.panelLinks).toHaveLength(0);
    expect(caseview.introtext).toBe("");
  });

  it("throws when no self link is available", () => {
    const caseview = new CaseViewModel({});
    expect(() => {
      caseview.selfhref;
    }).toThrow(IllegalStateException);
  });

  it("should be able to create a casedetail from a typical modular UI json structure", () => {
    const caseDetail = new CaseViewModel({
      key: "Book",
      data: caseviewJson,
      contributions: caseviewContributionsJson,
    });

    expect(caseDetail.viewLabel).toBe("Book");
    expect(caseDetail.hasIntroText()).toBe(true);
    expect(caseDetail).toBeInstanceOf(CaseViewModel);
    expect(caseDetail).toBeInstanceOf(DetailModel);

    expect(caseDetail.key).toBe("Book");
    expect(caseDetail.id).toBe(24);

    expect(caseDetail.casename.value).toBe("The safety of objects");

    expect(caseDetail.hasTaskGroups()).toBe(false);
  });

  it("should be able to handle local taskgroup", () => {
    const caseDetail = new CaseViewModel({
      key: "Book",
      data: caseviewLocalTaskgroupJson,
      contributions: caseviewContributionsJson,
    });

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

  it("should be able to handle different kind of introtext", () => {
    const caseviewOldStructure = new CaseViewModel({
      key: "Book",
      data: caseviewJson,
      contributions: {
        ...caseviewContributionsJson,
        text: undefined,
        texts: [
          {
            type: "master",
            text: "<p>This is introtext</p>",
          },
        ],
      },
    });

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

    const caseviewFromDataPlain = new CaseViewModel({
      key: "Book",
      data: {
        _content: { text: { message: "<p>This is introtext</p>" } },
        ...caseviewJson,
      },
      contributions: caseviewContributionsJson,
    });

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

    const caseviewFromDataApplicationMessage = new CaseViewModel({
      key: "Book",
      data: {
        ...caseviewJson,
        _content: {
          text: {
            message: "<p>This is introtext</p>",
          },
        },
      },
      contributions: caseviewContributionsJson,
    });

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

    const caseviewFromNewContributionsRawTextMessage = new CaseViewModel({
      key: "Book",
      data: caseviewJson,
      contributions: {
        ...caseviewContributionsJson,
        text: {
          message: "<p>This is introtext</p>",
        },
      },
    });

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

    const caseviewFromNewContributionsSimpleMessage = new CaseViewModel({
      key: "Book",
      data: caseviewJson,
      contributions: {
        ...caseviewContributionsJson,
        text: "<p>This is introtext</p>",
      },
    });

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