socialization 0.4.0 → 0.5.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. data/.gitignore +5 -1
  2. data/CHANGELOG.md +41 -0
  3. data/README.md +246 -0
  4. data/demo/{demo_app/.gitignore → .gitignore} +0 -0
  5. data/demo/{demo_app/Gemfile → Gemfile} +1 -1
  6. data/demo/{demo_app/README.rdoc → README.rdoc} +0 -0
  7. data/demo/{demo_app/Rakefile → Rakefile} +0 -0
  8. data/demo/{demo_app/app → app}/assets/images/rails.png +0 -0
  9. data/demo/{demo_app/app → app}/assets/javascripts/application.js +0 -0
  10. data/demo/{demo_app/app → app}/assets/stylesheets/application.css +0 -0
  11. data/demo/{demo_app/app → app}/controllers/application_controller.rb +0 -0
  12. data/demo/{demo_app/app → app}/helpers/application_helper.rb +0 -0
  13. data/demo/{demo_app/app → app}/mailers/.gitkeep +0 -0
  14. data/demo/{demo_app/app → app}/models/.gitkeep +0 -0
  15. data/demo/{demo_app/app → app}/models/celebrity.rb +0 -0
  16. data/demo/{demo_app/app → app}/models/comment.rb +0 -0
  17. data/demo/app/models/follow.rb +2 -0
  18. data/demo/app/models/like.rb +2 -0
  19. data/demo/app/models/mention.rb +2 -0
  20. data/demo/{demo_app/app → app}/models/movie.rb +0 -0
  21. data/demo/{demo_app/app → app}/models/user.rb +0 -0
  22. data/demo/{demo_app/app → app}/views/layouts/application.html.erb +0 -0
  23. data/demo/{demo_app/config.ru → config.ru} +0 -0
  24. data/demo/{demo_app/config → config}/application.rb +0 -0
  25. data/demo/{demo_app/config → config}/boot.rb +0 -0
  26. data/demo/{demo_app/config → config}/database.yml +0 -0
  27. data/demo/{demo_app/config → config}/environment.rb +0 -0
  28. data/demo/{demo_app/config → config}/environments/development.rb +0 -0
  29. data/demo/{demo_app/config → config}/environments/production.rb +0 -0
  30. data/demo/{demo_app/config → config}/environments/test.rb +0 -0
  31. data/demo/{demo_app/config → config}/initializers/backtrace_silencers.rb +0 -0
  32. data/demo/{demo_app/config → config}/initializers/inflections.rb +0 -0
  33. data/demo/{demo_app/config → config}/initializers/mime_types.rb +0 -0
  34. data/demo/{demo_app/config → config}/initializers/secret_token.rb +0 -0
  35. data/demo/{demo_app/config → config}/initializers/session_store.rb +1 -1
  36. data/demo/{demo_app/config → config}/initializers/wrap_parameters.rb +1 -1
  37. data/demo/{demo_app/config → config}/locales/en.yml +0 -0
  38. data/demo/{demo_app/config → config}/routes.rb +0 -0
  39. data/demo/{demo_app/db → db}/migrate/20120115051222_create_users.rb +0 -0
  40. data/demo/{demo_app/db → db}/migrate/20120115051234_create_movies.rb +0 -0
  41. data/demo/{demo_app/db → db}/migrate/20120115051255_create_celebrities.rb +0 -0
  42. data/demo/{demo_app/db → db}/migrate/20120115054646_create_follows.rb +0 -0
  43. data/demo/{demo_app/db → db}/migrate/20120115054647_create_likes.rb +0 -0
  44. data/demo/{demo_app/db → db}/migrate/20120221200644_create_mentions.rb +0 -0
  45. data/demo/{demo_app/db → db}/migrate/20120221202703_create_comments.rb +0 -0
  46. data/demo/{demo_app/db → db}/schema.rb +0 -1
  47. data/demo/{demo_app/db → db}/seeds.rb +0 -0
  48. data/demo/{demo_app/lib → lib}/assets/.gitkeep +0 -0
  49. data/demo/{demo_app/lib → lib}/tasks/.gitkeep +0 -0
  50. data/demo/{demo_app/public → public}/404.html +0 -0
  51. data/demo/{demo_app/public → public}/422.html +0 -0
  52. data/demo/{demo_app/public → public}/500.html +0 -0
  53. data/demo/{demo_app/public → public}/favicon.ico +0 -0
  54. data/demo/{demo_app/public → public}/index.html +0 -0
  55. data/demo/{demo_app/public → public}/robots.txt +0 -0
  56. data/demo/{demo_app/script → script}/rails +0 -0
  57. data/demo/{demo_app/test → test}/fixtures/.gitkeep +0 -0
  58. data/demo/{demo_app/test → test}/fixtures/celebrities.yml +0 -0
  59. data/demo/{demo_app/test → test}/fixtures/movies.yml +0 -0
  60. data/demo/{demo_app/test → test}/fixtures/users.yml +0 -0
  61. data/demo/{demo_app/test → test}/functional/.gitkeep +0 -0
  62. data/demo/{demo_app/test → test}/integration/.gitkeep +0 -0
  63. data/demo/{demo_app/test → test}/performance/browsing_test.rb +0 -0
  64. data/demo/{demo_app/test → test}/test_helper.rb +0 -0
  65. data/demo/{demo_app/test → test}/unit/.gitkeep +0 -0
  66. data/demo/{demo_app/test → test}/unit/celebrity_test.rb +0 -0
  67. data/demo/{demo_app/test → test}/unit/movie_test.rb +0 -0
  68. data/demo/{demo_app/test → test}/unit/user_test.rb +0 -0
  69. data/demo/{demo_app/vendor → vendor}/assets/javascripts/.gitkeep +0 -0
  70. data/demo/{demo_app/vendor → vendor}/assets/stylesheets/.gitkeep +0 -0
  71. data/demo/{demo_app/vendor → vendor}/plugins/.gitkeep +0 -0
  72. data/lib/generators/socialization/socialization_generator.rb +20 -9
  73. data/{generators/socialization/templates → lib/generators/socialization/templates/active_record}/migration_follows.rb +0 -0
  74. data/{generators/socialization/templates → lib/generators/socialization/templates/active_record}/migration_likes.rb +0 -0
  75. data/{generators/socialization/templates → lib/generators/socialization/templates/active_record}/migration_mentions.rb +0 -0
  76. data/lib/generators/socialization/templates/active_record/model_follow.rb +2 -0
  77. data/lib/generators/socialization/templates/active_record/model_like.rb +2 -0
  78. data/lib/generators/socialization/templates/active_record/model_mention.rb +2 -0
  79. data/lib/socialization.rb +3 -5
  80. data/lib/socialization/actors/follower.rb +74 -0
  81. data/lib/socialization/actors/liker.rb +74 -0
  82. data/lib/socialization/actors/mentioner.rb +74 -0
  83. data/lib/socialization/acts_as_helpers.rb +43 -0
  84. data/lib/socialization/config.rb +45 -0
  85. data/lib/socialization/helpers/string.rb +17 -0
  86. data/lib/socialization/stores/active_record/follow_store.rb +143 -0
  87. data/lib/socialization/stores/active_record/like_store.rb +143 -0
  88. data/lib/socialization/stores/active_record/mention_store.rb +143 -0
  89. data/lib/socialization/stores/redis/base.rb +8 -0
  90. data/lib/socialization/stores/redis/config.rb +11 -0
  91. data/lib/socialization/stores/redis/follow_store.rb +126 -0
  92. data/lib/socialization/stores/redis/like_store.rb +126 -0
  93. data/lib/socialization/stores/redis/mention_store.rb +126 -0
  94. data/lib/socialization/version.rb +1 -1
  95. data/lib/socialization/victims/followable.rb +38 -0
  96. data/lib/socialization/victims/likeable.rb +38 -0
  97. data/lib/socialization/victims/mentionable.rb +38 -0
  98. data/socialization.gemspec +3 -3
  99. data/test/actors/follower_test.rb +74 -0
  100. data/test/actors/liker_test.rb +74 -0
  101. data/test/actors/mentioner_test.rb +74 -0
  102. data/test/stores/active_record/follow_store_test.rb +121 -0
  103. data/test/stores/active_record/like_store_test.rb +121 -0
  104. data/test/stores/active_record/mention_store_test.rb +121 -0
  105. data/test/stores/redis/config_test.rb +30 -0
  106. data/test/stores/redis/follow_store_test.rb +153 -0
  107. data/test/stores/redis/like_store_test.rb +153 -0
  108. data/test/stores/redis/mention_store_test.rb +153 -0
  109. data/test/string_test.rb +13 -0
  110. data/test/test_helper.rb +70 -12
  111. data/test/victims/followable_test.rb +34 -0
  112. data/test/victims/likeable_test.rb +34 -0
  113. data/test/victims/mentionable_test.rb +34 -0
  114. data/test/world_test.rb +80 -69
  115. metadata +261 -176
  116. data/README.rdoc +0 -186
  117. data/demo/demo_app/app/models/follow.rb +0 -3
  118. data/demo/demo_app/app/models/like.rb +0 -3
  119. data/demo/demo_app/app/models/mention.rb +0 -3
  120. data/demo/demo_app/doc/README_FOR_APP +0 -2
  121. data/gemfiles/activerecord30.gemfile +0 -6
  122. data/gemfiles/activerecord30.gemfile.lock +0 -23
  123. data/gemfiles/activerecord31.gemfile +0 -6
  124. data/gemfiles/activerecord31.gemfile.lock +0 -25
  125. data/gemfiles/activerecord32.gemfile +0 -6
  126. data/gemfiles/activerecord32.gemfile.lock +0 -25
  127. data/generators/socialization/USAGE +0 -1
  128. data/generators/socialization/socialization_generator.rb +0 -15
  129. data/generators/socialization/templates/model_follow.rb +0 -3
  130. data/generators/socialization/templates/model_like.rb +0 -3
  131. data/generators/socialization/templates/model_mention.rb +0 -3
  132. data/lib/socialization/follow_store.rb +0 -14
  133. data/lib/socialization/followable.rb +0 -34
  134. data/lib/socialization/follower.rb +0 -50
  135. data/lib/socialization/hello.rb +0 -53
  136. data/lib/socialization/like_store.rb +0 -14
  137. data/lib/socialization/likeable.rb +0 -34
  138. data/lib/socialization/liker.rb +0 -54
  139. data/lib/socialization/mention_store.rb +0 -14
  140. data/lib/socialization/mentionable.rb +0 -36
  141. data/lib/socialization/mentioner.rb +0 -54
  142. data/test/follow_test.rb +0 -125
  143. data/test/like_test.rb +0 -125
  144. data/test/mention_test.rb +0 -116
