socialization-cassandra 0.0.1.pre.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.travis.yml +7 -0
  4. data/CHANGELOG.md +0 -0
  5. data/Gemfile +9 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +144 -0
  8. data/Rakefile +10 -0
  9. data/init.rb +1 -0
  10. data/lib/generators/socialization/socialization_generator.rb +17 -0
  11. data/lib/generators/socialization/templates/cassandra/model_comment.rb +2 -0
  12. data/lib/generators/socialization/templates/cassandra/model_follow.rb +2 -0
  13. data/lib/generators/socialization/templates/cassandra/model_like.rb +2 -0
  14. data/lib/generators/socialization/templates/cassandra/model_share.rb +2 -0
  15. data/lib/generators/socialization/templates/socialization_cassandra_migrations.rake +141 -0
  16. data/lib/socialization/actors/commenter.rb +79 -0
  17. data/lib/socialization/actors/follower.rb +79 -0
  18. data/lib/socialization/actors/liker.rb +79 -0
  19. data/lib/socialization/actors/mentioner.rb +79 -0
  20. data/lib/socialization/actors/sharer.rb +79 -0
  21. data/lib/socialization/config/config.rb +51 -0
  22. data/lib/socialization/helpers/acts_as_helpers.rb +49 -0
  23. data/lib/socialization/helpers/string.rb +17 -0
  24. data/lib/socialization/lib/exceptions.rb +3 -0
  25. data/lib/socialization/stores/cassandra/base.rb +149 -0
  26. data/lib/socialization/stores/cassandra/comment.rb +28 -0
  27. data/lib/socialization/stores/cassandra/config.rb +29 -0
  28. data/lib/socialization/stores/cassandra/follow.rb +36 -0
  29. data/lib/socialization/stores/cassandra/like.rb +35 -0
  30. data/lib/socialization/stores/cassandra/mixins/base.rb +8 -0
  31. data/lib/socialization/stores/cassandra/share.rb +28 -0
  32. data/lib/socialization/stores/mixins/base.rb +22 -0
  33. data/lib/socialization/stores/mixins/follow.rb +39 -0
  34. data/lib/socialization/stores/mixins/like.rb +40 -0
  35. data/lib/socialization/stores/mixins/mention.rb +40 -0
  36. data/lib/socialization/version.rb +3 -0
  37. data/lib/socialization/victims/commentable.rb +51 -0
  38. data/lib/socialization/victims/followable.rb +50 -0
  39. data/lib/socialization/victims/likeable.rb +51 -0
  40. data/lib/socialization/victims/shareable.rb +51 -0
  41. data/lib/socialization.rb +17 -0
  42. data/socialization-cassandra.gemspec +30 -0
  43. data/test/actors/follower_test.rb +129 -0
  44. data/test/actors/liker_test.rb +121 -0
  45. data/test/stores/cassandra/base_test.rb +186 -0
  46. data/test/stores/cassandra/config_test.rb +36 -0
  47. data/test/stores/cassandra/follow_store_test.rb +28 -0
  48. data/test/stores/cassandra/like_store_test.rb +26 -0
  49. data/test/string_test.rb +13 -0
  50. data/test/test_helper.rb +259 -0
  51. data/test/victims/followable_test.rb +65 -0
  52. data/test/victims/likeable_test.rb +67 -0
  53. data/test/world_test.rb +107 -0
  54. metadata +209 -0
