@xmpp/stream-management
Version:
XMPP stream management for JavaScript
197 lines (143 loc) • 4.26 kB
JavaScript
;
const test = require("ava");
const { mockClient } = require("@xmpp/test");
function tick() {
return new Promise((resolve) => {
process.nextTick(resolve);
});
}
test("enable - enabled", async (t) => {
const { entity } = mockClient();
entity.mockInput(
<features xmlns="http://etherx.jabber.org/streams">
<sm xmlns="urn:xmpp:sm:3" />
</features>,
);
entity.streamManagement.outbound = 45;
t.deepEqual(
await entity.catchOutgoing(),
<enable xmlns="urn:xmpp:sm:3" resume="true" />,
);
await tick();
t.is(entity.streamManagement.outbound, 0);
t.is(entity.streamManagement.enabled, false);
t.is(entity.streamManagement.id, "");
entity.mockInput(
<enabled
xmlns="urn:xmpp:sm:3"
id="some-long-sm-id"
location="[2001:41D0:1:A49b::1]:9222"
resume="true"
/>,
);
await tick();
t.is(entity.streamManagement.id, "some-long-sm-id");
t.is(entity.streamManagement.enabled, true);
});
test("enable - send rejects", async (t) => {
const { entity } = mockClient();
entity.send = () => Promise.reject(new Error("nope"));
entity.mockInput(
<enabled
xmlns="urn:xmpp:sm:3"
id="some-long-sm-id"
location="[2001:41D0:1:A49b::1]:9222"
resume="true"
/>,
);
await tick();
t.is(entity.streamManagement.enabled, false);
});
test("enable - message - enabled", async (t) => {
const { entity } = mockClient();
entity.mockInput(
<features xmlns="http://etherx.jabber.org/streams">
<sm xmlns="urn:xmpp:sm:3" />
</features>,
);
entity.streamManagement.outbound = 45;
t.deepEqual(
await entity.catchOutgoing(),
<enable xmlns="urn:xmpp:sm:3" resume="true" />,
);
t.is(entity.streamManagement.outbound, 0);
t.is(entity.streamManagement.enabled, false);
t.is(entity.streamManagement.id, "");
await tick();
entity.mockInput(<message />);
t.is(entity.streamManagement.enabled, false);
t.is(entity.streamManagement.inbound, 1);
entity.mockInput(
<enabled
xmlns="urn:xmpp:sm:3"
id="some-long-sm-id"
location="[2001:41D0:1:A49b::1]:9222"
resume="true"
/>,
);
await tick();
t.is(entity.streamManagement.id, "some-long-sm-id");
t.is(entity.streamManagement.enabled, true);
});
test("enable - failed", async (t) => {
const { entity } = mockClient();
entity.mockInput(
<features xmlns="http://etherx.jabber.org/streams">
<sm xmlns="urn:xmpp:sm:3" />
</features>,
);
entity.streamManagement.outbound = 45;
t.deepEqual(
await entity.catchOutgoing(),
<enable xmlns="urn:xmpp:sm:3" resume="true" />,
);
t.is(entity.streamManagement.outbound, 0);
entity.streamManagement.enabled = true;
await tick();
entity.mockInput(<failed xmlns="urn:xmpp:sm:3" />);
await tick();
t.is(entity.streamManagement.enabled, false);
});
test("resume - resumed", async (t) => {
const { entity } = mockClient();
entity.status = "offline";
entity.streamManagement.id = "bar";
entity.mockInput(
<features xmlns="http://etherx.jabber.org/streams">
<sm xmlns="urn:xmpp:sm:3" />
</features>,
);
entity.streamManagement.outbound = 45;
t.deepEqual(
await entity.catchOutgoing(),
<resume xmlns="urn:xmpp:sm:3" previd="bar" h="0" />,
);
t.is(entity.streamManagement.enabled, false);
t.is(entity.status, "offline");
entity.mockInput(<resumed xmlns="urn:xmpp:sm:3" />);
await tick();
t.is(entity.streamManagement.outbound, 45);
t.is(entity.status, "online");
});
test("resume - failed", async (t) => {
const { entity } = mockClient();
entity.status = "bar";
entity.streamManagement.id = "bar";
entity.streamManagement.enabled = true;
entity.streamManagement.outbound = 45;
entity.mockInput(
<features xmlns="http://etherx.jabber.org/streams">
<sm xmlns="urn:xmpp:sm:3" />
</features>,
);
t.deepEqual(
await entity.catchOutgoing(),
<resume xmlns="urn:xmpp:sm:3" previd="bar" h="0" />,
);
entity.mockInput(<failed xmlns="urn:xmpp:sm:3" />);
await tick();
t.is(entity.status, "bar");
t.is(entity.streamManagement.id, "");
t.is(entity.streamManagement.enabled, false);
t.is(entity.streamManagement.outbound, 0);
});