1.8 KiB · text History 4b6fe3b
defmodule OhMyExOhIrcd.ChannelsTest do
  use OhMyExOhIrcd.DataCase, async: true

  import OhMyExOhIrcd.AccountsFixtures

  alias OhMyExOhIrcd.Channels
  alias OhMyExOhIrcd.Channels.ChannelRecord

  describe "register/2" do
    test "creates a channel registration tied to a founder" do
      user = user_fixture()
      assert {:ok, %ChannelRecord{} = rec} = Channels.register("#hello", user)
      assert rec.name == "#hello"
      assert rec.founder_user_id == user.id
    end

    test "downcases the channel name" do
      user = user_fixture()
      {:ok, rec} = Channels.register("#HELLO", user)
      assert rec.name == "#hello"
      assert Channels.get("#Hello").id == rec.id
    end

    test "is idempotent for the same founder" do
      user = user_fixture()
      {:ok, a} = Channels.register("#again", user)
      {:ok, b} = Channels.register("#again", user)
      assert a.id == b.id
    end

    test "returns :taken when a different user already owns the name" do
      u1 = user_fixture()
      u2 = user_fixture()
      {:ok, _} = Channels.register("#mine", u1)
      assert {:error, :taken} = Channels.register("#mine", u2)
    end

    test "rejects names that don't start with # or &" do
      user = user_fixture()
      assert {:error, %Ecto.Changeset{}} = Channels.register("nohash", user)
    end
  end

  describe "unregister/2" do
    test "founder can drop their registration" do
      user = user_fixture()
      {:ok, _} = Channels.register("#drop", user)
      assert {:ok, _} = Channels.unregister("#drop", user)
      assert Channels.get("#drop") == nil
    end

    test "non-founder cannot drop someone else's channel" do
      u1 = user_fixture()
      u2 = user_fixture()
      {:ok, _} = Channels.register("#u1ch", u1)
      assert {:error, :not_founder} = Channels.unregister("#u1ch", u2)
    end
  end
end