twitter4r 0.3.0 → 0.3.1

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.
Files changed (39) hide show
  1. data/CHANGES +129 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +37 -0
  4. data/TODO +7 -0
  5. data/lib/twitter/client/account.rb +24 -0
  6. data/lib/twitter/client/base.rb +16 -5
  7. data/lib/twitter/client/blocks.rb +35 -0
  8. data/lib/twitter/client/favorites.rb +37 -37
  9. data/lib/twitter/client/friendship.rb +32 -32
  10. data/lib/twitter/client/graph.rb +37 -0
  11. data/lib/twitter/client/messaging.rb +3 -4
  12. data/lib/twitter/client/profile.rb +29 -0
  13. data/lib/twitter/client/search.rb +27 -0
  14. data/lib/twitter/client/status.rb +9 -3
  15. data/lib/twitter/client/timeline.rb +1 -0
  16. data/lib/twitter/client/user.rb +20 -9
  17. data/lib/twitter/client.rb +13 -9
  18. data/lib/twitter/config.rb +6 -0
  19. data/lib/twitter/console.rb +3 -0
  20. data/lib/twitter/core.rb +1 -1
  21. data/lib/twitter/ext/stdlib.rb +17 -1
  22. data/lib/twitter/model.rb +39 -10
  23. data/lib/twitter/version.rb +1 -1
  24. data/lib/twitter.rb +13 -4
  25. data/spec/twitter/client/account_spec.rb +28 -0
  26. data/spec/twitter/client/base_spec.rb +10 -0
  27. data/spec/twitter/client/blocks_spec.rb +76 -0
  28. data/spec/twitter/client/friendship_spec.rb +7 -7
  29. data/spec/twitter/client/graph_spec.rb +67 -0
  30. data/spec/twitter/client/messaging_spec.rb +3 -3
  31. data/spec/twitter/client/profile_spec.rb +91 -0
  32. data/spec/twitter/client/search_spec.rb +68 -0
  33. data/spec/twitter/client/status_spec.rb +27 -0
  34. data/spec/twitter/client/user_spec.rb +0 -17
  35. data/spec/twitter/ext/stdlib_spec.rb +20 -3
  36. data/spec/twitter/model_spec.rb +46 -26
  37. metadata +92 -67
  38. data/lib/twitter/rails.rb +0 -89
  39. data/spec/twitter/rails_spec.rb +0 -110
@@ -14,6 +14,11 @@ class Twitter::Client
14
14
  # @twitter.user(234943) #=> Twitter::User object instance for user with numeric id of 234943
15
15
  # @twitter.user('mylogin') #=> Twitter::User object instance for user with screen name 'mylogin'
16
16
  #
17
+ # Where <tt>options</tt> is a +Hash+ of options that can include:
18
+ # * <tt>:page</tt> - optional. Retrieves the next set of friends. There are 100 friends per page. Default: 1.
19
+ # * <tt>:lite</tt> - optional. Prevents the inline inclusion of current status. Default: false.
20
+ # * <tt>:since</tt> - optional. Only relevant for <tt>:friends</tt> action. Narrows the results to just those friends added after the date given as value of this option. Must be HTTP-formatted date.
21
+ #
17
22
  # An <tt>ArgumentError</tt> will be raised if an invalid <tt>action</tt>
18
23
  # is given. Valid actions are:
19
24
  # * +:info+
@@ -25,30 +30,36 @@ class Twitter::Client
25
30
  # followers = client.my(:followers)
26
31
  # OR
27
32
  # followers = client.my(:info).followers
28
- def user(id, action = :info)
33
+ def user(id, action = :info, options = {})
29
34
  raise ArgumentError, "Invalid user action: #{action}" unless @@USER_URIS.keys.member?(action)
30
- raise ArgumentError, "Unable to retrieve followers for user: #{id}" if action.eql?(:followers) and not id.eql?(@login)
31
35
  id = id.to_i if id.is_a?(Twitter::User)
