Skip to content
This repository has been archived by the owner on Jul 24, 2020. It is now read-only.

[1609] Refactor category model spec #1614

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
270 changes: 60 additions & 210 deletions spec/models/category_spec.rb
Original file line number Diff line number Diff line change
@@ -1,240 +1,90 @@
require 'spec_helper'

describe Category, type: :model do
before(:each) do
@category = FactoryGirl.build(:category)
describe 'basic validations' do
subject(:category) { FactoryGirl.build(:category) }
it { is_expected.to validate_presence_of(:name) }
it { is_expected.to validate_uniqueness_of(:name) }
it { is_expected.to have_many(:equipment_models) }
end

it { is_expected.to validate_presence_of(:name) }
it { is_expected.to validate_uniqueness_of(:name) }

it { is_expected.to have_many(:equipment_models) }

# validate numericality for :max_renewal_length, :max_renewal_times,
# :renewal_days_before_due, :max_per_user, :sort_order, :max_checkout_length
# this includes integer_only, and greater_than_or_equal_to => 0

# :max_renewal_length
it 'validates max_renewal_length must be non-negative' do
@category.max_renewal_length = -1
expect(@category.save).to be_falsey
@category.max_renewal_length = 0
expect(@category.save).to be_truthy
end
it 'validates max_renewal_length can be nil' do
@category.max_renewal_length = nil
expect(@category.save).to be_truthy
end
it 'validates max_renewal_length must be an integer' do
@category.max_renewal_length = 'not_an_integer'
expect(@category.save).to be_falsey
@category.max_renewal_length = 1
expect(@category.save).to be_truthy
end

# :max_renewal_times
it 'validates max_renewal_times must be non-negative' do
@category.max_renewal_times = -1
expect(@category.save).to be_falsey
@category.max_renewal_times = 0
expect(@category.save).to be_truthy
end
it 'validates max_renewal_times can be nil' do
@category.max_renewal_times = nil
expect(@category.save).to be_truthy
end
it 'validates max_renewal_times must be an integer' do
@category.max_renewal_times = 'not_an_integer'
expect(@category.save).to be_falsey
@category.max_renewal_times = 1
expect(@category.save).to be_truthy
end

# :renewal_days_before_due
it 'validates renewal_days_before_due must be non-negative' do
@category.renewal_days_before_due = -1
expect(@category.save).to be_falsey
@category.renewal_days_before_due = 0
expect(@category.save).to be_truthy
end
it 'validates renewal_days_before_due can be nil' do
@category.renewal_days_before_due = nil
expect(@category.save).to be_truthy
end
it 'validates renewal_days_before_due must be an integer' do
@category.renewal_days_before_due = 'not_an_integer'
expect(@category.save).to be_falsey
@category.renewal_days_before_due = 1
expect(@category.save).to be_truthy
end

# :sort_order
it 'validates sort_order must be non-negative' do
@category.sort_order = -1
expect(@category.save).to be_falsey
@category.sort_order = 0
expect(@category.save).to be_truthy
end
it 'validates sort_order can be nil' do
@category.sort_order = nil
expect(@category.save).to be_truthy
end
it 'validates sort_order must be an integer' do
@category.sort_order = 'not_an_integer'
expect(@category.save).to be_falsey
@category.sort_order = 1
expect(@category.save).to be_truthy
end

# :max_per_user
it 'validates max_per_user must be non-negative' do
@category.max_per_user = -1
expect(@category.save).to be_falsey
@category.max_per_user = 0
expect(@category.save).to be_truthy
end
it 'validates max_per_user can be nil' do
@category.max_per_user = nil
expect(@category.save).to be_truthy
end
it 'validates max_per_user must be an integer' do
@category.max_per_user = 'not_an_integer'
expect(@category.save).to be_falsey
@category.max_per_user = 1
expect(@category.save).to be_truthy
end

# :max_checkout_length
it 'validates max_checkout_length must be non-negative' do
@category.max_checkout_length = -1
expect(@category.save).to be_falsey
@category.max_checkout_length = 0
expect(@category.save).to be_truthy
end
it 'validates max_checkout_length can be nil' do
@category.max_checkout_length = nil
expect(@category.save).to be_truthy
end
it 'validates max_checkout_length must be an integer' do
@category.max_checkout_length = 'not_an_integer'
expect(@category.save).to be_falsey
@category.max_checkout_length = 1
expect(@category.save).to be_truthy
end

# custom scope to return active categories
describe '.active' do
before(:each) do
@deactivated = FactoryGirl.create(:category,
deleted_at: '2013-01-01 00:00:00')
@category.save
end

it 'Should return all active categories' do
expect(Category.active).to include(@category)
end

it 'Should not return inactive categories' do
expect(Category.active).not_to include(@deactivated)
end
end

describe '#maximum_per_user' do
before(:each) do
@category.max_per_user = 1
@category.save
@unrestrected_category = FactoryGirl.create(:category,
max_per_user: nil)
end
it 'Should return maximum_per_user if defined' do
expect(@category.maximum_per_user).to eq(1)
end
it 'Should return Float::INFINITY if not defined' do
expect(@unrestrected_category.maximum_per_user).to eq(Float::INFINITY)
shared_examples 'integer attribute' do |attr|
it "is valid when #{attr} is an integer >= 0" do
category = FactoryGirl.build_stubbed(:category, attr => 0)
expect(category.valid?).to be_truthy
end
end

