socialization 0.2.1 → 0.2.2

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.
@@ -11,6 +11,7 @@ module Socialization
11
11
 
12
12
  def follow!(followable)
13
13
  raise ArgumentError, "#{followable} is not followable!" unless followable.respond_to?(:is_followable?)
14
+ raise ArgumentError, "#{self} cannot follow itself!" unless self != followable
14
15
  Follow.create! :follower => self, :followable => followable
15
16
  end
16
17
 
@@ -11,6 +11,7 @@ module Socialization
11
11
 
12
12
  def like!(likeable)
13
13
  raise ArgumentError, "#{likeable} is not likeable!" unless likeable.respond_to?(:is_likeable?)
14
+ raise ArgumentError, "#{self} cannot like itself!" unless self != likeable
14
15
  Like.create! :liker => self, :likeable => likeable
15
16
  end
16
17
 
@@ -1,3 +1,3 @@
1
1
  module Socialization
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -25,5 +25,6 @@ Gem::Specification.new do |s|
25
25
  s.add_development_dependency "appraisal"
26
26
  s.add_development_dependency "logger"
27
27
  s.add_development_dependency "mocha"
28
+ s.add_development_dependency "shoulda"
28
29
  s.add_development_dependency "sqlite3"
29
30
  end
data/test/follow_test.rb CHANGED
@@ -1,40 +1,86 @@
1
1
  require File.dirname(__FILE__)+'/test_helper'
2
2
 
3
3
  class FollowTest < Test::Unit::TestCase
4
- def setup
5
- @u_john = User.create :name => 'John Doe'
6
- @u_jane = User.create :name => 'Jane Doe'
7
- @c_chuck = Celebrity.create :name => 'Chuck Norris'
8
- @c_uma = Celebrity.create :name => 'Uma Thurman'
9
- @c_rick = Celebrity.create :name => 'Rick Astley'
4
+ context "a Follower" do
5
+ setup do
6
+ seed
7
+ end
8
+
9
+ should "respond to is_follower?" do
10
+ assert_equal true, @follower1.respond_to?(:is_follower?)
11
+ assert_equal true, @follower1.is_follower?
12
+ end
13
+
14
+ should "be able to follow a Followable" do
15
+ assert @follower1.follow!(@followable1)
16
+ assert_equal true, @follower1.follows?(@followable1)
17
+ assert_equal false, @follower2.follows?(@followable1)
18
+ end
19
+
20
+ should "be able to unfollow a Followable" do
21
+ Follow.create :follower => @follower1, :followable => @followable1
22
+ assert @follower1.unfollow!(@followable1)
23
+ assert_equal false, @follower1.follows?(@followable1)
24
+ end
10
25
  end
11
26
 
12
- def test_the_world
13
- assert @u_john.is_follower?
14
- assert @c_chuck.is_followable?
27
+ context "a Followable" do
28
+ setup do
29
+ seed
30
+ end
31
+
32
+ should "respond to is_followable?" do
33
+ assert_equal true, @followable1.respond_to?(:is_followable?)
34
+ assert_equal true, @followable1.is_followable?
35
+ end
36
+
37
+ should "be able to determine who follows it" do
38
+ Follow.create :follower => @follower1, :followable => @followable1
39
+ assert_equal true, @followable1.followed_by?(@follower1)
40
+ assert_equal false, @followable1.followed_by?(@follower2)
41
+ end
15
42
 
16
- assert @u_john.follow!(@c_rick)
17
- assert @u_john.follow!(@c_chuck)
18
- assert @u_jane.follow!(@c_rick)
43
+ should "expose a list of its followers" do
44
+ Follow.create :follower => @follower1, :followable => @followable1
45
+ assert_equal [@follower1], @followable1.followers
46
+ end
47
+
48
+ should "expose followings" do
49
+ Follow.create :follower => @follower1, :followable => @followable1
50
+ followings = @followable1.followings
51
+ assert_equal 1, followings.size
52
+ assert followings.first.is_a?(Follow)
53
+ end
54
+ end
19
55
 
20
- assert_equal true, @u_john.follows?(@c_chuck)
21
- assert_equal true, @u_john.follows?(@c_rick)
22
- assert_equal true, @c_chuck.followed_by?(@u_john)
56
+ context "Deleting a Follower" do
57
+ setup do
58
+ seed
59
+ @follower1.follow!(@followable1)
60
+ end
23
61
 
