Some checks failed
build / lint (22) (push) Failing after 17s
build / test (22) (push) Failing after 8s
build / lint (23) (push) Failing after 2s
build / build (22) (push) Has been skipped
build / build (23) (push) Has been skipped
build / test (23) (push) Failing after 4s
docsearch / docsearch (push) Failing after 1s
170 lines
3.9 KiB
TypeScript
170 lines
3.9 KiB
TypeScript
import test from "ava";
|
|
import { newHocuspocus, newHocuspocusProvider, sleep } from "../utils/index.ts";
|
|
|
|
test("onAwarenessChange callback is executed", async (t) => {
|
|
await new Promise(async (resolve) => {
|
|
let resolved = false;
|
|
const server = await newHocuspocus(t);
|
|
|
|
const provider = newHocuspocusProvider(t, server, {
|
|
onConnect() {
|
|
provider.setAwarenessField("foo", "bar");
|
|
},
|
|
onAwarenessChange: ({ states }) => {
|
|
if (resolved) return;
|
|
resolved = true;
|
|
|
|
t.is(states.length, 1);
|
|
t.is(states[0].foo, "bar");
|
|
|
|
resolve("done");
|
|
},
|
|
});
|
|
});
|
|
});
|
|
|
|
test("onAwarenessChange callback is executed, even when no awareness fields are set", async (t) => {
|
|
await new Promise(async (resolve) => {
|
|
let resolved = false;
|
|
const server = await newHocuspocus(t);
|
|
|
|
const provider = newHocuspocusProvider(t, server, {
|
|
onAwarenessChange: ({ states }) => {
|
|
if (resolved) return;
|
|
resolved = true;
|
|
|
|
t.is(states.length, 2);
|
|
|
|
resolve("done");
|
|
},
|
|
});
|
|
|
|
const anotherProvider = newHocuspocusProvider(t, server, {
|
|
async onConnect() {
|
|
anotherProvider.setAwarenessField("foo", "bar");
|
|
provider.configuration.websocketProvider.connect();
|
|
},
|
|
});
|
|
});
|
|
|
|
t.pass();
|
|
});
|
|
|
|
test("onAwarenessChange callback is executed on provider destroy", async (t) => {
|
|
await new Promise(async (resolve) => {
|
|
let resolved = false;
|
|
const server = await newHocuspocus(t);
|
|
|
|
const provider = newHocuspocusProvider(t,
|
|
server,
|
|
{
|
|
onConnect() {
|
|
provider.destroy();
|
|
},
|
|
onAwarenessChange: ({ states }) => {
|
|
if (resolved) return;
|
|
resolved = true;
|
|
|
|
t.is(states.length, 0);
|
|
resolve("done");
|
|
},
|
|
},
|
|
{
|
|
maxAttempts: 1,
|
|
},
|
|
);
|
|
});
|
|
});
|
|
|
|
test("gets the current awareness states from the server", async (t) => {
|
|
await new Promise(async (resolve) => {
|
|
let resolved = false;
|
|
const server = await newHocuspocus(t);
|
|
|
|
const provider = newHocuspocusProvider(t, server);
|
|
const provider2 = newHocuspocusProvider(t, server, {
|
|
onAwarenessChange: ({ states }) => {
|
|
if (resolved) return;
|
|
const state = states.find((state) => state.foo === "bar");
|
|
|
|
if (state && state.foo === "bar") {
|
|
resolved = true;
|
|
t.pass();
|
|
resolve("done");
|
|
}
|
|
},
|
|
});
|
|
|
|
provider.setAwarenessField("foo", "bar");
|
|
});
|
|
});
|
|
|
|
test("shares awareness state with other users", async (t) => {
|
|
await new Promise(async (resolve) => {
|
|
let resolved = false;
|
|
const server = await newHocuspocus(t);
|
|
|
|
const provider = newHocuspocusProvider(t, server, {
|
|
onConnect() {
|
|
provider.setAwarenessField("name", "player1");
|
|
},
|
|
onAwarenessChange: ({ states }) => {
|
|
if (resolved) return;
|
|
const player2 = !!states.filter((state) => state.name === "player2")
|
|
.length;
|
|
|
|
if (player2) {
|
|
resolved = true;
|
|
t.is(player2, true);
|
|
resolve("done");
|
|
}
|
|
},
|
|
});
|
|
|
|
const anotherProvider = newHocuspocusProvider(t, server, {
|
|
onConnect() {
|
|
anotherProvider.setAwarenessField("name", "player2");
|
|
},
|
|
onAwarenessChange: ({ states }) => {
|
|
if (resolved) return;
|
|
const player1 = !!states.filter((state) => state.name === "player1")
|
|
.length;
|
|
|
|
if (player1) {
|
|
t.is(player1, true);
|
|
}
|
|
},
|
|
});
|
|
});
|
|
});
|
|
|
|
test("does not share awareness state with users in other documents", async (t) => {
|
|
await new Promise(async (resolve) => {
|
|
const server = await newHocuspocus(t);
|
|
|
|
newHocuspocusProvider(t, server, {
|
|
async onConnect() {
|
|
await sleep(100);
|
|
|
|
t.pass();
|
|
resolve("done");
|
|
},
|
|
onAwarenessChange: ({ states }) => {
|
|
const player2 = !!states.filter((state) => state.name === "player2")
|
|
.length;
|
|
|
|
if (player2) {
|
|
t.fail("Awareness state leaked!");
|
|
}
|
|
},
|
|
});
|
|
|
|
const anotherProvider = newHocuspocusProvider(t, server, {
|
|
name: "completely-different-and-unrelated-document",
|
|
onConnect() {
|
|
anotherProvider.setAwarenessField("name", "player2");
|
|
},
|
|
});
|
|
});
|
|
});
|