socialization 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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