Skip to content

Commit 455a50c

Browse files
committed
Add scope tests
1 parent e453a9f commit 455a50c

File tree

6 files changed

+77
-1
lines changed

6 files changed

+77
-1
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ end
4646
group :test do
4747
gem "rspec-rails", "~> 5.0.0"
4848
gem "factory_bot_rails", "~> 6.2.0"
49+
gem "debug", ">= 1.0.0"
4950
end
5051

5152
gem "bootstrap-kaminari-views", "~> 0.0.5"

app/models/pet.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Pet < ApplicationRecord
1212

1313
scope :most_viewed, -> do
1414
joins('LEFT JOIN (SELECT pet_id, COUNT(*) as pet_count FROM pet_views GROUP BY pet_id) pet_counts ON pet_counts.pet_id = pets.id')
15-
.order(Arel.sql('COALESCE(pet_count, 0) DESC, pets.created_at DESC'))
15+
.reorder(Arel.sql('COALESCE(pet_count, 0) DESC, pets.created_at DESC'))
1616
end
1717

1818
scope :recent, -> { order("created_at DESC") }

spec/factories/pets.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
FactoryBot.define do
2+
factory :pet do
3+
name { Faker::Creature::Dog.name }
4+
breed { Faker::Creature::Dog.breed }
5+
age { Faker::Number.between(from: 1, to: 20) }
6+
weight { Faker::Number.between(from: 1, to: 100) }
7+
color { Faker::Color.color_name }
8+
shelter { create(:shelter) }
9+
end
10+
end

spec/factories/shelter.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FactoryBot.define do
2+
factory :shelter do
3+
name { Faker::Company.name }
4+
address { Faker::Address.full_address }
5+
email { Faker::Internet.email }
6+
phone { Faker::PhoneNumber.phone_number }
7+
end
8+
end

spec/models/pet_spec.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,59 @@
6565
end
6666
end
6767
end
68+
69+
describe "scopes" do
70+
it "returns recent pets" do
71+
pet1 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever", created_at: 1.day.ago)
72+
pet2 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever")
73+
expect(Pet.recent).to eq([pet2, pet1])
74+
end
75+
76+
it "returns available pets" do
77+
_pet1 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever", adoption_date: 1.day.ago)
78+
pet2 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever")
79+
expect(Pet.available).to eq([pet2])
80+
end
81+
82+
it "returns pets that match a search" do
83+
pet1 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever")
84+
_pet2 = create(:pet, name: "Spot", age: 5, breed: "Golden Retriever")
85+
expect(Pet.search("Fido")).to eq([pet1])
86+
end
87+
88+
it "returns dogs" do
89+
pet1 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever", pet_type: "dog")
90+
_pet2 = create(:pet, name: "Spot", age: 5, breed: "Golden Retriever", pet_type: "cat")
91+
expect(Pet.dogs).to eq([pet1])
92+
end
93+
94+
it "returns cats" do
95+
_pet1 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever", pet_type: "dog")
96+
pet2 = create(:pet, name: "Spot", age: 5, breed: "Golden Retriever", pet_type: "cat")
97+
expect(Pet.cats).to eq([pet2])
98+
end
99+
100+
it "returns pets similar to the current pet" do
101+
pet1 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever", pet_type: "dog")
102+
pet2 = create(:pet, name: "Spot", age: 5, breed: "Golden Retriever", pet_type: "dog")
103+
expect(pet1.similar_type_pets).to eq([pet2])
104+
end
105+
106+
it "returns pets with similar names to the current pet" do
107+
pet1 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever", pet_type: "dog")
108+
pet2 = create(:pet, name: "Fido", age: 5, breed: "Labrador", pet_type: "cat")
109+
expect(pet1.similiar_name_pets).to eq([pet2])
110+
end
111+
112+
it "returns most viewed pets" do
113+
pet1 = create(:pet, name: "Fido", age: 5, breed: "Golden Retriever", pet_type: "dog")
114+
pet2 = create(:pet, name: "Spot", age: 5, breed: "Golden Retriever", pet_type: "dog")
115+
pet3 = create(:pet, name: "Rover", age: 5, breed: "Golden Retriever", pet_type: "dog")
116+
PetView.create!(pet: pet1)
117+
PetView.create!(pet: pet1)
118+
PetView.create!(pet: pet2)
119+
120+
expect(Pet.most_viewed).to eq([pet1, pet2, pet3])
121+
end
122+
end
68123
end

spec/rails_helper.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
exit 1
3232
end
3333
RSpec.configure do |config|
34+
config.include FactoryBot::Syntax::Methods
35+
3436
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
3537
config.fixture_path = "#{::Rails.root}/spec/fixtures"
3638

0 commit comments

Comments
 (0)