UNPKG

@webda/core

Version:

Expose API with Lambda

118 lines 4.94 kB
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; }; import { suite, test } from "@testdeck/mocha"; import * as assert from "assert"; import * as sinon from "sinon"; import { WebdaTest } from "../test.js"; import { EventService } from "./asyncevents.js"; let AsyncEventsTest = class AsyncEventsTest extends WebdaTest { async simple() { var users = this.webda.getService("Users"); var eventsCount = 0; var priorityEventsCount = 0; var defaultQueue = this.webda.getService("EventQueue"); var priorityQueue = this.webda.getService("PriorityEventQueue"); var eventService = this.webda.getService("AsyncEvents"); users.onAsync("Store.Saved", () => { eventsCount++; }); users.onAsync("Store.Deleted", () => { priorityEventsCount++; }, "priority"); await users.save({ uuid: "test", type: 1 }); let size = await defaultQueue.size(); assert.strictEqual(size, 1); size = await priorityQueue.size(); assert.strictEqual(size, 0); await users.delete("test"); size = await priorityQueue.size(); assert.strictEqual(size, 1); size = await defaultQueue.size(); assert.strictEqual(size, 1); // Now that we have queued all messages see if they unqueue correctly // We need to emulate the worker as it wont stop pulling from the queue assert.strictEqual(eventsCount, 0); assert.strictEqual(priorityEventsCount, 0); let evts = await defaultQueue.receiveMessage(); // @ts-ignore await eventService.handleRawEvent(evts[0].Message); assert.strictEqual(eventsCount, 1); assert.strictEqual(priorityEventsCount, 0); evts = await priorityQueue.receiveMessage(); // @ts-ignore await eventService.handleRawEvent(evts[0].Message); assert.strictEqual(eventsCount, 1); assert.strictEqual(priorityEventsCount, 1); // Disable async and verify that it directly update now eventService._async = false; await users.save({ uuid: "test", type: 1 }); assert.strictEqual(eventsCount, 2); assert.strictEqual(priorityEventsCount, 1); await users.delete("test"); assert.strictEqual(eventsCount, 2); assert.strictEqual(priorityEventsCount, 2); } worker() { let eventService = this.webda.getService("AsyncEvents"); eventService._queues = { plop: { // @ts-ignore consume: () => "ploper" }, default: { // @ts-ignore consume: () => "default" } }; assert.strictEqual(eventService.worker("plop"), "ploper"); assert.strictEqual(eventService.worker(), "default"); } async computeParameters() { let evt = new EventService(this.webda, "none", { sync: false }); await assert.rejects(() => evt.computeParameters(), /Need at least one queue for async to be ready/); } async cov() { let evt = new EventService(this.webda, "none", { sync: true }); assert.throws(() => evt.bindAsyncListener(evt, "plop", undefined, "plop"), /EventService is not configured for asynchronous/); await assert.rejects( // @ts-ignore () => evt.handleEvent({ getMapper: () => "plop" }), /Callbacks should not be empty, possible application version mismatch between emitter and worker/); evt._async = true; let stub = sinon.spy(this.webda.getService("Users"), "on"); try { evt.bindAsyncListener(this.webda.getService("Users"), "plop", () => { }, "priority"); evt.bindAsyncListener(this.webda.getService("Users"), "plop", () => { }, "priority"); // Should call 'on' only once assert.strictEqual(stub.callCount, 1); } finally { stub.restore(); } } }; __decorate([ test ], AsyncEventsTest.prototype, "simple", null); __decorate([ test ], AsyncEventsTest.prototype, "worker", null); __decorate([ test ], AsyncEventsTest.prototype, "computeParameters", null); __decorate([ test ], AsyncEventsTest.prototype, "cov", null); AsyncEventsTest = __decorate([ suite ], AsyncEventsTest); //# sourceMappingURL=asyncevents.spec.js.map