twitter4r 0.3.0 → 0.3.1

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