spec/models/user_spec.rb in recommendable-0.2.1.1 vs spec/models/user_spec.rb in recommendable-1.0.0

- old
+ new

@@ -32,11 +32,11 @@ Recommendable.redis.get(similarity_set).must_be_nil Recommendable.redis.get(predictions_set).must_be_nil end end - describe "that does not act_as_recommendable" do + describe "that does not act_as_recommended_to" do before :each do @user = Factory(:bully) @movie = Factory(:movie) end @@ -184,11 +184,11 @@ @user.stash(@movie).must_equal true @user.ignored?(@movie).must_equal false @user.stashed?(@movie).must_equal true end - it "should not be able to rate or ignore an item that is not recommendable. doing so should not be enough to create Redis keys" do + it "should not be able to rate or ignore an item that is not recommendable." do @cakephp = Factory(:php_framework) proc { @user.like(@cakephp) }.must_raise Recommendable::RecordNotRecommendableError proc { @user.dislike(@cakephp) }.must_raise Recommendable::RecordNotRecommendableError proc { @user.ignore(@cakephp) }.must_raise Recommendable::RecordNotRecommendableError @@ -233,10 +233,31 @@ @user.stash(@movie) @user.unstash(@movie).must_equal true end end + + describe "while using finders" do + it "should return ActiveRecord::Relations" do + @user = Factory(:user) + @movie1 = Factory(:movie) + @movie2 = Factory(:movie) + @movie3 = Factory(:movie) + @movie4 = Factory(:movie) + @movie5 = Factory(:movie) + + @user.like @movie1 + @user.like @movie2 + @user.dislike @movie3 + + @user.liked_movies.must_be_instance_of ActiveRecord::Relation + @user.liked_movies.where(:title => @movie1.title).must_include @movie1 + @user.liked_movies.where(:title => @movie2.title).wont_include @movie1 + @user.liked_movies.limit(1).size.must_equal 1 + @user.disliked_movies.where(:title => @movie5.title).must_be_empty + end + end describe "while getting recommendations" do before :each do @dave = Factory(:user) @frank = Factory(:user) @@ -253,10 +274,41 @@ Recommendable.redis.del "User:#{@dave.id}:predictions:Movie" Recommendable.redis.del "User:#{@frank.id}:similarities" Recommendable.redis.del "User:#{@frank.id}:predictions:Movie" end + it "should respect passed counts" do + @dave.like @movie1 + @frank.like @movie1 + @frank.like @movie2 + @frank.like @movie3 + @frank.like @movie4 + @frank.like @movie5 + + @dave.send :update_similarities and @dave.send :update_recommendations + + @dave.recommendations.size.must_equal 4 + @dave.recommendations(2).size.must_equal 2 + end + + it "should return an ActiveRecord::Relation when using the dynamic finder" do + @dave.like @movie1 + @frank.like @movie1 + @frank.like @movie2 + @frank.like @movie3 + @frank.like @movie4 + @frank.like @movie5 + + @dave.send :update_similarities and @dave.send :update_recommendations + + @dave.recommended_movies.limit(2).size.must_equal 2 + @dave.recommended_movies.where(:title => @movie3.title).must_include @movie3 + @dave.recommended_movies.where(:title => @movie3.title).wont_include @movie2 + @dave.recommended_movies.where(:title => @movie3.title).wont_include @movie4 + @dave.recommended_movies.where(:title => @movie3.title).wont_include @movie5 + end + it "should have common likes with a friend" do @dave.like @movie1 @dave.like @movie2 @dave.like @movie4 @@ -292,9 +344,22 @@ @dave.send :update_similarities @dave.send :update_recommendations @dave.similar_raters.must_include @frank @dave.recommended_movies.must_include @movie2 + end + + it "should return only the number of specified recommendations" do + @dave.like(@movie1) + @frank.like(@movie1) + @frank.like(@movie2) + @frank.like(@movie3) + @frank.like(@movie4) + @dave.send :update_similarities + @dave.send :update_recommendations + + @dave.recommendations(2).size.must_equal 2 + @dave.recommended_movies(1).size.must_equal 1 end it "should order similar users by similarity" do @dave.like(@movie1) @dave.like(@movie2)