32
- response = http_connect {|conn| create_http_get_request(@@USER_URIS[action], :id => id) }
33
- bless_models(Twitter::User.unmarshal(response.body))
36
+ params = options.merge(:id => id)
37
+ response = http_connect {|conn| create_http_get_request(@@USER_URIS[action], params) }
38
+ bless_models(Twitter::User.unmarshal(response.body))
34
39
  end
35
40
 
36
41
  # Syntactic sugar for queries relating to authenticated user in Twitter's User API
37
42
  #
38
- # When <tt>action</tt> is:
43
+ # Where <tt>action</tt> is one of the following:
39
44
  # * <tt>:info</tt> - Returns user instance for the authenticated user.
40
45
  # * <tt>:friends</tt> - Returns Array of users that are authenticated user's friends
41
46
  # * <tt>:followers</tt> - Returns Array of users that are authenticated user's followers
42
47
  #
48
+ # Where <tt>options</tt> is a +Hash+ of options that can include:
49
+ # * <tt>:page</tt> - optional. Retrieves the next set of friends. There are 100 friends per page. Default: 1.
50
+ # * <tt>:lite</tt> - optional. Prevents the inline inclusion of current status. Default: false.
51
+ # * <tt>:since</tt> - optional. Only relevant for <tt>:friends</tt> action. Narrows the results to just those friends added after the date given as value of this option. Must be HTTP-formatted date.
52
+ #
43
53
  # An <tt>ArgumentError</tt> will be raised if an invalid <tt>action</tt>
44
54
  # is given. Valid actions are:
45
55
  # * +:info+
46
56
  # * +:friends+
47
57
  # * +:followers+
48
- def my(action)
58
+ def my(action, options = {})
49
59
  raise ArgumentError, "Invalid user action: #{action}" unless @@USER_URIS.keys.member?(action)
50
- response = http_connect {|conn| create_http_get_request(@@USER_URIS[action], :id => @login) }
51
- users = Twitter::User.unmarshal(response.body)
52
- bless_models(users)
60
+ params = options.merge(:id => @login)
61
+ response = http_connect {|conn| create_http_get_request(@@USER_URIS[action], params) }
62
+ users = Twitter::User.unmarshal(response.body)
63
+ bless_models(users)
53
64
  end
54
65
  end
@@ -9,12 +9,16 @@ class Twitter::Client
9
9
  include Twitter::ClassUtilMixin
10
10
  end
11
11
 
12
- require('twitter/client/base.rb')
13
- require('twitter/client/timeline.rb')
14
- require('twitter/client/status.rb')
15
- require('twitter/client/friendship.rb')
16
- require('twitter/client/messaging.rb')
17
- require('twitter/client/user.rb')
18
- require('twitter/client/auth.rb')
19
- require('twitter/client/favorites.rb')
20
-
12
+ require('twitter/client/base')
13
+ require('twitter/client/timeline')
14
+ require('twitter/client/status')
15
+ require('twitter/client/friendship')
16
+ require('twitter/client/messaging')
17
+ require('twitter/client/user')
18
+ require('twitter/client/auth')
19
+ require('twitter/client/favorites')
20
+ require('twitter/client/blocks')
21
+ require('twitter/client/account')
22
+ require('twitter/client/graph')
23
+ require('twitter/client/profile')
24
+ require('twitter/client/search')
@@ -22,6 +22,9 @@ module Twitter
22
22
  :protocol,
23
23
  :host,
24
24
  :port,
25
+ :search_protocol,
26
+ :search_host,
27
+ :search_port,
25
28
  :proxy_host,
26
29
  :proxy_port,
27
30
  :proxy_user,
