import { getObjectDiff } from "../src/object-diff";

describe("getObjectDiff", () => {
  it("returns an empty diff if no objects are provided", () => {
    expect(getObjectDiff(null, null)).toStrictEqual({
      type: "object",
      status: "equal",
      diff: [],
    });
  });
  it("consider previous object as completely deleted if no next object is provided", () => {
    expect(
      getObjectDiff(
        { name: "joe", age: 54, hobbies: ["golf", "football"] },
        null
      )
    ).toStrictEqual({
      type: "object",
      status: "deleted",
      diff: [
        {
          property: "name",
          previousValue: "joe",
          currentValue: undefined,
          status: "deleted",
        },
        {
          property: "age",
          previousValue: 54,
          currentValue: undefined,
          status: "deleted",
        },
        {
          property: "hobbies",
          previousValue: ["golf", "football"],
          currentValue: undefined,
          status: "deleted",
        },
      ],
    });
  });
  it("consider next object as completely added if no previous object is provided", () => {
    expect(
      getObjectDiff(null, {
        name: "joe",
        age: 54,
        hobbies: ["golf", "football"],
      })
    ).toStrictEqual({
      type: "object",
      status: "added",
      diff: [
        {
          property: "name",
          previousValue: undefined,
          currentValue: "joe",
          status: "added",
        },
        {
          property: "age",
          previousValue: undefined,
          currentValue: 54,
          status: "added",
        },
        {
          property: "hobbies",
          previousValue: undefined,
          currentValue: ["golf", "football"],
          status: "added",
        },
      ],
    });
  });
  it("detects changed between two objects", () => {
    expect(
      getObjectDiff(
        {
          id: 54,
          user: {
            name: "joe",
            member: true,
            hobbies: ["golf", "football"],
            age: 66,
          },
        },
        {
          id: 54,
          user: {
            name: "joe",
            member: false,
            hobbies: ["golf", "chess"],
            age: 66,
          },
        }
      )
    ).toStrictEqual({
      type: "object",
      status: "updated",
      diff: [
        {
          property: "id",
          previousValue: 54,
          currentValue: 54,
          status: "equal",
        },
        {
          property: "user",
          previousValue: {
            name: "joe",
            member: true,
            hobbies: ["golf", "football"],
            age: 66,
          },
          currentValue: {
            name: "joe",
            member: false,
            hobbies: ["golf", "chess"],
            age: 66,
          },
          status: "updated",
          subPropertiesDiff: [
            {
              name: "name",
              previousValue: "joe",
              currentValue: "joe",
              status: "equal",
            },
            {
              name: "member",
              previousValue: true,
              currentValue: false,
              status: "updated",
            },
            {
              name: "hobbies",
              previousValue: ["golf", "football"],
              currentValue: ["golf", "chess"],
              status: "updated",
            },
            {
              name: "age",
              previousValue: 66,
              currentValue: 66,
              status: "equal",
            },
          ],
        },
      ],
    });
  });
});