import { expect, test } from "vitest";
import { Value } from "../shared/types";
import getOverrideFromOverridesList from "./getOverrideFromOverridesList";

const cases: {
  name: string;
  list: [flagPath: string, value: Value | null][];
  expected: ReturnType<typeof getOverrideFromOverridesList>;
}[] = [
  {
    name: "null for empty list",
    list: [],
    expected: null,
  },
  {
    name: "null overrides are ignored",
    list: [["simpleFlag", null]],
    expected: null,
  },
  {
    name: "simple flag",
    list: [["simpleFlag", true]],
    expected: { root: { simpleFlag: true } },
  },
  {
    name: "nested flag",
    list: [["flags.ui.simpleFlag", true]],
    expected: { root: { flags: { ui: { simpleFlag: true } } } },
  },
  {
    name: "nested flag with root in path",
    list: [["root.flags.ui.simpleFlag", true]],
    expected: { root: { flags: { ui: { simpleFlag: true } } } },
  },
  {
    name: "multiple nested flags",
    list: [
      ["flags.ui.simpleFlag", true],
      ["flags.ui.ignoredFlag", null],
      ["flags.ui.stringFlag", "Override string"],
    ],
    expected: {
      root: {
        flags: { ui: { simpleFlag: true, stringFlag: "Override string" } },
      },
    },
  },
  {
    name: "multiple nested flags at different levels",
    list: [
      ["flags.ui.simpleFlag", true],
      ["flags.errorList", ["Override string"]],
    ],
    expected: {
      root: {
        flags: { ui: { simpleFlag: true }, errorList: ["Override string"] },
      },
    },
  },
];

test.each(cases)("$name", ({ list, expected }) => {
  expect(getOverrideFromOverridesList(list)).toEqual(expected);
});