@@ -49,6 +52,9 @@ module Twitter
49
52
  @@defaults = { :host => 'twitter.com',
50
53
  :port => 443,
51
54
  :protocol => :ssl,
55
+ :search_host => 'search.twitter.com',
56
+ :search_port => 80,
57
+ :search_protocol => :http,
52
58
  :proxy_host => nil,
53
59
  :proxy_port => nil,
54
60
  :user_agent => "default",
@@ -1,5 +1,7 @@
1
1
  # Contains hooks for the twitter console
2
2
 
3
+ require('optparse')
4
+
3
5
  module Twitter
4
6
  class Client
5
7
  class << self
@@ -26,3 +28,4 @@ module Twitter
26
28
  end # class << self
27
29
  end
28
30
  end
31
+
data/lib/twitter/core.rb CHANGED
@@ -99,7 +99,7 @@ module Twitter
99
99
  # 404
100
100
  # Resource Not Found
101
101
  # /i_am_crap.json
102
- class RESTError < Exception
102
+ class RESTError < RuntimeError
103
103
  include ClassUtilMixin
104
104
  @@ATTRIBUTES = [:code, :message, :uri]
105
105
  attr_accessor :code, :message, :uri
@@ -12,7 +12,7 @@ class Hash
12
12
  result = ''
13
13
  return result if self.empty?
14
14
  self.each do |key, val|
15
- result << "#{key}=#{URI.encode(val.to_s)}&"
15
+ result << "#{key}=#{CGI.escape(val.to_s)}&"
16
16
  end
17
17
  result.chop # remove the last '&' character, since it can be discarded
18
18
  end
@@ -34,3 +34,19 @@ class Time
34
34
  format ? self.to_formatted_s(format) : self.rfc2822
35
35
  end
36
36
  end
37
+
38
+ # Extension to Kernel to add #gem_present? without any exceptions raised
39
+ module Kernel
40
+
41
+ # Returns whether or not a gem exists without raising a Gem::LoadError exception
42
+ def gem_present?(gem_name, version = nil)
43
+ present = false
44
+ begin
45
+ present = !!(version ? gem(gem_name, version) : gem(gem_name))
46
+ rescue Gem::LoadError => le
47
+ present = false
48
+ warn("Gem load error: Couldn't load #{gem_name} #{version ? "with version requirement #{version}: #{le.to_s}": ""}")
49
+ end
50
+ present
51
+ end
52
+ end
data/lib/twitter/model.rb CHANGED
@@ -124,15 +124,15 @@ module Twitter
124
124
  end
125
125
 
126
126
  module AuthenticatedUserMixin
127
- def self.included(base)
128
- base.send(:include, InstanceMethods)
129
- end
130
-
131
- module InstanceMethods
127
+ def self.included(base)
128
+ base.send(:include, InstanceMethods)
129
+ end
130
+
131
+ module InstanceMethods
132
132
  # Returns an Array of user objects that represents the authenticated
133
133
  # user's friends on Twitter.
134
- def followers
135
- @client.my(:followers)
134
+ def followers(options = {})
135
+ @client.my(:followers, options)
136
136
  end
137
137
 
138
138
  # Adds given user as a friend. Returns user object as given by
@@ -152,13 +152,19 @@ module Twitter
152
152
  def defriend(user)
153
153
  @client.friend(:remove, user)
154
154
  end
155
- end
155
+ end
156
156
  end
157
157
 
158
158
  # Represents a <tt>Twitter</tt> user
159
159
  class User
160
160
  include ModelMixin
161
- @@ATTRIBUTES = [:id, :name, :description, :location, :screen_name, :url, :profile_image_url, :protected]
161
+ @@ATTRIBUTES = [:id, :name, :description, :location, :screen_name, :url,
162
+ :protected, :profile_image_url, :profile_background_color,
163
+ :profile_text_color, :profile_link_color, :profile_sidebar_fill_color,
164
+ :profile_sidebar_border_color, :profile_background_image_url,
165
+ :profile_background_tile, :utc_offset, :time_zone,
166
+ :following, :notifications, :favourites_count, :followers_count,
167
+ :friends_count, :statuses_count, :created_at, ]
162
168
  attr_accessor *@@ATTRIBUTES
163
169
 
164
170
  class << self
@@ -219,7 +225,9 @@ module Twitter
219
225
  # Represents a status posted to <tt>Twitter</tt> by a <tt>Twitter</tt> user.
220
226
  class Status
221
227
  include ModelMixin
222
- @@ATTRIBUTES = [:id, :text, :created_at, :user]
228
+ @@ATTRIBUTES = [:id, :text, :source, :truncated, :created_at, :user,
229
+ :favorited, :in_reply_to_status_id, :in_reply_to_user_id,
230
+ :in_reply_to_screen_name]
223
231
  attr_accessor *@@ATTRIBUTES
224
232
 
225
233
  class << self
@@ -260,6 +268,14 @@ module Twitter
260
268
  client.status(:post, text)
261
269
  end
262
270
  end
271
+
272
+ def reply?
273
+ !!@in_reply_to_status_id
274
+ end
275
+
276
+ def reply(status)
277
+ client.status(:reply, :status => status, :in_reply_to_status_id => @id)
278
+ end
263
279
 
264
280
  protected
265
281
  # Constructor callback
@@ -328,4 +344,17 @@ module Twitter
328
344
  @created_at = Time.parse(@created_at) if @created_at.is_a?(String)
329
345
  end
330
346
  end # Message
347
+
348
+ # RateLimitStatus provides information about how many requests you have left
349
+ # and when you can resume more requests if your remaining_hits count is zero.
350
+ class RateLimitStatus
351
+ include ModelMixin
352
+ @@ATTRIBUTES = [:remaining_hits, :hourly_limit, :reset_time_in_seconds, :reset_time]
353
+ attr_accessor *@@ATTRIBUTES
354
+
355
+ class << self
356
+ # Used as factory method callback
357
+ def attributes; @@ATTRIBUTES; end
358
+ end
359
+ end
331
360
  end # Twitter
@@ -4,7 +4,7 @@
4
4
  module Twitter::Version #:nodoc:
5
5
  MAJOR = 0
6
6
  MINOR = 3
7
- REVISION = 0
7
+ REVISION = 1
8
8
  class << self
9
9
  # Returns X.Y.Z formatted version string
10
10
  def to_version
data/lib/twitter.rb CHANGED
@@ -1,4 +1,5 @@
1
- #
1
+ #
2
+ require('rubygems')
2
3
 
3
4
  module Twitter; end
4
5
 
@@ -6,14 +7,21 @@ def require_local(suffix)
6
7
  require(File.expand_path(File.join(File.dirname(__FILE__), suffix)))
7
8
  end
8
9
 
9
- # For better unicode support
10
- $KCODE = 'u'
11
- require 'jcode'
10
+ # For better unicode support in 1.8
11
+ if RUBY_VERSION < '1.9'
12
+ $KCODE = 'u'
13
+ require 'jcode'
14
+ end
12
15
 
13
16
  # External requires
17
+ require('yaml')
18
+ require('date')
19
+ require('time')
14
20
  require('net/https')
15
21
  require('uri')
22
+ require('cgi')
16
23
  require('json')
24
+ require('yaml')
17
25
 
18
26
  # Ordering matters...pay attention here!
19
27
  require_local('twitter/ext')
@@ -23,3 +31,4 @@ require_local('twitter/core')
23
31
  require_local('twitter/model')
24
32
  require_local('twitter/config')
25
33
  require_local('twitter/client')
34
+ require_local('twitter/console')
@@ -0,0 +1,28 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe Twitter::Client, "#account_info" do
4
+ before(:each) do
5
+ @uri = Twitter::Client.class_eval("@@ACCOUNT_URIS[:rate_limit_status]")
6
+ @request = mas_net_http_get(:basic_auth => nil)
7
+ @twitter = client_context
8
+ @default_header = @twitter.send(:http_header)
9
+ @response = mas_net_http_response(:success)
10
+ @connection = mas_net_http(@response)
11
+ @response.stub!(:body).and_return("{}")
12
+ Net::HTTP.stub!(:new).and_return(@connection)
13
+ @rate_limit_status = mock(Twitter::RateLimitStatus)
14
+ @twitter.stub!(:bless_models).and_return({})
15
+ end
16
+
17
+ it "should create expected HTTP GET request" do
18
+ @twitter.should_receive(:create_http_get_request).with(@uri).and_return(@request)
19
+ @twitter.account_info
20
+ end
21
+
22
+ it "should raise Twitter::RESTError when 500 HTTP response received when giving page options" do
23
+ @connection = mas_net_http(mas_net_http_response(:server_error))
24
+ lambda {
25
+ @twitter.account_info
26
+ }.should raise_error(Twitter::RESTError)
27
+ end
28
+ end
@@ -15,6 +15,16 @@ describe "Twitter::Client" do
15
15
  end
16
16
  end
17
17
 
18
+ describe Twitter::Client, "#inspect" do
19
+ before(:each) do
20
+ @client = Twitter::Client.new(:login => "NippleEquality", :password => "3rdnipple")
21
+ end
22
+
23
+ it "should block out password attribute values" do
24
+ @client.inspect.should_not match(/@password="3rdnipple"/)
25
+ end
26
+ end
27
+
18
28
  describe Twitter::Client, "#http_header" do
19
29
  before(:each) do
20
30
  @user_agent = 'myapp'
@@ -0,0 +1,76 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe Twitter::Client, "#block" do
4
+ before(:each) do
5
+ @twitter = client_context
6
+ @id = 1234567
7
+ @screen_name = 'dummylogin'
8
+ @friend = Twitter::User.new(:id => @id, :screen_name => @screen_name)
9
+ @uris = Twitter::Client.class_eval("@@BLOCK_URIS")
10
+ @request = mas_net_http_get(:basic_auth => nil)
11
+ @response = mas_net_http_response(:success)
12
+ @connection = mas_net_http(@response)
13
+ Net::HTTP.stub!(:new).and_return(@connection)
14
+ Twitter::User.stub!(:unmarshal).and_return(@friend)
15
+ end
16
+
17
+ def create_uri(action, id)
18
+ "#{@uris[action]}/#{id}.json"
19
+ end
20
+
21
+ it "should create expected HTTP GET request for :add case using integer user ID" do
22
+ # the integer user ID scenario...
23
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:add, @id)).and_return(@request)
24
+ @twitter.block(:add, @id)
25
+ end
26
+
27
+ it "should create expected HTTP GET request for :add case using screen name" do
28
+ # the screen name scenario...
29
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:add, @screen_name)).and_return(@request)
30
+ @twitter.block(:add, @screen_name)
31
+ end
32
+
33
+ it "should create expected HTTP GET request for :add case using Twitter::User object" do
34
+ # the Twitter::User object scenario...
35
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:add, @friend.to_i)).and_return(@request)
36
+ @twitter.block(:add, @friend)
37
+ end
38
+
39
+ it "should create expected HTTP GET request for :remove case using integer user ID" do
40
+ # the integer user ID scenario...
41
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:remove, @id)).and_return(@request)
42
+ @twitter.block(:remove, @id)
43
+ end
44
+
45
+ it "should create expected HTTP GET request for :remove case using screen name" do
46
+ # the screen name scenario...
47
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:remove, @screen_name)).and_return(@request)
48
+ @twitter.block(:remove, @screen_name)
49
+ end
50
+
51
+ it "should create expected HTTP GET request for :remove case using Twitter::User object" do
52
+ # the Twitter::User object scenario...
53
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:remove, @friend.to_i)).and_return(@request)
54
+ @twitter.block(:remove, @friend)
55
+ end
56
+
57
+ it "should bless user model returned for :add case" do
58
+ @twitter.should_receive(:bless_model).with(@friend)
59
+ @twitter.block(:add, @friend)
60
+ end
61
+
62
+ it "should bless user model returned for :remove case" do
63
+ @twitter.should_receive(:bless_model).with(@friend)
64
+ @twitter.block(:remove, @friend)
65
+ end
66
+
67
+ it "should raise ArgumentError if action given is not valid" do
68
+ lambda {
69
+ @twitter.block(:crap, @friend)
70
+ }.should raise_error(ArgumentError)
71
+ end
72
+
73
+ after(:each) do
74
+ nilize(@twitter, @id, @uris, @request, @response, @connection)
75
+ end
76
+ end
@@ -7,7 +7,7 @@ describe Twitter::Client, "#friend" do
7
7
  @screen_name = 'dummylogin'
