@hazeljs/event-emitter 0.2.0-beta.53 → 0.2.0-beta.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/event-emitter.module.test.d.ts +2 -0
- package/dist/event-emitter.module.test.d.ts.map +1 -0
- package/dist/event-emitter.module.test.js +280 -0
- package/dist/event-emitter.service.js +1 -1
- package/dist/event-emitter.service.test.d.ts +2 -0
- package/dist/event-emitter.service.test.d.ts.map +1 -0
- package/dist/event-emitter.service.test.js +61 -0
- package/dist/on-event.decorator.test.d.ts +2 -0
- package/dist/on-event.decorator.test.d.ts.map +1 -0
- package/dist/on-event.decorator.test.js +136 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.module.test.d.ts","sourceRoot":"","sources":["../src/event-emitter.module.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const core_1 = require("@hazeljs/core");
|
|
13
|
+
const event_emitter_module_1 = require("./event-emitter.module");
|
|
14
|
+
const event_emitter_service_1 = require("./event-emitter.service");
|
|
15
|
+
const on_event_decorator_1 = require("./on-event.decorator");
|
|
16
|
+
describe('EventEmitterModule', () => {
|
|
17
|
+
let container;
|
|
18
|
+
const originalGetInstance = core_1.Container.getInstance;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
container = core_1.Container.createTestInstance();
|
|
21
|
+
core_1.Container.getInstance = jest.fn(() => container);
|
|
22
|
+
});
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
core_1.Container.getInstance = originalGetInstance;
|
|
25
|
+
});
|
|
26
|
+
describe('forRoot', () => {
|
|
27
|
+
it('should return module config with providers and exports', () => {
|
|
28
|
+
const config = event_emitter_module_1.EventEmitterModule.forRoot();
|
|
29
|
+
expect(config.module).toBe(event_emitter_module_1.EventEmitterModule);
|
|
30
|
+
expect(config.providers).toHaveLength(1);
|
|
31
|
+
expect(config.providers[0].provide).toBe(event_emitter_service_1.EventEmitterService);
|
|
32
|
+
expect(config.providers[0].useFactory).toBeDefined();
|
|
33
|
+
expect(config.exports).toContain(event_emitter_service_1.EventEmitterService);
|
|
34
|
+
expect(config.global).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
it('should use isGlobal option', () => {
|
|
37
|
+
const config = event_emitter_module_1.EventEmitterModule.forRoot({ isGlobal: false });
|
|
38
|
+
expect(config.global).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
it('should default isGlobal to true when not provided', () => {
|
|
41
|
+
const config = event_emitter_module_1.EventEmitterModule.forRoot({});
|
|
42
|
+
expect(config.global).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it('should pass options to EventEmitterService factory', () => {
|
|
45
|
+
const config = event_emitter_module_1.EventEmitterModule.forRoot({
|
|
46
|
+
wildcard: true,
|
|
47
|
+
delimiter: ':',
|
|
48
|
+
});
|
|
49
|
+
const factory = config.providers[0].useFactory;
|
|
50
|
+
const service = factory();
|
|
51
|
+
expect(service).toBeInstanceOf(event_emitter_service_1.EventEmitterService);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('registerListenersFromProvider', () => {
|
|
55
|
+
it('should register event listeners from provider with @OnEvent', () => {
|
|
56
|
+
const mockEmit = jest.fn();
|
|
57
|
+
const mockOn = jest.fn();
|
|
58
|
+
const eventEmitter = {
|
|
59
|
+
on: mockOn,
|
|
60
|
+
emit: mockEmit,
|
|
61
|
+
};
|
|
62
|
+
container.register(event_emitter_service_1.EventEmitterService, eventEmitter);
|
|
63
|
+
class TestHandler {
|
|
64
|
+
handleOrderCreated(payload) {
|
|
65
|
+
return payload;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
__decorate([
|
|
69
|
+
(0, on_event_decorator_1.OnEvent)('order.created'),
|
|
70
|
+
__metadata("design:type", Function),
|
|
71
|
+
__metadata("design:paramtypes", [Object]),
|
|
72
|
+
__metadata("design:returntype", void 0)
|
|
73
|
+
], TestHandler.prototype, "handleOrderCreated", null);
|
|
74
|
+
const handler = new TestHandler();
|
|
75
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProvider(handler);
|
|
76
|
+
expect(mockOn).toHaveBeenCalledWith('order.created', expect.any(Function), expect.objectContaining({ suppressErrors: true }));
|
|
77
|
+
});
|
|
78
|
+
it('should handle async listeners', () => {
|
|
79
|
+
const mockOn = jest.fn();
|
|
80
|
+
const eventEmitter = {
|
|
81
|
+
on: mockOn,
|
|
82
|
+
};
|
|
83
|
+
container.register(event_emitter_service_1.EventEmitterService, eventEmitter);
|
|
84
|
+
class TestHandler {
|
|
85
|
+
async handleAsync(_payload) { }
|
|
86
|
+
}
|
|
87
|
+
__decorate([
|
|
88
|
+
(0, on_event_decorator_1.OnEvent)('async.event', { async: true }),
|
|
89
|
+
__metadata("design:type", Function),
|
|
90
|
+
__metadata("design:paramtypes", [Object]),
|
|
91
|
+
__metadata("design:returntype", Promise)
|
|
92
|
+
], TestHandler.prototype, "handleAsync", null);
|
|
93
|
+
const handler = new TestHandler();
|
|
94
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProvider(handler);
|
|
95
|
+
expect(mockOn).toHaveBeenCalledWith('async.event', expect.any(Function), expect.objectContaining({ async: true }));
|
|
96
|
+
});
|
|
97
|
+
it('should call listener when event is emitted', () => {
|
|
98
|
+
const eventEmitter = new event_emitter_service_1.EventEmitterService();
|
|
99
|
+
container.register(event_emitter_service_1.EventEmitterService, eventEmitter);
|
|
100
|
+
const handlerFn = jest.fn();
|
|
101
|
+
class TestHandler {
|
|
102
|
+
handleTest(payload) {
|
|
103
|
+
handlerFn(payload);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
__decorate([
|
|
107
|
+
(0, on_event_decorator_1.OnEvent)('test.event'),
|
|
108
|
+
__metadata("design:type", Function),
|
|
109
|
+
__metadata("design:paramtypes", [Object]),
|
|
110
|
+
__metadata("design:returntype", void 0)
|
|
111
|
+
], TestHandler.prototype, "handleTest", null);
|
|
112
|
+
const handler = new TestHandler();
|
|
113
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProvider(handler);
|
|
114
|
+
eventEmitter.emit('test.event', { data: 'test' });
|
|
115
|
+
expect(handlerFn).toHaveBeenCalledWith({ data: 'test' });
|
|
116
|
+
});
|
|
117
|
+
it('should suppress errors when suppressErrors is true', () => {
|
|
118
|
+
const eventEmitter = new event_emitter_service_1.EventEmitterService();
|
|
119
|
+
container.register(event_emitter_service_1.EventEmitterService, eventEmitter);
|
|
120
|
+
class TestHandler {
|
|
121
|
+
handleTest() {
|
|
122
|
+
throw new Error('Handler error');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
__decorate([
|
|
126
|
+
(0, on_event_decorator_1.OnEvent)('test.event'),
|
|
127
|
+
__metadata("design:type", Function),
|
|
128
|
+
__metadata("design:paramtypes", []),
|
|
129
|
+
__metadata("design:returntype", void 0)
|
|
130
|
+
], TestHandler.prototype, "handleTest", null);
|
|
131
|
+
const handler = new TestHandler();
|
|
132
|
+
expect(() => {
|
|
133
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProvider(handler);
|
|
134
|
+
eventEmitter.emit('test.event');
|
|
135
|
+
}).not.toThrow();
|
|
136
|
+
});
|
|
137
|
+
it('should rethrow errors when suppressErrors is false', () => {
|
|
138
|
+
const eventEmitter = new event_emitter_service_1.EventEmitterService();
|
|
139
|
+
container.register(event_emitter_service_1.EventEmitterService, eventEmitter);
|
|
140
|
+
class TestHandler {
|
|
141
|
+
handleTest() {
|
|
142
|
+
throw new Error('Handler error');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
__decorate([
|
|
146
|
+
(0, on_event_decorator_1.OnEvent)('test.event', { suppressErrors: false }),
|
|
147
|
+
__metadata("design:type", Function),
|
|
148
|
+
__metadata("design:paramtypes", []),
|
|
149
|
+
__metadata("design:returntype", void 0)
|
|
150
|
+
], TestHandler.prototype, "handleTest", null);
|
|
151
|
+
const handler = new TestHandler();
|
|
152
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProvider(handler);
|
|
153
|
+
expect(() => eventEmitter.emit('test.event')).toThrow('Handler error');
|
|
154
|
+
});
|
|
155
|
+
it('should skip when method is not a function', () => {
|
|
156
|
+
const mockOn = jest.fn();
|
|
157
|
+
const eventEmitter = { on: mockOn };
|
|
158
|
+
container.register(event_emitter_service_1.EventEmitterService, eventEmitter);
|
|
159
|
+
class TestHandler {
|
|
160
|
+
handleTest(_payload) {
|
|
161
|
+
return _payload;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
__decorate([
|
|
165
|
+
(0, on_event_decorator_1.OnEvent)('test.event'),
|
|
166
|
+
__metadata("design:type", Function),
|
|
167
|
+
__metadata("design:paramtypes", [Object]),
|
|
168
|
+
__metadata("design:returntype", void 0)
|
|
169
|
+
], TestHandler.prototype, "handleTest", null);
|
|
170
|
+
const handler = new TestHandler();
|
|
171
|
+
// Overwrite method with non-function to simulate missing/invalid method
|
|
172
|
+
handler.handleTest = 'not a function';
|
|
173
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProvider(handler);
|
|
174
|
+
expect(mockOn).not.toHaveBeenCalled();
|
|
175
|
+
});
|
|
176
|
+
it('should handle provider with no @OnEvent decorators', () => {
|
|
177
|
+
const mockOn = jest.fn();
|
|
178
|
+
const eventEmitter = { on: mockOn };
|
|
179
|
+
container.register(event_emitter_service_1.EventEmitterService, eventEmitter);
|
|
180
|
+
class PlainHandler {
|
|
181
|
+
}
|
|
182
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProvider(new PlainHandler());
|
|
183
|
+
expect(mockOn).not.toHaveBeenCalled();
|
|
184
|
+
});
|
|
185
|
+
it('should handle EventEmitterService not in container', () => {
|
|
186
|
+
const emptyContainer = core_1.Container.createTestInstance();
|
|
187
|
+
// Register EventEmitterService as undefined to simulate "not found"
|
|
188
|
+
emptyContainer.register(event_emitter_service_1.EventEmitterService, undefined);
|
|
189
|
+
core_1.Container.getInstance = jest.fn(() => emptyContainer);
|
|
190
|
+
class TestHandler {
|
|
191
|
+
handle() { }
|
|
192
|
+
}
|
|
193
|
+
__decorate([
|
|
194
|
+
(0, on_event_decorator_1.OnEvent)('test'),
|
|
195
|
+
__metadata("design:type", Function),
|
|
196
|
+
__metadata("design:paramtypes", []),
|
|
197
|
+
__metadata("design:returntype", void 0)
|
|
198
|
+
], TestHandler.prototype, "handle", null);
|
|
199
|
+
expect(() => {
|
|
200
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProvider(new TestHandler());
|
|
201
|
+
}).not.toThrow();
|
|
202
|
+
});
|
|
203
|
+
it('should handle errors during registration gracefully', () => {
|
|
204
|
+
core_1.Container.getInstance = jest.fn(() => {
|
|
205
|
+
throw new Error('Container error');
|
|
206
|
+
});
|
|
207
|
+
class TestHandler {
|
|
208
|
+
handle() { }
|
|
209
|
+
}
|
|
210
|
+
__decorate([
|
|
211
|
+
(0, on_event_decorator_1.OnEvent)('test'),
|
|
212
|
+
__metadata("design:type", Function),
|
|
213
|
+
__metadata("design:paramtypes", []),
|
|
214
|
+
__metadata("design:returntype", void 0)
|
|
215
|
+
], TestHandler.prototype, "handle", null);
|
|
216
|
+
expect(() => {
|
|
217
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProvider(new TestHandler());
|
|
218
|
+
}).not.toThrow();
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
describe('registerListenersFromProviders', () => {
|
|
222
|
+
it('should register listeners from multiple provider classes', () => {
|
|
223
|
+
const eventEmitter = new event_emitter_service_1.EventEmitterService();
|
|
224
|
+
container.register(event_emitter_service_1.EventEmitterService, eventEmitter);
|
|
225
|
+
const handler1Fn = jest.fn();
|
|
226
|
+
const handler2Fn = jest.fn();
|
|
227
|
+
class Handler1 {
|
|
228
|
+
handle() {
|
|
229
|
+
handler1Fn();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
__decorate([
|
|
233
|
+
(0, on_event_decorator_1.OnEvent)('event.1'),
|
|
234
|
+
__metadata("design:type", Function),
|
|
235
|
+
__metadata("design:paramtypes", []),
|
|
236
|
+
__metadata("design:returntype", void 0)
|
|
237
|
+
], Handler1.prototype, "handle", null);
|
|
238
|
+
class Handler2 {
|
|
239
|
+
handle() {
|
|
240
|
+
handler2Fn();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
__decorate([
|
|
244
|
+
(0, on_event_decorator_1.OnEvent)('event.2'),
|
|
245
|
+
__metadata("design:type", Function),
|
|
246
|
+
__metadata("design:paramtypes", []),
|
|
247
|
+
__metadata("design:returntype", void 0)
|
|
248
|
+
], Handler2.prototype, "handle", null);
|
|
249
|
+
container.register(Handler1, new Handler1());
|
|
250
|
+
container.register(Handler2, new Handler2());
|
|
251
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProviders([Handler1, Handler2]);
|
|
252
|
+
eventEmitter.emit('event.1');
|
|
253
|
+
eventEmitter.emit('event.2');
|
|
254
|
+
expect(handler1Fn).toHaveBeenCalled();
|
|
255
|
+
expect(handler2Fn).toHaveBeenCalled();
|
|
256
|
+
});
|
|
257
|
+
it('should skip provider when resolve returns undefined', () => {
|
|
258
|
+
const eventEmitter = new event_emitter_service_1.EventEmitterService();
|
|
259
|
+
container.register(event_emitter_service_1.EventEmitterService, eventEmitter);
|
|
260
|
+
class Handler1 {
|
|
261
|
+
handle() { }
|
|
262
|
+
}
|
|
263
|
+
__decorate([
|
|
264
|
+
(0, on_event_decorator_1.OnEvent)('event.1'),
|
|
265
|
+
__metadata("design:type", Function),
|
|
266
|
+
__metadata("design:paramtypes", []),
|
|
267
|
+
__metadata("design:returntype", void 0)
|
|
268
|
+
], Handler1.prototype, "handle", null);
|
|
269
|
+
const originalResolve = container.resolve.bind(container);
|
|
270
|
+
jest.spyOn(container, 'resolve').mockImplementation((token) => {
|
|
271
|
+
if (token === Handler1)
|
|
272
|
+
return undefined;
|
|
273
|
+
return originalResolve(token);
|
|
274
|
+
});
|
|
275
|
+
expect(() => {
|
|
276
|
+
event_emitter_module_1.EventEmitterModule.registerListenersFromProviders([Handler1]);
|
|
277
|
+
}).not.toThrow();
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
});
|
|
@@ -53,6 +53,6 @@ let EventEmitterService = class EventEmitterService extends eventemitter2_1.defa
|
|
|
53
53
|
};
|
|
54
54
|
exports.EventEmitterService = EventEmitterService;
|
|
55
55
|
exports.EventEmitterService = EventEmitterService = __decorate([
|
|
56
|
-
(0, core_1.
|
|
56
|
+
(0, core_1.Service)(),
|
|
57
57
|
__metadata("design:paramtypes", [Object])
|
|
58
58
|
], EventEmitterService);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.service.test.d.ts","sourceRoot":"","sources":["../src/event-emitter.service.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const event_emitter_service_1 = require("./event-emitter.service");
|
|
4
|
+
describe('EventEmitterService', () => {
|
|
5
|
+
describe('constructor', () => {
|
|
6
|
+
it('should create instance with default options when no options provided', () => {
|
|
7
|
+
const service = new event_emitter_service_1.EventEmitterService();
|
|
8
|
+
expect(service).toBeInstanceOf(event_emitter_service_1.EventEmitterService);
|
|
9
|
+
});
|
|
10
|
+
it('should create instance with custom options', () => {
|
|
11
|
+
const service = new event_emitter_service_1.EventEmitterService({
|
|
12
|
+
wildcard: true,
|
|
13
|
+
delimiter: ':',
|
|
14
|
+
maxListeners: 20,
|
|
15
|
+
});
|
|
16
|
+
expect(service).toBeInstanceOf(event_emitter_service_1.EventEmitterService);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe('emit', () => {
|
|
20
|
+
it('should emit event and invoke listeners', () => {
|
|
21
|
+
const service = new event_emitter_service_1.EventEmitterService();
|
|
22
|
+
const listener = jest.fn();
|
|
23
|
+
service.on('test.event', listener);
|
|
24
|
+
const result = service.emit('test.event', { data: 'payload' });
|
|
25
|
+
expect(result).toBe(true);
|
|
26
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
27
|
+
expect(listener).toHaveBeenCalledWith({ data: 'payload' });
|
|
28
|
+
});
|
|
29
|
+
it('should emit event with multiple arguments', () => {
|
|
30
|
+
const service = new event_emitter_service_1.EventEmitterService();
|
|
31
|
+
const listener = jest.fn();
|
|
32
|
+
service.on('multi', listener);
|
|
33
|
+
service.emit('multi', 'arg1', 'arg2', 123);
|
|
34
|
+
expect(listener).toHaveBeenCalledWith('arg1', 'arg2', 123);
|
|
35
|
+
});
|
|
36
|
+
it('should return false when no listeners', () => {
|
|
37
|
+
const service = new event_emitter_service_1.EventEmitterService();
|
|
38
|
+
const result = service.emit('nonexistent.event');
|
|
39
|
+
expect(result).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('emitAsync', () => {
|
|
43
|
+
it('should emit event asynchronously and return promise', async () => {
|
|
44
|
+
const service = new event_emitter_service_1.EventEmitterService();
|
|
45
|
+
const listener = jest.fn().mockResolvedValue(undefined);
|
|
46
|
+
service.on('async.event', listener);
|
|
47
|
+
const promise = service.emitAsync('async.event', { id: 1 });
|
|
48
|
+
expect(promise).toBeInstanceOf(Promise);
|
|
49
|
+
const results = await promise;
|
|
50
|
+
expect(listener).toHaveBeenCalledWith({ id: 1 });
|
|
51
|
+
expect(results).toEqual([undefined]);
|
|
52
|
+
});
|
|
53
|
+
it('should handle async listeners that return values', async () => {
|
|
54
|
+
const service = new event_emitter_service_1.EventEmitterService();
|
|
55
|
+
const listener = jest.fn().mockResolvedValue('result');
|
|
56
|
+
service.on('async.event', listener);
|
|
57
|
+
const results = await service.emitAsync('async.event');
|
|
58
|
+
expect(results).toEqual(['result']);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-event.decorator.test.d.ts","sourceRoot":"","sources":["../src/on-event.decorator.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
require("reflect-metadata");
|
|
13
|
+
const on_event_decorator_1 = require("./on-event.decorator");
|
|
14
|
+
describe('OnEvent decorator', () => {
|
|
15
|
+
it('should define ON_EVENT_METADATA_KEY', () => {
|
|
16
|
+
expect(typeof on_event_decorator_1.ON_EVENT_METADATA_KEY).toBe('symbol');
|
|
17
|
+
});
|
|
18
|
+
it('should add metadata for single event', () => {
|
|
19
|
+
class TestHandler {
|
|
20
|
+
handleOrderCreated(_payload) { }
|
|
21
|
+
}
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, on_event_decorator_1.OnEvent)('order.created'),
|
|
24
|
+
__metadata("design:type", Function),
|
|
25
|
+
__metadata("design:paramtypes", [Object]),
|
|
26
|
+
__metadata("design:returntype", void 0)
|
|
27
|
+
], TestHandler.prototype, "handleOrderCreated", null);
|
|
28
|
+
const metadata = (0, on_event_decorator_1.getOnEventMetadata)(new TestHandler());
|
|
29
|
+
expect(metadata).toHaveLength(1);
|
|
30
|
+
expect(metadata[0].event).toBe('order.created');
|
|
31
|
+
expect(metadata[0].methodName).toBe('handleOrderCreated');
|
|
32
|
+
expect(metadata[0].options).toEqual({ suppressErrors: true });
|
|
33
|
+
});
|
|
34
|
+
it('should add metadata for multiple events on same class', () => {
|
|
35
|
+
class TestHandler {
|
|
36
|
+
handleCreated(_payload) { }
|
|
37
|
+
handleUpdated(_payload) { }
|
|
38
|
+
}
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, on_event_decorator_1.OnEvent)('order.created'),
|
|
41
|
+
__metadata("design:type", Function),
|
|
42
|
+
__metadata("design:paramtypes", [Object]),
|
|
43
|
+
__metadata("design:returntype", void 0)
|
|
44
|
+
], TestHandler.prototype, "handleCreated", null);
|
|
45
|
+
__decorate([
|
|
46
|
+
(0, on_event_decorator_1.OnEvent)('order.updated'),
|
|
47
|
+
__metadata("design:type", Function),
|
|
48
|
+
__metadata("design:paramtypes", [Object]),
|
|
49
|
+
__metadata("design:returntype", void 0)
|
|
50
|
+
], TestHandler.prototype, "handleUpdated", null);
|
|
51
|
+
const metadata = (0, on_event_decorator_1.getOnEventMetadata)(new TestHandler());
|
|
52
|
+
expect(metadata).toHaveLength(2);
|
|
53
|
+
expect(metadata[0].event).toBe('order.created');
|
|
54
|
+
expect(metadata[0].methodName).toBe('handleCreated');
|
|
55
|
+
expect(metadata[1].event).toBe('order.updated');
|
|
56
|
+
expect(metadata[1].methodName).toBe('handleUpdated');
|
|
57
|
+
});
|
|
58
|
+
it('should merge custom options with defaults', () => {
|
|
59
|
+
class TestHandler {
|
|
60
|
+
handleEvent(_payload) { }
|
|
61
|
+
}
|
|
62
|
+
__decorate([
|
|
63
|
+
(0, on_event_decorator_1.OnEvent)('test.event', { async: true, suppressErrors: false }),
|
|
64
|
+
__metadata("design:type", Function),
|
|
65
|
+
__metadata("design:paramtypes", [Object]),
|
|
66
|
+
__metadata("design:returntype", void 0)
|
|
67
|
+
], TestHandler.prototype, "handleEvent", null);
|
|
68
|
+
const metadata = (0, on_event_decorator_1.getOnEventMetadata)(new TestHandler());
|
|
69
|
+
expect(metadata[0].options).toEqual({
|
|
70
|
+
async: true,
|
|
71
|
+
suppressErrors: false,
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
it('should support array of events', () => {
|
|
75
|
+
class TestHandler {
|
|
76
|
+
handleMultiple(_payload) { }
|
|
77
|
+
}
|
|
78
|
+
__decorate([
|
|
79
|
+
(0, on_event_decorator_1.OnEvent)(['event.a', 'event.b']),
|
|
80
|
+
__metadata("design:type", Function),
|
|
81
|
+
__metadata("design:paramtypes", [Object]),
|
|
82
|
+
__metadata("design:returntype", void 0)
|
|
83
|
+
], TestHandler.prototype, "handleMultiple", null);
|
|
84
|
+
const metadata = (0, on_event_decorator_1.getOnEventMetadata)(new TestHandler());
|
|
85
|
+
expect(metadata[0].event).toEqual(['event.a', 'event.b']);
|
|
86
|
+
});
|
|
87
|
+
it('should support symbol as event', () => {
|
|
88
|
+
const sym = Symbol('custom-event');
|
|
89
|
+
class TestHandler {
|
|
90
|
+
handleSymbol(_payload) { }
|
|
91
|
+
}
|
|
92
|
+
__decorate([
|
|
93
|
+
(0, on_event_decorator_1.OnEvent)(sym),
|
|
94
|
+
__metadata("design:type", Function),
|
|
95
|
+
__metadata("design:paramtypes", [Object]),
|
|
96
|
+
__metadata("design:returntype", void 0)
|
|
97
|
+
], TestHandler.prototype, "handleSymbol", null);
|
|
98
|
+
const metadata = (0, on_event_decorator_1.getOnEventMetadata)(new TestHandler());
|
|
99
|
+
expect(metadata[0].event).toBe(sym);
|
|
100
|
+
});
|
|
101
|
+
it('should default suppressErrors to true when not provided', () => {
|
|
102
|
+
class TestHandler {
|
|
103
|
+
handleEvent(_payload) { }
|
|
104
|
+
}
|
|
105
|
+
__decorate([
|
|
106
|
+
(0, on_event_decorator_1.OnEvent)('test.event', { async: true }),
|
|
107
|
+
__metadata("design:type", Function),
|
|
108
|
+
__metadata("design:paramtypes", [Object]),
|
|
109
|
+
__metadata("design:returntype", void 0)
|
|
110
|
+
], TestHandler.prototype, "handleEvent", null);
|
|
111
|
+
const metadata = (0, on_event_decorator_1.getOnEventMetadata)(new TestHandler());
|
|
112
|
+
expect(metadata[0].options?.suppressErrors).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('getOnEventMetadata', () => {
|
|
116
|
+
it('should return empty array for class without @OnEvent decorators', () => {
|
|
117
|
+
class PlainClass {
|
|
118
|
+
}
|
|
119
|
+
const metadata = (0, on_event_decorator_1.getOnEventMetadata)(new PlainClass());
|
|
120
|
+
expect(metadata).toEqual([]);
|
|
121
|
+
});
|
|
122
|
+
it('should return metadata from class constructor', () => {
|
|
123
|
+
class TestHandler {
|
|
124
|
+
handle() { }
|
|
125
|
+
}
|
|
126
|
+
__decorate([
|
|
127
|
+
(0, on_event_decorator_1.OnEvent)('test'),
|
|
128
|
+
__metadata("design:type", Function),
|
|
129
|
+
__metadata("design:paramtypes", []),
|
|
130
|
+
__metadata("design:returntype", void 0)
|
|
131
|
+
], TestHandler.prototype, "handle", null);
|
|
132
|
+
const instance = new TestHandler();
|
|
133
|
+
const metadata = (0, on_event_decorator_1.getOnEventMetadata)(instance);
|
|
134
|
+
expect(metadata).toHaveLength(1);
|
|
135
|
+
});
|
|
136
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hazeljs/event-emitter",
|
|
3
|
-
"version": "0.2.0-beta.
|
|
3
|
+
"version": "0.2.0-beta.55",
|
|
4
4
|
"description": "Event emitter module for HazelJS framework - event-driven architecture with decorators",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"url": "https://github.com/hazeljs/hazel-js/issues"
|
|
51
51
|
},
|
|
52
52
|
"homepage": "https://hazeljs.com",
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "f2e54f346eea552595a44607999454a9e388cb9e"
|
|
54
54
|
}
|