# frozen_string_literal: true

RSpec.describe ChatChannel do
  fab!(:category_channel1) { Fabricate(:category_channel) }
  fab!(:dm_channel1) { Fabricate(:direct_message_channel) }

  describe "#relative_url" do
    context "when the slug is nil" do
      it "uses a - instead" do
        category_channel1.slug = nil
        expect(category_channel1.relative_url).to eq("/chat/c/-/#{category_channel1.id}")
      end
    end

    context "when the slug is not nil" do
      before { category_channel1.update!(slug: "some-cool-channel") }

      it "includes the slug for the channel" do
        expect(category_channel1.relative_url).to eq(
          "/chat/c/some-cool-channel/#{category_channel1.id}",
        )
      end
    end
  end

  describe ".ensure_consistency!" do
    fab!(:category_channel2) { Fabricate(:category_channel) }
    fab!(:category_channel3) { Fabricate(:category_channel) }
    fab!(:category_channel4) { Fabricate(:category_channel) }
    fab!(:dm_channel2) { Fabricate(:direct_message_channel) }

    before do
      Fabricate(:chat_message, chat_channel: category_channel1)
      Fabricate(:chat_message, chat_channel: category_channel1)
      Fabricate(:chat_message, chat_channel: category_channel1)

      Fabricate(:chat_message, chat_channel: category_channel2)
      Fabricate(:chat_message, chat_channel: category_channel2)
      Fabricate(:chat_message, chat_channel: category_channel2)
      Fabricate(:chat_message, chat_channel: category_channel2)

      Fabricate(:chat_message, chat_channel: category_channel3)

      Fabricate(:chat_message, chat_channel: dm_channel2)
      Fabricate(:chat_message, chat_channel: dm_channel2)
    end

    describe "updating messages_count for all channels" do
      it "counts correctly" do
        described_class.ensure_consistency!
        expect(category_channel1.reload.messages_count).to eq(3)
        expect(category_channel2.reload.messages_count).to eq(4)
        expect(category_channel3.reload.messages_count).to eq(1)
        expect(category_channel4.reload.messages_count).to eq(0)
        expect(dm_channel1.reload.messages_count).to eq(0)
        expect(dm_channel2.reload.messages_count).to eq(2)
      end

      it "does not count deleted messages" do
        category_channel3.chat_messages.last.trash!
        described_class.ensure_consistency!
        expect(category_channel3.reload.messages_count).to eq(0)
      end

      it "does not update deleted channels" do
        described_class.ensure_consistency!
        category_channel3.chat_messages.last.trash!
        category_channel3.trash!
        described_class.ensure_consistency!
        expect(category_channel3.reload.messages_count).to eq(1)
      end
    end
  end

  describe "#allow_channel_wide_mentions" do
    it "defaults to true" do
      expect(category_channel1.allow_channel_wide_mentions).to be(true)
    end

    it "cant be nullified" do
      expect { category_channel1.update!(allow_channel_wide_mentions: nil) }.to raise_error(
        ActiveRecord::NotNullViolation,
      )
    end
  end
end