8
8
  @friend = Twitter::User.new(:id => @id, :screen_name => @screen_name)
9
9
  @uris = Twitter::Client.class_eval("@@FRIENDSHIP_URIS")
10
- @request = mas_net_http_get(:basic_auth => nil)
10
+ @request = mas_net_http_post(:basic_auth => nil)
11
11
  @response = mas_net_http_response(:success)
12
12
  @connection = mas_net_http(@response)
13
13
  Net::HTTP.stub!(:new).and_return(@connection)
@@ -20,37 +20,37 @@ describe Twitter::Client, "#friend" do
20
20
 
21
21
  it "should create expected HTTP GET request for :add case using integer user ID" do
22
22
  # the integer user ID scenario...
23
- @twitter.should_receive(:create_http_get_request).with(create_uri(:add, @id)).and_return(@request)
23
+ @twitter.should_receive(:create_http_post_request).with(create_uri(:add, @id)).and_return(@request)
24
24
  @twitter.friend(:add, @id)
25
25
  end
26
26
 
27
27
  it "should create expected HTTP GET request for :add case using screen name" do
28
28
  # the screen name scenario...
29
- @twitter.should_receive(:create_http_get_request).with(create_uri(:add, @screen_name)).and_return(@request)
29
+ @twitter.should_receive(:create_http_post_request).with(create_uri(:add, @screen_name)).and_return(@request)
30
30
  @twitter.friend(:add, @screen_name)