24
- assert @c_uma.followers.empty?
62
+ should "delete its Follow records" do
63
+ @follower1.destroy
64
+ assert_equal false, @followable1.followed_by?(@follower1)
65
+ end
66
+ end
25
67
 
26
- # can't have duplicate follows
27
- assert_raise ActiveRecord::RecordInvalid do
28
- @u_john.follow!(@c_rick)
68
+ context "Deleting a Followable" do
69
+ setup do
70
+ seed
71
+ @follower1.follow!(@followable1)
29
72
  end
30
73
 
31
- assert @u_john.unfollow!(@c_rick)
32
- assert_equal false, @c_rick.followed_by?(@u_john)
74
+ should "delete its Follow records" do
75
+ @followable1.destroy
76
+ assert_equal false, @follower1.follows?(@followable1)
77
+ end
33
78
  end
34
79
 
35
- def test_user_following_user
36
- @u_john.follow!(@u_jane)
37
- assert_equal true, @u_john.follows?(@u_jane)
38
- assert_equal false, @u_jane.follows?(@u_john)
80
+ def seed
81
+ @follower1 = ImAFollower.create
82
+ @follower2 = ImAFollower.create
83
+ @followable1 = ImAFollowable.create
84
+ @followable2 = ImAFollowable.create
39
85
  end
40
86
  end
data/test/like_test.rb CHANGED
@@ -1,49 +1,86 @@
1
1
  require File.dirname(__FILE__)+'/test_helper'
2
2
 
3
3
  class LikeTest < Test::Unit::TestCase
4
- def setup
5
- @u_john = User.create :name => 'John Doe'
6
- @u_jane = User.create :name => 'Jane Doe'
7
- @m_seven = Movie.create :name => 'Seven'
8
- @m_pulp = Movie.create :name => 'Pulp Fiction'
9
- @m_tub = Movie.create :name => 'Hot Tub Time Machine'
4
+ context "a Liker" do
5
+ setup do
6
+ seed
7
+ end
8
+
9
+ should "respond to is_liker?" do
10
+ assert_equal true, @liker1.respond_to?(:is_liker?)
11
+ assert_equal true, @liker1.is_liker?
12
+ end
13
+
14
+ should "be able to like a Likeable" do
15
+ assert @liker1.like!(@likeable1)
16
+ assert_equal true, @liker1.likes?(@likeable1)
17
+ assert_equal false, @liker2.likes?(@likeable1)
18
+ end
19
+
20
+ should "be able to unlike a Likeable" do
21
+ Like.create :liker => @liker1, :likeable => @likeable1
22
+ assert @liker1.unlike!(@likeable1)
23
+ assert_equal false, @liker1.likes?(@likeable1)
24
+ end
10
25
  end
11
26
 
12
- def test_the_world
13
- assert @u_john.is_liker?
14
- assert @u_john.is_likeable?
15
- assert @m_seven.is_likeable?
27
+ context "a Likeable" do
28
+ setup do
29
+ seed
30
+ end
16
31
 
17
- assert @u_john.like!(@m_seven)
18
- assert @u_john.like!(@m_pulp)
19
- assert @u_jane.like!(@m_seven)
32
+ should "respond to is_likeable?" do
33
+ assert_equal true, @likeable1.respond_to?(:is_likeable?)
34
+ assert_equal true, @likeable1.is_likeable?
35
+ end
20
36
 
21
- assert_raise ArgumentError do
22
- @u_jane.follow!(@m_seven) # movie is not followable
37
+ should "be able to determine who likes it" do
38
+ Like.create :liker => @liker1, :likeable => @likeable1
39
+ assert_equal true, @likeable1.liked_by?(@liker1)
40
+ assert_equal false, @likeable1.liked_by?(@liker2)
23
41
  end
24
42
 
25
- assert_equal true, @u_john.likes?(@m_seven)
26
- assert_equal true, @u_john.likes?(@m_pulp)
27
- assert_equal true, @u_jane.likes?(@m_seven)
28
- assert_equal false, @u_jane.likes?(@m_pulp)
43
+ should "expose a list of its likers" do
44
+ Like.create :liker => @liker1, :likeable => @likeable1
45
+ assert_equal [@liker1], @likeable1.likers
46
+ end
47
+
48
+ should "expose likings" do
49
+ Like.create :liker => @liker1, :likeable => @likeable1
50
+ likings = @likeable1.likings
51
+ assert_equal 1, likings.size
52
+ assert likings.first.is_a?(Like)
53
+ end
54
+ end
29
55
 