describe '#maximum_renewal_length' do
before(:each) do
@category.max_renewal_length = 5
@category.save
@unrestrected_category = FactoryGirl.create(:category,
max_renewal_length: nil)
it "is valid when #{attr} is nil" do
category = FactoryGirl.build_stubbed(:category, attr => nil)
expect(category.valid?).to be_truthy
end
it 'Should return maximum_renewal_length if defined' do
expect(@category.maximum_renewal_length).to eq(5)
it "is invalid when #{attr} is not an integer" do
category = FactoryGirl.build_stubbed(:category, attr => 'not an int')
expect(category.valid?).to be_falsey
end
it 'Default to 0 if not defined' do
expect(@unrestrected_category.maximum_renewal_length).to eq(0)
it "is invalid when #{attr} is < 0 " do
category = FactoryGirl.build_stubbed(:category, attr => -1)
expect(category.valid?).to be_falsey
end
end
it_behaves_like 'integer attribute', :max_renewal_length
it_behaves_like 'integer attribute', :max_renewal_times
it_behaves_like 'integer attribute', :renewal_days_before_due
it_behaves_like 'integer attribute', :sort_order
it_behaves_like 'integer attribute', :max_per_user
it_behaves_like 'integer attribute', :max_checkout_length

describe '#maximum_renewal_times' do
before(:each) do
@category.max_renewal_times = 1
@category.save
@unrestrected_category = FactoryGirl.create(:category,
max_renewal_times: nil)
end
it 'Should return maximum_renewal_times if defined' do
expect(@category.maximum_renewal_times).to eq(1)
shared_examples 'attribute methods' do |attr, method, default|
it "#{method} returns #{attr} when defined" do
category = FactoryGirl.build_stubbed(:category, attr => 1)
expect(category.send(method)).to eq(1)
end
it 'Default to infinity if not defined' do
expect(@unrestrected_category.maximum_renewal_times).to\
eq(Float::INFINITY)
it "#{method} returns appropriate default when #{attr} is not defined" do
category = FactoryGirl.build_stubbed(:category, attr => nil)
expect(category.send(method)).to eq(default)
end
end
it_behaves_like 'attribute methods', :max_renewal_length,
:maximum_renewal_length, 0
it_behaves_like 'attribute methods', :max_renewal_times,
:maximum_renewal_times, Float::INFINITY
it_behaves_like 'attribute methods', :renewal_days_before_due,
:maximum_renewal_days_before_due, Float::INFINITY
it_behaves_like 'attribute methods', :max_per_user,
:maximum_per_user, Float::INFINITY
it_behaves_like 'attribute methods', :max_checkout_length,
:maximum_checkout_length, Float::INFINITY

describe '#maximum_renewal_days_before_due' do
before(:each) do
@category.renewal_days_before_due = 1
@category.save
@unrestrected_category = FactoryGirl.create(:category,
renewal_days_before_due: nil)
describe '#active' do
it 'returns active categories' do
category = FactoryGirl.create(:category)
expect(Category.active).to include(category)
end
it 'Should return maximum_renewal_days_before_due if defined' do
expect(@category.maximum_renewal_days_before_due).to eq(1)
end
it 'Default to infinity if not defined' do
expect(@unrestrected_category.maximum_renewal_days_before_due).to\
eq(Float::INFINITY)
it 'does not return inactive categories' do
deactivated = FactoryGirl.create(:category,
deleted_at: '2013-01-01 00:00:00')
expect(Category.active).not_to include(deactivated)
end
end

describe '#maximum_checkout_length' do
before(:each) do
@category.max_checkout_length = 5
@category.save
@unrestrected_category = FactoryGirl.create(:category,
max_checkout_length: nil)
end
it 'Should return maximum_checkout_length if defined' do
expect(@category.maximum_checkout_length).to eq(5)
end
it 'Default to infinity if not defined' do
expect(@unrestrected_category.maximum_checkout_length).to\
eq(Float::INFINITY)
describe 'catalog_search' do
let!(:category) do
FactoryGirl.create(:category,
name: 'Tumblr hipster instagram sustainable')
end
end

describe '.catalog_search' do
before(:each) do
@category.name = 'Tumblr hipster instagram sustainable'
@category.save
@hipster =
FactoryGirl.create(:category,
name: 'Tumblr starbucks PBR slackline music hipster')
let!(:hipster) do
FactoryGirl.create(:category,
name: 'Tumblr starbucks PBR slackline music hipster')
end
it 'Should return names matching all of the query words' do
expect(Category.catalog_search('Tumblr')).to eq([@category, @hipster])
expect(Category.catalog_search('Tumblr')).to eq([category, hipster])
expect(Category.catalog_search('Tumblr hipster')).to\
eq([@category, @hipster])
eq([category, hipster])
end
it 'Should not return any categories without every query word in the '\
'name' do
expect(Category.catalog_search('starbucks')).to eq([@hipster])
expect(Category.catalog_search('starbucks')).to eq([hipster])
expect(Category.catalog_search('Tumblr instagram sustainable')).to\
eq([@category])
eq([category])
end
end
end