Skip to content

Commit fc45ebd

Browse files
committed
added specs and validations for Role model
- added shoulda-matchers gem for one-line specs - added FactoryGirl syntax methods
1 parent 0856eb8 commit fc45ebd

5 files changed

Lines changed: 65 additions & 4 deletions

File tree

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ group :test do
254254
gem "factory_girl_rails", "4.5.0"
255255
gem "timecop", "0.7.3"
256256
gem "webmock", "1.20.4", require: false
257+
gem "shoulda-matchers", "2.8.0", require: false
257258
end
258259

259260
group :development, :test do

Gemfile.lock

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,8 @@ GEM
619619
rubyzip (~> 1.0)
620620
websocket (~> 1.0)
621621
shellany (0.0.1)
622+
shoulda-matchers (2.8.0)
623+
activesupport (>= 3.0.0)
622624
sidekiq (3.3.2)
623625
celluloid (>= 0.16.0)
624626
connection_pool (>= 2.1.1)
@@ -803,6 +805,7 @@ DEPENDENCIES
803805
ruby-oembed (= 0.8.12)
804806
sass-rails (= 5.0.1)
805807
selenium-webdriver (= 2.45.0)
808+
shoulda-matchers (= 2.8.0)
806809
sidekiq (= 3.3.2)
807810
sidetiq (= 0.6.3)
808811
simple_captcha2 (= 0.3.4)

app/models/role.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
#NOTE add the person object you want to attach role to...
2+
23
class Role < ActiveRecord::Base
34
belongs_to :person
45

6+
validates :person, presence: true
7+
validates :name, uniqueness: {scope: :person_id}
8+
validates :name, inclusion: {in: %w(admin spotlight)}
9+
510
scope :admins, -> { where(name: 'admin') }
611

712
def self.is_admin?(person)
8-
find_by_person_id_and_name(person.id, 'admin')
13+
self.exists?(person_id: person.id, name: 'admin')
914
end
1015

1116
def self.add_admin(person)

spec/models/role_spec.rb

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,54 @@
1-
require 'spec_helper'
1+
require "spec_helper"
22

3-
describe Role, :type => :model do
4-
skip "add some examples to (or delete) #{__FILE__}"
3+
describe Role do
4+
let(:person) { create(:person) }
5+
6+
describe "validations" do
7+
it { should validate_presence_of(:person) }
8+
it { should validate_uniqueness_of(:name).scoped_to(:person_id) }
9+
it { should validate_inclusion_of(:name).in_array(%w(admin spotlight)) }
10+
end
11+
12+
describe "associations" do
13+
it { should belong_to(:person) }
14+
end
15+
16+
describe "scopes" do
17+
let!(:admin_role) { person.roles.create(name: "admin") }
18+
let!(:spotlight_role) { person.roles.create(name: "spotlight") }
19+
20+
describe ".admins" do
21+
it "includes admin roles" do
22+
expect(Role.admins).to match_array([admin_role])
23+
end
24+
end
25+
end
26+
27+
describe ".is_admin?" do
28+
it "defaults to false" do
29+
expect(Role.is_admin?(person)).to be false
30+
end
31+
32+
context "when the person is an admin" do
33+
before { person.roles.create(name: "admin") }
34+
35+
it "is true" do
36+
expect(Role.is_admin?(person)).to be true
37+
end
38+
end
39+
end
40+
41+
describe ".add_admin" do
42+
it "creates the admin role" do
43+
Role.add_admin(person)
44+
expect(person.roles.where(name: "admin")).to exist
45+
end
46+
end
47+
48+
describe ".add_spotlight" do
49+
it "creates the spotlight role" do
50+
Role.add_spotlight(person)
51+
expect(person.roles.where(name: "spotlight")).to exist
52+
end
53+
end
554
end

spec/spec_helper.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
require 'webmock/rspec'
1111
require 'factory_girl'
1212
require 'sidekiq/testing'
13+
require 'shoulda/matchers'
1314

1415
include HelperMethods
1516

@@ -100,4 +101,6 @@ def photo_fixture_name
100101
config.after(:each) do
101102
ActionMailer::Base.deliveries.clear
102103
end
104+
105+
config.include FactoryGirl::Syntax::Methods
103106
end

0 commit comments

Comments
 (0)