# frozen_string_literal: true

RSpec.describe BasicGroupSerializer do
  subject(:serializer) { described_class.new(group, scope: guardian, root: false) }

  let(:guardian) { Guardian.new }
  fab!(:group)

  describe "#display_name" do
    describe "automatic group" do
      let(:group) { Group.find(1) }

      it "should include the display name" do
        expect(serializer.display_name).to eq(I18n.t("groups.default_names.admins"))
      end
    end

    describe "normal group" do
      fab!(:group)

      it "should not include the display name" do
        expect(serializer.display_name).to eq(nil)
      end
    end
  end

  describe "#bio_raw" do
    subject(:serializer) do
      described_class.new(group, scope: guardian, root: false, owner_group_ids: [group.id])
    end

    fab!(:group) { Fabricate(:group, bio_raw: "testing :slightly_smiling_face:") }

    describe "group owner" do
      it "should include bio_raw" do
        expect(serializer.as_json[:bio_raw]).to eq("testing :slightly_smiling_face:")
        expect(serializer.as_json[:bio_excerpt]).to start_with("testing <img")
      end
    end
  end

  describe "#has_messages" do
    fab!(:group) { Fabricate(:group, has_messages: true) }

    describe "for a staff user" do
      let!(:guardian) { Guardian.new(Fabricate(:moderator)) }

      it "should be present" do
        expect(serializer.as_json[:has_messages]).to eq(true)
      end
    end

    describe "for a group user" do
      fab!(:user) { Fabricate(:user, refresh_auto_groups: true) }
      let(:guardian) { Guardian.new(user) }

      before { group.add(user) }

      it "should be present" do
        expect(serializer.as_json[:has_messages]).to eq(true)
      end
    end

    describe "for a normal user" do
      let(:guardian) { Guardian.new(Fabricate(:user)) }

      it "should not be present" do
        expect(serializer.as_json[:has_messages]).to eq(nil)
      end
    end
  end

  describe "#can_see_members" do
    fab!(:group) { Fabricate(:group, members_visibility_level: Group.visibility_levels[:members]) }

    describe "for a group user" do
      fab!(:user)
      let(:guardian) { Guardian.new(user) }

      before { group.add(user) }

      it "should be true" do
        expect(serializer.as_json[:can_see_members]).to eq(true)
      end
    end

    describe "for a normal user" do
      let(:guardian) { Guardian.new(Fabricate(:user)) }

      it "should be false" do
        expect(serializer.as_json[:can_see_members]).to eq(false)
      end
    end
  end
end