import { describe, it, expect } from "vitest";
import { z } from "zod";
import { defineRealtimeChannel } from "@/realtime-channel";

describe("defineRealtimeChannel", () => {
  it("returns a descriptor with name, schema, and scope", () => {
    const ch = defineRealtimeChannel(
      "test.channel",
      z.object({ id: z.string() }).strict(),
      { scope: "public" },
    );
    expect(ch.name).toBe("test.channel");
    expect(ch.scope).toBe("public");
    expect(() => ch.schema.parse({ id: "x" })).not.toThrow();
  });

  it("preserves all four scope shapes", () => {
    expect(defineRealtimeChannel("a", z.object({}), { scope: "public" }).scope).toBe("public");
    expect(defineRealtimeChannel("a", z.object({}), { scope: "authenticated" }).scope).toBe("authenticated");
    expect(defineRealtimeChannel("a", z.object({}), { scope: { role: "admin" } }).scope).toEqual({ role: "admin" });
    expect(
      defineRealtimeChannel("a", z.object({}), { scope: { userScoped: true, template: "x.{id}" } }).scope,
    ).toEqual({ userScoped: true, template: "x.{id}" });
  });
});
