169 lines
5.6 KiB
Ruby
169 lines
5.6 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe Review do
|
|
|
|
shared_examples_for :review do |target, target_type|
|
|
before(:each) do
|
|
Review.delete_all
|
|
User.delete_all
|
|
@user = FactoryBot.create(:user)
|
|
end
|
|
|
|
after(:all) do
|
|
Review.delete_all
|
|
User.delete_all
|
|
end
|
|
|
|
context "validates review" do
|
|
it "blank target" do
|
|
review = Review.create({})
|
|
review.valid?.should be false
|
|
review.errors[:target].should == ["can't be blank"]
|
|
end
|
|
|
|
it "no rating" do
|
|
review = Review.create(target:target)
|
|
review.valid?.should be false
|
|
review.errors[:rating].should include("can't be blank")
|
|
review.errors[:rating].should include("is not a number")
|
|
end
|
|
|
|
it "no user" do
|
|
review = Review.create(target:target, rating:3)
|
|
review.valid?.should be false
|
|
review.errors[:user_id].should include("can't be blank")
|
|
end
|
|
|
|
it "complete" do
|
|
review = Review.create(target:target, rating:3, user:@user)
|
|
review.valid?.should be true
|
|
end
|
|
|
|
it "unique" do
|
|
review = Review.create(target:target, rating:3, user:@user)
|
|
review.valid?.should be true
|
|
|
|
review2 = Review.create(target:target, rating:3, user:@user)
|
|
review2.valid?.should be false
|
|
end
|
|
|
|
it "reduces" do
|
|
review = Review.create(target:target, rating:3, user:@user)
|
|
review.valid?.should be true
|
|
|
|
review2 = Review.create(target:target, rating:5, user:FactoryBot.create(:user))
|
|
review2.valid?.should be true
|
|
Review.count.should == 2
|
|
Review.index.size.should == 2
|
|
|
|
# Reduce and check:
|
|
ReviewSummary.count.should == 1
|
|
ReviewSummary.first.avg_rating.should eq(4.0)
|
|
|
|
ws_orig = ReviewSummary.first.wilson_score
|
|
avg_orig = ReviewSummary.first.avg_rating
|
|
|
|
# Create some more and verify:
|
|
5.times {Review.create(target:target, rating:5, user:FactoryBot.create(:user))}
|
|
Review.index.size.should == 7
|
|
ReviewSummary.count.should == 1
|
|
|
|
ReviewSummary.first.wilson_score.should > ws_orig
|
|
ReviewSummary.first.avg_rating.should > avg_orig
|
|
|
|
end
|
|
end # context
|
|
|
|
context "validates review summary" do
|
|
it "blank target" do
|
|
review_summary = ReviewSummary.create()
|
|
review_summary.valid?.should be false
|
|
review_summary.errors[:target_id].should == ["can't be blank"]
|
|
end
|
|
|
|
it "no rating" do
|
|
review_summary = ReviewSummary.create(target:target)
|
|
review_summary.valid?.should be false
|
|
review_summary.errors[:target].should be_empty
|
|
review_summary.errors[:avg_rating].should include("can't be blank")
|
|
review_summary.errors[:avg_rating].should include("is not a number")
|
|
end
|
|
|
|
it "no score" do
|
|
review_summary = ReviewSummary.create(target:target, avg_rating:3.2)
|
|
review_summary.valid?.should be false
|
|
review_summary.errors[:target].should be_empty
|
|
review_summary.errors[:avg_rating].should be_empty
|
|
review_summary.errors[:wilson_score].should include("can't be blank")
|
|
review_summary.errors[:wilson_score].should include("is not a number")
|
|
end
|
|
|
|
it "no count" do
|
|
review_summary = ReviewSummary.create(target:target, avg_rating:3.2, wilson_score:0.95)
|
|
review_summary.valid?.should be false
|
|
review_summary.errors[:review_count].should include("can't be blank")
|
|
end
|
|
|
|
it "complete" do
|
|
review_summary = ReviewSummary.create(target:target, avg_rating:3.2, wilson_score:0.95, review_count: 15)
|
|
review_summary.valid?.should be true
|
|
end
|
|
|
|
it "unique" do
|
|
review = ReviewSummary.create(target:target, avg_rating:3, wilson_score:0.82, review_count:14)
|
|
review.valid?.should be true
|
|
|
|
review2 = ReviewSummary.create(target:target, avg_rating:3.22, wilson_score:0.91, review_count:12)
|
|
review2.valid?.should be false
|
|
end
|
|
|
|
it "reduces and queries" do
|
|
review = Review.create(target:target, rating:3, user:@user)
|
|
review.valid?.should be true
|
|
review2 = Review.create(target:target, rating:5, user:FactoryBot.create(:user))
|
|
review2.valid?.should be true
|
|
Review.count.should == 2
|
|
|
|
ReviewSummary.count.should == 1
|
|
ReviewSummary.first.avg_rating.should eq(4.0)
|
|
|
|
ws_orig = ReviewSummary.first.wilson_score
|
|
avg_orig = ReviewSummary.first.avg_rating
|
|
|
|
|
|
# Create some more and verify:
|
|
5.times {Review.create(target:target, rating:5, user:FactoryBot.create(:user))}
|
|
ReviewSummary.count.should == 1
|
|
ReviewSummary.first.wilson_score.should > ws_orig
|
|
ReviewSummary.first.avg_rating.should > avg_orig
|
|
|
|
|
|
# Create some more with a different target and verify:
|
|
target2=FactoryBot.create(:jam_track)
|
|
5.times {Review.create(target:target2, rating:5, user:FactoryBot.create(:user))}
|
|
Review.index.size.should == 12
|
|
Review.index(target_id: target2).size.should == 5
|
|
summaries = ReviewSummary.index()
|
|
summaries.size.should == 2
|
|
summaries[0].wilson_score.should > summaries[1].wilson_score
|
|
|
|
summaries = ReviewSummary.index(target_id: target2)
|
|
summaries.size.should == 1
|
|
summaries[0].target_id.should eq(target2.id)
|
|
|
|
summaries = ReviewSummary.index(target_type: "JamRuby::JamTrack")
|
|
summaries.size.should == 2
|
|
|
|
summaries = ReviewSummary.index(minimum_reviews: 6)
|
|
summaries.size.should == 1
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "with a jamtrack" do
|
|
@jam_track = FactoryBot.create(:jam_track)
|
|
it_behaves_like :review, @jam_track, "jam_track"
|
|
end
|
|
|
|
|
|
end |