import { ModularUIReducer } from "../ModularUIReducer";
import { MODULARUI_STATUS } from "../../../constants";

import application from "../../../models/application/__mock__/application";
import tab from "../../../models/tab/__mock__/tab";

describe("modularui reducer", () => {
  it("should return the initial state", () => {
    expect(ModularUIReducer(undefined, {})).toStrictEqual({});
    expect(ModularUIReducer()).toStrictEqual({});
  });

  it("should handle MODULARUI/STATUS loading", () => {
    expect(
      ModularUIReducer(
        {},
        {
          type: "MODULARUI/STATUS",
          payload: {
            key: "modelKey",
            status: MODULARUI_STATUS.LOADING,
          },
        },
      ),
    ).toStrictEqual({
      modelKey: expect.objectContaining({
        status: MODULARUI_STATUS.LOADING,
      }),
    });
  });

  it("cannot set a model to finished when it is not set in the reducer", () => {
    expect(
      ModularUIReducer(
        {},
        {
          type: "MODULARUI/STATUS",
          payload: {
            key: "modelKey",
            status: MODULARUI_STATUS.FINISHED,
          },
        },
      ),
    ).toStrictEqual({});

    expect(
      ModularUIReducer(
        {
          modelKey: {
            status: "LOADING",
          },
        },
        {
          type: "MODULARUI/STATUS",
          payload: {
            key: "modelKey",
            status: MODULARUI_STATUS.FINISHED,
          },
        },
      ),
    ).toStrictEqual({
      modelKey: expect.objectContaining({
        status: MODULARUI_STATUS.FINISHED,
      }),
    });
  });

  it("should handle MODULARUI/SET", () => {
    expect(
      ModularUIReducer(
        {
          modelKey: {
            status: "LOADING",
          },
        },
        {
          type: "MODULARUI/SET",
          payload: {
            key: "modelKey",
            model: application,
          },
        },
      ),
    ).toStrictEqual({
      modelKey: expect.objectContaining({
        model: application,
      }),
    });
  });

  it("should handle MODULARUI/UPDATE", () => {
    application.connectKey = "modelKey";
    expect(
      ModularUIReducer(
        { modelKey: { model: application } },
        {
          type: "MODULARUI/UPDATE",
          payload: application,
        },
      ),
    ).toStrictEqual({
      modelKey: expect.objectContaining({
        model: application,
      }),
    });
  });

  it("should handle MODULARUI/UPDATE without existing model", () => {
    application.connectKey = "modelKey";
    expect(
      ModularUIReducer(
        {},
        {
          type: "MODULARUI/UPDATE",
          payload: application,
        },
      ),
    ).toStrictEqual({});
  });

  it("should handle MODULARUI/REMOVE_KEY", () => {
    application.connectKey = "modelKey";
    tab.connectKey = "tabKey";
    expect(
      ModularUIReducer(
        { modelKey: { model: application }, tabKey: { model: tab } },
        {
          type: "MODULARUI/REMOVE_KEY",
          payload: "modelKey",
        },
      ),
    ).toStrictEqual({ tabKey: { model: tab } });
  });
});