@@ -0,0 +1,121 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/../../test_helper'
2
+
3
+ class ActiveRecordMentionStoreTest < Test::Unit::TestCase
4
+ context "ActiveRecordStores::MentionStoreTest" do
5
+ setup do
6
+ @klass = Socialization::ActiveRecordStores::MentionStore
7
+ @klass.touch nil
8
+ @klass.after_mention nil
9
+ @klass.after_unmention nil
10
+ @mentioner = ImAMentioner.create
11
+ @mentionable = ImAMentionable.create
12
+ end
13
+
14
+ context "data store" do
15
+ should "inherit Socialization::ActiveRecordStores::MentionStore" do
16
+ assert_equal Socialization::ActiveRecordStores::MentionStore, Socialization.mention_model
17
+ end
18
+ end
19
+
20
+ context "#mention!" do
21
+ should "create a Mention record" do
22
+ @klass.mention!(@mentioner, @mentionable)
23
+ assert_match_mentioner @klass.last, @mentioner
24
+ assert_match_mentionable @klass.last, @mentionable
25
+ end
26
+
27
+ should "touch mentioner when instructed" do
28
+ @klass.touch :mentioner
29
+ @mentioner.expects(:touch).once
30
+ @mentionable.expects(:touch).never
31
+ @klass.mention!(@mentioner, @mentionable)
32
+ end
33
+
34
+ should "touch mentionable when instructed" do
35
+ @klass.touch :mentionable
36
+ @mentioner.expects(:touch).never
37
+ @mentionable.expects(:touch).once
38
+ @klass.mention!(@mentioner, @mentionable)
39
+ end
40
+
41
+ should "touch all when instructed" do
42
+ @klass.touch :all
43
+ @mentioner.expects(:touch).once
44
+ @mentionable.expects(:touch).once
45
+ @klass.mention!(@mentioner, @mentionable)
46
+ end
47
+
48
+ should "call after mention hook" do
49
+ @klass.after_mention :after_mention
50
+ @klass.expects(:after_mention).once
51
+ @klass.mention!(@mentioner, @mentionable)
52
+ end
53
+
54
+ should "call after unmention hook" do
55
+ @klass.after_mention :after_unmention
56
+ @klass.expects(:after_unmention).once
57
+ @klass.mention!(@mentioner, @mentionable)
58
+ end
59
+ end
60
+
61
+ context "#mentions?" do
62
+ should "return true when mention exists" do
63
+ @klass.create! do |f|
64
+ f.mentioner = @mentioner
65
+ f.mentionable = @mentionable
66
+ end
67
+ assert_true @klass.mentions?(@mentioner, @mentionable)
68
+ end
69
+
70
+ should "return false when mention doesn't exist" do
71
+ assert_false @klass.mentions?(@mentioner, @mentionable)
72
+ end
73
+ end
74
+
75
+ context "#mentioners" do
76
+ should "return an array of mentioners" do
77
+ mentioner1 = ImAMentioner.create
78
+ mentioner2 = ImAMentioner.create
79
+ mentioner1.mention!(@mentionable)
80
+ mentioner2.mention!(@mentionable)
81
+ assert_equal [mentioner1, mentioner2], @klass.mentioners(@mentionable, mentioner1.class)
82
+ end
83
+
84
+ should "return an array of mentioner ids when plucking" do
85
+ mentioner1 = ImAMentioner.create
86
+ mentioner2 = ImAMentioner.create
87
+ mentioner1.mention!(@mentionable)
88
+ mentioner2.mention!(@mentionable)
89
+ assert_equal [mentioner1.id, mentioner2.id], @klass.mentioners(@mentionable, mentioner1.class, :pluck => :id)
90
+ end
91
+ end
92
+
93
+ context "#mentionables" do
94
+ should "return an array of mentioners" do
95
+ mentionable1 = ImAMentionable.create
96
+ mentionable2 = ImAMentionable.create
97
+ @mentioner.mention!(mentionable1)
98
+ @mentioner.mention!(mentionable2)
99
+ assert_equal [mentionable1, mentionable2], @klass.mentionables(@mentioner, mentionable1.class)
100
+ end
101
+
102
+ should "return an array of mentioner ids when plucking" do
103
+ mentionable1 = ImAMentionable.create
104
+ mentionable2 = ImAMentionable.create
105
+ @mentioner.mention!(mentionable1)
106
+ @mentioner.mention!(mentionable2)
107
+ assert_equal [mentionable1.id, mentionable2.id], @klass.mentionables(@mentioner, mentionable1.class, :pluck => :id)
108
+ end
109
+ end
110
+
111
+ end
112
+
113
+ # Helpers
114
+ def assert_match_mentioner(mention_record, mentioner)
115
+ assert mention_record.mentioner_type == mentioner.class.to_s && mention_record.mentioner_id == mentioner.id
116
+ end
117
+
118
+ def assert_match_mentionable(mention_record, mentionable)
119
+ assert mention_record.mentionable_type == mentionable.class.to_s && mention_record.mentionable_id == mentionable.id
120
+ end
121
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/../../test_helper'
2
+
3
+ class RedisStoreConfigTest < Test::Unit::TestCase
4
+ context "redis" do
5
+ setup do
6
+ Socialization.instance_eval { @redis = nil }
7
+ end
8
+
9
+ should "return a new Redis object when none were specified" do
10
+ assert_instance_of Redis, Socialization.redis
11
+ end
12
+
13
+ should "always return the same Redis object when none were specified" do
14
+ redis = Socialization.redis
15
+ assert_same redis, Socialization.redis
16
+ end
17
+
18
+ should "be able to set and get a redis instance" do
19
+ redis = Redis.new
20
+ Socialization.redis = redis
21
+ assert_same redis, Socialization.redis
22
+ end
23
+
24
+ should "always return the same Redis object when it was specified" do
25
+ redis = Redis.new
26
+ Socialization.redis = redis
27
+ assert_same redis, Socialization.redis
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,153 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/../../test_helper'
2
+
3
+ class RedisFollowStoreTest < Test::Unit::TestCase
4
+ context "RedisStores::FollowStoreTest" do
5
+ setup do
6
+ use_redis_store
7
+ @klass = Socialization::RedisStores::FollowStore
8
+ @klass.touch nil
9
+ @klass.after_follow nil
10
+ @klass.after_unfollow nil
11
+ @follower = ImAFollower.create
12
+ @followable = ImAFollowable.create
13
+ end
14
+
15
+ context "Stores" do
16
+ should "inherit Socialization::RedisStores::FollowStore" do
17
+ assert_equal Socialization::RedisStores::FollowStore, Socialization.follow_model
18
+ end
19
+ end
20
+
21
+ context "#follow!" do
22
+ should "create a Follow record" do
23
+ @klass.follow!(@follower, @followable)
24
+ assert_equal ["#{@follower.id}"], Socialization.redis.smembers(followers_key)
25
+ assert_equal ["#{@followable.id}"], Socialization.redis.smembers(followables_key)
26
+ end
27
+
28
+ should "touch follower when instructed" do
29
+ @klass.touch :follower
30
+ @follower.expects(:touch).once
31
+ @followable.expects(:touch).never
32
+ @klass.follow!(@follower, @followable)
33
+ end
34
+
35
+ should "touch followable when instructed" do
36
+ @klass.touch :followable
37
+ @follower.expects(:touch).never
38
+ @followable.expects(:touch).once
39
+ @klass.follow!(@follower, @followable)
40
+ end
41
+
42
+ should "touch all when instructed" do
43
+ @klass.touch :all
44
+ @follower.expects(:touch).once
45
+ @followable.expects(:touch).once
46
+ @klass.follow!(@follower, @followable)
47
+ end
48
+
49
+ should "call after follow hook" do
50
+ @klass.after_follow :after_follow
51
+ @klass.expects(:after_follow).once
52
+ @klass.follow!(@follower, @followable)
53
+ end
54
+
55
+ should "call after unfollow hook" do
56
+ @klass.after_follow :after_unfollow
57
+ @klass.expects(:after_unfollow).once
58
+ @klass.follow!(@follower, @followable)
59
+ end
60
+ end
61
+
62
+ context "#follows?" do
63
+ should "return true when follow exists" do
64
+ Socialization.redis.sadd followers_key, @follower.id
65
+ Socialization.redis.sadd followables_key, @followable.id
66
+ assert_true @klass.follows?(@follower, @followable)
67
+ end
68
+
69
+ should "return false when follow doesn't exist" do
70
+ assert_false @klass.follows?(@follower, @followable)
71
+ end
72
+ end
73
+
74
+ context "#followers" do
75
+ should "return an array of followers" do
76
+ follower1 = ImAFollower.create
77
+ follower2 = ImAFollower.create
78
+ follower1.follow!(@followable)
79
+ follower2.follow!(@followable)
80
+ assert_array_similarity [follower1, follower2], @klass.followers(@followable, follower1.class)
81
+ end
82
+
83
+ should "return an array of follower ids when plucking" do
84
+ follower1 = ImAFollower.create
85
+ follower2 = ImAFollower.create
86
+ follower1.follow!(@followable)
87
+ follower2.follow!(@followable)
88
+ assert_array_similarity [follower1.id, follower2.id], @klass.followers(@followable, follower1.class, :pluck => :id)
89
+ end
90
+ end
91
+
92
+ context "#followables" do
93
+ should "return an array of followables" do
94
+ followable1 = ImAFollowable.create
95
+ followable2 = ImAFollowable.create
96
+ @follower.follow!(followable1)
97
+ @follower.follow!(followable2)
98
+
99
+ assert_array_similarity [followable1, followable2], @klass.followables(@follower, followable1.class)
100
+ end
101
+
102
+ should "return an array of followables ids when plucking" do
103
+ followable1 = ImAFollowable.create
104
+ followable2 = ImAFollowable.create
105
+ @follower.follow!(followable1)
106
+ @follower.follow!(followable2)
107
+ assert_array_similarity [followable1.id, followable2.id], @klass.followables(@follower, followable1.class, :pluck => :id)
108
+ end
109
+ end
110
+
111
+ context "#generate_followers_key" do
112
+ should "return valid key when passed objects" do
113
+ assert_equal "Followers:ImAFollowable:#{@followable.id}:ImAFollower", followers_key(@follower, @followable)
114
+ end
115
+
116
+ should "return valid key when follower is a class" do
117
+ assert_equal "Followers:ImAFollowable:#{@followable.id}:ImAFollower", followers_key(@follower.class, @followable)
118
+ end
119
+ end
120
+
121
+ context "#generate_followables_key" do
122
+ should "return valid key when passed objects" do
123
+ assert_equal "Followables:ImAFollower:#{@follower.id}:ImAFollowable", followables_key(@follower, @followable)
124
+ end
125
+
126
+ should "return valid key when followable is a class" do
127
+ assert_equal "Followables:ImAFollower:#{@follower.id}:ImAFollowable", followables_key(@follower, @followable.class)
128
+ end
129
+ end
130
+
131
+ end
132
+
133
+ # Helpers
134
+ def assert_match_follower(follow_record, follower)
135
+ assert follow_record.follower_type == follower.class.to_s && follow_record.follower_id == follower.id
136
+ end
137
+
138
+ def assert_match_followable(follow_record, followable)
139
+ assert follow_record.followable_type == followable.class.to_s && follow_record.followable_id == followable.id
140
+ end
141
+
142
+ def followers_key(follower = nil, followable = nil)
143
+ follower ||= @follower
144
+ followable ||= @followable
145
+ @klass.send(:generate_followers_key, follower, followable)
146
+ end
147
+
148
+ def followables_key(follower = nil, followable = nil)
149
+ follower ||= @follower
150
+ followable ||= @followable
151
+ @klass.send(:generate_followables_key, follower, followable)
152
+ end
153
+ end
@@ -0,0 +1,153 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/../../test_helper'
2
+
3
+ class RedisLikeStoreTest < Test::Unit::TestCase
4
+ context "RedisStores::LikeStoreTest" do
5
+ setup do
6
+ use_redis_store
7
+ @klass = Socialization::RedisStores::LikeStore
8
+ @klass.touch nil
9
+ @klass.after_like nil
10
+ @klass.after_unlike nil
11
+ @liker = ImALiker.create
12
+ @likeable = ImALikeable.create
13
+ end
14
+
15
+ context "Stores" do
16
+ should "inherit Socialization::RedisStores::LikeStore" do
17
+ assert_equal Socialization::RedisStores::LikeStore, Socialization.like_model
18
+ end
19
+ end
20
+
21
+ context "#like!" do
22
+ should "create a Like record" do
23
+ @klass.like!(@liker, @likeable)
24
+ assert_equal ["#{@liker.id}"], Socialization.redis.smembers(likers_key)
25
+ assert_equal ["#{@likeable.id}"], Socialization.redis.smembers(likeables_key)
26
+ end
27
+
28
+ should "touch liker when instructed" do
29
+ @klass.touch :liker
30
+ @liker.expects(:touch).once
31
+ @likeable.expects(:touch).never
32
+ @klass.like!(@liker, @likeable)
33
+ end
34
+
35
+ should "touch likeable when instructed" do
36
+ @klass.touch :likeable
37
+ @liker.expects(:touch).never
38
+ @likeable.expects(:touch).once
39
+ @klass.like!(@liker, @likeable)
40
+ end
41
+
42
+ should "touch all when instructed" do
43
+ @klass.touch :all
44
+ @liker.expects(:touch).once
45
+ @likeable.expects(:touch).once
46
+ @klass.like!(@liker, @likeable)
47
+ end
48
+
49
+ should "call after like hook" do
50
+ @klass.after_like :after_like
51
+ @klass.expects(:after_like).once
52
+ @klass.like!(@liker, @likeable)
53
+ end
54
+
55
+ should "call after unlike hook" do
56
+ @klass.after_like :after_unlike
57
+ @klass.expects(:after_unlike).once
58
+ @klass.like!(@liker, @likeable)
59
+ end
60
+ end
61
+
62
+ context "#likes?" do
63
+ should "return true when like exists" do
64
+ Socialization.redis.sadd likers_key, @liker.id
65
+ Socialization.redis.sadd likeables_key, @likeable.id
66
+ assert_true @klass.likes?(@liker, @likeable)
67
+ end
68
+
69
+ should "return false when like doesn't exist" do
70
+ assert_false @klass.likes?(@liker, @likeable)
71
+ end
72
+ end
73
+
74
+ context "#likers" do
75
+ should "return an array of likers" do
76
+ liker1 = ImALiker.create
77
+ liker2 = ImALiker.create
78
+ liker1.like!(@likeable)
79
+ liker2.like!(@likeable)
80
+ assert_array_similarity [liker1, liker2], @klass.likers(@likeable, liker1.class)
81
+ end
82
+
83
+ should "return an array of liker ids when plucking" do
84
+ liker1 = ImALiker.create
85
+ liker2 = ImALiker.create
86
+ liker1.like!(@likeable)
87
+ liker2.like!(@likeable)
88
+ assert_array_similarity [liker1.id, liker2.id], @klass.likers(@likeable, liker1.class, :pluck => :id)
89
+ end
90
+ end
91
+
92
+ context "#likeables" do
93
+ should "return an array of likeables" do
94
+ likeable1 = ImALikeable.create
95
+ likeable2 = ImALikeable.create
96
+ @liker.like!(likeable1)
97
+ @liker.like!(likeable2)
98
+
99
+ assert_array_similarity [likeable1, likeable2], @klass.likeables(@liker, likeable1.class)
100
+ end
101
+
102
+ should "return an array of likeables ids when plucking" do
103
+ likeable1 = ImALikeable.create
104
+ likeable2 = ImALikeable.create
105
+ @liker.like!(likeable1)
106
+ @liker.like!(likeable2)
107
+ assert_array_similarity [likeable1.id, likeable2.id], @klass.likeables(@liker, likeable1.class, :pluck => :id)
108
+ end
109
+ end
110
+
111
+ context "#generate_likers_key" do
112
+ should "return valid key when passed objects" do
113
+ assert_equal "Likers:ImALikeable:#{@likeable.id}:ImALiker", likers_key(@liker, @likeable)
114
+ end
115
+
116
+ should "return valid key when liker is a class" do
117
+ assert_equal "Likers:ImALikeable:#{@likeable.id}:ImALiker", likers_key(@liker.class, @likeable)
118
+ end
119
+ end
120
+
121
+ context "#generate_likeables_key" do
122
+ should "return valid key when passed objects" do
123
+ assert_equal "Likeables:ImALiker:#{@liker.id}:ImALikeable", likeables_key(@liker, @likeable)
124
+ end
125
+
126
+ should "return valid key when likeable is a class" do
127
+ assert_equal "Likeables:ImALiker:#{@liker.id}:ImALikeable", likeables_key(@liker, @likeable.class)
128
+ end
129
+ end
130
+
131
+ end
132
+
133
+ # Helpers
134
+ def assert_match_liker(like_record, liker)
135
+ assert like_record.liker_type == liker.class.to_s && like_record.liker_id == liker.id
136
+ end
137
+
138
+ def assert_match_likeable(like_record, likeable)
139
+ assert like_record.likeable_type == likeable.class.to_s && like_record.likeable_id == likeable.id
140
+ end
141
+
142
+ def likers_key(liker = nil, likeable = nil)
143
+ liker ||= @liker
144
+ likeable ||= @likeable
145
+ @klass.send(:generate_likers_key, liker, likeable)
146
+ end
147
+
148
+ def likeables_key(liker = nil, likeable = nil)
149
+ liker ||= @liker
150
+ likeable ||= @likeable
151
+ @klass.send(:generate_likeables_key, liker, likeable)
152
+ end
153
+ end