jlind-twitter 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/History +290 -0
  2. data/License +20 -0
  3. data/Notes +33 -0
  4. data/README.rdoc +19 -0
  5. data/Rakefile +40 -0
  6. data/VERSION.yml +5 -0
  7. data/examples/connect.rb +30 -0
  8. data/examples/friendship_existence.rb +13 -0
  9. data/examples/helpers/config_store.rb +38 -0
  10. data/examples/httpauth.rb +11 -0
  11. data/examples/ids.rb +13 -0
  12. data/examples/lists.rb +11 -0
  13. data/examples/oauth.rb +27 -0
  14. data/examples/search.rb +15 -0
  15. data/examples/timeline.rb +19 -0
  16. data/examples/tumblr.rb +9 -0
  17. data/examples/unauthorized.rb +16 -0
  18. data/examples/update.rb +11 -0
  19. data/examples/user.rb +5 -0
  20. data/lib/twitter.rb +156 -0
  21. data/lib/twitter/base.rb +390 -0
  22. data/lib/twitter/geo.rb +25 -0
  23. data/lib/twitter/httpauth.rb +53 -0
  24. data/lib/twitter/local_trends.rb +30 -0
  25. data/lib/twitter/oauth.rb +85 -0
  26. data/lib/twitter/request.rb +71 -0
  27. data/lib/twitter/search.rb +163 -0
  28. data/lib/twitter/trends.rb +55 -0
  29. data/test/fixtures/blocking.json +1632 -0
  30. data/test/fixtures/firehose.json +1 -0
  31. data/test/fixtures/follower_ids.json +1 -0
  32. data/test/fixtures/followers.json +1 -0
  33. data/test/fixtures/friend_ids.json +1 -0
  34. data/test/fixtures/friends_timeline.json +1 -0
  35. data/test/fixtures/friendship.json +1 -0
  36. data/test/fixtures/friendship_exists.json +1 -0
  37. data/test/fixtures/geo_place.json +1 -0
  38. data/test/fixtures/geo_reverse_geocode.json +1 -0
  39. data/test/fixtures/geo_reverse_geocode_granularity.json +1 -0
  40. data/test/fixtures/geo_reverse_geocode_limit.json +1 -0
  41. data/test/fixtures/geo_search.json +1 -0
  42. data/test/fixtures/geo_search_ip_address.json +1 -0
  43. data/test/fixtures/geo_search_query.json +1 -0
  44. data/test/fixtures/home_timeline.json +1 -0
  45. data/test/fixtures/ids.json +1 -0
  46. data/test/fixtures/list.json +1 -0
  47. data/test/fixtures/list_statuses.json +1 -0
  48. data/test/fixtures/list_statuses_1_1.json +1 -0
  49. data/test/fixtures/list_statuses_2_1.json +1 -0
  50. data/test/fixtures/list_subscriptions.json +1 -0
  51. data/test/fixtures/list_users.json +1 -0
  52. data/test/fixtures/lists.json +1 -0
  53. data/test/fixtures/memberships.json +1 -0
  54. data/test/fixtures/mentions.json +1 -0
  55. data/test/fixtures/not_found.json +1 -0
  56. data/test/fixtures/people_search.json +39 -0
  57. data/test/fixtures/rate_limit_exceeded.json +1 -0
  58. data/test/fixtures/report_spam.json +41 -0
  59. data/test/fixtures/retweet.json +1 -0
  60. data/test/fixtures/retweeted_by_me.json +1 -0
  61. data/test/fixtures/retweeted_to_me.json +1 -0
  62. data/test/fixtures/retweeters_of_tweet.json +166 -0
  63. data/test/fixtures/retweets.json +1 -0
  64. data/test/fixtures/retweets_of_me.json +1 -0
  65. data/test/fixtures/sample-image.png +0 -0
  66. data/test/fixtures/saved_search.json +7 -0
  67. data/test/fixtures/saved_searches.json +16 -0
  68. data/test/fixtures/search.json +1 -0
  69. data/test/fixtures/search_from_jnunemaker.json +1 -0
  70. data/test/fixtures/status.json +1 -0
  71. data/test/fixtures/status_show.json +1 -0
  72. data/test/fixtures/trends_available.json +253 -0
  73. data/test/fixtures/trends_current.json +1 -0
  74. data/test/fixtures/trends_current_exclude.json +1 -0
  75. data/test/fixtures/trends_daily.json +1925 -0
  76. data/test/fixtures/trends_daily_date.json +1 -0
  77. data/test/fixtures/trends_daily_exclude.json +1 -0
  78. data/test/fixtures/trends_location.json +57 -0
  79. data/test/fixtures/trends_weekly.json +1 -0
  80. data/test/fixtures/trends_weekly_date.json +1 -0
  81. data/test/fixtures/trends_weekly_exclude.json +1 -0
  82. data/test/fixtures/unauthorized.json +1 -0
  83. data/test/fixtures/update_profile_background_image.json +1 -0
  84. data/test/fixtures/update_profile_image.json +1 -0
  85. data/test/fixtures/user.json +1 -0
  86. data/test/fixtures/user_timeline.json +710 -0
  87. data/test/fixtures/users.json +1 -0
  88. data/test/test_helper.rb +47 -0
  89. data/test/twitter/base_test.rb +426 -0
  90. data/test/twitter/geo_test.rb +79 -0
  91. data/test/twitter/httpauth_test.rb +86 -0
  92. data/test/twitter/oauth_test.rb +127 -0
  93. data/test/twitter/request_test.rb +217 -0
  94. data/test/twitter/search_test.rb +208 -0
  95. data/test/twitter/trends_test.rb +112 -0
  96. data/test/twitter_test.rb +106 -0
  97. metadata +305 -0
