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.
- data/.gitignore +5 -1
- data/CHANGELOG.md +41 -0
- data/README.md +246 -0
- data/demo/{demo_app/.gitignore → .gitignore} +0 -0
- data/demo/{demo_app/Gemfile → Gemfile} +1 -1
- data/demo/{demo_app/README.rdoc → README.rdoc} +0 -0
- data/demo/{demo_app/Rakefile → Rakefile} +0 -0
- data/demo/{demo_app/app → app}/assets/images/rails.png +0 -0
- data/demo/{demo_app/app → app}/assets/javascripts/application.js +0 -0
- data/demo/{demo_app/app → app}/assets/stylesheets/application.css +0 -0
- data/demo/{demo_app/app → app}/controllers/application_controller.rb +0 -0
- data/demo/{demo_app/app → app}/helpers/application_helper.rb +0 -0
- data/demo/{demo_app/app → app}/mailers/.gitkeep +0 -0
- data/demo/{demo_app/app → app}/models/.gitkeep +0 -0
- data/demo/{demo_app/app → app}/models/celebrity.rb +0 -0
- data/demo/{demo_app/app → app}/models/comment.rb +0 -0
- data/demo/app/models/follow.rb +2 -0
- data/demo/app/models/like.rb +2 -0
- data/demo/app/models/mention.rb +2 -0
- data/demo/{demo_app/app → app}/models/movie.rb +0 -0
- data/demo/{demo_app/app → app}/models/user.rb +0 -0
- data/demo/{demo_app/app → app}/views/layouts/application.html.erb +0 -0
- data/demo/{demo_app/config.ru → config.ru} +0 -0
- data/demo/{demo_app/config → config}/application.rb +0 -0
- data/demo/{demo_app/config → config}/boot.rb +0 -0
- data/demo/{demo_app/config → config}/database.yml +0 -0
- data/demo/{demo_app/config → config}/environment.rb +0 -0
- data/demo/{demo_app/config → config}/environments/development.rb +0 -0
- data/demo/{demo_app/config → config}/environments/production.rb +0 -0
- data/demo/{demo_app/config → config}/environments/test.rb +0 -0
- data/demo/{demo_app/config → config}/initializers/backtrace_silencers.rb +0 -0
- data/demo/{demo_app/config → config}/initializers/inflections.rb +0 -0
- data/demo/{demo_app/config → config}/initializers/mime_types.rb +0 -0
- data/demo/{demo_app/config → config}/initializers/secret_token.rb +0 -0
- data/demo/{demo_app/config → config}/initializers/session_store.rb +1 -1
- data/demo/{demo_app/config → config}/initializers/wrap_parameters.rb +1 -1
- data/demo/{demo_app/config → config}/locales/en.yml +0 -0
- data/demo/{demo_app/config → config}/routes.rb +0 -0
- data/demo/{demo_app/db → db}/migrate/20120115051222_create_users.rb +0 -0
- data/demo/{demo_app/db → db}/migrate/20120115051234_create_movies.rb +0 -0
- data/demo/{demo_app/db → db}/migrate/20120115051255_create_celebrities.rb +0 -0
- data/demo/{demo_app/db → db}/migrate/20120115054646_create_follows.rb +0 -0
- data/demo/{demo_app/db → db}/migrate/20120115054647_create_likes.rb +0 -0
- data/demo/{demo_app/db → db}/migrate/20120221200644_create_mentions.rb +0 -0
- data/demo/{demo_app/db → db}/migrate/20120221202703_create_comments.rb +0 -0
- data/demo/{demo_app/db → db}/schema.rb +0 -1
- data/demo/{demo_app/db → db}/seeds.rb +0 -0
- data/demo/{demo_app/lib → lib}/assets/.gitkeep +0 -0
- data/demo/{demo_app/lib → lib}/tasks/.gitkeep +0 -0
- data/demo/{demo_app/public → public}/404.html +0 -0
- data/demo/{demo_app/public → public}/422.html +0 -0
- data/demo/{demo_app/public → public}/500.html +0 -0
- data/demo/{demo_app/public → public}/favicon.ico +0 -0
- data/demo/{demo_app/public → public}/index.html +0 -0
- data/demo/{demo_app/public → public}/robots.txt +0 -0
- data/demo/{demo_app/script → script}/rails +0 -0
- data/demo/{demo_app/test → test}/fixtures/.gitkeep +0 -0
- data/demo/{demo_app/test → test}/fixtures/celebrities.yml +0 -0
- data/demo/{demo_app/test → test}/fixtures/movies.yml +0 -0
- data/demo/{demo_app/test → test}/fixtures/users.yml +0 -0
- data/demo/{demo_app/test → test}/functional/.gitkeep +0 -0
- data/demo/{demo_app/test → test}/integration/.gitkeep +0 -0
- data/demo/{demo_app/test → test}/performance/browsing_test.rb +0 -0
- data/demo/{demo_app/test → test}/test_helper.rb +0 -0
- data/demo/{demo_app/test → test}/unit/.gitkeep +0 -0
- data/demo/{demo_app/test → test}/unit/celebrity_test.rb +0 -0
- data/demo/{demo_app/test → test}/unit/movie_test.rb +0 -0
- data/demo/{demo_app/test → test}/unit/user_test.rb +0 -0
- data/demo/{demo_app/vendor → vendor}/assets/javascripts/.gitkeep +0 -0
- data/demo/{demo_app/vendor → vendor}/assets/stylesheets/.gitkeep +0 -0
- data/demo/{demo_app/vendor → vendor}/plugins/.gitkeep +0 -0
- data/lib/generators/socialization/socialization_generator.rb +20 -9
- data/{generators/socialization/templates → lib/generators/socialization/templates/active_record}/migration_follows.rb +0 -0
- data/{generators/socialization/templates → lib/generators/socialization/templates/active_record}/migration_likes.rb +0 -0
- data/{generators/socialization/templates → lib/generators/socialization/templates/active_record}/migration_mentions.rb +0 -0
- data/lib/generators/socialization/templates/active_record/model_follow.rb +2 -0
- data/lib/generators/socialization/templates/active_record/model_like.rb +2 -0
- data/lib/generators/socialization/templates/active_record/model_mention.rb +2 -0
- data/lib/socialization.rb +3 -5
- data/lib/socialization/actors/follower.rb +74 -0
- data/lib/socialization/actors/liker.rb +74 -0
- data/lib/socialization/actors/mentioner.rb +74 -0
- data/lib/socialization/acts_as_helpers.rb +43 -0
- data/lib/socialization/config.rb +45 -0
- data/lib/socialization/helpers/string.rb +17 -0
- data/lib/socialization/stores/active_record/follow_store.rb +143 -0
- data/lib/socialization/stores/active_record/like_store.rb +143 -0
- data/lib/socialization/stores/active_record/mention_store.rb +143 -0
- data/lib/socialization/stores/redis/base.rb +8 -0
- data/lib/socialization/stores/redis/config.rb +11 -0
- data/lib/socialization/stores/redis/follow_store.rb +126 -0
- data/lib/socialization/stores/redis/like_store.rb +126 -0
- data/lib/socialization/stores/redis/mention_store.rb +126 -0
- data/lib/socialization/version.rb +1 -1
- data/lib/socialization/victims/followable.rb +38 -0
- data/lib/socialization/victims/likeable.rb +38 -0
- data/lib/socialization/victims/mentionable.rb +38 -0
- data/socialization.gemspec +3 -3
- data/test/actors/follower_test.rb +74 -0
- data/test/actors/liker_test.rb +74 -0
- data/test/actors/mentioner_test.rb +74 -0
- data/test/stores/active_record/follow_store_test.rb +121 -0
- data/test/stores/active_record/like_store_test.rb +121 -0
- data/test/stores/active_record/mention_store_test.rb +121 -0
- data/test/stores/redis/config_test.rb +30 -0
- data/test/stores/redis/follow_store_test.rb +153 -0
- data/test/stores/redis/like_store_test.rb +153 -0
- data/test/stores/redis/mention_store_test.rb +153 -0
- data/test/string_test.rb +13 -0
- data/test/test_helper.rb +70 -12
- data/test/victims/followable_test.rb +34 -0
- data/test/victims/likeable_test.rb +34 -0
- data/test/victims/mentionable_test.rb +34 -0
- data/test/world_test.rb +80 -69
- metadata +261 -176
- data/README.rdoc +0 -186
- data/demo/demo_app/app/models/follow.rb +0 -3
- data/demo/demo_app/app/models/like.rb +0 -3
- data/demo/demo_app/app/models/mention.rb +0 -3
- data/demo/demo_app/doc/README_FOR_APP +0 -2
- data/gemfiles/activerecord30.gemfile +0 -6
- data/gemfiles/activerecord30.gemfile.lock +0 -23
- data/gemfiles/activerecord31.gemfile +0 -6
- data/gemfiles/activerecord31.gemfile.lock +0 -25
- data/gemfiles/activerecord32.gemfile +0 -6
- data/gemfiles/activerecord32.gemfile.lock +0 -25
- data/generators/socialization/USAGE +0 -1
- data/generators/socialization/socialization_generator.rb +0 -15
- data/generators/socialization/templates/model_follow.rb +0 -3
- data/generators/socialization/templates/model_like.rb +0 -3
- data/generators/socialization/templates/model_mention.rb +0 -3
- data/lib/socialization/follow_store.rb +0 -14
- data/lib/socialization/followable.rb +0 -34
- data/lib/socialization/follower.rb +0 -50
- data/lib/socialization/hello.rb +0 -53
- data/lib/socialization/like_store.rb +0 -14
- data/lib/socialization/likeable.rb +0 -34
- data/lib/socialization/liker.rb +0 -54
- data/lib/socialization/mention_store.rb +0 -14
- data/lib/socialization/mentionable.rb +0 -36
- data/lib/socialization/mentioner.rb +0 -54
- data/test/follow_test.rb +0 -125
- data/test/like_test.rb +0 -125
- data/test/mention_test.rb +0 -116
@@ -0,0 +1,153 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__))+'/../../test_helper'
|
2
|
+
|
3
|
+
class RedisMentionStoreTest < Test::Unit::TestCase
|
4
|
+
context "RedisStores::MentionStoreTest" do
|
5
|
+
setup do
|
6
|
+
use_redis_store
|
7
|
+
@klass = Socialization::RedisStores::MentionStore
|
8
|
+
@klass.touch nil
|
9
|
+
@klass.after_mention nil
|
10
|
+
@klass.after_unmention nil
|
11
|
+
@mentioner = ImAMentioner.create
|
12
|
+
@mentionable = ImAMentionable.create
|
13
|
+
end
|
14
|
+
|
15
|
+
context "Stores" do
|
16
|
+
should "inherit Socialization::RedisStores::MentionStore" do
|
17
|
+
assert_equal Socialization::RedisStores::MentionStore, Socialization.mention_model
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "#mention!" do
|
22
|
+
should "create a Mention record" do
|
23
|
+
@klass.mention!(@mentioner, @mentionable)
|
24
|
+
assert_equal ["#{@mentioner.id}"], Socialization.redis.smembers(mentioners_key)
|
25
|
+
assert_equal ["#{@mentionable.id}"], Socialization.redis.smembers(mentionables_key)
|
26
|
+
end
|
27
|
+
|
28
|
+
should "touch mentioner when instructed" do
|
29
|
+
@klass.touch :mentioner
|
30
|
+
@mentioner.expects(:touch).once
|
31
|
+
@mentionable.expects(:touch).never
|
32
|
+
@klass.mention!(@mentioner, @mentionable)
|
33
|
+
end
|
34
|
+
|
35
|
+
should "touch mentionable when instructed" do
|
36
|
+
@klass.touch :mentionable
|
37
|
+
@mentioner.expects(:touch).never
|
38
|
+
@mentionable.expects(:touch).once
|
39
|
+
@klass.mention!(@mentioner, @mentionable)
|
40
|
+
end
|
41
|
+
|
42
|
+
should "touch all when instructed" do
|
43
|
+
@klass.touch :all
|
44
|
+
@mentioner.expects(:touch).once
|
45
|
+
@mentionable.expects(:touch).once
|
46
|
+
@klass.mention!(@mentioner, @mentionable)
|
47
|
+
end
|
48
|
+
|
49
|
+
should "call after mention hook" do
|
50
|
+
@klass.after_mention :after_mention
|
51
|
+
@klass.expects(:after_mention).once
|
52
|
+
@klass.mention!(@mentioner, @mentionable)
|
53
|
+
end
|
54
|
+
|
55
|
+
should "call after unmention hook" do
|
56
|
+
@klass.after_mention :after_unmention
|
57
|
+
@klass.expects(:after_unmention).once
|
58
|
+
@klass.mention!(@mentioner, @mentionable)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "#mentions?" do
|
63
|
+
should "return true when mention exists" do
|
64
|
+
Socialization.redis.sadd mentioners_key, @mentioner.id
|
65
|
+
Socialization.redis.sadd mentionables_key, @mentionable.id
|
66
|
+
assert_true @klass.mentions?(@mentioner, @mentionable)
|
67
|
+
end
|
68
|
+
|
69
|
+
should "return false when mention doesn't exist" do
|
70
|
+
assert_false @klass.mentions?(@mentioner, @mentionable)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "#mentioners" do
|
75
|
+
should "return an array of mentioners" do
|
76
|
+
mentioner1 = ImAMentioner.create
|
77
|
+
mentioner2 = ImAMentioner.create
|
78
|
+
mentioner1.mention!(@mentionable)
|
79
|
+
mentioner2.mention!(@mentionable)
|
80
|
+
assert_array_similarity [mentioner1, mentioner2], @klass.mentioners(@mentionable, mentioner1.class)
|
81
|
+
end
|
82
|
+
|
83
|
+
should "return an array of mentioner ids when plucking" do
|
84
|
+
mentioner1 = ImAMentioner.create
|
85
|
+
mentioner2 = ImAMentioner.create
|
86
|
+
mentioner1.mention!(@mentionable)
|
87
|
+
mentioner2.mention!(@mentionable)
|
88
|
+
assert_array_similarity [mentioner1.id, mentioner2.id], @klass.mentioners(@mentionable, mentioner1.class, :pluck => :id)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "#mentionables" do
|
93
|
+
should "return an array of mentionables" do
|
94
|
+
mentionable1 = ImAMentionable.create
|
95
|
+
mentionable2 = ImAMentionable.create
|
96
|
+
@mentioner.mention!(mentionable1)
|
97
|
+
@mentioner.mention!(mentionable2)
|
98
|
+
|
99
|
+
assert_array_similarity [mentionable1, mentionable2], @klass.mentionables(@mentioner, mentionable1.class)
|
100
|
+
end
|
101
|
+
|
102
|
+
should "return an array of mentionables ids when plucking" do
|
103
|
+
mentionable1 = ImAMentionable.create
|
104
|
+
mentionable2 = ImAMentionable.create
|
105
|
+
@mentioner.mention!(mentionable1)
|
106
|
+
@mentioner.mention!(mentionable2)
|
107
|
+
assert_array_similarity [mentionable1.id, mentionable2.id], @klass.mentionables(@mentioner, mentionable1.class, :pluck => :id)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "#generate_mentioners_key" do
|
112
|
+
should "return valid key when passed objects" do
|
113
|
+
assert_equal "Mentioners:ImAMentionable:#{@mentionable.id}:ImAMentioner", mentioners_key(@mentioner, @mentionable)
|
114
|
+
end
|
115
|
+
|
116
|
+
should "return valid key when mentioner is a class" do
|
117
|
+
assert_equal "Mentioners:ImAMentionable:#{@mentionable.id}:ImAMentioner", mentioners_key(@mentioner.class, @mentionable)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "#generate_mentionables_key" do
|
122
|
+
should "return valid key when passed objects" do
|
123
|
+
assert_equal "Mentionables:ImAMentioner:#{@mentioner.id}:ImAMentionable", mentionables_key(@mentioner, @mentionable)
|
124
|
+
end
|
125
|
+
|
126
|
+
should "return valid key when mentionable is a class" do
|
127
|
+
assert_equal "Mentionables:ImAMentioner:#{@mentioner.id}:ImAMentionable", mentionables_key(@mentioner, @mentionable.class)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
# Helpers
|
134
|
+
def assert_match_mentioner(mention_record, mentioner)
|
135
|
+
assert mention_record.mentioner_type == mentioner.class.to_s && mention_record.mentioner_id == mentioner.id
|
136
|
+
end
|
137
|
+
|
138
|
+
def assert_match_mentionable(mention_record, mentionable)
|
139
|
+
assert mention_record.mentionable_type == mentionable.class.to_s && mention_record.mentionable_id == mentionable.id
|
140
|
+
end
|
141
|
+
|
142
|
+
def mentioners_key(mentioner = nil, mentionable = nil)
|
143
|
+
mentioner ||= @mentioner
|
144
|
+
mentionable ||= @mentionable
|
145
|
+
@klass.send(:generate_mentioners_key, mentioner, mentionable)
|
146
|
+
end
|
147
|
+
|
148
|
+
def mentionables_key(mentioner = nil, mentionable = nil)
|
149
|
+
mentioner ||= @mentioner
|
150
|
+
mentionable ||= @mentionable
|
151
|
+
@klass.send(:generate_mentionables_key, mentioner, mentionable)
|
152
|
+
end
|
153
|
+
end
|
data/test/string_test.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__))+'/test_helper'
|
2
|
+
|
3
|
+
class StringTest < Test::Unit::TestCase
|
4
|
+
context "#deep_const_get" do
|
5
|
+
should "return a class" do
|
6
|
+
assert_equal Socialization, "Socialization".deep_const_get
|
7
|
+
assert_equal Socialization::ActiveRecordStores, "Socialization::ActiveRecordStores".deep_const_get
|
8
|
+
assert_equal Socialization::ActiveRecordStores::FollowStore, "Socialization::ActiveRecordStores::FollowStore".deep_const_get
|
9
|
+
|
10
|
+
assert_raise(NameError) { "Foo::Bar".deep_const_get }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,19 +1,79 @@
|
|
1
|
+
$MOCK_REDIS = true
|
2
|
+
|
1
3
|
require 'rubygems'
|
2
4
|
require 'active_record'
|
3
|
-
require 'mocha'
|
4
5
|
require 'shoulda'
|
5
6
|
require 'test/unit'
|
6
7
|
require 'logger'
|
8
|
+
require 'mock_redis' if $MOCK_REDIS
|
9
|
+
require 'redis' unless $MOCK_REDIS
|
10
|
+
require 'mocha' # mocha always needs to be loaded last! http://stackoverflow.com/questions/3118866/mocha-mock-carries-to-another-test/4375296#4375296
|
7
11
|
|
8
12
|
$:.push File.expand_path("../lib", __FILE__)
|
9
13
|
require "socialization"
|
10
14
|
|
15
|
+
silence_warnings do
|
16
|
+
Redis = MockRedis if $MOCK_REDIS # Magic!
|
17
|
+
end
|
18
|
+
|
19
|
+
module Test::Unit::Assertions
|
20
|
+
def assert_true(object, message="")
|
21
|
+
assert_equal(true, object, message)
|
22
|
+
end
|
23
|
+
|
24
|
+
def assert_false(object, message="")
|
25
|
+
assert_equal(false, object, message)
|
26
|
+
end
|
27
|
+
|
28
|
+
def assert_array_similarity(expected, actual, message=nil)
|
29
|
+
full_message = build_message(message, "<?> expected but was\n<?>.\n", expected, actual)
|
30
|
+
assert_block(full_message) { (expected.size == actual.size) && (expected - actual == []) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Test::Unit::TestCase
|
35
|
+
def setup
|
36
|
+
use_ar_store
|
37
|
+
end
|
38
|
+
|
39
|
+
def teardown
|
40
|
+
clear_redis
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def use_redis_store
|
45
|
+
Socialization.follow_model = Socialization::RedisStores::FollowStore
|
46
|
+
Socialization.mention_model = Socialization::RedisStores::MentionStore
|
47
|
+
Socialization.like_model = Socialization::RedisStores::LikeStore
|
48
|
+
setup_model_shortcuts
|
49
|
+
end
|
50
|
+
|
51
|
+
def use_ar_store
|
52
|
+
Socialization.follow_model = Socialization::ActiveRecordStores::FollowStore
|
53
|
+
Socialization.mention_model = Socialization::ActiveRecordStores::MentionStore
|
54
|
+
Socialization.like_model = Socialization::ActiveRecordStores::LikeStore
|
55
|
+
setup_model_shortcuts
|
56
|
+
end
|
57
|
+
|
58
|
+
def setup_model_shortcuts
|
59
|
+
$Follow = Socialization.follow_model
|
60
|
+
$Mention = Socialization.mention_model
|
61
|
+
$Like = Socialization.like_model
|
62
|
+
end
|
63
|
+
|
64
|
+
def clear_redis
|
65
|
+
Socialization.redis.keys(nil).each do |k|
|
66
|
+
Socialization.redis.del k
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
11
70
|
ActiveRecord::Base.configurations = {'sqlite3' => {:adapter => 'sqlite3', :database => ':memory:'}}
|
12
71
|
ActiveRecord::Base.establish_connection('sqlite3')
|
13
72
|
|
14
73
|
ActiveRecord::Base.logger = Logger.new(STDERR)
|
15
74
|
ActiveRecord::Base.logger.level = Logger::WARN
|
16
75
|
|
76
|
+
ActiveRecord::Migration.verbose = false
|
17
77
|
ActiveRecord::Schema.define(:version => 0) do
|
18
78
|
create_table :users do |t|
|
19
79
|
t.string :name
|
@@ -116,41 +176,39 @@ class Movie < ActiveRecord::Base
|
|
116
176
|
has_many :comments
|
117
177
|
end
|
118
178
|
|
119
|
-
class Follow <
|
120
|
-
|
121
|
-
end
|
122
|
-
|
123
|
-
class Like < ActiveRecord::Base
|
124
|
-
acts_as_like_store
|
125
|
-
end
|
126
|
-
|
127
|
-
class Mention < ActiveRecord::Base
|
128
|
-
acts_as_mention_store
|
129
|
-
end
|
179
|
+
# class Follow < Socialization::ActiveRecordStores::FollowStore; end
|
180
|
+
# class Like < Socialization::ActiveRecordStores::LikeStore; end
|
181
|
+
# class Mention < Socialization::ActiveRecordStores::MentionStore; end
|
130
182
|
|
131
183
|
class ImAFollower < ActiveRecord::Base
|
132
184
|
acts_as_follower
|
133
185
|
end
|
186
|
+
class ImAFollowerChild < ImAFollower; end
|
134
187
|
|
135
188
|
class ImAFollowable < ActiveRecord::Base
|
136
189
|
acts_as_followable
|
137
190
|
end
|
191
|
+
class ImAFollowableChild < ImAFollowable; end
|
138
192
|
|
139
193
|
class ImALiker < ActiveRecord::Base
|
140
194
|
acts_as_liker
|
141
195
|
end
|
196
|
+
class ImALikerChild < ImALiker; end
|
142
197
|
|
143
198
|
class ImALikeable < ActiveRecord::Base
|
144
199
|
acts_as_likeable
|
145
200
|
end
|
201
|
+
class ImALikeableChild < ImALikeable; end
|
146
202
|
|
147
203
|
class ImAMentioner < ActiveRecord::Base
|
148
204
|
acts_as_mentioner
|
149
205
|
end
|
206
|
+
class ImAMentionerChild < ImAMentioner; end
|
150
207
|
|
151
208
|
class ImAMentionable < ActiveRecord::Base
|
152
209
|
acts_as_mentionable
|
153
210
|
end
|
211
|
+
class ImAMentionableChild < ImAMentionable; end
|
154
212
|
|
155
213
|
class ImAMentionerAndMentionable < ActiveRecord::Base
|
156
214
|
acts_as_mentioner
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__))+'/../test_helper'
|
2
|
+
|
3
|
+
class FollowableTest < Test::Unit::TestCase
|
4
|
+
context "Followable" do
|
5
|
+
setup do
|
6
|
+
@follower = ImAFollower.new
|
7
|
+
@followable = ImAFollowable.create
|
8
|
+
end
|
9
|
+
|
10
|
+
context "#is_followable" do
|
11
|
+
should "return true" do
|
12
|
+
assert_true @followable.is_followable?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#followed_by?" do
|
17
|
+
should "not accept non-followers" do
|
18
|
+
assert_raise(ArgumentError) { @followable.followed_by?(:foo) }
|
19
|
+
end
|
20
|
+
|
21
|
+
should "call $Follow.follows?" do
|
22
|
+
$Follow.expects(:follows?).with(@follower, @followable).once
|
23
|
+
@followable.followed_by?(@follower)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "#followers" do
|
28
|
+
should "call $Follow.followers" do
|
29
|
+
$Follow.expects(:followers).with(@followable, @follower.class, { :foo => :bar })
|
30
|
+
@followable.followers(@follower.class, { :foo => :bar })
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__))+'/../test_helper'
|
2
|
+
|
3
|
+
class LikeableTest < Test::Unit::TestCase
|
4
|
+
context "Likeable" do
|
5
|
+
setup do
|
6
|
+
@liker = ImALiker.new
|
7
|
+
@likeable = ImALikeable.create
|
8
|
+
end
|
9
|
+
|
10
|
+
context "#is_likeable" do
|
11
|
+
should "return true" do
|
12
|
+
assert_true @likeable.is_likeable?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#liked_by?" do
|
17
|
+
should "not accept non-likers" do
|
18
|
+
assert_raise(ArgumentError) { @likeable.liked_by?(:foo) }
|
19
|
+
end
|
20
|
+
|
21
|
+
should "call $Like.likes?" do
|
22
|
+
$Like.expects(:likes?).with(@liker, @likeable).once
|
23
|
+
@likeable.liked_by?(@liker)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "#likers" do
|
28
|
+
should "call $Like.likers" do
|
29
|
+
$Like.expects(:likers).with(@likeable, @liker.class, { :foo => :bar })
|
30
|
+
@likeable.likers(@liker.class, { :foo => :bar })
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__))+'/../test_helper'
|
2
|
+
|
3
|
+
class MentionableTest < Test::Unit::TestCase
|
4
|
+
context "Mentionable" do
|
5
|
+
setup do
|
6
|
+
@mentioner = ImAMentioner.new
|
7
|
+
@mentionable = ImAMentionable.create
|
8
|
+
end
|
9
|
+
|
10
|
+
context "#is_mentionable" do
|
11
|
+
should "return true" do
|
12
|
+
assert_true @mentionable.is_mentionable?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#mentioned_by?" do
|
17
|
+
should "not accept non-mentioners" do
|
18
|
+
assert_raise(ArgumentError) { @mentionable.mentioned_by?(:foo) }
|
19
|
+
end
|
20
|
+
|
21
|
+
should "call $Mention.mentions?" do
|
22
|
+
$Mention.expects(:mentions?).with(@mentioner, @mentionable).once
|
23
|
+
@mentionable.mentioned_by?(@mentioner)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "#mentioners" do
|
28
|
+
should "call $Mentionmentioners" do
|
29
|
+
$Mention.expects(:mentioners).with(@mentionable, @mentioner.class, { :foo => :bar })
|
30
|
+
@mentionable.mentioners(@mentioner.class, { :foo => :bar })
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/test/world_test.rb
CHANGED
@@ -2,99 +2,110 @@ require File.expand_path(File.dirname(__FILE__))+'/test_helper'
|
|
2
2
|
|
3
3
|
# Test Socialization as it would be used in a "real world" scenario
|
4
4
|
class WorldTest < Test::Unit::TestCase
|
5
|
-
|
5
|
+
cattr_reader :users, :movies, :celebs, :comments
|
6
6
|
|
7
7
|
context "The World" do
|
8
8
|
setup do
|
9
9
|
seed
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
assert john.follows?(jane)
|
19
|
-
assert john.follows?(travolta)
|
12
|
+
context "ActiveRecord store" do
|
13
|
+
setup { use_ar_store }
|
14
|
+
should "be social" do
|
15
|
+
test_the_world
|
16
|
+
end
|
17
|
+
end
|
20
18
|
|
21
|
-
|
22
|
-
|
19
|
+
context "Redis store" do
|
20
|
+
setup { use_redis_store }
|
21
|
+
should "be social" do
|
22
|
+
test_the_world
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
23
26
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
+
def test_the_world
|
28
|
+
john.like!(pulp)
|
29
|
+
john.follow!(jane)
|
30
|
+
john.follow!(travolta)
|
27
31
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
assert !pulp.likers(User).include?(mat)
|
32
|
+
assert john.likes?(pulp)
|
33
|
+
assert john.follows?(jane)
|
34
|
+
assert john.follows?(travolta)
|
32
35
|
|
33
|
-
|
34
|
-
|
35
|
-
camilo.follow!(carl)
|
36
|
+
assert pulp.liked_by?(john)
|
37
|
+
assert travolta.followed_by?(john)
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
assert carl.followed_by?(mat)
|
41
|
-
assert camilo.follows?(carl)
|
42
|
-
assert !carl.follows?(camilo)
|
39
|
+
carl.like!(pulp)
|
40
|
+
camilo.like!(pulp)
|
41
|
+
assert_equal 3, pulp.likers(User).size
|
43
42
|
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
assert pulp.likers(User).include?(carl)
|
44
|
+
assert pulp.likers(User).include?(john)
|
45
|
+
assert pulp.likers(User).include?(camilo)
|
46
|
+
assert !pulp.likers(User).include?(mat)
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
carl.follow!(mat)
|
49
|
+
mat.follow!(carl)
|
50
|
+
camilo.follow!(carl)
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
assert carl.follows?(mat)
|
53
|
+
assert mat.followed_by?(carl)
|
54
|
+
assert mat.follows?(carl)
|
55
|
+
assert carl.followed_by?(mat)
|
56
|
+
assert camilo.follows?(carl)
|
57
|
+
assert !carl.follows?(camilo)
|
55
58
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
+
assert_raise ArgumentError do
|
60
|
+
john.like!(travolta) # Can't like a Celeb
|
61
|
+
end
|
59
62
|
|
60
|
-
|
61
|
-
|
62
|
-
comment.mention!(carl)
|
63
|
-
assert comment.mentions?(carl)
|
64
|
-
assert carl.mentioned_by?(comment)
|
65
|
-
assert comment.mentions?(tami)
|
66
|
-
assert tami.mentioned_by?(comment)
|
63
|
+
assert_raise ArgumentError do
|
64
|
+
john.follow!(kill_bill) # Can't follow a movie
|
67
65
|
end
|
66
|
+
|
67
|
+
# You can even follow or like yourself if your ego is that big.
|
68
|
+
assert john.follow!(john)
|
69
|
+
assert john.like!(john)
|
70
|
+
|
71
|
+
comment = john.comments.create(:body => "I think Tami and Carl would like this movie!", :movie_id => pulp.id)
|
72
|
+
comment.mention!(tami)
|
73
|
+
comment.mention!(carl)
|
74
|
+
assert comment.mentions?(carl)
|
75
|
+
assert carl.mentioned_by?(comment)
|
76
|
+
assert comment.mentions?(tami)
|
77
|
+
assert tami.mentioned_by?(comment)
|
68
78
|
end
|
69
79
|
|
70
80
|
def seed
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
81
|
+
@@users = {}
|
82
|
+
@@celebs = {}
|
83
|
+
@@movies = {}
|
84
|
+
@@comments = {}
|
85
|
+
|
86
|
+
@@users[:john] = User.create :name => 'John Doe'
|
87
|
+
@@users[:jane] = User.create :name => 'Jane Doe'
|
88
|
+
@@users[:mat] = User.create :name => 'Mat'
|
89
|
+
@@users[:carl] = User.create :name => 'Carl'
|
90
|
+
@@users[:camilo] = User.create :name => 'Camilo'
|
91
|
+
@@users[:tami] = User.create :name => 'Tami'
|
92
|
+
|
93
|
+
@@movies[:pulp] = Movie.create :name => 'Pulp Fiction'
|
94
|
+
@@movies[:reservoir] = Movie.create :name => 'Reservoir Dogs'
|
95
|
+
@@movies[:kill_bill] = Movie.create :name => 'Kill Bill'
|
96
|
+
|
97
|
+
@@celebs[:willis] = Celebrity.create :name => 'Bruce Willis'
|
98
|
+
@@celebs[:travolta] = Celebrity.create :name => 'John Travolta'
|
99
|
+
@@celebs[:jackson] = Celebrity.create :name => 'Samuel L. Jackson'
|
90
100
|
end
|
91
101
|
|
92
102
|
def method_missing(meth, *args, &block)
|
93
103
|
sym = meth.to_sym
|
94
|
-
return users[sym] if users[sym]
|
95
|
-
return celebs[sym] if celebs[sym]
|
96
|
-
return movies[sym] if movies[sym]
|
97
|
-
return comments[sym] if comments[sym]
|
104
|
+
return users[sym] if users && users[sym]
|
105
|
+
return celebs[sym] if celebs && celebs[sym]
|
106
|
+
return movies[sym] if movies && movies[sym]
|
107
|
+
return comments[sym] if comments && comments[sym]
|
108
|
+
require 'pry'; binding.pry
|
98
109
|
super
|
99
110
|
end
|
100
111
|
|