import { describe, it, expectTypeOf } from "vitest";
import type {
  EventBusProtocol,
  RealtimeBroadcasterProtocol,
  RealtimeRegistryProtocol,
} from "./bind-protocols";

// Protocol-shape tests. These verify each protocol type EXPORTS the
// expected method names. Full assignability of `IEventBus` /
// `IRealtimeBroadcaster` / `IRealtimeHandlerRegistry` to their respective
// protocols is verified at the optional-package level — when those packages
// are scaffolded back via `pnpm turbo gen core-package <name>`, the
// `extends`-link in their interface declarations forces a typecheck
// failure if the protocol surface ever drifts.

describe("EventBusProtocol", () => {
  it("requires publish(event, payload) and subscribe(event, consumer, handler)", () => {
    type Bus = EventBusProtocol;
    expectTypeOf<Bus["publish"]>().toBeFunction();
    expectTypeOf<Bus["subscribe"]>().toBeFunction();
  });
});

describe("RealtimeBroadcasterProtocol", () => {
  it("requires broadcast(channel, payload)", () => {
    type Rt = RealtimeBroadcasterProtocol;
    expectTypeOf<Rt["broadcast"]>().toBeFunction();
  });
});

describe("RealtimeRegistryProtocol", () => {
  it("requires register, registerChannel, listChannels", () => {
    type Reg = RealtimeRegistryProtocol;
    expectTypeOf<Reg["register"]>().toBeFunction();
    expectTypeOf<Reg["registerChannel"]>().toBeFunction();
    expectTypeOf<Reg["listChannels"]>().toBeFunction();
  });
});
