spec/likeable_spec.rb in likeable-0.1.1 vs spec/likeable_spec.rb in likeable-0.1.2
- old
+ new
@@ -1,111 +1,160 @@
require 'spec_helper'
-class CleanTestClassForLikeable
- include Likeable
- def like_key
- "like_key"
- end
- def to_hash(*args); {} end
+describe Likeable do
- def foo
+ before(:all) do
+ Likeable.setup do |like|
+ like.find_one = lambda { |klass, id| klass.where(:id => id) }
+ end
end
- def id
- @id ||= rand(100)
- end
-end
-
-
-
-
-Likeable.setup do |like|
- like.find_one = lambda {|klass, id| klass.where(:id => id)}
-end
-
-
-describe Likeable do
-
before(:each) do
@user = User.new
@target = CleanTestClassForLikeable.new
end
+
describe 'instance methods' do
describe "#add_like_from" do
+
it "creates a like" do
target_class = @target.class.to_s.downcase
user_like_key = "users:like:#{@user.id}:#{target_class}"
time = Time.now.to_f
@user.should_receive(:like_key).with(target_class).and_return(user_like_key)
Likeable.redis.should_receive(:hset).with("like_key", @user.id, time).once
Likeable.redis.should_receive(:hset).with(user_like_key, @target.id, time).once
@target.add_like_from(@user, time)
end
+
end
describe "#remove_like_from" do
+
it "removes a like" do
target_class = @target.class.to_s.downcase
user_like_key = "users:like:#{@user.id}:#{target_class}"
+ Likeable.redis.should_receive(:hexists).with("like_key", @user.id).and_return(true)
@user.should_receive(:like_key).with(target_class).and_return(user_like_key)
Likeable.redis.should_receive(:hdel).with("like_key", @user.id).once
Likeable.redis.should_receive(:hdel).with(user_like_key, @target.id)
@target.remove_like_from(@user)
end
+
+ it "doesn't call after_unlike if like didn't exist" do
+ CleanTestClassForLikeable.after_unlike(:foo)
+ Likeable.redis.should_receive(:hexists).with("like_key", @user.id).and_return(false)
+ @target = CleanTestClassForLikeable.new
+ @target.should_not_receive(:foo)
+ @target.remove_like_from(@user)
+ end
+
end
describe "#liked_users" do
- it "finds the users that like it" do
- @target.should_receive(:like_user_ids).and_return([1,2])
- User.should_receive(:where).with(:id => [1,2])
- @target.liked_users(@user)
+
+ it "finds the users that like it", :integration do
+ user1 = User.new :name => "user1"
+ user2 = User.new :name => "user2"
+ user1.like! @target
+ user2.like! @target
+ User.should_receive(:where).with(:id => [user1.id, user2.id]).and_return([user1, user2])
+ @target.liked_users.should =~ [user1, user2]
end
+
+ it "supports user id models where the id is a hash string", :integration do
+ Likeable.cast_id = lambda { |id| id.to_s }
+ user_id = "ce7961bd9ca9de6753b6e04754c1c615"
+ @user.should_receive(:id).at_least(:once).and_return(user_id)
+ @user.like! @target
+ User.should_receive(:where).with(:id => [user_id]).and_return([@user])
+ @target.liked_users.should =~ [@user]
+ end
+
end
describe "#likes" do
+
it "returns set of likes" do
Likeable.redis.should_receive(:hkeys).with("like_key").once
@target.like_user_ids
end
+
end
describe "#liked_by?" do
- it "will answer if current user likes target" do
- Likeable.redis.should_receive(:hexists).with("like_key", @user.id).once
- @target.liked_by?(@user)
+
+ it "will answer if current user likes target", :integration do
+ @target.should_not be_liked_by(@user)
+ @user.like! @target
+ @target.should be_liked_by(@user)
end
+
+ it "works with hash string based user ids", :integration do
+ user_id = "fa7961bd9ca9de6753b6e04754c1c615"
+ @user.should_receive(:id).at_least(:once).and_return(user_id)
+ @target.should_not be_liked_by(@user)
+ @user.like! @target
+ @target.should be_liked_by(@user)
+ end
+
end
describe "#liked_friend_ids" do
+
it "will return all friend ids of user who like target" do
common_value = 3
@target.should_receive(:like_user_ids).and_return([1,2, common_value])
@user.should_receive(:friend_ids).and_return([common_value])
@target.liked_friend_ids(@user).should == [common_value]
end
+
end
describe "#liked_friends" do
+
it "will return all friends who like object" do
values = [1]
@target.should_receive(:liked_friend_ids).with(@user).and_return(values)
User.should_receive(:where).with(:id => values)
@target.liked_friends(@user)
end
+
end
+
end
describe "class methods" do
+
describe 'after_like' do
+
it 'should be a class method when included' do
CleanTestClassForLikeable.respond_to?(:after_like).should be_true
end
+
it 'is called after a like is created' do
CleanTestClassForLikeable.after_like(:foo)
@target.should_receive(:foo)
@target.add_like_from(@user)
end
+
end
+
+ describe 'after_unlike' do
+
+ it 'should be a class method when included' do
+ CleanTestClassForLikeable.respond_to?(:after_unlike).should be_true
+ end
+
+ it 'is called after a like is destroyed' do
+ CleanTestClassForLikeable.after_unlike(:foo)
+ Likeable.redis.should_receive(:hexists).and_return(true)
+ @target.should_receive(:foo)
+ @target.remove_like_from(@user)
+ end
+
+ end
+
end
end