@webda/gcp
Version:
Webda GCP Services implementation
103 lines • 4.23 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;
};
import { suite, test } from "@testdeck/mocha";
import { QueueTest } from "@webda/core/lib/queues/queue.spec.js";
import * as assert from "assert";
import { EventEmitter } from "events";
import * as sinon from "sinon";
class FakeSubscription extends EventEmitter {
emitError() {
this.emit("error", "Fake error");
}
close() { }
}
let GCPQueueTest = class GCPQueueTest extends QueueTest {
async basic() {
let queue = this.webda.getService("queue");
queue.getParameters().subscription = `${queue.getParameters().subscription}_${this.webda.getUuid()}`;
await queue.pubsub.createSubscription(queue.getParameters().topic, queue.getParameters().subscription, {
ackDeadlineSeconds: 10,
enableExactlyOnceDelivery: true
});
try {
await this.simple(queue, true, 12000);
// Seems to be penalized by no promise on ACK
await this.sleep(5000);
this.log("DEBUG", "Verify receiveMessage is now empty");
queue.getParameters().timeout = 3000;
// TODO Investigate this one
if ((await queue.receiveMessage()).length > 0) {
this.log("ERROR", "Queue should be empty - not an assert to avoid random");
}
}
finally {
await queue.pubsub.subscription(queue.getParameters().subscription).delete();
}
}
async consumers() {
let queue = this.webda.getService("queue");
queue.getParameters().subscription = `${queue.getParameters().subscription}_${this.webda.getUuid()}`;
await queue.pubsub.createSubscription(queue.getParameters().topic, queue.getParameters().subscription, {
ackDeadlineSeconds: 10,
enableMessageOrdering: true
});
try {
// Test consumer
let msg;
let consumed = 0;
let consumer = queue.consume(async (dt) => {
consumed++;
if (msg) {
throw new Error();
}
msg = dt;
});
await this.sleep(1000);
this.log("DEBUG", "Consume sendMessage");
await queue.sendMessage({ plop: 1 });
this.log("DEBUG", "Consume cancel");
await queue.sendMessage({ plop: 2 });
// Need to wait before cancel to ensure message are received
while (consumed < 2) {
await this.sleep(500);
}
await consumer.cancel();
this.log("DEBUG", "Consume assert");
assert.notStrictEqual(msg, undefined);
// The second message throw an exception so it can come back
await queue.receiveMessage();
await queue.receiveMessage();
}
finally {
await queue.pubsub.subscription(queue.getParameters().subscription).delete();
}
}
async receiveError() {
this.log("DEBUG", "Receive Error test");
let queue = this.webda.getService("queue");
let service = new FakeSubscription();
sinon.stub(queue.pubsub, "subscription").callsFake(() => {
return service;
});
let consumer = queue.receiveMessage();
service.emitError();
await assert.rejects(() => consumer, /Fake error/);
}
};
__decorate([
test
], GCPQueueTest.prototype, "basic", null);
__decorate([
test
], GCPQueueTest.prototype, "consumers", null);
__decorate([
test
], GCPQueueTest.prototype, "receiveError", null);
GCPQueueTest = __decorate([
suite
], GCPQueueTest);
//# sourceMappingURL=queue.spec.js.map