31
31
  end
32
32
 
33
33
  it "should create expected HTTP GET request for :add case using Twitter::User object" do
34
34
  # the Twitter::User object scenario...
35
- @twitter.should_receive(:create_http_get_request).with(create_uri(:add, @friend.to_i)).and_return(@request)
35
+ @twitter.should_receive(:create_http_post_request).with(create_uri(:add, @friend.to_i)).and_return(@request)
36
36
  @twitter.friend(:add, @friend)
37
37
  end
38
38
 
39
39
  it "should create expected HTTP GET request for :remove case using integer user ID" do
40
40
  # the integer user ID scenario...
41
- @twitter.should_receive(:create_http_get_request).with(create_uri(:remove, @id)).and_return(@request)
41
+ @twitter.should_receive(:create_http_post_request).with(create_uri(:remove, @id)).and_return(@request)
42
42
  @twitter.friend(:remove, @id)
43
43
  end
44
44
 
45
45
  it "should create expected HTTP GET request for :remove case using screen name" do
46
46
  # the screen name scenario...
47
- @twitter.should_receive(:create_http_get_request).with(create_uri(:remove, @screen_name)).and_return(@request)
47
+ @twitter.should_receive(:create_http_post_request).with(create_uri(:remove, @screen_name)).and_return(@request)
48
48
  @twitter.friend(:remove, @screen_name)
