robotty/dank-twitch-irc

View on GitHub
lib/operations/timeout.spec.ts

Summary

Maintainability
B
5 hrs
Test Coverage
import { assert } from "chai";
import * as sinon from "sinon";
import { ClientError, ConnectionError, MessageError } from "../client/errors";
import { assertErrorChain, fakeConnection } from "../helpers.spec";
import { ValidationError } from "../validation/validation-error";
import { timeout, UserTimeoutError } from "./timeout";

describe("./operations/timeout", function () {
  describe("UserTimeoutError", function () {
    it("should not be instanceof ConnectionError", function () {
      assert.notInstanceOf(
        new UserTimeoutError("pajlada", "weeb123", 120, "read the rules >("),
        ConnectionError
      );
    });
    it("should not be instanceof ClientError", function () {
      assert.notInstanceOf(
        new UserTimeoutError("pajlada", "weeb123", 120, "read the rules >("),
        ClientError
      );
    });
  });

  describe("#timeout()", function () {
    it("should send the correct wire command if no reason is given", async function () {
      sinon.useFakeTimers();
      const { client, data } = fakeConnection();

      timeout(client, "pajlada", "weeb123", 120);

      assert.deepStrictEqual(data, [
        "PRIVMSG #pajlada :/timeout weeb123 120\r\n",
      ]);
    });

    it("should send the correct wire command if a reason is given", async function () {
      sinon.useFakeTimers();
      const { client, clientError, end, data } = fakeConnection();

      timeout(client, "pajlada", "weeb123", 120, "read the rules >(");

      assert.deepStrictEqual(data, [
        "PRIVMSG #pajlada :/timeout weeb123 120 read the rules >(\r\n",
      ]);
      end();
      await clientError;
    });

    it("should validate the given channel name", async function () {
      const { client, clientError, end, data } = fakeConnection();

      const promise = timeout(client, "PAJLADA", "weeb123", 120);
      await assertErrorChain(
        promise,
        ValidationError,
        'Channel name "PAJLADA" is invalid/malformed'
      );
      end();
      await clientError;
      assert.isEmpty(data);
    });

    it("should validate the given username", async function () {
      const { client, clientError, end, data } = fakeConnection();

      const promise = timeout(client, "pajlada", "WEEB123", 120);
      await assertErrorChain(
        promise,
        ValidationError,
        'Channel name "WEEB123" is invalid/malformed'
      );
      end();
      await clientError;
      assert.isEmpty(data);
    });

    it("should not send newlines in the reason", async function () {
      const { client, clientError, end, data } = fakeConnection();

      const promise = timeout(
        client,
        "pajlada",
        "weeb123",
        120,
        "Please\r\nread the rules!"
      );

      await assertErrorChain(
        promise,
        ValidationError,
        "IRC command may not include \\n or \\r"
      );
      end();
      await clientError;
      assert.isEmpty(data);
    });

    it("should resolve on incoming timeout_success", async function () {
      const { client, emitAndEnd, clientError } = fakeConnection();

      const promise = timeout(
        client,
        "pajlada",
        "weeb123",
        420,
        "Please read the rules!"
      );

      emitAndEnd(
        "@msg-id=timeout_success :tmi.twitch.tv NOTICE #pajlada :WEEB123 has been timed out for 1 second."
      );

      await promise;
      await clientError;
    });

    it("should reject on incoming no_permission", async function () {
      const { client, emitAndEnd, clientError } = fakeConnection();

      const promise = timeout(
        client,
        "forsen",
        "weeb123",
        420,
        "Please read the rules!"
      );

      const response =
        "@msg-id=no_permission :tmi.twitch.tv NOTICE #forsen " +
        ":You don't have permission to perform that action.";
      emitAndEnd(response);

      await assertErrorChain(
        [promise, clientError],
        UserTimeoutError,
        "Failed to timeout weeb123 for 7m in #forsen: Bad response message: " +
          response,
        MessageError,
        "Bad response message: " + response
      );
    });
  });
});