@@ -0,0 +1,79 @@
1
+ require 'test_helper'
2
+
3
+ class GeoTest < Test::Unit::TestCase
4
+ include Twitter
5
+
6
+ context "Geographic place lookup" do
7
+
8
+ should "work" do
9
+ stub_get 'http://api.twitter.com/1/geo/id/ea76a36c5bc2bdff.json', 'geo_place.json'
10
+ place = Geo.place('ea76a36c5bc2bdff')
11
+ place.country.should == 'The United States of America'
12
+ place.full_name.should == 'Ballantyne West, Charlotte'
13
+ place.geometry.coordinates.should be_kind_of(Array)
14
+ end
15
+
16
+ end
17
+
18
+ context "Geographic search" do
19
+
20
+ should "work" do
21
+ stub_get 'http://api.twitter.com:80/1/geo/search.json?lat=35.061161&long=-80.854568', 'geo_search.json'
22
+ places = Geo.search(:lat => 35.061161, :long => -80.854568)
23
+ places.size.should == 3
24
+ places[0].full_name.should eql('Ballantyne West, Charlotte')
25
+ places[0].name.should eql('Ballantyne West')
26
+ end
27
+
28
+ should "be able to search with free form text" do
29
+ stub_get 'http://api.twitter.com/1/geo/search.json?query=princeton%20record%20exchange', 'geo_search_query.json'
30
+ places = Geo.search(:query => 'princeton record exchange')
31
+ places.size.should == 1
32
+ places[0].name.should eql('Princeton Record Exchange')
33
+ places[0].place_type.should eql('poi')
34
+ places[0].attributes.street_address.should eql('20 S Tulane St')
35
+ end
36
+
37
+ should "be able to search by ip address" do
38
+ stub_get 'http://api.twitter.com/1/geo/search.json?ip=74.125.19.104', 'geo_search_ip_address.json'
39
+ places = Geo.search(:ip => '74.125.19.104')
40
+ places.size.should == 4
41
+ places[0].full_name.should eql("Mountain View, CA")
42
+ places[0].name.should eql("Mountain View")
43
+ places[1].full_name.should eql("Sunnyvale, CA")
44
+ places[1].name.should eql('Sunnyvale')
45
+ end
46
+
47
+ end
48
+
49
+ context "Geographic reverse_geocode" do
50
+
51
+ should "work" do
52
+ stub_get 'http://api.twitter.com:80/1/geo/reverse_geocode.json?lat=35.061161&long=-80.854568', 'geo_reverse_geocode.json'
53
+ places = Geo.reverse_geocode(:lat => 35.061161, :long => -80.854568)
54
+ places.size.should == 4
55
+ places[0].full_name.should eql('Ballantyne West, Charlotte')
56
+ places[0].name.should eql('Ballantyne West')
57
+ end
58
+
59
+ should "be able to limit the number of results returned" do
60
+ stub_get 'http://api.twitter.com/1/geo/reverse_geocode.json?lat=35.061161&max_results=2&long=-80.854568', 'geo_reverse_geocode_limit.json'
61
+ places = Geo.reverse_geocode(:lat => 35.061161, :long => -80.854568, :max_results => 2)
62
+ places.size.should == 2
63
+ places[0].full_name.should eql('Ballantyne West, Charlotte')
64
+ places[0].name.should eql('Ballantyne West')
65
+ end
66
+
67
+ should "be able to lookup with granularity" do
68
+ stub_get 'http://api.twitter.com/1/geo/reverse_geocode.json?lat=35.061161&long=-80.854568&granularity=city', 'geo_reverse_geocode_granularity.json'
69
+ places = Geo.reverse_geocode(:lat => 35.061161, :long => -80.854568, :granularity => 'city')
70
+ places.size.should == 3
71
+ places[0].full_name.should eql('Charlotte, NC')
72
+ places[0].name.should eql('Charlotte')
73
+ places[1].full_name.should eql('North Carolina, US')
74
+ places[1].name.should eql('North Carolina')
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -0,0 +1,86 @@
1
+ require 'test_helper'
2
+
3
+ class HTTPAuthTest < Test::Unit::TestCase
4
+ context "Creating new instance" do
5
+ should "should take user and password" do
6
+ twitter = Twitter::HTTPAuth.new('username', 'password')
7
+ twitter.username.should == 'username'
8
+ twitter.password.should == 'password'
9
+ end
10
+
11
+ should "accept options" do
12
+ twitter = Twitter::HTTPAuth.new('username', 'password', :ssl => true)
13
+ twitter.options.should == {:ssl => true}
14
+ end
15
+
16
+ should "default ssl to false" do
17
+ twitter = Twitter::HTTPAuth.new('username', 'password')
18
+ twitter.options[:ssl].should be(false)
19
+ end
20
+
21
+ should "use https if ssl is true" do
22
+ Twitter::HTTPAuth.expects(:base_uri).with('https://api.twitter.com/' + Twitter::API_VERSION)
23
+ twitter = Twitter::HTTPAuth.new('username', 'password', :ssl => true)
24
+ end
25
+
26
+ should "use http if ssl is false" do
27
+ Twitter::HTTPAuth.expects(:base_uri).with('http://api.twitter.com/' + Twitter::API_VERSION)
28
+ twitter = Twitter::HTTPAuth.new('username', 'password', :ssl => false)
29
+ end
30
+
31
+ should "use api version if provided" do
32
+ Twitter::HTTPAuth.expects(:base_uri).with('http://api.twitter.com/2')
33
+ twitter = Twitter::HTTPAuth.new('username', 'password', {:ssl => false, :api_version => 2})
34
+ end
35
+
36
+ should "not use api versioning if api_version is false " do
37
+ Twitter::HTTPAuth.expects(:base_uri).with('http://api.twitter.com')
38
+ twitter = Twitter::HTTPAuth.new('username', 'password', {:ssl => false, :api_version => false})
39
+ end
40
+ end
41
+
42
+ context "Client methods" do
43
+ setup do
44
+ @twitter = Twitter::HTTPAuth.new('username', 'password')
45
+ end
46
+
47
+ should "not throw error when accessing response message" do
48
+ stub_get('http://api.twitter.com:80/1/statuses/user_timeline.json', 'user_timeline.json')
49
+ response = @twitter.get('/statuses/user_timeline.json')
50
+ response.message.should == 'OK'
51
+ end
52
+
53
+ should "be able to get" do
54
+ stub_get('http://username:password@api.twitter.com:80/1/statuses/user_timeline.json', 'user_timeline.json')
55
+ response = @twitter.get('/statuses/user_timeline.json')
56
+ response.should == fixture_file('user_timeline.json')
57
+ end
58
+
59
+ should "be able to get with headers" do
60
+ @twitter.class.expects(:get).with(
61
+ '/statuses/user_timeline.json', {
62
+ :basic_auth => {:username => 'username', :password => 'password'},
63
+ :headers => {'Foo' => 'Bar'}
64
+ }
65
+ ).returns(fixture_file('user_timeline.json'))
66
+ @twitter.get('/statuses/user_timeline.json', {'Foo' => 'Bar'})
67
+ end
68
+
69
+ should "be able to post" do
70
+ stub_post('http://username:password@api.twitter.com:80/1/statuses/update.json', 'status.json')
71
+ response = @twitter.post('/statuses/update.json', :text => 'My update.')
72
+ response.should == fixture_file('status.json')
73
+ end
74
+
75
+ should "be able to post with headers" do
76
+ @twitter.class.expects(:post).with(
77
+ '/statuses/update.json', {
78
+ :headers => {'Foo' => 'Bar'},
79
+ :body => {:text => 'My update.'},
80
+ :basic_auth => {:username => 'username', :password => 'password'}
81
+ }
82
+ ).returns(fixture_file('status.json'))
83
+ @twitter.post('/statuses/update.json', {:text => 'My update.'}, {'Foo' => 'Bar'})
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,127 @@
1
+ require 'test_helper'
2
+
3
+ class OAuthTest < Test::Unit::TestCase
4
+ should "initialize with consumer token and secret" do
5
+ twitter = Twitter::OAuth.new('token', 'secret')
6
+
7
+ twitter.ctoken.should == 'token'
8
+ twitter.csecret.should == 'secret'
9
+ end
10
+
11
+ should "set authorization path to '/oauth/authorize' by default" do
12
+ twitter = Twitter::OAuth.new('token', 'secret')
13
+ twitter.consumer.options[:authorize_path].should == '/oauth/authorize'
14
+ end
15
+
16
+ should "set authorization path to '/oauth/authenticate' if sign_in_with_twitter" do
17
+ twitter = Twitter::OAuth.new('token', 'secret', :sign_in => true)
18
+ twitter.consumer.options[:authorize_path].should == '/oauth/authenticate'
19
+ end
20
+
21
+ should "have a consumer" do
22
+ consumer = mock('oauth consumer')
23
+ OAuth::Consumer.expects(:new).with('token', 'secret', {:site => 'http://api.twitter.com'}).returns(consumer)
24
+ twitter = Twitter::OAuth.new('token', 'secret')
25
+
26
+ twitter.consumer.should == consumer
27
+ end
28
+
29
+ should "have a request token from the consumer" do
30
+ consumer = mock('oauth consumer')
31
+ request_token = mock('request token')
32
+ consumer.expects(:get_request_token).returns(request_token)
33
+ OAuth::Consumer.expects(:new).with('token', 'secret', {:site => 'http://api.twitter.com', :request_endpoint => 'http://api.twitter.com'}).returns(consumer)
34
+ twitter = Twitter::OAuth.new('token', 'secret')
35
+
36
+ twitter.request_token.should == request_token
37
+ end
38
+
39
+ context "set_callback_url" do
40
+ should "clear request token and set the callback url" do
41
+ consumer = mock('oauth consumer')
42
+ request_token = mock('request token')
43
+
44
+ OAuth::Consumer.
45
+ expects(:new).
46
+ with('token', 'secret', {:site => 'http://api.twitter.com', :request_endpoint => 'http://api.twitter.com'}).
47
+ returns(consumer)
48
+
49
+ twitter = Twitter::OAuth.new('token', 'secret')
50
+
51
+ consumer.
52
+ expects(:get_request_token).
53
+ with({:oauth_callback => 'http://myapp.com/oauth_callback'})
54
+
55
+ twitter.set_callback_url('http://myapp.com/oauth_callback')
56
+ end
57
+ end
58
+
59
+ should "be able to create access token from request token, request secret and verifier" do
60
+ twitter = Twitter::OAuth.new('token', 'secret')
61
+ consumer = OAuth::Consumer.new('token', 'secret', {:site => 'http://api.twitter.com'})
62
+ twitter.stubs(:signing_consumer).returns(consumer)
63
+
64
+ access_token = mock('access token', :token => 'atoken', :secret => 'asecret')
65
+ request_token = mock('request token')
66
+ request_token.
67
+ expects(:get_access_token).
68
+ with(:oauth_verifier => 'verifier').
69
+ returns(access_token)
70
+
71
+ OAuth::RequestToken.
72
+ expects(:new).
73
+ with(consumer, 'rtoken', 'rsecret').
74
+ returns(request_token)
75
+
76
+ twitter.authorize_from_request('rtoken', 'rsecret', 'verifier')
77
+ twitter.access_token.class.should be(OAuth::AccessToken)
78
+ twitter.access_token.token.should == 'atoken'
79
+ twitter.access_token.secret.should == 'asecret'
80
+ end
81
+
82
+ should "be able to create access token from access token and secret" do
83
+ twitter = Twitter::OAuth.new('token', 'secret')
84
+ consumer = OAuth::Consumer.new('token', 'secret', {:site => 'http://api.twitter.com'})
85
+ twitter.stubs(:consumer).returns(consumer)
86
+
87
+ twitter.authorize_from_access('atoken', 'asecret')
88
+ twitter.access_token.class.should be(OAuth::AccessToken)
89
+ twitter.access_token.token.should == 'atoken'
90
+ twitter.access_token.secret.should == 'asecret'
91
+ end
92
+
93
+ should "delegate get to access token" do
94
+ access_token = mock('access token')
95
+ twitter = Twitter::OAuth.new('token', 'secret')
96
+ twitter.stubs(:access_token).returns(access_token)
97
+ access_token.expects(:get).returns(nil)
98
+ twitter.get('/foo')
99
+ end
100
+
101
+ should "delegate post to access token" do
102
+ access_token = mock('access token')
103
+ twitter = Twitter::OAuth.new('token', 'secret')
104
+ twitter.stubs(:access_token).returns(access_token)
105
+ access_token.expects(:post).returns(nil)
106
+ twitter.post('/foo')
107
+ end
108
+
109
+ [:get, :put, :post, :delete].each do |method|
110
+ should "#{method} with api version if provided" do
111
+ access_token = mock('access token')
112
+ twitter = Twitter::OAuth.new('token', 'secret', :api_version => 2)
113
+ twitter.stubs(:access_token).returns(access_token)
114
+ access_token.expects(method).with('/2/foo').returns(nil)
115
+ access_token.expects(method).with('/foo').never
116
+ twitter.send(method, '/foo')
117
+ end
118
+
119
+ should "not #{method} with api versioning if api_version is false" do
120
+ access_token = mock('access token')
121
+ twitter = Twitter::OAuth.new('token', 'secret', :api_version => false)
122
+ twitter.stubs(:access_token).returns(access_token)
123
+ access_token.expects(method).with('/foo')
124
+ twitter.send(method, '/foo')
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,217 @@
1
+ require 'test_helper'
2
+
3
+ class RequestTest < Test::Unit::TestCase
4
+ context "new get request" do
5
+ setup do
6
+ @client = mock('twitter client')
7
+ @request = Twitter::Request.new(@client, :get, '/1/statuses/user_timeline.json', {:query => {:since_id => 1234}})
8
+ end
9
+
10
+ should "have client" do
11
+ @request.client.should == @client
12
+ end
13
+
14
+ should "have method" do
15
+ @request.method.should == :get
16
+ end
17
+
18
+ should "have path" do
19
+ @request.path.should == '/1/statuses/user_timeline.json'
20
+ end
21
+
22
+ should "have options" do
23
+ @request.options[:query].should == {:since_id => 1234}
24
+ end
25
+
26
+ should "have uri" do
27
+ @request.uri.should == '/1/statuses/user_timeline.json?since_id=1234'
28
+ end
29
+
30
+ context "performing request for collection" do
31
+ setup do
32
+ response = mock('response') do
33
+ stubs(:body).returns(fixture_file('user_timeline.json'))
34
+ stubs(:code).returns('200')
35
+ end
36
+
37
+ @client.expects(:get).returns(response)
38
+ @object = @request.perform
39
+ end
40
+
41
+ should "return array of mashes" do
42
+ @object.size.should == 20
43
+ @object.each { |obj| obj.class.should be(Hashie::Mash) }
44
+ @object.first.text.should == 'Colder out today than expected. Headed to the Beanery for some morning wakeup drink. Latte or coffee...hmmm...'
45
+ end
46
+ end
47
+
48
+ context "performing a request for a single object" do
49
+ setup do
50
+ response = mock('response') do
51
+ stubs(:body).returns(fixture_file('status.json'))
52
+ stubs(:code).returns('200')
53
+ end
54
+
55
+ @client.expects(:get).returns(response)
56
+ @object = @request.perform
57
+ end
58
+
59
+ should "return a single mash" do
60
+ @object.class.should be(Hashie::Mash)
61
+ @object.text.should == 'Rob Dyrdek is the funniest man alive. That is all.'
62
+ end
63
+ end
64
+
65
+ context "with no query string" do
66
+ should "not have any query string" do
67
+ request = Twitter::Request.new(@client, :get, '/1/statuses/user_timeline.json')
68
+ request.uri.should == '/1/statuses/user_timeline.json'
69
+ end
70
+ end
71
+
72
+ context "with blank query string" do
73
+ should "not have any query string" do
74
+ request = Twitter::Request.new(@client, :get, '/1/statuses/user_timeline.json', :query => {})
75
+ request.uri.should == '/1/statuses/user_timeline.json'
76
+ end
77
+ end
78
+
79
+ should "have get shortcut to initialize and perform all in one" do
80
+ Twitter::Request.any_instance.expects(:perform).returns(nil)
81
+ Twitter::Request.get(@client, '/foo')
82
+ end
83
+
84
+ should "allow setting query string and headers" do
85
+ response = mock('response') do
86
+ stubs(:body).returns('')
87
+ stubs(:code).returns('200')
88
+ end
89
+
90
+ @client.expects(:get).with('/1/statuses/friends_timeline.json?since_id=1234', {'Foo' => 'Bar'}).returns(response)
91
+ Twitter::Request.get(@client, '/1/statuses/friends_timeline.json?since_id=1234', :headers => {'Foo' => 'Bar'})
92
+ end
93
+ end
94
+
95
+ context "new post request" do
96
+ setup do
97
+ @client = mock('twitter client')
98
+ @request = Twitter::Request.new(@client, :post, '/1/statuses/update.json', {:body => {:status => 'Woohoo!'}})
99
+ end
100
+
101
+ should "allow setting body and headers" do
102
+ response = mock('response') do
103
+ stubs(:body).returns('')
104
+ stubs(:code).returns('200')
105
+ end
106
+
107
+ @client.expects(:post).with('/1/statuses/update.json', {:status => 'Woohoo!'}, {'Foo' => 'Bar'}).returns(response)
108
+ Twitter::Request.post(@client, '/1/statuses/update.json', :body => {:status => 'Woohoo!'}, :headers => {'Foo' => 'Bar'})
109
+ end
110
+
111
+ context "performing request" do
112
+ setup do
113
+ response = mock('response') do
114
+ stubs(:body).returns(fixture_file('status.json'))
115
+ stubs(:code).returns('200')
116
+ end
117
+
118
+ @client.expects(:post).returns(response)
119
+ @object = @request.perform
120
+ end
121
+
122
+ should "return a mash of the object" do
123
+ @object.text.should == 'Rob Dyrdek is the funniest man alive. That is all.'
124
+ end
125
+ end
126
+
127
+ should "have post shortcut to initialize and perform all in one" do
128
+ Twitter::Request.any_instance.expects(:perform).returns(nil)
129
+ Twitter::Request.post(@client, '/foo')
130
+ end
131
+ end
132
+
133
+ context "error raising" do
134
+ setup do
135
+ oauth = Twitter::OAuth.new('token', 'secret')
136
+ oauth.authorize_from_access('atoken', 'asecret')
137
+ @client = Twitter::Base.new(oauth)
138
+ end
139
+
140
+ should "not raise error for 200" do
141
+ stub_get('http://api.twitter.com:80/foo', '', ['200'])
142
+ lambda {
143
+ Twitter::Request.get(@client, '/foo')
144
+ }.should_not raise_error
145
+ end
146
+
147
+ should "not raise error for 304" do
148
+ stub_get('http://api.twitter.com:80/foo', '', ['304'])
149
+ lambda {
150
+ Twitter::Request.get(@client, '/foo')
151
+ }.should_not raise_error
152
+ end
153
+
154
+ should "raise RateLimitExceeded for 400" do
155
+ stub_get('http://api.twitter.com:80/foo', 'rate_limit_exceeded.json', ['400'])
156
+ lambda {
157
+ Twitter::Request.get(@client, '/foo')
158
+ }.should raise_error(Twitter::RateLimitExceeded)
159
+ end
160
+
161
+ should "raise Unauthorized for 401" do
162
+ stub_get('http://api.twitter.com:80/foo', '', ['401'])
163
+ lambda {
164
+ Twitter::Request.get(@client, '/foo')
165
+ }.should raise_error(Twitter::Unauthorized)
166
+ end
167
+
168
+ should "raise General for 403" do
169
+ stub_get('http://api.twitter.com:80/foo', '', ['403'])
170
+ lambda {
171
+ Twitter::Request.get(@client, '/foo')
172
+ }.should raise_error(Twitter::General)
173
+ end
174
+
175
+ should "raise NotFound for 404" do
176
+ stub_get('http://api.twitter.com:80/foo', '', ['404'])
177
+ lambda {
178
+ Twitter::Request.get(@client, '/foo')
179
+ }.should raise_error(Twitter::NotFound)
180
+ end
181
+
182
+ should "raise InformTwitter for 500" do
183
+ stub_get('http://api.twitter.com:80/foo', '', ['500'])
184
+ lambda {
185
+ Twitter::Request.get(@client, '/foo')
186
+ }.should raise_error(Twitter::InformTwitter)
187
+ end
188
+
189
+ should "raise Unavailable for 502" do
190
+ stub_get('http://api.twitter.com:80/foo', '', ['502'])
191
+ lambda {
192
+ Twitter::Request.get(@client, '/foo')
193
+ }.should raise_error(Twitter::Unavailable)
194
+ end
195
+
196
+ should "raise Unavailable for 503" do
197
+ stub_get('http://api.twitter.com:80/foo', '', ['503'])
198
+ lambda {
199
+ Twitter::Request.get(@client, '/foo')
200
+ }.should raise_error(Twitter::Unavailable)
201
+ end
202
+ end
203
+
204
+ context "Making request with mash option set to false" do
205
+ setup do
206
+ oauth = Twitter::OAuth.new('token', 'secret')
207
+ oauth.authorize_from_access('atoken', 'asecret')
208
+ @client = Twitter::Base.new(oauth)
209
+ end
210
+
211
+ should "not attempt to create mash of return object" do
212
+ stub_get('http://api.twitter.com:80/foo', 'friend_ids.json')
213
+ object = Twitter::Request.get(@client, '/foo', :mash => false)
214
+ object.class.should_not be(Hashie::Mash)
215
+ end
216
+ end
217
+ end