49
49
  end
50
50
 
51
51
  it "should create expected HTTP GET request for :remove case using Twitter::User object" do
52
52
  # the Twitter::User object scenario...
53
- @twitter.should_receive(:create_http_get_request).with(create_uri(:remove, @friend.to_i)).and_return(@request)
53
+ @twitter.should_receive(:create_http_post_request).with(create_uri(:remove, @friend.to_i)).and_return(@request)
54
54
  @twitter.friend(:remove, @friend)
55
55
  end
56
56
 
@@ -0,0 +1,67 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe Twitter::Client, "#graph(:friends...)" do
4
+ before(:each) do
5
+ @twitter = client_context
6
+ @id = 1234567
7
+ @screen_name = 'dummylogin'
8
+ @friend = Twitter::User.new(:id => @id, :screen_name => @screen_name)
9
+ @uris = Twitter::Client.class_eval("@@GRAPH_URIS")
10
+ @request = mas_net_http_get(:basic_auth => nil)
11
+ @response = mas_net_http_response(:success)
12
+ @response.stub!(:body).and_return("[1, 2, 3, 4, 5, 6]")
13
+ @connection = mas_net_http(@response)
14
+ Net::HTTP.stub!(:new).and_return(@connection)
15
+ Twitter::User.stub!(:unmarshal).and_return(@friend)
16
+ end
17
+
18
+ def create_uri(action)
19
+ "#{@uris[action]}.json"
20
+ end
21
+
22
+ it "should create expected HTTP GET request for :friends case using integer user ID" do
23
+ # the integer user ID scenario...
24
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:friends), :id => @id).and_return(@request)
25
+ @twitter.graph(:friends, @id)
26
+ end
27
+
28
+ it "should create expected HTTP GET request for :friends case using screen name" do
29
+ # the screen name scenario...
30
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:friends), :id => @screen_name).and_return(@request)
31
+ @twitter.graph(:friends, @screen_name)
32
+ end
33
+
34
+ it "should create expected HTTP GET request for :friends case using Twitter::User object" do
35
+ # the Twitter::User object scenario...
36
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:friends), :id => @friend.to_i).and_return(@request)
37
+ @twitter.graph(:friends, @friend)
38
+ end
39
+
40
+ it "should create expected HTTP GET request for :followers case using integer user ID" do
41
+ # the integer user ID scenario...
42
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:followers), :id => @id).and_return(@request)
43
+ @twitter.graph(:followers, @id)
44
+ end
45
+
46
+ it "should create expected HTTP GET request for :followers case using screen name" do
47
+ # the screen name scenario...
48
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:followers), :id => @screen_name).and_return(@request)
49
+ @twitter.graph(:followers, @screen_name)
50
+ end
51
+
52
+ it "should create expected HTTP GET request for :followers case using Twitter::User object" do
53
+ # the Twitter::User object scenario...
54
+ @twitter.should_receive(:create_http_get_request).with(create_uri(:followers), :id => @friend.to_i).and_return(@request)
55
+ @twitter.graph(:followers, @friend)
56
+ end
57
+
58
+ it "should raise ArgumentError if action given is not valid" do
59
+ lambda {
60
+ @twitter.graph(:crap, @friend)
61
+ }.should raise_error(ArgumentError)
62
+ end
63
+
64
+ after(:each) do
65
+ nilize(@twitter, @id, @uris, @request, @response, @connection)
66
+ end
67
+ end
@@ -14,7 +14,7 @@ describe Twitter::Client, "#messages" do
14
14
  end
