// NodegroupDiffTable: nodegroup instance types/counts across the two diff
// sides — plural types joined per side, signed count deltas, em dashes for
// absent sides, and the empty state. Fabricated NodegroupDiff fixtures.

import { describe, expect, it } from "vitest";
import { render, screen, within } from "@testing-library/react";
import { NodegroupDiffTable } from "@/components/compare/NodegroupDiffTable";
import type { NodegroupDiff } from "@/lib/api-types";

const nodegroups: NodegroupDiff[] = [
  {
    name: "ng-main",
    instanceTypesA: ["m6i.4xlarge"],
    instanceTypesB: ["m6i.4xlarge", "c6i.2xlarge"],
    countA: 4,
    countB: 2,
    presentA: true,
    presentB: true,
  },
  {
    name: "ng-scale",
    instanceTypesA: ["m5.2xlarge"],
    instanceTypesB: ["m5.2xlarge"],
    countA: 1,
    countB: 3,
    presentA: true,
    presentB: true,
  },
  {
    name: "ng-added",
    instanceTypesA: null,
    instanceTypesB: ["t3.large"],
    countA: null,
    countB: 3,
    presentA: false,
    presentB: true,
  },
  {
    name: "ng-removed",
    instanceTypesA: ["t3.medium"],
    instanceTypesB: null,
    countA: 1,
    countB: null,
    presentA: true,
    presentB: false,
  },
];

describe("NodegroupDiffTable", () => {
  it("joins plural instance types per side", () => {
    render(<NodegroupDiffTable nodegroups={nodegroups} />);
    expect(screen.getByText("m6i.4xlarge, c6i.2xlarge")).toBeInTheDocument();
    expect(screen.getByText("t3.large")).toBeInTheDocument();
    expect(screen.getByText("t3.medium")).toBeInTheDocument();
    expect(screen.getByText("m6i.4xlarge")).toBeInTheDocument();
    expect(screen.getAllByText("m5.2xlarge").length).toBe(2); // same types on both sides
  });

  it("shows counts and signed count deltas, em dashes for missing sides", () => {
    render(<NodegroupDiffTable nodegroups={nodegroups} />);
    const rowOf = (name: string) => screen.getByText(name).closest("tr");
    expect(within(rowOf("ng-main")!).getByText("-2")).toBeInTheDocument();
    expect(within(rowOf("ng-scale")!).getByText("+2")).toBeInTheDocument();
    // a side absent from the diff has no instance types, count, or delta
    expect(within(rowOf("ng-added")!).getAllByText("—").length).toBe(3);
    expect(within(rowOf("ng-removed")!).getAllByText("—").length).toBe(3);
  });

  it("renders an empty state without nodegroups", () => {
    render(<NodegroupDiffTable nodegroups={[]} />);
    expect(screen.getByText("No nodegroups on either side.")).toBeInTheDocument();
  });
});