30
- assert_equal true, @m_seven.liked_by?(@u_john)
31
- assert_equal false, @m_pulp.liked_by?(@u_jane)
56
+ context "Deleting a Liker" do
57
+ setup do
58
+ seed
59
+ @liker1.like!(@likeable1)
60
+ end
32
61
 
33
- assert @m_tub.likers.empty?
62
+ should "delete its Like records" do
63
+ @liker1.destroy
64
+ assert_equal false, @likeable1.liked_by?(@liker1)
65
+ end
66
+ end
34
67
 
35
- # can't have duplicate a like
36
- assert_raise ActiveRecord::RecordInvalid do
37
- @u_john.like!(@m_seven)
68
+ context "Deleting a Likeable" do
69
+ setup do
70
+ seed
71
+ @liker1.like!(@likeable1)
38
72
  end
39
73
 
40
- assert @u_john.unlike!(@m_seven)
41
- assert_equal false, @m_seven.liked_by?(@u_john)
74
+ should "delete its Like records" do
75
+ @likeable1.destroy
76
+ assert_equal false, @liker1.likes?(@likeable1)
77
+ end
42
78
  end
43
79
 
44
- def test_user_liking_another_user
45
- @u_john.like!(@u_jane)
46
- assert_equal true, @u_john.likes?(@u_jane)
47
- assert_equal false, @u_jane.likes?(@u_john)
80
+ def seed
81
+ @liker1 = ImALiker.create
82
+ @liker2 = ImALiker.create
83
+ @likeable1 = ImALikeable.create
84
+ @likeable2 = ImALikeable.create
48
85
  end
49
- end
86
+ end
data/test/test_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'active_record'
3
3
  require 'mocha'
4
+ require 'shoulda'
4
5
  require 'test/unit'
5
6
  require 'logger'
6
7
 
@@ -41,6 +42,22 @@ ActiveRecord::Schema.define(:version => 0) do
41
42
  t.integer :likeable_id
42
43
  t.datetime :created_at
43
44
  end
45
+
46
+ create_table :im_a_followers do |t|
47
+ t.timestamps
48
+ end
49
+
50
+ create_table :im_a_followables do |t|
51
+ t.timestamps
52
+ end
53
+
54
+ create_table :im_a_likers do |t|
55
+ t.timestamps
56
+ end
57
+
58
+ create_table :im_a_likeables do |t|
59
+ t.timestamps
60
+ end
44
61
  end
45
62
 
46
63
  class Celebrity < ActiveRecord::Base
@@ -65,3 +82,19 @@ end
65
82
  class Like < ActiveRecord::Base
66
83
  acts_as_like_store
67
84
  end