@@ -0,0 +1,186 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/../../test_helper'
2
+
3
+ class CassandraBaseStoreTest < TestCase
4
+ include Assertions
5
+ # Testing through CassandraStores::Follow for easy testing
6
+ context "CassandraStores::Base through CassandraStores::Follow" do
7
+ setup do
8
+ use_cassandra_store
9
+ @klass = Socialization::CassandraStores::Follow
10
+ @klass.touch nil
11
+ @klass.after_follow nil
12
+ @klass.after_unfollow nil
13
+ @follower1 = ImAFollower.create
14
+ @follower2 = ImAFollower.create
15
+ @followable1 = ImAFollowable.create
16
+ @followable2 = ImAFollowable.create
17
+ end
18
+
19
+ context "Stores" do
20
+ should "inherit Socialization::CassandraStores::Follow" do
21
+ assert_equal Socialization::CassandraStores::Follow, Socialization.follow_model
22
+ end
23
+ end
24
+
25
+ context "#follow!" do
26
+ should "create follow records" do
27
+ @klass.follow!(@follower1, @followable1)
28
+ row = Socialization.cassandra_session.execute("SELECT actor_type, actor_id FROM #{@klass.forward_table_name} where victim_type='#{@followable1.class}' AND victim_id=#{@followable1.id} ALLOW FILTERING").rows.to_a.first
29
+ assert_array_similarity ["#{@follower1.class}:#{@follower1.id}"], ["#{row['actor_type']}:#{row['actor_id']}"]
30
+ row = Socialization.cassandra_session.execute("SELECT victim_type, victim_id FROM #{@klass.backward_table_name} where actor_type='#{@follower1.class}' AND actor_id=#{@follower1.id} ALLOW FILTERING").rows.to_a.last
31
+ assert_array_similarity ["#{@followable1.class}:#{@followable1.id}"], ["#{row['victim_type']}:#{row['victim_id']}"]
32
+
33
+ @klass.follow!(@follower2, @followable1)
34
+ rows = Socialization.cassandra_session.execute("SELECT actor_type, actor_id FROM #{@klass.forward_table_name} where victim_type='#{@followable1.class}' AND victim_id=#{@followable1.id} ALLOW FILTERING").rows
35
+ assert_array_similarity ["#{@follower1.class}:#{@follower1.id}", "#{@follower2.class}:#{@follower2.id}"], (rows.collect {|i| "#{i['actor_type']}:#{i['actor_id']}"})
36
+
37
+ row = Socialization.cassandra_session.execute("SELECT victim_type, victim_id FROM #{@klass.backward_table_name} where actor_type='#{@follower1.class}' AND actor_id=#{@follower1.id} ALLOW FILTERING").rows.to_a.last
38
+ assert_array_similarity ["#{@followable1.class}:#{@followable1.id}"], ["#{row['victim_type']}:#{row['victim_id']}"]
39
+ row = Socialization.cassandra_session.execute("SELECT victim_type, victim_id FROM #{@klass.backward_table_name} where actor_type='#{@follower2.class}' AND actor_id=#{@follower2.id} ALLOW FILTERING").rows.to_a.first
40
+ assert_array_similarity ["#{@followable1.class}:#{@followable1.id}"], ["#{row['victim_type']}:#{row['victim_id']}"]
41
+ end
42
+
43
+ should "touch follower when instructed" do
44
+ @klass.touch :follower
45
+ assert_send([@follower1, :touch])
46
+ assert_send([@followable1, :touch])
47
+ @klass.follow!(@follower1, @followable1)
48
+ end
49
+
50
+ should "touch followable when instructed" do
51
+ @klass.touch :followable
52
+ !assert_send([@follower1, :touch])
53
+ assert_send([@followable1, :touch])
54
+ @klass.follow!(@follower1, @followable1)
55
+ end
56
+
57
+ should "touch all when instructed" do
58
+ @klass.touch :all
59
+ assert_send([@follower1, :touch])
60
+ assert_send([@followable1, :touch])
61
+ @klass.follow!(@follower1, @followable1)
62
+ end
63
+
64
+ # should "call after follow hook" do
65
+ # @klass.after_follow :after_follow
66
+ # assert_send([@klass, :after_follow])
67
+ # @klass.follow!(@follower1, @followable1)
68
+ # end
69
+
70
+ # should "call after unfollow hook" do
71
+ # @klass.after_follow :after_unfollow
72
+ # assert_send([@klass, :after_unfollow])
73
+ # @klass.follow!(@follower1, @followable1)
74
+ # end
75
+ end
76
+
77
+ context "#unfollow!" do
78
+ setup do
79
+ @klass.follow!(@follower1, @followable1)
80
+ end
81
+
82
+ should "remove follow records" do
83
+ @klass.unfollow!(@follower1, @followable1)
84
+ assert_empty Socialization.cassandra_session.execute("SELECT * FROM #{@klass.backward_table_name} where actor_type='#{@follower1.class}' AND actor_id=#{@follower1.id} ALLOW FILTERING").rows.to_a
85
+ assert_empty Socialization.cassandra_session.execute("SELECT * FROM #{@klass.forward_table_name} where victim_type='#{@followable1.class}' AND victim_id=#{@followable1.id} ALLOW FILTERING").rows.to_a
86
+ end
87
+ end
88
+
89
+ context "#follows?" do
90
+ should "return true when follow exists" do
91
+ @klass.follow!(@follower1, @followable1)
92
+ assert_true @klass.follows?(@follower1, @followable1)
93
+ end
94
+
95
+ should "return false when follow doesn't exist" do
96
+ assert_false @klass.follows?(@follower1, @followable1)
97
+ end
98
+ end
99
+
100
+ context "#followers" do
101
+ should "return an array of followers" do
102
+ follower1 = ImAFollower.create
103
+ follower2 = ImAFollower.create
104
+ follower1.follow!(@followable1)
105
+ follower2.follow!(@followable1)
106
+ assert_array_similarity [follower1, follower2], @klass.followers(@followable1, follower1.class)
107
+ end
108
+
109
+ should "return an array of follower ids when plucking" do
110
+ follower1 = ImAFollower.create
111
+ follower2 = ImAFollower.create
112
+ follower1.follow!(@followable1)
113
+ follower2.follow!(@followable1)
114
+ assert_array_similarity [follower1.id, follower2.id], @klass.followers(@followable1, follower1.class, :pluck => :id)
115
+ end
116
+ end
117
+
118
+ context "#followables" do
119
+ should "return an array of followables" do
120
+ followable1 = ImAFollowable.create
121
+ followable2 = ImAFollowable.create
122
+ @follower1.follow!(followable1)
123
+ @follower1.follow!(followable2)
124
+
125
+ assert_array_similarity [followable1, followable2], @klass.followables(@follower1, followable1.class)
126
+ end
127
+
128
+ should "return an array of followables ids when plucking" do
129
+ followable1 = ImAFollowable.create
130
+ followable2 = ImAFollowable.create
131
+ @follower1.follow!(followable1)
132
+ @follower1.follow!(followable2)
133
+ assert_array_similarity [followable1.id, followable2.id], @klass.followables(@follower1, followable1.class, :pluck => :id)
134
+ end
135
+ end
136
+
137
+ context "#remove_followers" do
138
+ should "delete all followers relationships for a followable" do
139
+ @follower1.follow!(@followable1)
140
+ @follower2.follow!(@followable1)
141
+ assert_equal 2, @followable1.followers(@follower1.class).count
142
+
143
+ @klass.remove_followers(@followable1)
144
+ assert_equal 0, @followable1.followers(@follower1.class).count
145
+ assert_empty Socialization.cassandra_session.execute("SELECT * FROM #{@klass.forward_table_name} where victim_type='#{@followable1.class}' AND victim_id=#{@followable1.id} ALLOW FILTERING").rows.to_a
146
+ assert_empty Socialization.cassandra_session.execute("SELECT * FROM #{@klass.backward_table_name} where actor_type='#{@follower1.class}' AND actor_id=#{@follower1.id} ALLOW FILTERING").rows.to_a
147
+ assert_empty Socialization.cassandra_session.execute("SELECT * FROM #{@klass.backward_table_name} where actor_type='#{@follower2.class}' AND actor_id=#{@follower2.id} ALLOW FILTERING").rows.to_a
148
+ end
149
+ end
150
+
151
+ context "#remove_followables" do
152
+ should "delete all followables relationships for a follower" do
153
+ @follower1.follow!(@followable1)
154
+ @follower1.follow!(@followable2)
155
+ assert_equal 2, @follower1.followables(@followable1.class).count
156
+
157
+ @klass.remove_followables(@follower1)
158
+ assert_equal 0, @follower1.followables(@followable1.class).count
159
+ assert_empty Socialization.cassandra_session.execute("SELECT * FROM #{@klass.forward_table_name} where victim_type='#{@followable1.class}' AND victim_id=#{@followable1.id} ALLOW FILTERING").rows.to_a
160
+ assert_empty Socialization.cassandra_session.execute("SELECT * FROM #{@klass.backward_table_name} where actor_type='#{@follower1.class}' AND actor_id=#{@follower1.id} ALLOW FILTERING").rows.to_a
161
+ assert_empty Socialization.cassandra_session.execute("SELECT * FROM #{@klass.backward_table_name} where actor_type='#{@follower2.class}' AND actor_id=#{@follower2.id} ALLOW FILTERING").rows.to_a
162
+ # assert_empty Socialization.redis.smembers backward_key(@followable1)
163
+ # assert_empty Socialization.redis.smembers backward_key(@follower2)
164
+ # assert_empty Socialization.redis.smembers forward_key(@follower1)
165
+ end
166
+ end
167
+
168
+ end
169
+
170
+ # Helpers
171
+ def assert_match_follower(follow_record, follower)
172
+ assert follow_record.follower_type == follower.class.to_s && follow_record.follower_id == follower.id
173
+ end
174
+
175
+ def assert_match_followable(follow_record, followable)
176
+ assert follow_record.followable_type == followable.class.to_s && follow_record.followable_id == followable.id
177
+ end
178
+
179
+ def forward_key(followable)
180
+ Socialization::CassandraStores::Follow.send(:forward_table_name)
181
+ end
182
+
183
+ def backward_key(follower)
184
+ Socialization::CassandraStores::Follow.send(:backward_table_name)
185
+ end
186
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/../../test_helper'
2
+
3
+ class CassandraStoreConfigTest < Minitest::Test
4
+ context "cassandra" do
5
+ setup do
6
+ Socialization.instance_eval {
7
+ @cassandra = nil
8
+ @cas_keyspace = nil
9
+ @cassandra_session = nil
10
+ }
11
+ end
12
+
13
+ should "return a new cassandra object when none were specified" do
14
+ assert_instance_of Cassandra::Session, Socialization.cassandra_session
15
+ end
16
+
17
+ #should "always return the same Cassandra object when none were specified" do
18
+ # cassandra_session = Socialization.cassandra_session
19
+ # assert_same cassandra_session, Socialization.cassandra_session
20
+ #end
21
+
22
+ # should "be able to set and get a cassandra instance" do
23
+ # cluster = Cassandra.cluster
24
+ # Socialization.cassandra = cluster
25
+ # Socialization.keyspace = 'system'
26
+ # session = cluster.connect('system')
27
+ # assert_same session, Socialization.cassandra_session
28
+ # end
29
+
30
+ #should "always return the same Redis object when it was specified" do
31
+ # redis = Redis.new
32
+ # Socialization.redis = redis
33
+ # assert_same redis, Socialization.redis
34
+ #end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/../../test_helper'
2
+ # require './../../test_helper'
3
+
4
+ class CassandraFollowStoreTest < Minitest::Test
5
+ include Assertions
6
+ context "CassandraStores::Follow" do
7
+ setup do
8
+ @klass = Socialization::CassandraStores::Follow
9
+ @base = Socialization::CassandraStores::Base
10
+ end
11
+
12
+ context "method aliases" do
13
+ should "be set properly and made public" do
14
+ # TODO: Can't figure out how to test method aliases properly. The following doesn't work:
15
+ # assert @klass.method(:follow!) == @base.method(:relation!)
16
+ assert_method_public @klass, :follow!
17
+ assert_method_public @klass, :unfollow!
18
+ assert_method_public @klass, :follows?
19
+ assert_method_public @klass, :followers_relation
20
+ assert_method_public @klass, :followers
21
+ assert_method_public @klass, :followables_relation
22
+ assert_method_public @klass, :followables
23
+ assert_method_public @klass, :remove_followers
24
+ assert_method_public @klass, :remove_followables
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/../../test_helper'
2
+
3
+
4
+ class CassandraLikeStoreTest < Minitest::Test
5
+ include Assertions
6
+ context "CassandraStores::Like" do
7
+ setup do
8
+ @klass = Socialization::CassandraStores::Like
9
+ @base = Socialization::CassandraStores::Base
10
+ end
11
+
12
+ context "method aliases" do
13
+ should "be set properly and made public" do
14
+ assert_method_public @klass, :like!
15
+ assert_method_public @klass, :unlike!
16
+ assert_method_public @klass, :likes?
17
+ assert_method_public @klass, :likers_relation
18
+ assert_method_public @klass, :likers
19
+ assert_method_public @klass, :likeables_relation
20
+ assert_method_public @klass, :likeables
21
+ assert_method_public @klass, :remove_likers
22
+ assert_method_public @klass, :remove_likeables
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/test_helper'
2
+
3
+ class StringTest < Minitest::Test
4
+ context "#deep_const_get" do
5
+ should "return a class" do
6
+ assert_equal Socialization, "Socialization".deep_const_get
7
+ assert_equal Socialization::CassandraStores, "Socialization::CassandraStores".deep_const_get
8
+ assert_equal Socialization::CassandraStores::Follow, "Socialization::CassandraStores::Follow".deep_const_get
9
+
10
+ assert_raises(NameError) { "Foo::Bar".deep_const_get }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,259 @@
1
+ $MOCK_REDIS = true
2
+
3
+ require 'rubygems'
4
+ require 'active_record'
5
+ require 'shoulda'
6
+ # require 'test/unit'
7
+ require 'logger'
8
+ require 'mocha' # mocha always needs to be loaded last! http://stackoverflow.com/questions/3118866/mocha-mock-carries-to-another-test/4375296#4375296
9
+ # require 'pry'
10
+ require 'minitest/autorun'
11
+ require 'cassandra'
12
+
13
+ $:.push File.expand_path("../lib", __FILE__)
14
+ require "socialization"
15
+
16
+ module Assertions
17
+ def assert_true(object, message="")
18
+ assert_equal(true, object, message)
19
+ end
20
+
21
+ def assert_false(object, message="")
22
+ assert_equal(false, object, message)
23
+ end
24
+
25
+ def build_message(head, template=nil, *arguments) #:nodoc:
26
+ template &&= template.chomp
27
+ template.gsub(/\G((?:[^\\]|\\.)*?)(\\)?\?/) { $1 + ($2 ? "?" : mu_pp(arguments.shift)) }
28
+ end
29
+
30
+ def assert_array_similarity(expected, actual, message=nil)
31
+ full_message = build_message(message, "<?> expected but was\n<?>.\n", expected, actual)
32
+ assert((expected.size == actual.size) && (expected - actual == []), full_message)
33
+ # assert_block(full_message) { (expected.size == actual.size) && (expected - actual == []) }
34
+ end
35
+
36
+ def assert_empty(obj, msg = nil)
37
+ msg = "Expected #{obj.inspect} to be empty" unless msg
38
+ assert_respond_to obj, :empty?
39
+ assert obj.empty?, msg
40
+ end
41
+
42
+ def assert_method_public(obj, method, msg = nil)
43
+ msg = "Expected method #{obj}.#{method} to be public."
44
+ method = if RUBY_VERSION.match(/^1\.8/)
45
+ method.to_s
46
+ else
47
+ method.to_s.to_sym
48
+ end
49
+
50
+ assert obj.public_methods.include?(method), msg
51
+ end
52
+ end
53
+
54
+ class TestCase < Minitest::Test
55
+ def setup
56
+ use_cassandra_store
57
+ end
58
+
59
+ def teardown
60
+ session = Socialization.cassandra_session
61
+ # ['likes', 'likers', 'liker_counter', 'followings', 'followers', 'following_counter', 'follower_counter', 'comments', 'comment_counter', 'shares', 'share_counter'].each {|t| session.execute("TRUNCATE #{t}")}
62
+ ['likes', 'likers', 'liker_counter', 'followings', 'followers', 'following_counter', 'follower_counter'].each {|t| session.execute("TRUNCATE #{t}")}
63
+ end
64
+ end
65
+
66
+ def use_cassandra_store
67
+ Socialization.follow_model = Socialization::CassandraStores::Follow
68
+ Socialization.comment_model = Socialization::CassandraStores::Comment
69
+ Socialization.share_model = Socialization::CassandraStores::Share
70
+ Socialization.like_model = Socialization::CassandraStores::Like
71
+ setup_model_shortcuts
72
+ end
73
+
74
+ def setup_model_shortcuts
75
+ $Follow = Socialization.follow_model
76
+ $Comment = Socialization.comment_model
77
+ $Share = Socialization.share_model
78
+ $Like = Socialization.like_model
79
+ end
80
+
81
+ ActiveRecord::Base.configurations = {'sqlite3' => {:adapter => 'sqlite3', :database => ':memory:'}}
82
+ ActiveRecord::Base.establish_connection(:sqlite3)
83
+
84
+ ActiveRecord::Base.logger = Logger.new(STDERR)
85
+ ActiveRecord::Base.logger.level = Logger::WARN
86
+
87
+ ActiveRecord::Migration.verbose = false
88
+ ActiveRecord::Schema.define(:version => 0) do
89
+ create_table :users do |t|
90
+ t.string :name
91
+ end
92
+
93
+ create_table :celebrities do |t|
94
+ t.string :name
95
+ end
96
+
97
+ create_table :movies do |t|
98
+ t.string :name
99
+ end
100
+
101
+ create_table :follows do |t|
102
+ t.string :follower_type
103
+ t.integer :follower_id
104
+ t.string :followable_type
105
+ t.integer :followable_id
106
+ t.datetime :created_at
107
+ end
108
+
109
+ create_table :likes do |t|
110
+ t.string :liker_type
111
+ t.integer :liker_id
112
+ t.string :likeable_type
113
+ t.integer :likeable_id
114
+ t.datetime :created_at
115
+ end
116
+
117
+ create_table :comments do |t|
118
+ t.string :commenter_type
119
+ t.integer :commenter_id
120
+ t.string :commentable_type
121
+ t.integer :commentable_id
122
+ t.datetime :created_at
123
+ end
124
+
125
+ create_table :shares do |t|
126
+ t.string :sharer_type
127
+ t.integer :sharer_id
128
+ t.string :shareable_type
129
+ t.integer :shareable_id
130
+ t.datetime :created_at
131
+ end
132
+
133
+ create_table :im_a_followers do |t|
134
+ t.datetime :created_at
135
+ t.datetime :updated_at
136
+ end
137
+
138
+ create_table :im_a_followables do |t|
139
+ t.datetime :created_at
140
+ t.datetime :updated_at
141
+ end
142
+
143
+ create_table :im_a_likers do |t|
144
+ t.datetime :created_at
145
+ t.datetime :updated_at
146
+ end
147
+
148
+ create_table :im_a_likeables do |t|
149
+ t.datetime :created_at
150
+ t.datetime :updated_at
151
+ end
152
+
153
+ create_table :im_a_commenters do |t|
154
+ t.datetime :created_at
155
+ t.datetime :updated_at
156
+ end
157
+
158
+ create_table :im_a_commentables do |t|
159
+ t.datetime :created_at
160
+ t.datetime :updated_at
161
+ end
162
+
163
+ create_table :im_a_commenter_and_commentables do |t|
164
+ t.datetime :created_at
165
+ t.datetime :updated_at
166
+ end
167
+
168
+ create_table :im_a_sharers do |t|
169
+ t.datetime :created_at
170
+ t.datetime :updated_at
171
+ end
172
+
173
+ create_table :im_a_shareables do |t|
174
+ t.datetime :created_at
175
+ t.datetime :updated_at
176
+ end
177
+
178
+ create_table :im_a_sharer_and_shareables do |t|
179
+ t.datetime :created_at
180
+ t.datetime :updated_at
181
+ end
182
+
183
+ create_table :vanillas do |t|
184
+ t.datetime :created_at
185
+ t.datetime :updated_at
186
+ end
187
+ end
188
+
189
+ class Celebrity < ActiveRecord::Base
190
+ acts_as_followable
191
+ end
192
+
193
+ class User < ActiveRecord::Base
194
+ acts_as_follower
195
+ acts_as_followable
196
+ acts_as_liker
197
+ acts_as_likeable
198
+ acts_as_commenter
199
+ acts_as_sharer
200
+ end
201
+
202
+ class Movie < ActiveRecord::Base
203
+ acts_as_likeable
204
+ acts_as_commentable
205
+ acts_as_shareable
206
+ end
207
+
208
+ class ImAFollower < ActiveRecord::Base
209
+ acts_as_follower
210
+ end
211
+ class ImAFollowerChild < ImAFollower; end
212
+
213
+ class ImAFollowable < ActiveRecord::Base
214
+ acts_as_followable
215
+ end
216
+ class ImAFollowableChild < ImAFollowable; end
217
+
218
+ class ImALiker < ActiveRecord::Base
219
+ acts_as_liker
220
+ end
221
+ class ImALikerChild < ImALiker; end
222
+
223
+ class ImALikeable < ActiveRecord::Base
224
+ acts_as_likeable
225
+ end
226
+ class ImALikeableChild < ImALikeable; end
227
+
228
+ class ImACommenter < ActiveRecord::Base
229
+ acts_as_commenter
230
+ end
231
+ class ImACommenterChild < ImACommenter; end
232
+
233
+ class ImACommentable < ActiveRecord::Base
234
+ acts_as_commentable
235
+ end
236
+ class ImACommentableChild < ImACommentable; end
237
+
238
+ class ImACommenterAndCommentable < ActiveRecord::Base
239
+ acts_as_commenter
240
+ acts_as_commentable
241
+ end
242
+
243
+ class ImASharer < ActiveRecord::Base
244
+ acts_as_sharer
245
+ end
246
+ class ImASharerChild < ImASharer; end
247
+
248
+ class ImAShareable < ActiveRecord::Base
249
+ acts_as_shareable
250
+ end
251
+ class ImAShareableChild < ImAShareable; end
252
+
253
+ class ImASharerAndShareable < ActiveRecord::Base
254
+ acts_as_sharer
255
+ acts_as_shareable
256
+ end
257
+
258
+ class Vanilla < ActiveRecord::Base
259
+ end
@@ -0,0 +1,65 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class FollowableTest < TestCase
4
+ include Assertions
5
+ context "Followable" do
6
+ setup do
7
+ # @follower = ImAFollower.new
8
+ @follower = ImAFollower.create
9
+ @followable = ImAFollowable.create
10
+ end
11
+
12
+ context "#is_followable?" do
13
+ should "return true" do
14
+ assert_true @followable.is_followable?
15
+ end
16
+ end
17
+
18
+ context "#followable?" do
19
+ should "return true" do
20
+ assert_true @followable.followable?
21
+ end
22
+ end
23
+
24
+ context "#followed_by?" do
25
+ should "not accept non-followers" do
26
+ assert_raises(Socialization::ArgumentError) { @followable.followed_by?(:foo) }
27
+ end
28
+
29
+ should "call $Follow.follows?" do
30
+ Minitest::Mock.new.expect(:check, false) do
31
+ $Follow.follows?(@follower, @followable)
32
+ end
33
+ # assert_send([$Follow, :follows?, *[@follower, @followable]])
34
+ @followable.followed_by?(@follower)
35
+ end
36
+ end
37
+
38
+ context "#followers" do
39
+ should "call $Follow.followers" do
40
+ assert_send([$Follow, :followers, *[@followable, @follower.class, { :foo => :bar }]])
41
+ @followable.followers(@follower.class, { :foo => :bar })
42
+ end
43
+ end
44
+
45
+ context "#followers_relation" do
46
+ should "call $Follow.followers_relation" do
47
+ assert_send([$Follow, :followers_relation, *[@followable, @follower.class, { :foo => :bar }]])
48
+ @followable.followers_relation(@follower.class, { :foo => :bar })
49
+ end
50
+ end
51
+
52
+ context "deleting a followable" do
53
+ setup do
54
+ @follower = ImAFollower.create
55
+ @follower.follow!(@followable)
56
+ end
57
+
58
+ should "remove follow relationships" do
59
+ assert_send([Socialization.follow_model, :remove_followers, *[@followable]])
60
+ @followable.destroy
61
+ end
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,67 @@
1
+ require File.expand_path(File.dirname(__FILE__))+'/../test_helper'
2
+
3
+ class LikeableTest < TestCase
4
+ include Assertions
5
+ context "Likeable" do
6
+ setup do
7
+ #@liker = ImALiker.new
8
+ @liker = ImALiker.create
9
+ @likeable = ImALikeable.create
10
+ end
11
+
12
+ context "#is_likeable?" do
13
+ should "return true" do
14
+ assert @likeable.is_likeable?
15
+ end
16
+ end
17
+
18
+ context "#likeable?" do
19
+ should "return true" do
20
+ assert @likeable.likeable?
21
+ end
22
+ end
23
+
24
+ context "#liked_by?" do
25
+ should "not accept non-likers" do
26
+ assert_raises(Socialization::ArgumentError) { @likeable.liked_by?(:foo) }
27
+ end
28
+
29
+ # should "call $Like.likes?" do
30
+ # # $Like.expect(:likes?).with(@liker, @likeable).once
31
+ # assert_send([$Like, :likes?, *[@liker, @likeable]])
32
+ # @likeable.liked_by?(@liker)
33
+ # end
34
+ end
35
+
36
+ context "#likers" do
37
+ should "call $Like.likers" do
38
+ # $Like.expect(:likers).with(@likeable, @liker.class, { :foo => :bar })
39
+ assert_send([$Like, :likers, *[@likeable, @liker.class, { :foo => :bar }]])
40
+ @likeable.likers(@liker.class, { :foo => :bar })
41
+ end
42
+ end
43
+
44
+ context "#likers_relation" do
45
+ should "call $Like.likers_relation" do
46
+ # $Like.expect(:likers_relation).with(@likeable, @liker.class, { :foo => :bar })
47
+ assert_send([$Like, :likers_relation, *[@likeable, @liker.class, { :foo => :bar }]])
48
+ @likeable.likers_relation(@liker.class, { :foo => :bar })
49
+ end
50
+ end
51
+
52
+ context "deleting a likeable" do
53
+ setup do
54
+ @liker = ImALiker.create
55
+ @liker.save!
56
+ @liker.like!(@likeable)
57
+ end
58
+
59
+ should "remove like relationships" do
60
+ assert_send([Socialization.like_model, :remove_likers, *[@likeable]])
61
+ # Socialization.like_model.expect(:remove_likers).with(@likeable)
62
+ @likeable.destroy
63
+ end
64
+ end
65
+
66
+ end
67
+ end