require "rails_helper"

describe Flag do
  let(:user) { create(:user) }
  let(:comment) { create(:comment) }

  describe ".flag" do
    it "creates a flag when there is none" do
      expect { Flag.flag(user, comment) }.to change { Flag.count }.by(1)
      expect(Flag.last.user).to eq(user)
      expect(Flag.last.flaggable).to eq(comment)
    end

    it "does nothing if the flag already exists" do
      Flag.flag(user, comment)
      expect(Flag.flag(user, comment)).to be false
      expect(Flag.by_user_and_flaggable(user, comment).count).to eq(1)
    end

    it "increases the flag count" do
      expect { Flag.flag(user, comment) }.to change { comment.reload.flags_count }.by(1)
    end
  end

  describe ".unflag" do
    it "raises an error if the flag does not exist" do
      expect(Flag.unflag(user, comment)).to be false
    end

    describe "when the flag already exists" do
      before { Flag.flag(user, comment) }

      it "removes an existing flag" do
        expect { Flag.unflag(user, comment) }.to change { Flag.count }.by(-1)
      end

      it "decreases the flag count" do
        expect { Flag.unflag(user, comment) }.to change { comment.reload.flags_count }.by(-1)
      end
    end
  end

  describe ".flagged?" do
    it "returns false when the user has not flagged the comment" do
      expect(Flag.flagged?(user, comment)).not_to be
    end

    it "returns true when the user has flagged the comment" do
      Flag.flag(user, comment)
      expect(Flag.flagged?(user, comment)).to be
    end
  end
end
