cqrs-eda
Version:
Lightweight CQRS and Event-Driven Architecture library using TypeScript decorators, handlers and typings. Perfect for scalable event-driven apps.
59 lines (44 loc) • 1.72 kB
text/typescript
import { describe, it, expect, vi, beforeEach } from "vitest";
import { CommandHandler } from "./handler";
import { Command, getCommandRegistry } from "./decorators";
import { ICommand } from "../types/base";
describe("CommandHandler", () => {
beforeEach(() => {
getCommandRegistry().clear();
});
it("should instantiate commands from registry without factory", async () => {
const executeMock = vi.fn();
("TEST_COMMAND")
class TestCommand implements ICommand<{ foo: string }> {
async execute(payload: { foo: string }) {
executeMock(payload);
}
}
const handler = new CommandHandler<{ TEST_COMMAND: { foo: string } }>();
await handler.fire("TEST_COMMAND", { foo: "bar" });
expect(executeMock).toHaveBeenCalledOnce();
expect(executeMock).toHaveBeenCalledWith({ foo: "bar" });
});
it("should instantiate commands using the factory function", async () => {
const executeMock = vi.fn();
("FACTORY_COMMAND")
class FactoryCommand implements ICommand<{ baz: number }> {
async execute(payload: { baz: number }) {
executeMock(payload);
}
}
const factory = (cls: any) => new cls();
const handler = new CommandHandler<{ FACTORY_COMMAND: { baz: number } }>(
factory
);
await handler.fire("FACTORY_COMMAND", { baz: 42 });
expect(executeMock).toHaveBeenCalledOnce();
expect(executeMock).toHaveBeenCalledWith({ baz: 42 });
});
it("should throw if command not found", async () => {
const handler = new CommandHandler();
await expect(
handler.fire("UNKNOWN_COMMAND" as any, {})
).rejects.toThrowError('Command "UNKNOWN_COMMAND" not found.');
});
});