import { describe, it, expect } from "vitest";
import type { PlopTypes } from "@turbo/gen";
import generator from "./config";

describe("core-package generator", () => {
  it("is registered with realtime in choices list", () => {
    const captured: Array<{ name: string; def: PlopTypes.PlopGeneratorConfig }> = [];
    const plopMock = {
      setHelper: () => {},
      setGenerator: (name: string, def: PlopTypes.PlopGeneratorConfig) =>
        captured.push({ name, def }),
    } as unknown as PlopTypes.NodePlopAPI;
    generator(plopMock);
    const corePkg = captured.find((c) => c.name === "core-package");
    expect(corePkg).toBeDefined();
    const prompts = corePkg!.def.prompts as Array<{ name: string; choices: unknown[] }>;
    expect(prompts[0]!.name).toBe("name");
    expect(prompts[0]!.choices).toContain("realtime");
  });
});

describe("core-package realtime", () => {
  it("emits actions covering package files, transpilePackages, and ESLint rules", () => {
    // Capture the actions returned by the realtime entry.
    const captured: Array<{ name: string; def: PlopTypes.PlopGeneratorConfig }> = [];
    const plop = {
      setHelper: () => {},
      setGenerator: (n: string, d: unknown) => captured.push({ name: n, def: d as PlopTypes.PlopGeneratorConfig }),
    } as unknown as PlopTypes.NodePlopAPI;
    generator(plop);
    const corePkg = captured.find((c) => c.name === "core-package")!.def;
    const actions = (corePkg.actions as (a: { name: string }) => PlopTypes.ActionType[])(
      { name: "realtime" },
    );
    // Expectations: at least one assertNotPresent guard, multiple `add` actions, and a transpilePackages action.
    expect(actions.length).toBeGreaterThan(20); // 28 files + extras
  });
});
