jam-cloud/ruby/spec/jam_ruby/models/review_spec.rb

169 lines
5.7 KiB
Ruby
Raw Permalink Normal View History

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
2016-01-13 03:01:39 +00:00
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