15
15
 
16
16
  it "should create expected HTTP GET request for :received case" do
17
- @twitter.should_receive(:create_http_get_request).with(@uris[:received]).and_return(@request)
17
+ @twitter.should_receive(:create_http_get_request).with(@uris[:received], {}).and_return(@request)
18
18
  @twitter.messages(:received)
19
19
  end
20
20
 
@@ -24,7 +24,7 @@ describe Twitter::Client, "#messages" do
24
24
  end
25
25
 
26
26
  it "should create expected HTTP GET request for :sent case" do
27
- @twitter.should_receive(:create_http_get_request).with(@uris[:sent]).and_return(@request)
27
+ @twitter.should_receive(:create_http_get_request).with(@uris[:sent], {}).and_return(@request)
28
28
  @twitter.messages(:sent)
29
29
  end
30
30
 
@@ -46,7 +46,7 @@ describe Twitter::Client, "#messages" do
46
46
  end
47
47
 
48
48
  it "should generate expected GET HTTP request for paging case" do
49
- @twitter.should_receive(:create_http_get_request).with(@uris[:received] + "?page=#{@page}").and_return(@request)
49
+ @twitter.should_receive(:create_http_get_request).with(@uris[:received], {:page => @page}).and_return(@request)
50
50
  @twitter.messages(:received, :page => @page)
51
51
  end
52
52
 
