nestjs-typed-events
Version:
Typesafe NestJS event emitter module
91 lines • 4.13 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestWatcher = void 0;
const module_1 = require("./module");
const testing_1 = require("@nestjs/testing");
const common_1 = require("@nestjs/common");
const decorator_1 = require("./decorator");
const contract_1 = require("./contract");
const zod_1 = require("zod");
const emitter_1 = require("./emitter");
const contract = contract_1.EventContractBuilder.create()
.required('test.event', zod_1.z.object({
foo: zod_1.z.string(),
}))
.optional('optional.event', zod_1.z.object({}))
.build();
const ContractEvent = (0, decorator_1.EventListenerDecoratorFactory)(contract);
const handleMock = jest.fn();
let TestWatcher = class TestWatcher {
handle(props) {
return __awaiter(this, void 0, void 0, function* () {
handleMock(props);
});
}
};
TestWatcher = __decorate([
(0, common_1.Injectable)(),
ContractEvent('test.event')
], TestWatcher);
exports.TestWatcher = TestWatcher;
describe(module_1.EventEmitterModule.name, () => {
describe('given event contract', () => {
describe('when all required events have subscribers', () => {
let emitter;
beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
const deps = yield createModule(contract);
emitter = deps.emitter;
}));
it('should register subscribers', () => {
emitter.emit('test.event', {
foo: 'bar',
});
expect(handleMock).toHaveBeenCalledTimes(1);
});
});
describe('when some required subscribers are missing', () => {
it('should throw', () => __awaiter(void 0, void 0, void 0, function* () {
const contract = contract_1.EventContractBuilder.create()
.required('test.required', zod_1.z.object({
foo: zod_1.z.string(),
}))
.build();
yield expect(() => __awaiter(void 0, void 0, void 0, function* () { return yield createModule(contract); })).rejects.toThrow();
}));
});
});
});
function createModule(contract) {
return __awaiter(this, void 0, void 0, function* () {
const module = yield testing_1.Test.createTestingModule({
imports: [
module_1.EventEmitterModule.forRoot(module_1.EventEmitterModule, {
contract,
}),
],
providers: [TestWatcher],
}).compile();
const app = module.createNestApplication();
yield app.get(module_1.EventEmitterModule).onModuleInit();
const emitter = app.get(emitter_1.TypedEventEmitter);
return {
emitter,
};
});
}
//# sourceMappingURL=module.spec.js.map