Files
growstuff/spec/models/garden_spec.rb
2022-11-08 00:21:23 +10:30

219 lines
5.9 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe Garden do
let(:owner) { FactoryBot.create(:member, login_name: 'hatupatu') }
let(:garden) { FactoryBot.create(:garden, owner:, name: 'Springfield Community Garden') }
it "has a slug" do
garden.slug.should match(/hatupatu-springfield-community-garden/)
end
it "has a description" do
garden.description.should == "This is a **totally** cool garden"
end
it "doesn't allow a nil name" do
garden = FactoryBot.build(:garden, name: nil)
garden.should_not be_valid
end
it "doesn't allow a blank name" do
garden = FactoryBot.build(:garden, name: "")
garden.should_not be_valid
end
it "allows numbers" do
garden = FactoryBot.build(:garden, name: "100 vines of 2 kamo-kamo")
garden.should be_valid
end
it "allows brackets" do
garden = FactoryBot.build(:garden, name: "Garden (second)")
garden.should be_valid
end
it "allows macrons" do
garden = FactoryBot.build(:garden, name: "Kūmara and pūha patch")
garden.should be_valid
end
it "allows some punctuation" do
garden = FactoryBot.build(:garden, name: "best-garden-eva!")
garden.should be_valid
end
it "doesn't allow a name with only spaces" do
garden = FactoryBot.build(:garden, name: " ")
garden.should_not be_valid
end
it "doesn't allow new line chars in garden names" do
garden = FactoryBot.build(:garden, name: "My garden\nI am a 1337 hacker")
garden.should_not be_valid
end
it "has an owner" do
garden.owner.should be_an_instance_of Member
end
it "stringifies as its name" do
garden.to_s.should == garden.name
end
it "destroys plantings when deleted" do
garden = FactoryBot.create(:garden, owner:)
@planting1 = FactoryBot.create(:planting, garden:, owner: garden.owner)
@planting2 = FactoryBot.create(:planting, garden:, owner: garden.owner)
expect(garden.plantings.size).to eq(2)
all = Planting.count
garden.destroy
expect(Planting.count).to eq(all - 2)
end
context 'area' do
it 'allows numeric area' do
garden = FactoryBot.build(:garden, area: 33)
garden.should be_valid
end
it "doesn't allow negative area" do
garden = FactoryBot.build(:garden, area: -5)
garden.should_not be_valid
end
it 'allows decimal quantities' do
garden = FactoryBot.build(:garden, area: 3.3)
garden.should be_valid
end
it 'allows blank quantities' do
garden = FactoryBot.build(:garden, area: '')
garden.should be_valid
end
it 'allows nil quantities' do
garden = FactoryBot.build(:garden, area: nil)
garden.should be_valid
end
it 'cleans up zero quantities' do
garden = FactoryBot.build(:garden, area: 0)
expect(garden.area).to eq 0
end
it "doesn't allow non-numeric quantities" do
garden = FactoryBot.build(:garden, area: "99a")
garden.should_not be_valid
end
end
context 'units' do
Garden::AREA_UNITS_VALUES.values.push(nil, '').each do |s|
it "#{s} should be a valid unit" do
garden = FactoryBot.build(:garden, area_unit: s)
garden.should be_valid
end
end
it 'refuses invalid unit values' do
garden = FactoryBot.build(:garden, area_unit: 'not valid')
garden.should_not be_valid
garden.errors[:area_unit].should include("not valid is not a valid area unit")
end
it 'sets area unit to blank if area is blank' do
garden = FactoryBot.build(:garden, area: '', area_unit: 'acre')
garden.should be_valid
expect(garden.area_unit).to be_nil
end
end
context 'active scopes' do
let(:active) { FactoryBot.create(:garden) }
let(:inactive) { FactoryBot.create(:inactive_garden) }
it 'includes active garden in active scope' do
described_class.active.should include active
described_class.active.should_not include inactive
end
it 'includes inactive garden in inactive scope' do
described_class.inactive.should include inactive
described_class.inactive.should_not include active
end
end
it "marks plantings as finished when garden is inactive" do
garden = FactoryBot.create(:garden)
p1 = FactoryBot.create(:planting, garden:, owner: garden.owner)
p2 = FactoryBot.create(:planting, garden:, owner: garden.owner)
expect(p1.finished).to be false
expect(p2.finished).to be false
garden.active = false
garden.save
p1.reload
expect(p1.finished).to be true
p2.reload
expect(p2.finished).to be true
end
it "doesn't mark the wrong plantings as finished" do
g1 = FactoryBot.create(:garden)
g2 = FactoryBot.create(:garden)
p1 = FactoryBot.create(:planting, garden: g1, owner: g1.owner)
p2 = FactoryBot.create(:planting, garden: g2, owner: g2.owner)
# mark the garden as inactive
g1.active = false
g1.save
# plantings in that garden should be "finished"
p1.reload
expect(p1.finished).to be true
# plantings in other gardens should not be.
p2.reload
expect(p2.finished).to be false
end
context 'photos' do
let(:garden) { FactoryBot.create(:garden) }
let(:photo) { FactoryBot.create(:photo, owner: garden.owner) }
before do
garden.photos << photo
end
it 'has a photo' do
expect(garden.photos.first).to eq photo
end
it 'deletes association with photos when photo is deleted' do
photo.destroy
garden.reload
garden.photos.should be_empty
end
it 'has a default photo' do
expect(garden.default_photo).to eq photo
end
it 'chooses the most recent photo' do
@photo2 = FactoryBot.create(:photo, owner: garden.owner)
garden.photos << @photo2
expect(garden.default_photo).to eq @photo2
end
end
it 'excludes deleted members' do
expect(described_class.joins(:owner).all).to include(garden)
owner.destroy
expect(described_class.joins(:owner).all).not_to include(garden)
end
end