diff --git a/test/lib/data/messages_core.js b/test/lib/data/messages_core.js index 3ff28509..2e06c673 100644 --- a/test/lib/data/messages_core.js +++ b/test/lib/data/messages_core.js @@ -16,6 +16,33 @@ describe("lib/data/messages_core", function() { const instanceBr = new Address(Address.broadcast, Address.instance); const controlBr = new Address(Address.broadcast, Address.control); + describe(".withoutRequestId()", () => { + it("returns the same instance when requestId is undefined", () => { + const address = new Address(1, 2); + + assert.strictEqual(address.withoutRequestId(), address); + }); + + it("returns a new instance when requestId is present", () => { + const address = new Address(1, 2, 123); + + const result = address.withoutRequestId(); + + assert.notStrictEqual(result, address); + assert.deepEqual(result, new Address(1, 2)); + }); + + it("does not modify the original address", () => { + const address = new Address(1, 2, 123); + + address.withoutRequestId(); + + assert.equal(address.type, 1); + assert.equal(address.id, 2); + assert.equal(address.requestId, 123); + }); + }); + it("Should correctly resolve addressedTo", function() { assert(controller.addressedTo(controller)); assert(!controller.addressedTo(host1)); diff --git a/test/lib/subscriptions.test.js b/test/lib/subscriptions.test.js index eb4659ed..bd556487 100644 --- a/test/lib/subscriptions.test.js +++ b/test/lib/subscriptions.test.js @@ -520,72 +520,6 @@ describe("lib/subscriptions", function() { }); }); - describe("subscriber addressing", function() { - // A subscribe arrives as a request, so the source address it is - // handled with carries the request id used to route the response - // back to the caller. That id identifies one request in flight and - // means nothing on an event, see #847. These use a controller of - // their own because a subscription is only ever addressed when it - // is first created, and the shared one is already subscribed. - const connectorData = connectorSetupDate[0]; - - function requestSource(requestId) { - return new lib.Address(connectorData.dst.type, connectorData.dst.id, requestId); - } - - function lastSentMessage() { - return getLink(connectorData.id).connector.sentMessages.at(-1); - } - - it("should strip the request id from broadcast events", async function() { - const ownSubscriptions = new lib.SubscriptionController(mockController); - ownSubscriptions.handle(RegisteredEvent); - await ownSubscriptions.handleRequest( - getLink(connectorData.id), - new lib.SubscriptionRequest(RegisteredEvent.name, "subscribe"), - requestSource(213), connectorData.src - ); - - ownSubscriptions.broadcast(new RegisteredEvent()); - await onceConnectorSend(connectorData.id); - - assert.equal(lastSentMessage().name, RegisteredEvent.name); - assert.equal(lastSentMessage().dst.requestId, undefined, "event addressed to a request id"); - assert.deepEqual(lastSentMessage().dst.toJSON(), connectorData.dst.toJSON()); - }); - - it("should strip the request id from the replayed event", async function() { - const ownSubscriptions = new lib.SubscriptionController(mockController); - ownSubscriptions.handle(RegisteredEvent, async () => new RegisteredEvent()); - await ownSubscriptions.handleRequest( - getLink(connectorData.id), - new lib.SubscriptionRequest(RegisteredEvent.name, "subscribe"), - requestSource(417), connectorData.src - ); - - assert.equal(lastSentMessage().name, RegisteredEvent.name); - assert.equal(lastSentMessage().dst.requestId, undefined, "replay addressed to a request id"); - assert.deepEqual(lastSentMessage().dst.toJSON(), connectorData.dst.toJSON()); - }); - - it("should strip the request id when replacing filters creates the subscription", async function() { - const ownSubscriptions = new lib.SubscriptionController(mockController); - ownSubscriptions.handle(RegisteredEvent); - await ownSubscriptions.handleRequest( - getLink(connectorData.id), - new lib.SubscriptionRequest(RegisteredEvent.name, "replace", 0, "foo"), - requestSource(918), connectorData.src - ); - - ownSubscriptions.broadcast(new RegisteredEvent(), "foo"); - await onceConnectorSend(connectorData.id); - - assert.equal(lastSentMessage().name, RegisteredEvent.name); - assert.equal(lastSentMessage().dst.requestId, undefined, "event addressed to a request id"); - assert.deepEqual(lastSentMessage().dst.toJSON(), connectorData.dst.toJSON()); - }); - }); - describe(".unsubscribeLink() / .unsubscribeAddress()", function() { beforeEach(function() { subscriptions.handle(RegisteredEvent); @@ -680,6 +614,71 @@ describe("lib/subscriptions", function() { ), /unreachable case: invalid action/); }); + describe("addressing", function() { + // A subscribe arrives as a request, so the source address it is + // handled with carries the request id which should not be persisted + const connectorData = connectorSetupDate[0]; + + function requestSource(requestId) { + return new lib.Address(connectorData.dst.type, connectorData.dst.id, requestId); + } + + function lastSentMessage() { + return getLink(connectorData.id).connector.sentMessages.at(-1); + } + + it("should strip the request id from broadcast events", async function() { + const ownSubscriptions = new lib.SubscriptionController(mockController); + ownSubscriptions.handle(RegisteredEvent); + await ownSubscriptions.handleRequest( + getLink(connectorData.id), + new lib.SubscriptionRequest(RegisteredEvent.name, "subscribe"), + requestSource(213), connectorData.src + ); + + ownSubscriptions.broadcast(new RegisteredEvent()); + await onceConnectorSend(connectorData.id); + + const message = lastSentMessage(); + assert.equal(message.name, RegisteredEvent.name); + assert.equal(message.dst.requestId, undefined, "event addressed to a request id"); + assert.deepEqual(message.dst.toJSON(), connectorData.dst.toJSON()); + }); + + it("should strip the request id from the replayed event", async function() { + const ownSubscriptions = new lib.SubscriptionController(mockController); + ownSubscriptions.handle(RegisteredEvent, async () => new RegisteredEvent()); + await ownSubscriptions.handleRequest( + getLink(connectorData.id), + new lib.SubscriptionRequest(RegisteredEvent.name, "subscribe"), + requestSource(417), connectorData.src + ); + + const message = lastSentMessage(); + assert.equal(message.name, RegisteredEvent.name); + assert.equal(message.dst.requestId, undefined, "replay addressed to a request id"); + assert.deepEqual(message.dst.toJSON(), connectorData.dst.toJSON()); + }); + + it("should strip the request id when replacing filters creates the subscription", async function() { + const ownSubscriptions = new lib.SubscriptionController(mockController); + ownSubscriptions.handle(RegisteredEvent); + await ownSubscriptions.handleRequest( + getLink(connectorData.id), + new lib.SubscriptionRequest(RegisteredEvent.name, "replace", 0, "foo"), + requestSource(918), connectorData.src + ); + + ownSubscriptions.broadcast(new RegisteredEvent(), "foo"); + await onceConnectorSend(connectorData.id); + + const message = lastSentMessage(); + assert.equal(message.name, RegisteredEvent.name); + assert.equal(message.dst.requestId, undefined, "event addressed to a request id"); + assert.deepEqual(message.dst.toJSON(), connectorData.dst.toJSON()); + }); + }); + describe("subscribe", function() { it("should create a new subscription", async function() { const request = new lib.SubscriptionRequest(RegisteredEvent.name, "subscribe");