# frozen_string_literal: true

require "unread"

RSpec.describe Unread do
  let(:whisperers_group) { Fabricate(:group) }
  let(:user) { Fabricate(:user, groups: [whisperers_group]) }
  let(:topic) do
    Fabricate(:topic, posts_count: 13, highest_staff_post_number: 15, highest_post_number: 13)
  end

  let(:topic_user) do
    Fabricate(
      :topic_user,
      notification_level: TopicUser.notification_levels[:tracking],
      topic_id: topic.id,
      user_id: user.id,
    )
  end

  def unread
    Unread.new(topic, topic_user, Guardian.new(user))
  end

  describe "staff counts" do
    it "should correctly return based on staff post number" do
      SiteSetting.whispers_allowed_groups = "#{Group::AUTO_GROUPS[:staff]}"
      user.grant_admin!

      topic_user.last_read_post_number = 13

      expect(unread.unread_posts).to eq(2)
    end
  end

  describe "unread_posts" do
    it "should have 0 unread posts if the user has read all posts" do
      topic_user.last_read_post_number = 13
      expect(unread.unread_posts).to eq(0)
    end

    it "returns the right unread posts for a user" do
      topic_user.last_read_post_number = 10
      expect(unread.unread_posts).to eq(3)
    end

    it "returns the right unread posts for a staff user" do
      SiteSetting.whispers_allowed_groups = "#{Group::AUTO_GROUPS[:staff]}"
      user.grant_admin!
      topic_user.last_read_post_number = 10
      expect(unread.unread_posts).to eq(5)
    end

    it "returns the right unread posts for a whisperer user" do
      SiteSetting.whispers_allowed_groups = "#{whisperers_group.id}"
      topic_user.last_read_post_number = 10
      expect(unread.unread_posts).to eq(5)
    end

    it "should have 0 unread posts if the user has read more posts than exist (deleted)" do
      topic_user.last_read_post_number = 14
      expect(unread.unread_posts).to eq(0)
    end

    it "has 0 unread posts if the user has read 10 posts but is not tracking" do
      topic_user.last_read_post_number = 10
      topic_user.notification_level = TopicUser.notification_levels[:regular]
      expect(unread.unread_posts).to eq(0)
    end

    it "has 0 unread posts if the user has not seen the topic" do
      topic_user.last_read_post_number = nil
      expect(unread.unread_posts).to eq(0)
    end
  end
end