@@ -0,0 +1,91 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+
3
+ describe Twitter::Client, "#profile" do
4
+ before(:each) do
5
+ @twitter = client_context
6
+ @user_attrs = {
7
+ :id => "JaneEyre",
8
+ :login => "Jane Eyre",
9
+ :url => "http://janeeyrerocks.co.uk",
10
+ :location => "Thornfield Manor",
11
+ }
12
+ # name, email, url, location, description
13
+ @info_attrs = {
14
+ :name => "Jane Eyre",
15
+ :email => "jane.eyre@gmail.co.uk",
16
+ :url => "http://janeeyrerocks.co.uk",
17
+ :location => "Thornfield Manor",
18
+ :description => "Governess who falls for slave-trade aristocrat with French lovechild he doesn't acknowledge & wife locked in damp attic with keeper.",
19
+ }
20
+ # background_color, text_color, link_color, sidebar_fill_color, sidebar_border_color
21
+ @colors_attrs = {
22
+ :background_color => "#ffffff",
23
+ :text_color => "#101010",
24
+ :link_color => "#990000",
25
+ }
26
+ # value
27
+ @device_attrs = {
28
+ :value => "sms",
29
+ }
30
+ @user = Twitter::User.new
31
+ @uris = Twitter::Client.class_eval("@@PROFILE_URIS")
32
+ @request = mas_net_http_get(:basic_auth => nil)
33
+ @json = JSON.unparse(@user_attrs)
34
+ @response = mas_net_http_response(:success, @json)
35
+ @connection = mas_net_http(@response)
36
+
37
+ Net::HTTP.stub!(:new).and_return(@connection)
38
+ Twitter::User.stub!(:unmarshal).and_return(@user)
39
+ end
40
+
41
+ it "should invoke #http_connect with expected arguments for :info case" do
42
+ @twitter.should_receive(:http_connect).with(@info_attrs.to_http_str).and_return(@response)
43
+ @twitter.profile(:info, @info_attrs)
44
+ end
45
+
46
+ it "should invoke #http_connect with expected arguments for :colors case" do
47
+ @twitter.should_receive(:http_connect).with(@colors_attrs.to_http_str).and_return(@response)
48
+ @twitter.profile(:colors, @colors_attrs)
49
+ end
50
+
51
+ it "should invoke #http_connect with expected arguments for :device case" do
52
+ @twitter.should_receive(:http_connect).with(@device_attrs.to_http_str).and_return(@response)
53
+ @twitter.profile(:info, @device_attrs)
54
+ end
55
+
56
+ it "should create expected HTTP POST request for :info case" do
57
+ @twitter.should_receive(:create_http_post_request).with(@uris[:info]).and_return(@request)
58
+ @twitter.profile(:info, @info_attrs)
59
+ end
60
+
61
+ it "should create expected HTTP POST request for :colors case" do
62
+ @twitter.should_receive(:create_http_post_request).with(@uris[:colors]).and_return(@request)
63
+ @twitter.profile(:colors, @colors_attrs)
64
+ end
65
+
66
+ it "should create expected HTTP POST request for :device case" do
67
+ @twitter.should_receive(:create_http_post_request).with(@uris[:device]).and_return(@request)
68
+ @twitter.profile(:device, @device_attrs)
69
+ end
70
+
71
+ it "should bless returned Twitter::User object for :info case" do
72
+ @twitter.should_receive(:bless_model).with(@user)
73
+ @twitter.profile(:info, @info_attrs)
74
+ end
75
+
76
+ it "should bless returned Twitter::User object for :colors case" do
77
+ @twitter.should_receive(:bless_model).with(@user)
78
+ @twitter.profile(:colors, @colors_attrs)
79
+ end
80
+
81
+ it "should bless returned Twitter::User object for :device case" do
82
+ @twitter.should_receive(:bless_model).with(@user)
83
+ @twitter.profile(:device, @device_attrs)
84
+ end
85
+
86
+ it "should raise an ArgumentError when giving an invalid profile action"
87
+
88
+ after(:each) do
89
+ nilize(@twitter, @uris, @request, @response, @connection, @sender, @recipient, @user, @attributes)
90
+ end
91
+ end