socialization 0.4.0 → 0.5.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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