neet/masto.js

View on GitHub
src/adapters/ws/async-iterable.spec.ts

Summary

Maintainability
A
0 mins
Test Coverage
import getPort from "get-port";
import { WebSocket, WebSocketServer } from "isomorphic-ws";

import { toAsyncIterable } from "./async-iterable";
import { waitForOpen } from "./wait-for-events";

describe("toAsyncIterable", () => {
  it("returns an async iterable", async () => {
    const port = await getPort();
    const server = new WebSocketServer({ port });
    const ws = new WebSocket(`ws://localhost:${port}`);
    await waitForOpen(ws);

    const iterable = toAsyncIterable(ws);

    expect(iterable).toBeInstanceOf(Object);
    expect(iterable[Symbol.asyncIterator]).toBeInstanceOf(Function);

    server.close();
    ws.close();
  });

  it("yields events", async () => {
    const port = await getPort();
    const server = new WebSocketServer({ port });
    const ws = new WebSocket(`ws://localhost:${port}`);

    server.on("connection", (socket) => {
      socket.send("test");
    });

    const iterable = toAsyncIterable(ws);
    const promise = iterable.next();
    const { value } = await promise;

    expect(value).toBeDefined();
    expect(value.data).toBe("test");

    server.close();
    ws.close();
  });

  it("returns when the socket closes", async () => {
    const port = await getPort();
    const server = new WebSocketServer({ port });

    server.on("connection", (socket) => {
      socket.close();
    });

    const ws = new WebSocket(`ws://localhost:${port}`);
    const iterable = toAsyncIterable(ws);

    const result = await iterable.next();
    expect(result.done).toBe(true);

    ws.close();
    server.close();
  });

  it("throws an error when the socket errors", async () => {
    const ws = new WebSocket(`ws://localhost:0`);

    const iterable = toAsyncIterable(ws);
    const result = await iterable.next();
    expect(result.done).toBe(true);

    ws.close();
  });
});