spec/models/role_spec.rb
# frozen_string_literal: true

describe Role do
  let!(:person) { create(:person) }
  let!(:admin) { create(:person) }
  let!(:admin_role) { admin.roles.create(name: "admin") }
  let!(:moderator) { create(:person) }
  let!(:moderator_role) { moderator.roles.create(name: "moderator") }

  describe "validations" do
    it "validates the presence of the person" do
      role = Role.new(name: "admin")
      role.valid?
      expect(role.errors.full_messages).to include "Person must exist"
    end

    it { should validate_uniqueness_of(:name).scoped_to(:person_id) }
    it { should validate_inclusion_of(:name).in_array(%w(admin spotlight moderator)) }
  end

  describe "associations" do
    it { should belong_to(:person) }
  end

  describe "scopes" do
    describe ".admins" do
      it "includes admin roles" do
        expect(Role.admins).to match_array([admin_role])
      end
    end

    describe ".moderators" do
      it "should include admins" do
        expect(Role.moderators).to include(admin_role)
      end

      it "should include moderators" do
        expect(Role.moderators).to include(moderator_role)
      end
    end
  end

  describe ".is_admin?" do
    it "defaults to false" do
      expect(Role.is_admin?(person)).to be false
    end

    context "when the person is an admin" do
      it "is true" do
        expect(Role.is_admin?(admin)).to be true
      end
    end

    context "when the person is a moderator" do
      it "is false" do
        expect(Role.is_admin?(moderator)).to be false
      end
    end
  end

  describe ".moderator?" do
    it "defaults to false" do
      expect(Role.moderator?(person)).to be false
    end

    context "when the person is a moderator" do
      it "is true" do
        expect(Role.moderator?(moderator)).to be true
      end
    end

    context "when the person is an admin" do
      it "is true" do
        expect(Role.moderator?(admin)).to be true
      end
    end
  end

  describe ".add_admin" do
    it "creates the admin role" do
      Role.add_admin(person)
      expect(person.roles.where(name: "admin")).to exist
    end
  end

  describe ".add_moderator" do
    it "creates the moderator role" do
      Role.add_moderator(person)
      expect(person.roles.where(name: "moderator")).to exist
    end
  end

  describe ".add_spotlight" do
    it "creates the spotlight role" do
      Role.add_spotlight(person)
      expect(person.roles.where(name: "spotlight")).to exist
    end
  end
end
