169 lines
5.7 KiB
Ruby
169 lines
5.7 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 = FactoryGirl.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:FactoryGirl.create(:user))
|
|
review2.valid?.should be_true
|
|
Review.should have(2).items
|
|
Review.index.should have(2).items
|
|
|
|
# Reduce and check:
|
|
ReviewSummary.should have(1).items
|
|
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:FactoryGirl.create(:user))}
|
|
Review.index.should have(7).items
|
|
ReviewSummary.should have(1).items
|
|
|
|
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:FactoryGirl.create(:user))
|
|
review2.valid?.should be_true
|
|
Review.should have(2).items
|
|
|
|
ReviewSummary.should have(1).items
|
|
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:FactoryGirl.create(:user))}
|
|
ReviewSummary.should have(1).items
|
|
ReviewSummary.first.wilson_score.should > ws_orig
|
|
ReviewSummary.first.avg_rating.should > avg_orig
|
|
|
|
|
|
# Create some more with a different target and verify:
|
|
target2=FactoryGirl.create(:jam_track)
|
|
5.times {Review.create(target:target2, rating:5, user:FactoryGirl.create(:user))}
|
|
Review.index.should have(12).items
|
|
Review.index(target_id: target2).should have(5).items
|
|
summaries = ReviewSummary.index()
|
|
summaries.should have(2).items
|
|
summaries[0].wilson_score.should > summaries[1].wilson_score
|
|
|
|
summaries = ReviewSummary.index(target_id: target2)
|
|
summaries.should have(1).items
|
|
summaries[0].target_id.should eq(target2.id)
|
|
|
|
summaries = ReviewSummary.index(target_type: "JamRuby::JamTrack")
|
|
summaries.should have(2).items
|
|
|
|
summaries = ReviewSummary.index(minimum_reviews: 6)
|
|
summaries.should have(1).items
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "with a jamtrack" do
|
|
@jam_track = FactoryGirl.create(:jam_track)
|
|
it_behaves_like :review, @jam_track, "jam_track"
|
|
end
|
|
|
|
|
|
end |