85
+
86
+ class ImAFollower < ActiveRecord::Base
87
+ acts_as_follower
88
+ end
89
+
90
+ class ImAFollowable < ActiveRecord::Base
91
+ acts_as_followable
92
+ end
93
+
94
+ class ImALiker < ActiveRecord::Base
95
+ acts_as_liker
96
+ end
97
+
98
+ class ImALikeable < ActiveRecord::Base
99
+ acts_as_likeable
100
+ end
@@ -0,0 +1,91 @@
1
+ require File.dirname(__FILE__)+'/test_helper'
2
+
3
+ # Test Socialization as it would be used in a "real world" scenario
4
+ class WorldTest < Test::Unit::TestCase
5
+ attr_reader :users, :movies, :celebs
6
+
7
+
8
+ context "The World" do
9
+ setup do
10
+ seed
11
+ end
12
+
13
+ should "be social" do
14
+ john.like!(pulp)
15
+ john.follow!(jane)
16
+ john.follow!(travolta)
17
+
18
+ assert john.likes?(pulp)
19
+ assert john.follows?(jane)
20
+ assert john.follows?(travolta)
21
+
22
+ assert pulp.liked_by?(john)
23
+ assert travolta.followed_by?(john)
24
+
25
+ carl.like!(pulp)
26
+ camilo.like!(pulp)
27
+ assert_equal 3, pulp.likers.size
28
+
29
+ assert pulp.likers.include?(carl)
30
+ assert pulp.likers.include?(john)
31
+ assert pulp.likers.include?(camilo)
32
+ assert !pulp.likers.include?(mat)
33
+
34
+ carl.follow!(mat)
35
+ mat.follow!(carl)
36
+ camilo.follow!(carl)
37
+
38
+ assert carl.follows?(mat)
39
+ assert mat.followed_by?(carl)
40
+ assert mat.follows?(carl)
41
+ assert carl.followed_by?(mat)
42
+ assert camilo.follows?(carl)
43
+ assert !carl.follows?(camilo)
44
+
45
+ assert_raise ArgumentError do
46
+ john.like!(travolta) # Can't like a Celeb
47
+ end
48
+
49
+ assert_raise ArgumentError do
50
+ john.follow!(killbill) # Can't follow a movie
51
+ end
52
+
53
+ assert_raise ArgumentError do
54
+ john.follow!(john) # Can't follow yourself, duh!
55
+ end
56
+
57
+ assert_raise ArgumentError do
58
+ john.like!(john) # Can't like yourself, duh!
59
+ end
60
+ end
61
+ end
62
+
63
+ def seed
64
+ @users = {}
65
+ @celebs = {}
66
+ @movies = {}
67
+
68
+ @users[:john] = User.create :name => 'John Doe'
69
+ @users[:jane] = User.create :name => 'Jane Doe'
70
+ @users[:mat] = User.create :name => 'Mat'
71
+ @users[:carl] = User.create :name => 'Carl'
72
+ @users[:camilo] = User.create :name => 'Camilo'
73
+
74
+ @movies[:pulp] = Movie.create :name => 'Pulp Fiction'
75
+ @movies[:reservoir] = Movie.create :name => 'Reservoir Dogs'
76
+ @movies[:killbill] = Movie.create :name => 'Kill Bill'
77
+
78
+ @celebs[:willis] = Celebrity.create :name => 'Bruce Willis'
79
+ @celebs[:travolta] = Celebrity.create :name => 'John Travolta'
80
+ @celebs[:jackson] = Celebrity.create :name => 'Samuel L. Jackson'
81
+ end
82
+
83
+ def method_missing(meth, *args, &block)
84
+ sym = meth.to_sym
85
+ return users[sym] if users[sym]
86
+ return celebs[sym] if celebs[sym]
87
+ return movies[sym] if movies[sym]
88
+ super
89
+ end
90
+
91
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: socialization
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-01-15 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: &70297772455360 !ruby/object:Gem::Requirement
16
+ requirement: &70117266360600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70297772455360
24
+ version_requirements: *70117266360600
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: appraisal
27
- requirement: &70297772454940 !ruby/object:Gem::Requirement
27
+ requirement: &70117266360180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70297772454940
35
+ version_requirements: *70117266360180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: logger
38
- requirement: &70297772454520 !ruby/object:Gem::Requirement
38
+ requirement: &70117266359760 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70297772454520
46
+ version_requirements: *70117266359760
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: mocha
49
- requirement: &70297772454100 !ruby/object:Gem::Requirement
49
+ requirement: &70117266359340 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,21 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70297772454100
57
+ version_requirements: *70117266359340
58
+ - !ruby/object:Gem::Dependency
59
+ name: shoulda
60
+ requirement: &70117266358920 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70117266358920
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: sqlite3
60
- requirement: &70297772453680 !ruby/object:Gem::Requirement
71
+ requirement: &70117266358500 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,7 +76,7 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *70297772453680
79
+ version_requirements: *70117266358500
69
80
  description: Socialization allows any model to Follow and/or Like any other model.
70
81
  This is accomplished through a double polymorphic relationship on the Follow and
71
82
  Like models. But you don't need to know that since all the complexity is hidden
@@ -168,6 +179,7 @@ files:
168
179
  - test/follow_test.rb
169
180
  - test/like_test.rb
170
181
  - test/test_helper.rb
182
+ - test/world_test.rb
171
183
  homepage: https://github.com/cmer/socialization
172
184
  licenses: []
173
185
  post_install_message:
@@ -197,4 +209,5 @@ test_files:
197
209
  - test/follow_test.rb
198
210
  - test/like_test.rb
199
211
  - test/test_helper.rb
212
+ - test/world_test.rb
200
213
  has_rdoc: true