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.
- 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
data/lib/socialization/hello.rb
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
require 'active_support/concern'
|
|
2
|
-
|
|
3
|
-
%w{followable follower follow_store likeable liker like_store mentionable mentioner mention_store}.each do |f|
|
|
4
|
-
require "#{File.dirname(__FILE__)}/#{f}"
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
module Socialization
|
|
8
|
-
module Hello
|
|
9
|
-
extend ActiveSupport::Concern
|
|
10
|
-
|
|
11
|
-
module ClassMethods
|
|
12
|
-
## Follow
|
|
13
|
-
def acts_as_follower(opts = nil)
|
|
14
|
-
include Socialization::Follower
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def acts_as_followable(opts = nil)
|
|
18
|
-
include Socialization::Followable
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def acts_as_follow_store(opts = nil)
|
|
22
|
-
include Socialization::FollowStore
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
## Like
|
|
26
|
-
def acts_as_liker(opts = nil)
|
|
27
|
-
include Socialization::Liker
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def acts_as_likeable(opts = nil)
|
|
31
|
-
include Socialization::Likeable
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def acts_as_like_store(opts = nil)
|
|
35
|
-
include Socialization::LikeStore
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
## Mention
|
|
39
|
-
def acts_as_mentioner(opts = nil)
|
|
40
|
-
include Socialization::Mentioner
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def acts_as_mentionable(opts = nil)
|
|
44
|
-
include Socialization::Mentionable
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def acts_as_mention_store(opts = nil)
|
|
48
|
-
include Socialization::MentionStore
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
module Socialization
|
|
2
|
-
module LikeStore
|
|
3
|
-
extend ActiveSupport::Concern
|
|
4
|
-
|
|
5
|
-
included do
|
|
6
|
-
belongs_to :liker, :polymorphic => true
|
|
7
|
-
belongs_to :likeable, :polymorphic => true
|
|
8
|
-
|
|
9
|
-
validates_uniqueness_of :likeable_type, :scope => [:likeable_id, :liker_type, :liker_id], :message => 'You cannot like the same thing twice.'
|
|
10
|
-
|
|
11
|
-
def self.human_attribute_name(*args); ''; end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
module ActiveRecord
|
|
2
|
-
class Base
|
|
3
|
-
def is_likeable?
|
|
4
|
-
false
|
|
5
|
-
end
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
module Socialization
|
|
10
|
-
module Likeable
|
|
11
|
-
extend ActiveSupport::Concern
|
|
12
|
-
|
|
13
|
-
included do
|
|
14
|
-
# A liking is the Like record of the liker liking self.
|
|
15
|
-
has_many :likings, :as => :likeable, :dependent => :destroy, :class_name => 'Like'
|
|
16
|
-
|
|
17
|
-
def is_likeable?
|
|
18
|
-
true
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def liked_by?(liker)
|
|
22
|
-
raise ArgumentError, "#{liker} is not a liker!" unless liker.is_liker?
|
|
23
|
-
!self.likings.where(:liker_type => liker.class.to_s, :liker_id => liker.id).empty?
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def likers(klass)
|
|
27
|
-
klass = klass.to_s.singularize.camelize.constantize unless klass.is_a?(Class)
|
|
28
|
-
klass.joins("INNER JOIN likes ON likes.liker_id = #{klass.to_s.tableize}.id AND likes.liker_type = '#{klass.to_s}'").
|
|
29
|
-
where("likes.likeable_type = '#{self.class.to_s}'").
|
|
30
|
-
where("likes.likeable_id = #{self.id}")
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
data/lib/socialization/liker.rb
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
module ActiveRecord
|
|
2
|
-
class Base
|
|
3
|
-
def is_liker?
|
|
4
|
-
false
|
|
5
|
-
end
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
module Socialization
|
|
10
|
-
module Liker
|
|
11
|
-
extend ActiveSupport::Concern
|
|
12
|
-
|
|
13
|
-
included do
|
|
14
|
-
# A like is the Like record of self liking a likeable record.
|
|
15
|
-
has_many :likes, :as => :liker, :dependent => :destroy, :class_name => 'Like'
|
|
16
|
-
|
|
17
|
-
def is_liker?
|
|
18
|
-
true
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def like!(likeable)
|
|
22
|
-
ensure_likeable!(likeable)
|
|
23
|
-
raise ArgumentError, "#{self} cannot like itself!" unless self != likeable
|
|
24
|
-
Like.create!({ :liker => self, :likeable => likeable }, :without_protection => true)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def unlike!(likeable)
|
|
28
|
-
ll = likeable.likings.where(:liker_type => self.class.to_s, :liker_id => self.id)
|
|
29
|
-
unless ll.empty?
|
|
30
|
-
ll.each { |l| l.destroy }
|
|
31
|
-
else
|
|
32
|
-
raise ActiveRecord::RecordNotFound
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def likes?(likeable)
|
|
37
|
-
ensure_likeable!(likeable)
|
|
38
|
-
!self.likes.where(:likeable_type => likeable.class.to_s, :likeable_id => likeable.id).empty?
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def likees(klass)
|
|
42
|
-
klass = klass.to_s.singularize.camelize.constantize unless klass.is_a?(Class)
|
|
43
|
-
klass.joins("INNER JOIN likes ON likes.likeable_id = #{klass.to_s.tableize}.id AND likes.likeable_type = '#{klass.to_s}'").
|
|
44
|
-
where("likes.liker_type = '#{self.class.to_s}'").
|
|
45
|
-
where("likes.liker_id = #{self.id}")
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
private
|
|
49
|
-
def ensure_likeable!(likeable)
|
|
50
|
-
raise ArgumentError, "#{likeable} is not likeable!" unless likeable.is_likeable?
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
module Socialization
|
|
2
|
-
module MentionStore
|
|
3
|
-
extend ActiveSupport::Concern
|
|
4
|
-
|
|
5
|
-
included do
|
|
6
|
-
belongs_to :mentioner, :polymorphic => true
|
|
7
|
-
belongs_to :mentionable, :polymorphic => true
|
|
8
|
-
|
|
9
|
-
validates_uniqueness_of :mentionable_type, :scope => [:mentionable_id, :mentioner_type, :mentioner_id], :message => 'You cannot mention the same thing twice in a given object.'
|
|
10
|
-
|
|
11
|
-
def self.human_attribute_name(*args); ''; end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
module ActiveRecord
|
|
2
|
-
class Base
|
|
3
|
-
def is_mentionable?
|
|
4
|
-
false
|
|
5
|
-
end
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
module Socialization
|
|
10
|
-
module Mentionable
|
|
11
|
-
extend ActiveSupport::Concern
|
|
12
|
-
|
|
13
|
-
included do
|
|
14
|
-
# A mentioning is the Mention record of describing the mention relationship between
|
|
15
|
-
# the mentioner and the mentionable (self).
|
|
16
|
-
has_many :mentionings, :as => :mentionable, :dependent => :destroy, :class_name => 'Mention'
|
|
17
|
-
|
|
18
|
-
def is_mentionable?
|
|
19
|
-
true
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def mentioned_by?(mentioner)
|
|
23
|
-
raise ArgumentError, "#{mentioner} is not a mentioner!" unless mentioner.is_mentioner?
|
|
24
|
-
!self.mentionings.where(:mentioner_type => mentioner.class.to_s, :mentioner_id => mentioner.id).empty?
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def mentioners(klass)
|
|
28
|
-
klass = klass.to_s.singularize.camelize.constantize unless klass.is_a?(Class)
|
|
29
|
-
klass.joins("INNER JOIN mentions ON mentions.mentioner_id = #{klass.to_s.tableize}.id AND mentions.mentioner_type = '#{klass.to_s}'").
|
|
30
|
-
where("mentions.mentionable_type = '#{self.class.to_s}'").
|
|
31
|
-
where("mentions.mentionable_id = #{self.id}")
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
module ActiveRecord
|
|
2
|
-
class Base
|
|
3
|
-
def is_mentioner?
|
|
4
|
-
false
|
|
5
|
-
end
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
module Socialization
|
|
10
|
-
module Mentioner
|
|
11
|
-
extend ActiveSupport::Concern
|
|
12
|
-
|
|
13
|
-
included do
|
|
14
|
-
# A mention is the Mention record (self) mentionning a mentionable record.
|
|
15
|
-
has_many :mentions, :as => :mentioner, :dependent => :destroy, :class_name => 'Mention'
|
|
16
|
-
|
|
17
|
-
def is_mentioner?
|
|
18
|
-
true
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def mention!(mentionable)
|
|
22
|
-
ensure_mentionable!(mentionable)
|
|
23
|
-
Mention.create!({ :mentioner => self, :mentionable => mentionable }, :without_protection => true)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def unmention!(mentionable)
|
|
27
|
-
mm = mentionable.mentionings.where(:mentioner_type => self.class.to_s, :mentioner_id => self.id)
|
|
28
|
-
unless mm.empty?
|
|
29
|
-
mm.each { |m| m.destroy }
|
|
30
|
-
else
|
|
31
|
-
raise ActiveRecord::RecordNotFound
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def mentions?(mentionable)
|
|
36
|
-
ensure_mentionable!(mentionable)
|
|
37
|
-
!self.mentions.where(:mentionable_type => mentionable.class.to_s, :mentionable_id => mentionable.id).empty?
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def mentionees(klass)
|
|
41
|
-
klass = klass.to_s.singularize.camelize.constantize unless klass.is_a?(Class)
|
|
42
|
-
klass.joins("INNER JOIN mentions ON mentions.mentionable_id = #{klass.to_s.tableize}.id AND mentions.mentionable_type = '#{klass.to_s}'").
|
|
43
|
-
where("mentions.mentioner_type = '#{self.class.to_s}'").
|
|
44
|
-
where("mentions.mentioner_id = #{self.id}")
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
private
|
|
48
|
-
def ensure_mentionable!(mentionable)
|
|
49
|
-
raise ArgumentError, "#{mentionable} is not mentionable!" unless mentionable.is_mentionable?
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
data/test/follow_test.rb
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__))+'/test_helper'
|
|
2
|
-
|
|
3
|
-
class FollowTest < Test::Unit::TestCase
|
|
4
|
-
context "a Follower" do
|
|
5
|
-
setup do
|
|
6
|
-
seed
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
should "be follower" do
|
|
10
|
-
assert_equal true, @follower1.is_follower?
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
should "be able to follow a Followable" do
|
|
14
|
-
assert @follower1.follow!(@followable1)
|
|
15
|
-
assert_equal true, @follower1.follows?(@followable1)
|
|
16
|
-
assert_equal false, @follower2.follows?(@followable1)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
should "be able to unfollow a Followable" do
|
|
20
|
-
Follow.create :follower => @follower1, :followable => @followable1
|
|
21
|
-
assert @follower1.unfollow!(@followable1)
|
|
22
|
-
assert_equal false, @follower1.follows?(@followable1)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
should "not be able to follow the same thing twice" do
|
|
26
|
-
assert @follower1.follow!(@followable1)
|
|
27
|
-
|
|
28
|
-
assert_raise ActiveRecord::RecordInvalid do
|
|
29
|
-
@follower1.follow!(@followable1)
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
should "not be able to unfollow something that is not followed" do
|
|
34
|
-
assert_raise ActiveRecord::RecordNotFound do
|
|
35
|
-
@follower1.unfollow!(@followable1)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
should "expose a list of its followees" do
|
|
40
|
-
Follow.create :follower => @follower1, :followable => @followable1
|
|
41
|
-
assert @follower1.followees(ImAFollowable).is_a?(ActiveRecord::Relation)
|
|
42
|
-
assert_equal [@followable1], @follower1.followees(ImAFollowable).all
|
|
43
|
-
|
|
44
|
-
assert_equal @follower1.followees(ImAFollowable), @follower1.followees(:im_a_followables)
|
|
45
|
-
assert_equal @follower1.followees(ImAFollowable), @follower1.followees("im_a_followable")
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
context "a Followable" do
|
|
50
|
-
setup do
|
|
51
|
-
seed
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
should "be followable" do
|
|
55
|
-
assert_equal true, @followable1.is_followable?
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
should "be able to determine who follows it" do
|
|
59
|
-
Follow.create :follower => @follower1, :followable => @followable1
|
|
60
|
-
assert_equal true, @followable1.followed_by?(@follower1)
|
|
61
|
-
assert_equal false, @followable1.followed_by?(@follower2)
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
should "expose a list of its followers" do
|
|
65
|
-
Follow.create :follower => @follower1, :followable => @followable1
|
|
66
|
-
assert @followable1.followers(ImAFollower).is_a?(ActiveRecord::Relation)
|
|
67
|
-
assert_equal [@follower1], @followable1.followers(ImAFollower).all
|
|
68
|
-
|
|
69
|
-
assert_equal @followable1.followers(ImAFollower), @followable1.followers(:im_a_followers)
|
|
70
|
-
assert_equal @followable1.followers(ImAFollower), @followable1.followers("im_a_follower")
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
should "expose followings" do
|
|
74
|
-
Follow.create :follower => @follower1, :followable => @followable1
|
|
75
|
-
followings = @followable1.followings
|
|
76
|
-
assert_equal 1, followings.size
|
|
77
|
-
assert followings.first.is_a?(Follow)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
context "Deleting a Follower" do
|
|
82
|
-
setup do
|
|
83
|
-
seed
|
|
84
|
-
@follower1.follow!(@followable1)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
should "delete its Follow records" do
|
|
88
|
-
@follower1.destroy
|
|
89
|
-
assert_equal false, @followable1.followed_by?(@follower1)
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
context "Deleting a Followable" do
|
|
94
|
-
setup do
|
|
95
|
-
seed
|
|
96
|
-
@follower1.follow!(@followable1)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
should "delete its Follow records" do
|
|
100
|
-
@followable1.destroy
|
|
101
|
-
assert_equal false, @follower1.follows?(@followable1)
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
context "Virgin ActiveRecord::Base objects" do
|
|
106
|
-
setup do
|
|
107
|
-
@foo = Vanilla.new
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
should "not be follower" do
|
|
111
|
-
assert_equal false, @foo.is_follower?
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
should "not be followable" do
|
|
115
|
-
assert_equal false, @foo.is_followable?
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def seed
|
|
120
|
-
@follower1 = ImAFollower.create
|
|
121
|
-
@follower2 = ImAFollower.create
|
|
122
|
-
@followable1 = ImAFollowable.create
|
|
123
|
-
@followable2 = ImAFollowable.create
|
|
124
|
-
end
|
|
125
|
-
end
|
data/test/like_test.rb
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__))+'/test_helper'
|
|
2
|
-
|
|
3
|
-
class LikeTest < Test::Unit::TestCase
|
|
4
|
-
context "a Liker" do
|
|
5
|
-
setup do
|
|
6
|
-
seed
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
should "be liker" do
|
|
10
|
-
assert_equal true, @liker1.is_liker?
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
should "be able to like a Likeable" do
|
|
14
|
-
assert @liker1.like!(@likeable1)
|
|
15
|
-
assert_equal true, @liker1.likes?(@likeable1)
|
|
16
|
-
assert_equal false, @liker2.likes?(@likeable1)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
should "be able to unlike a Likeable" do
|
|
20
|
-
Like.create :liker => @liker1, :likeable => @likeable1
|
|
21
|
-
assert @liker1.unlike!(@likeable1)
|
|
22
|
-
assert_equal false, @liker1.likes?(@likeable1)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
should "not be able to like the same thing twice" do
|
|
26
|
-
assert @liker1.like!(@likeable1)
|
|
27
|
-
|
|
28
|
-
assert_raise ActiveRecord::RecordInvalid do
|
|
29
|
-
@liker1.like!(@likeable1)
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
should "not be able to unlike something that is not liked" do
|
|
34
|
-
assert_raise ActiveRecord::RecordNotFound do
|
|
35
|
-
@liker1.unlike!(@likeable1)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
should "expose a list of its likes" do
|
|
40
|
-
Like.create :liker => @liker1, :likeable => @likeable1
|
|
41
|
-
assert @liker1.likees(ImALikeable).is_a?(ActiveRecord::Relation)
|
|
42
|
-
assert_equal [@likeable1], @liker1.likees(ImALikeable).all
|
|
43
|
-
|
|
44
|
-
assert_equal @liker1.likees(ImALikeable), @liker1.likees(:im_a_likeables)
|
|
45
|
-
assert_equal @liker1.likees(ImALikeable), @liker1.likees("im_a_likeable")
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
context "a Likeable" do
|
|
50
|
-
setup do
|
|
51
|
-
seed
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
should "be likeable" do
|
|
55
|
-
assert_equal true, @likeable1.is_likeable?
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
should "be able to determine who likes it" do
|
|
59
|
-
Like.create :liker => @liker1, :likeable => @likeable1
|
|
60
|
-
assert_equal true, @likeable1.liked_by?(@liker1)
|
|
61
|
-
assert_equal false, @likeable1.liked_by?(@liker2)
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
should "expose a list of its likers" do
|
|
65
|
-
Like.create :liker => @liker1, :likeable => @likeable1
|
|
66
|
-
assert @likeable1.likers(ImALiker).is_a?(ActiveRecord::Relation)
|
|
67
|
-
assert_equal [@liker1], @likeable1.likers(ImALiker).all
|
|
68
|
-
|
|
69
|
-
assert_equal @likeable1.likers(ImALiker), @likeable1.likers(:im_a_likers)
|
|
70
|
-
assert_equal @likeable1.likers(ImALiker), @likeable1.likers("im_a_liker")
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
should "expose likings" do
|
|
74
|
-
Like.create :liker => @liker1, :likeable => @likeable1
|
|
75
|
-
likings = @likeable1.likings
|
|
76
|
-
assert_equal 1, likings.size
|
|
77
|
-
assert likings.first.is_a?(Like)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
context "Deleting a Liker" do
|
|
82
|
-
setup do
|
|
83
|
-
seed
|
|
84
|
-
@liker1.like!(@likeable1)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
should "delete its Like records" do
|
|
88
|
-
@liker1.destroy
|
|
89
|
-
assert_equal false, @likeable1.liked_by?(@liker1)
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
context "Deleting a Likeable" do
|
|
94
|
-
setup do
|
|
95
|
-
seed
|
|
96
|
-
@liker1.like!(@likeable1)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
should "delete its Like records" do
|
|
100
|
-
@likeable1.destroy
|
|
101
|
-
assert_equal false, @liker1.likes?(@likeable1)
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
context "Virgin ActiveRecord::Base objects" do
|
|
106
|
-
setup do
|
|
107
|
-
@foo = Vanilla.new
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
should "not be liker" do
|
|
111
|
-
assert_equal false, @foo.is_liker?
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
should "not be likeable" do
|
|
115
|
-
assert_equal false, @foo.is_likeable?
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def seed
|
|
120
|
-
@liker1 = ImALiker.create
|
|
121
|
-
@liker2 = ImALiker.create
|
|
122
|
-
@likeable1 = ImALikeable.create
|
|
123
|
-
@likeable2 = ImALikeable.create
|
|
124
|
-
end
|
|
125
|
-
end
|