twitter 4.8.1 → 5.0.0.rc.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 (197) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG.md +30 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +386 -266
  5. data/lib/twitter.rb +4 -39
  6. data/lib/twitter/arguments.rb +11 -0
  7. data/lib/twitter/base.rb +89 -68
  8. data/lib/twitter/client.rb +69 -110
  9. data/lib/twitter/configuration.rb +7 -3
  10. data/lib/twitter/creatable.rb +2 -4
  11. data/lib/twitter/cursor.rb +50 -42
  12. data/lib/twitter/direct_message.rb +2 -11
  13. data/lib/twitter/entity/uri.rb +13 -0
  14. data/lib/twitter/enumerable.rb +15 -0
  15. data/lib/twitter/error.rb +55 -7
  16. data/lib/twitter/error/already_favorited.rb +1 -1
  17. data/lib/twitter/error/already_posted.rb +10 -0
  18. data/lib/twitter/error/already_retweeted.rb +1 -1
  19. data/lib/twitter/error/bad_gateway.rb +2 -3
  20. data/lib/twitter/error/bad_request.rb +2 -2
  21. data/lib/twitter/error/forbidden.rb +2 -2
  22. data/lib/twitter/error/gateway_timeout.rb +2 -3
  23. data/lib/twitter/error/internal_server_error.rb +2 -3
  24. data/lib/twitter/error/not_acceptable.rb +2 -2
  25. data/lib/twitter/error/not_found.rb +2 -2
  26. data/lib/twitter/error/service_unavailable.rb +2 -3
  27. data/lib/twitter/error/too_many_requests.rb +2 -2
  28. data/lib/twitter/error/unauthorized.rb +2 -2
  29. data/lib/twitter/error/unprocessable_entity.rb +2 -2
  30. data/lib/twitter/factory.rb +2 -8
  31. data/lib/twitter/geo_factory.rb +2 -2
  32. data/lib/twitter/geo_results.rb +36 -0
  33. data/lib/twitter/identity.rb +0 -22
  34. data/lib/twitter/list.rb +18 -4
  35. data/lib/twitter/media/photo.rb +3 -3
  36. data/lib/twitter/media_factory.rb +2 -2
  37. data/lib/twitter/null_object.rb +24 -0
  38. data/lib/twitter/oembed.rb +3 -2
  39. data/lib/twitter/place.rb +15 -9
  40. data/lib/twitter/profile_banner.rb +5 -3
  41. data/lib/twitter/rate_limit.rb +1 -17
  42. data/lib/twitter/relationship.rb +2 -10
  43. data/lib/twitter/rest/api/direct_messages.rb +135 -0
  44. data/lib/twitter/rest/api/favorites.rb +120 -0
  45. data/lib/twitter/rest/api/friends_and_followers.rb +290 -0
  46. data/lib/twitter/rest/api/help.rb +58 -0
  47. data/lib/twitter/rest/api/lists.rb +491 -0
  48. data/lib/twitter/rest/api/oauth.rb +45 -0
  49. data/lib/twitter/rest/api/places_and_geo.rb +104 -0
  50. data/lib/twitter/rest/api/saved_searches.rb +91 -0
  51. data/lib/twitter/rest/api/search.rb +37 -0
  52. data/lib/twitter/rest/api/spam_reporting.rb +29 -0
  53. data/lib/twitter/rest/api/suggested_users.rb +51 -0
  54. data/lib/twitter/rest/api/timelines.rb +202 -0
  55. data/lib/twitter/rest/api/trends.rb +58 -0
  56. data/lib/twitter/rest/api/tweets.rb +293 -0
  57. data/lib/twitter/rest/api/undocumented.rb +52 -0
  58. data/lib/twitter/rest/api/users.rb +383 -0
  59. data/lib/twitter/rest/api/utils.rb +219 -0
  60. data/lib/twitter/rest/client.rb +193 -0
  61. data/lib/twitter/rest/request/multipart_with_file.rb +36 -0
  62. data/lib/twitter/rest/response/parse_json.rb +27 -0
  63. data/lib/twitter/{response → rest/response}/raise_error.rb +8 -11
  64. data/lib/twitter/search_results.rb +33 -21
  65. data/lib/twitter/settings.rb +1 -6
  66. data/lib/twitter/size.rb +1 -1
  67. data/lib/twitter/streaming/client.rb +77 -0
  68. data/lib/twitter/streaming/connection.rb +22 -0
  69. data/lib/twitter/streaming/response.rb +30 -0
  70. data/lib/twitter/suggestion.rb +4 -2
  71. data/lib/twitter/token.rb +8 -0
  72. data/lib/twitter/trend.rb +2 -1
  73. data/lib/twitter/trend_results.rb +59 -0
  74. data/lib/twitter/tweet.rb +41 -85
  75. data/lib/twitter/user.rb +51 -41
  76. data/lib/twitter/version.rb +4 -4
  77. data/spec/fixtures/already_posted.json +1 -0
  78. data/spec/fixtures/ids_list.json +1 -1
  79. data/spec/fixtures/ids_list2.json +1 -1
  80. data/spec/fixtures/search.json +1 -1
  81. data/spec/fixtures/search_malformed.json +1 -1
  82. data/spec/fixtures/track_streaming.json +3 -0
  83. data/spec/helper.rb +8 -13
  84. data/spec/twitter/base_spec.rb +25 -99
  85. data/spec/twitter/configuration_spec.rb +1 -1
  86. data/spec/twitter/cursor_spec.rb +13 -31
  87. data/spec/twitter/direct_message_spec.rb +41 -8
  88. data/spec/twitter/entity/uri_spec.rb +74 -0
  89. data/spec/twitter/error_spec.rb +59 -11
  90. data/spec/twitter/geo/point_spec.rb +1 -1
  91. data/spec/twitter/geo_factory_spec.rb +3 -3
  92. data/spec/twitter/geo_results_spec.rb +35 -0
  93. data/spec/twitter/identifiable_spec.rb +0 -21
  94. data/spec/twitter/list_spec.rb +51 -8
  95. data/spec/twitter/media/photo_spec.rb +118 -3
  96. data/spec/twitter/media_factory_spec.rb +2 -2
  97. data/spec/twitter/null_object_spec.rb +26 -0
  98. data/spec/twitter/oembed_spec.rb +69 -45
  99. data/spec/twitter/place_spec.rb +68 -12
  100. data/spec/twitter/profile_banner_spec.rb +1 -1
  101. data/spec/twitter/rate_limit_spec.rb +12 -12
  102. data/spec/twitter/relationship_spec.rb +31 -9
  103. data/spec/twitter/{api → rest/api}/direct_messages_spec.rb +22 -9
  104. data/spec/twitter/{api → rest/api}/favorites_spec.rb +80 -7
  105. data/spec/twitter/{api → rest/api}/friends_and_followers_spec.rb +104 -65
  106. data/spec/twitter/{api → rest/api}/geo_spec.rb +10 -10
  107. data/spec/twitter/{api → rest/api}/help_spec.rb +6 -6
  108. data/spec/twitter/{api → rest/api}/lists_spec.rb +77 -56
  109. data/spec/twitter/{api → rest/api}/oauth_spec.rb +6 -6
  110. data/spec/twitter/{api → rest/api}/saved_searches_spec.rb +7 -7
  111. data/spec/twitter/{api → rest/api}/search_spec.rb +8 -9
  112. data/spec/twitter/{api → rest/api}/spam_reporting_spec.rb +3 -3
  113. data/spec/twitter/{api → rest/api}/suggested_users_spec.rb +5 -5
  114. data/spec/twitter/{api → rest/api}/timelines_spec.rb +9 -9
  115. data/spec/twitter/{api → rest/api}/trends_spec.rb +6 -6
  116. data/spec/twitter/rest/api/tweets_spec.rb +503 -0
  117. data/spec/twitter/{api → rest/api}/undocumented_spec.rb +19 -45
  118. data/spec/twitter/{api → rest/api}/users_spec.rb +60 -35
  119. data/spec/twitter/rest/client_spec.rb +193 -0
  120. data/spec/twitter/saved_search_spec.rb +11 -0
  121. data/spec/twitter/search_results_spec.rb +29 -42
  122. data/spec/twitter/settings_spec.rb +17 -6
  123. data/spec/twitter/streaming/client_spec.rb +75 -0
  124. data/spec/twitter/token_spec.rb +16 -0
  125. data/spec/twitter/trend_results_spec.rb +89 -0
  126. data/spec/twitter/trend_spec.rb +23 -0
  127. data/spec/twitter/tweet_spec.rb +122 -115
  128. data/spec/twitter/user_spec.rb +136 -77
  129. data/spec/twitter_spec.rb +0 -119
  130. data/twitter.gemspec +8 -5
  131. metadata +148 -141
  132. metadata.gz.sig +0 -0
  133. data/lib/twitter/action/favorite.rb +0 -19
  134. data/lib/twitter/action/follow.rb +0 -30
  135. data/lib/twitter/action/list_member_added.rb +0 -39
  136. data/lib/twitter/action/mention.rb +0 -46
  137. data/lib/twitter/action/reply.rb +0 -27
  138. data/lib/twitter/action/retweet.rb +0 -27
  139. data/lib/twitter/action/tweet.rb +0 -20
  140. data/lib/twitter/action_factory.rb +0 -22
  141. data/lib/twitter/api/arguments.rb +0 -13
  142. data/lib/twitter/api/direct_messages.rb +0 -148
  143. data/lib/twitter/api/favorites.rb +0 -126
  144. data/lib/twitter/api/friends_and_followers.rb +0 -334
  145. data/lib/twitter/api/help.rb +0 -64
  146. data/lib/twitter/api/lists.rb +0 -618
  147. data/lib/twitter/api/oauth.rb +0 -44
  148. data/lib/twitter/api/places_and_geo.rb +0 -121
  149. data/lib/twitter/api/saved_searches.rb +0 -99
  150. data/lib/twitter/api/search.rb +0 -37
  151. data/lib/twitter/api/spam_reporting.rb +0 -30
  152. data/lib/twitter/api/suggested_users.rb +0 -55
  153. data/lib/twitter/api/timelines.rb +0 -214
  154. data/lib/twitter/api/trends.rb +0 -63
  155. data/lib/twitter/api/tweets.rb +0 -304
  156. data/lib/twitter/api/undocumented.rb +0 -97
  157. data/lib/twitter/api/users.rb +0 -439
  158. data/lib/twitter/api/utils.rb +0 -187
  159. data/lib/twitter/configurable.rb +0 -96
  160. data/lib/twitter/default.rb +0 -102
  161. data/lib/twitter/entity/url.rb +0 -9
  162. data/lib/twitter/error/client_error.rb +0 -35
  163. data/lib/twitter/error/decode_error.rb +0 -9
  164. data/lib/twitter/error/identity_map_key_error.rb +0 -9
  165. data/lib/twitter/error/server_error.rb +0 -28
  166. data/lib/twitter/exceptable.rb +0 -36
  167. data/lib/twitter/identity_map.rb +0 -22
  168. data/lib/twitter/request/multipart_with_file.rb +0 -34
  169. data/lib/twitter/response/parse_json.rb +0 -25
  170. data/spec/fixtures/about_me.json +0 -1
  171. data/spec/fixtures/activity_summary.json +0 -1
  172. data/spec/fixtures/bad_gateway.json +0 -1
  173. data/spec/fixtures/bad_request.json +0 -1
  174. data/spec/fixtures/by_friends.json +0 -1
  175. data/spec/fixtures/end_session.json +0 -1
  176. data/spec/fixtures/forbidden.json +0 -1
  177. data/spec/fixtures/internal_server_error.json +0 -1
  178. data/spec/fixtures/not_acceptable.json +0 -1
  179. data/spec/fixtures/phoenix_search.phoenix +0 -1
  180. data/spec/fixtures/resolve.json +0 -1
  181. data/spec/fixtures/service_unavailable.json +0 -1
  182. data/spec/fixtures/totals.json +0 -1
  183. data/spec/fixtures/trends.json +0 -1
  184. data/spec/fixtures/unauthorized.json +0 -1
  185. data/spec/fixtures/video_facets.json +0 -1
  186. data/spec/twitter/action/favorite_spec.rb +0 -29
  187. data/spec/twitter/action/follow_spec.rb +0 -29
  188. data/spec/twitter/action/list_member_added_spec.rb +0 -41
  189. data/spec/twitter/action/mention_spec.rb +0 -52
  190. data/spec/twitter/action/reply_spec.rb +0 -41
  191. data/spec/twitter/action/retweet_spec.rb +0 -41
  192. data/spec/twitter/action_factory_spec.rb +0 -35
  193. data/spec/twitter/action_spec.rb +0 -16
  194. data/spec/twitter/api/tweets_spec.rb +0 -285
  195. data/spec/twitter/client_spec.rb +0 -223
  196. data/spec/twitter/error/client_error_spec.rb +0 -23
  197. data/spec/twitter/error/server_error_spec.rb +0 -20
@@ -1,9 +1,9 @@
1
1
  require 'helper'
2
2
 
3
- describe Twitter::API::Undocumented do
3
+ describe Twitter::REST::API::Undocumented do
4
4
 
5
5
  before do
6
- @client = Twitter::Client.new
6
+ @client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT", :access_token_secret => "AS")
7
7
  end
8
8
 
9
9
  describe "#following_followers_of" do
@@ -18,15 +18,14 @@ describe Twitter::API::Undocumented do
18
18
  it "returns an array of numeric IDs for every user following the specified user" do
19
19
  following_followers_of = @client.following_followers_of("sferik")
20
20
  expect(following_followers_of).to be_a Twitter::Cursor
21
- expect(following_followers_of.users).to be_an Array
22
- expect(following_followers_of.users.first).to be_a Twitter::User
21
+ expect(following_followers_of.first).to be_a Twitter::User
23
22
  end
24
- context "with all" do
23
+ context "with each" do
25
24
  before do
26
25
  stub_get("/users/following_followers_of.json").with(:query => {:cursor => "1322801608223717003", :screen_name => "sferik"}).to_return(:body => fixture("users_list2.json"), :headers => {:content_type => "application/json; charset=utf-8"})
27
26
  end
28
27
  it "requests the correct resource" do
29
- @client.following_followers_of("sferik").all
28
+ @client.following_followers_of("sferik").each{}
30
29
  expect(a_get("/users/following_followers_of.json").with(:query => {:cursor => "-1", :screen_name => "sferik"})).to have_been_made
31
30
  expect(a_get("/users/following_followers_of.json").with(:query => {:cursor => "1322801608223717003", :screen_name => "sferik"})).to have_been_made
32
31
  end
@@ -40,12 +39,12 @@ describe Twitter::API::Undocumented do
40
39
  @client.following_followers_of(7505382)
41
40
  expect(a_get("/users/following_followers_of.json").with(:query => {:cursor => "-1", :user_id => "7505382"})).to have_been_made
42
41
  end
43
- context "with all" do
42
+ context "with each" do
44
43
  before do
45
44
  stub_get("/users/following_followers_of.json").with(:query => {:cursor => "1322801608223717003", :user_id => "7505382"}).to_return(:body => fixture("users_list2.json"), :headers => {:content_type => "application/json; charset=utf-8"})
46
45
  end
47
46
  it "requests the correct resource" do
48
- @client.following_followers_of(7505382).all
47
+ @client.following_followers_of(7505382).each{}
49
48
  expect(a_get("/users/following_followers_of.json").with(:query => {:cursor => "-1", :user_id => "7505382"})).to have_been_made
50
49
  expect(a_get("/users/following_followers_of.json").with(:query => {:cursor => "1322801608223717003", :user_id => "7505382"})).to have_been_made
51
50
  end
@@ -64,15 +63,14 @@ describe Twitter::API::Undocumented do
64
63
  it "returns an array of numeric IDs for every user following the specified user" do
65
64
  following_followers_of = @client.following_followers_of
66
65
  expect(following_followers_of).to be_a Twitter::Cursor
67
- expect(following_followers_of.users).to be_an Array
68
- expect(following_followers_of.users.first).to be_a Twitter::User
66
+ expect(following_followers_of.first).to be_a Twitter::User
69
67
  end
70
- context "with all" do
68
+ context "with each" do
71
69
  before do
72
70
  stub_get("/users/following_followers_of.json").with(:query => {:cursor => "1322801608223717003", :screen_name => "sferik"}).to_return(:body => fixture("users_list2.json"), :headers => {:content_type => "application/json; charset=utf-8"})
73
71
  end
74
72
  it "requests the correct resource" do
75
- @client.following_followers_of.all
73
+ @client.following_followers_of.each{}
76
74
  expect(a_get("/users/following_followers_of.json").with(:query => {:cursor => "-1", :screen_name => "sferik"})).to have_been_made
77
75
  expect(a_get("/users/following_followers_of.json").with(:query => {:cursor => "1322801608223717003", :screen_name => "sferik"})).to have_been_made
78
76
  end
@@ -80,38 +78,7 @@ describe Twitter::API::Undocumented do
80
78
  end
81
79
  end
82
80
 
83
- describe "#status_activity" do
84
- before do
85
- stub_get("/i/statuses/25938088801/activity/summary.json").to_return(:body => fixture("activity_summary.json"), :headers => {:content_type => "application/json; charset=utf-8"})
86
- end
87
- it "requests the correct resource" do
88
- @client.status_activity(25938088801)
89
- expect(a_get("/i/statuses/25938088801/activity/summary.json")).to have_been_made
90
- end
91
- it "returns a Tweet" do
92
- tweet = @client.status_activity(25938088801)
93
- expect(tweet).to be_a Twitter::Tweet
94
- expect(tweet.retweeters_count).to eq 1
95
- end
96
- end
97
-
98
- describe "#statuses_activity" do
99
- before do
100
- stub_get("/i/statuses/25938088801/activity/summary.json").to_return(:body => fixture("activity_summary.json"), :headers => {:content_type => "application/json; charset=utf-8"})
101
- end
102
- it "requests the correct resource" do
103
- @client.statuses_activity(25938088801)
104
- expect(a_get("/i/statuses/25938088801/activity/summary.json")).to have_been_made
105
- end
106
- it "returns an array of Tweets" do
107
- tweets = @client.statuses_activity(25938088801)
108
- expect(tweets).to be_an Array
109
- expect(tweets.first).to be_a Twitter::Tweet
110
- expect(tweets.first.retweeters_count).to eq 1
111
- end
112
- end
113
-
114
- describe "#statuses_activity" do
81
+ describe "#tweet_count" do
115
82
  before do
116
83
  stub_request(:get, "https://cdn.api.twitter.com/1/urls/count.json").with(:query => {:url => "http://twitter.com"}).to_return(:body => fixture("count.json"), :headers => {:content_type => "application/json; charset=utf-8"})
117
84
  end
@@ -122,7 +89,14 @@ describe Twitter::API::Undocumented do
122
89
  it "returns a Tweet count" do
123
90
  tweet_count = @client.tweet_count("http://twitter.com")
124
91
  expect(tweet_count).to be_an Integer
125
- expect(tweet_count).to eq 13845465
92
+ expect(tweet_count).to eq(13845465)
93
+ end
94
+ context "with a URI" do
95
+ it "requests the correct resource" do
96
+ uri = URI.parse("http://twitter.com")
97
+ @client.tweet_count(uri)
98
+ expect(a_request(:get, "https://cdn.api.twitter.com/1/urls/count.json").with(:query => {:url => "http://twitter.com"})).to have_been_made
99
+ end
126
100
  end
127
101
  end
128
102
 
@@ -1,9 +1,9 @@
1
1
  require 'helper'
2
2
 
3
- describe Twitter::API::Users do
3
+ describe Twitter::REST::API::Users do
4
4
 
5
5
  before do
6
- @client = Twitter::Client.new
6
+ @client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT", :access_token_secret => "AS")
7
7
  end
8
8
 
9
9
  describe "#settings" do
@@ -18,7 +18,7 @@ describe Twitter::API::Users do
18
18
  it "returns settings" do
19
19
  settings = @client.settings
20
20
  expect(settings).to be_a Twitter::Settings
21
- expect(settings.language).to eq "en"
21
+ expect(settings.language).to eq("en")
22
22
  end
23
23
  it "requests the correct resource on POST" do
24
24
  @client.settings(:trend_location_woeid => "23424803")
@@ -27,7 +27,7 @@ describe Twitter::API::Users do
27
27
  it "returns settings" do
28
28
  settings = @client.settings(:trend_location_woeid => "23424803")
29
29
  expect(settings).to be_a Twitter::Settings
30
- expect(settings.language).to eq "en"
30
+ expect(settings.language).to eq("en")
31
31
  end
32
32
  end
33
33
 
@@ -42,7 +42,7 @@ describe Twitter::API::Users do
42
42
  it "returns the requesting user" do
43
43
  user = @client.verify_credentials
44
44
  expect(user).to be_a Twitter::User
45
- expect(user.id).to eq 7505382
45
+ expect(user.id).to eq(7505382)
46
46
  end
47
47
  end
48
48
 
@@ -57,7 +57,7 @@ describe Twitter::API::Users do
57
57
  it "returns a user" do
58
58
  user = @client.update_delivery_device("sms")
59
59
  expect(user).to be_a Twitter::User
60
- expect(user.id).to eq 7505382
60
+ expect(user.id).to eq(7505382)
61
61
  end
62
62
  end
63
63
 
@@ -72,7 +72,7 @@ describe Twitter::API::Users do
72
72
  it "returns a user" do
73
73
  user = @client.update_profile(:url => "http://github.com/sferik/")
74
74
  expect(user).to be_a Twitter::User
75
- expect(user.id).to eq 7505382
75
+ expect(user.id).to eq(7505382)
76
76
  end
77
77
  end
78
78
 
@@ -87,7 +87,7 @@ describe Twitter::API::Users do
87
87
  it "returns a user" do
88
88
  user = @client.update_profile_background_image(fixture("we_concept_bg2.png"))
89
89
  expect(user).to be_a Twitter::User
90
- expect(user.id).to eq 7505382
90
+ expect(user.id).to eq(7505382)
91
91
  end
92
92
  end
93
93
 
@@ -102,7 +102,7 @@ describe Twitter::API::Users do
102
102
  it "returns a user" do
103
103
  user = @client.update_profile_colors(:profile_background_color => "000000")
104
104
  expect(user).to be_a Twitter::User
105
- expect(user.id).to eq 7505382
105
+ expect(user.id).to eq(7505382)
106
106
  end
107
107
  end
108
108
 
@@ -117,7 +117,7 @@ describe Twitter::API::Users do
117
117
  it "returns a user" do
118
118
  user = @client.update_profile_image(fixture("me.jpeg"))
119
119
  expect(user).to be_a Twitter::User
120
- expect(user.id).to eq 7505382
120
+ expect(user.id).to eq(7505382)
121
121
  end
122
122
  end
123
123
 
@@ -133,7 +133,7 @@ describe Twitter::API::Users do
133
133
  it "returns the users in a given category of the Twitter suggested user list" do
134
134
  suggestion = @client.suggestions("art-design")
135
135
  expect(suggestion).to be_a Twitter::Suggestion
136
- expect(suggestion.name).to eq "Art & Design"
136
+ expect(suggestion.name).to eq("Art & Design")
137
137
  expect(suggestion.users).to be_an Array
138
138
  expect(suggestion.users.first).to be_a Twitter::User
139
139
  end
@@ -150,7 +150,7 @@ describe Twitter::API::Users do
150
150
  suggestions = @client.suggestions
151
151
  expect(suggestions).to be_an Array
152
152
  expect(suggestions.first).to be_a Twitter::Suggestion
153
- expect(suggestions.first.name).to eq "Art & Design"
153
+ expect(suggestions.first.name).to eq("Art & Design")
154
154
  end
155
155
  end
156
156
  end
@@ -167,7 +167,7 @@ describe Twitter::API::Users do
167
167
  suggest_users = @client.suggest_users("art-design")
168
168
  expect(suggest_users).to be_an Array
169
169
  expect(suggest_users.first).to be_a Twitter::User
170
- expect(suggest_users.first.id).to eq 13
170
+ expect(suggest_users.first.id).to eq(13)
171
171
  end
172
172
  end
173
173
 
@@ -182,16 +182,15 @@ describe Twitter::API::Users do
182
182
  it "returns an array of user objects that the authenticating user is blocking" do
183
183
  blocking = @client.blocking
184
184
  expect(blocking).to be_a Twitter::Cursor
185
- expect(blocking.users).to be_an Array
186
- expect(blocking.users.first).to be_a Twitter::User
187
- expect(blocking.users.first.id).to eq 7505382
185
+ expect(blocking.first).to be_a Twitter::User
186
+ expect(blocking.first.id).to eq(7505382)
188
187
  end
189
- context "with all" do
188
+ context "with each" do
190
189
  before do
191
190
  stub_get("/1.1/blocks/list.json").with(:query => {:cursor => "1322801608223717003"}).to_return(:body => fixture("users_list2.json"), :headers => {:content_type => "application/json; charset=utf-8"})
192
191
  end
193
192
  it "requests the correct resource" do
194
- @client.blocking.all
193
+ @client.blocking.each{}
195
194
  expect(a_get("/1.1/blocks/list.json").with(:query => {:cursor => "-1"})).to have_been_made
196
195
  expect(a_get("/1.1/blocks/list.json").with(:query => {:cursor => "1322801608223717003"})).to have_been_made
197
196
  end
@@ -209,15 +208,14 @@ describe Twitter::API::Users do
209
208
  it "returns an array of numeric user IDs the authenticating user is blocking" do
210
209
  blocked_ids = @client.blocked_ids
211
210
  expect(blocked_ids).to be_a Twitter::Cursor
212
- expect(blocked_ids.ids).to be_an Array
213
- expect(blocked_ids.ids.first).to eq 14100886
211
+ expect(blocked_ids.first).to eq(20009713)
214
212
  end
215
- context "with all" do
213
+ context "with each" do
216
214
  before do
217
215
  stub_get("/1.1/blocks/ids.json").with(:query => {:cursor => "1305102810874389703"}).to_return(:body => fixture("ids_list2.json"), :headers => {:content_type => "application/json; charset=utf-8"})
218
216
  end
219
217
  it "requests the correct resource" do
220
- @client.blocked_ids.all
218
+ @client.blocked_ids.each{}
221
219
  expect(a_get("/1.1/blocks/ids.json").with(:query => {:cursor => "-1"})).to have_been_made
222
220
  expect(a_get("/1.1/blocks/ids.json").with(:query => {:cursor => "1305102810874389703"})).to have_been_made
223
221
  end
@@ -284,7 +282,7 @@ describe Twitter::API::Users do
284
282
  users = @client.block("sferik")
285
283
  expect(users).to be_an Array
286
284
  expect(users.first).to be_a Twitter::User
287
- expect(users.first.id).to eq 7505382
285
+ expect(users.first.id).to eq(7505382)
288
286
  end
289
287
  end
290
288
 
@@ -300,7 +298,7 @@ describe Twitter::API::Users do
300
298
  users = @client.unblock("sferik")
301
299
  expect(users).to be_an Array
302
300
  expect(users.first).to be_a Twitter::User
303
- expect(users.first.id).to eq 7505382
301
+ expect(users.first.id).to eq(7505382)
304
302
  end
305
303
  end
306
304
 
@@ -318,7 +316,21 @@ describe Twitter::API::Users do
318
316
  users = @client.users("sferik", "pengwynn")
319
317
  expect(users).to be_an Array
320
318
  expect(users.first).to be_a Twitter::User
321
- expect(users.first.id).to eq 7505382
319
+ expect(users.first.id).to eq(7505382)
320
+ end
321
+ context "with URI objects passed" do
322
+ it "requests the correct resource" do
323
+ sferik = URI.parse("https://twitter.com/sferik")
324
+ pengwynn = URI.parse("https://twitter.com/pengwynn")
325
+ @client.users(sferik, pengwynn)
326
+ expect(a_post("/1.1/users/lookup.json").with(:body => {:screen_name => "sferik,pengwynn"})).to have_been_made
327
+ end
328
+ end
329
+ context "with URI strings passed" do
330
+ it "requests the correct resource" do
331
+ @client.users("https://twitter.com/sferik", "https://twitter.com/pengwynn")
332
+ expect(a_post("/1.1/users/lookup.json").with(:body => {:screen_name => "sferik,pengwynn"})).to have_been_made
333
+ end
322
334
  end
323
335
  end
324
336
  context "with numeric screen names passed" do
@@ -360,7 +372,6 @@ describe Twitter::API::Users do
360
372
  end
361
373
  end
362
374
  end
363
-
364
375
  context "using a get request" do
365
376
  context "with screen names passed" do
366
377
  before do
@@ -374,7 +385,21 @@ describe Twitter::API::Users do
374
385
  users = @client.users("sferik", "pengwynn", :method => :get)
375
386
  expect(users).to be_an Array
376
387
  expect(users.first).to be_a Twitter::User
377
- expect(users.first.id).to eq 7505382
388
+ expect(users.first.id).to eq(7505382)
389
+ end
390
+ context "with URI objects passed" do
391
+ it "requests the correct resource" do
392
+ sferik = URI.parse("https://twitter.com/sferik")
393
+ pengwynn = URI.parse("https://twitter.com/pengwynn")
394
+ @client.users(sferik, pengwynn, :method => :get)
395
+ expect(a_get("/1.1/users/lookup.json").with(:query => {:screen_name => "sferik,pengwynn"})).to have_been_made
396
+ end
397
+ end
398
+ context "with URI objects passed" do
399
+ it "requests the correct resource" do
400
+ @client.users("https://twitter.com/sferik", "https://twitter.com/pengwynn", :method => :get)
401
+ expect(a_get("/1.1/users/lookup.json").with(:query => {:screen_name => "sferik,pengwynn"})).to have_been_made
402
+ end
378
403
  end
379
404
  end
380
405
  context "with numeric screen names passed" do
@@ -430,7 +455,7 @@ describe Twitter::API::Users do
430
455
  it "returns extended information of a given user" do
431
456
  user = @client.user("sferik")
432
457
  expect(user).to be_a Twitter::User
433
- expect(user.id).to eq 7505382
458
+ expect(user.id).to eq(7505382)
434
459
  end
435
460
  end
436
461
  context "with a screen name including '@' passed" do
@@ -523,7 +548,7 @@ describe Twitter::API::Users do
523
548
  user_search = @client.user_search("Erik Michaels-Ober")
524
549
  expect(user_search).to be_an Array
525
550
  expect(user_search.first).to be_a Twitter::User
526
- expect(user_search.first.id).to eq 7505382
551
+ expect(user_search.first.id).to eq(7505382)
527
552
  end
528
553
  end
529
554
 
@@ -540,7 +565,7 @@ describe Twitter::API::Users do
540
565
  contributees = @client.contributees("sferik")
541
566
  expect(contributees).to be_an Array
542
567
  expect(contributees.first).to be_a Twitter::User
543
- expect(contributees.first.name).to eq "Twitter API"
568
+ expect(contributees.first.name).to eq("Twitter API")
544
569
  end
545
570
  end
546
571
  context "with a user ID passed" do
@@ -565,7 +590,7 @@ describe Twitter::API::Users do
565
590
  contributees = @client.contributees
566
591
  expect(contributees).to be_an Array
567
592
  expect(contributees.first).to be_a Twitter::User
568
- expect(contributees.first.name).to eq "Twitter API"
593
+ expect(contributees.first.name).to eq("Twitter API")
569
594
  end
570
595
  end
571
596
  end
@@ -583,7 +608,7 @@ describe Twitter::API::Users do
583
608
  contributors = @client.contributors("sferik")
584
609
  expect(contributors).to be_an Array
585
610
  expect(contributors.first).to be_a Twitter::User
586
- expect(contributors.first.id).to eq 13
611
+ expect(contributors.first.id).to eq(13)
587
612
  end
588
613
  end
589
614
  context "with a user ID passed" do
@@ -608,7 +633,7 @@ describe Twitter::API::Users do
608
633
  contributors = @client.contributors
609
634
  expect(contributors).to be_an Array
610
635
  expect(contributors.first).to be_a Twitter::User
611
- expect(contributors.first.id).to eq 13
636
+ expect(contributors.first.id).to eq(13)
612
637
  end
613
638
  end
614
639
  end
@@ -654,7 +679,7 @@ describe Twitter::API::Users do
654
679
  banner = @client.profile_banner("sferik")
655
680
  expect(banner).to be_a Twitter::ProfileBanner
656
681
  expect(banner.sizes).to be_a Hash
657
- expect(banner.sizes[:mobile].height).to eq 160
682
+ expect(banner.sizes[:mobile].height).to eq(160)
658
683
  end
659
684
  end
660
685
  context "with a user ID passed" do
@@ -680,7 +705,7 @@ describe Twitter::API::Users do
680
705
  banner = @client.profile_banner
681
706
  expect(banner).to be_a Twitter::ProfileBanner
682
707
  expect(banner.sizes).to be_a Hash
683
- expect(banner.sizes[:mobile].height).to eq 160
708
+ expect(banner.sizes[:mobile].height).to eq(160)
684
709
  end
685
710
  end
686
711
  end
@@ -0,0 +1,193 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::REST::Client do
4
+
5
+ before do
6
+ @client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT", :access_token_secret => "AS")
7
+ end
8
+
9
+ describe ".new" do
10
+ context "when invalid credentials are provided" do
11
+ it "raises a ConfigurationError exception" do
12
+ expect {
13
+ Twitter::REST::Client.new(:consumer_key => [12345, 54321])
14
+ }.to raise_exception(Twitter::Error::ConfigurationError)
15
+ end
16
+ end
17
+
18
+ context "when no credentials are provided" do
19
+ it "does not raise an exception" do
20
+ expect {
21
+ Twitter::REST::Client.new
22
+ }.not_to raise_error
23
+ end
24
+ end
25
+ end
26
+
27
+ describe ".credentials?" do
28
+ it "returns true if only bearer_token is supplied" do
29
+ client = Twitter::REST::Client.new(:bearer_token => "BT")
30
+ expect(client.credentials?).to be_true
31
+ end
32
+ it "returns true if all OAuth credentials are present" do
33
+ client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT", :access_token_secret => "AS")
34
+ expect(client.credentials?).to be_true
35
+ end
36
+ it "returns false if any credentials are missing" do
37
+ client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT")
38
+ expect(client.credentials?).to be_false
39
+ end
40
+ end
41
+
42
+ it "does not cache the screen name across clients" do
43
+ stub_get("/1.1/account/verify_credentials.json").to_return(:body => fixture("sferik.json"), :headers => {:content_type => "application/json; charset=utf-8"})
44
+ user1 = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT", :access_token_secret => "AS").current_user
45
+ stub_get("/1.1/account/verify_credentials.json").to_return(:body => fixture("pengwynn.json"), :headers => {:content_type => "application/json; charset=utf-8"})
46
+ user2 = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT", :access_token_secret => "AS").current_user
47
+ expect(user1).not_to eq(user2)
48
+ end
49
+
50
+ describe "#delete" do
51
+ before do
52
+ stub_delete("/custom/delete").with(:query => {:deleted => "object"})
53
+ end
54
+ it "allows custom delete requests" do
55
+ @client.delete("/custom/delete", {:deleted => "object"})
56
+ expect(a_delete("/custom/delete").with(:query => {:deleted => "object"})).to have_been_made
57
+ end
58
+ end
59
+
60
+ describe "#put" do
61
+ before do
62
+ stub_put("/custom/put").with(:body => {:updated => "object"})
63
+ end
64
+ it "allows custom put requests" do
65
+ @client.put("/custom/put", {:updated => "object"})
66
+ expect(a_put("/custom/put").with(:body => {:updated => "object"})).to have_been_made
67
+ end
68
+ end
69
+
70
+ describe "#user_token?" do
71
+ it "returns true if the user token/secret are present" do
72
+ client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT", :access_token_secret => "AS")
73
+ expect(client.user_token?).to be_true
74
+ end
75
+ it "returns false if the user token/secret are not completely present" do
76
+ client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT")
77
+ expect(client.user_token?).to be_false
78
+ end
79
+ end
80
+
81
+ describe "#bearer_token?" do
82
+ it "returns true if the app token is present" do
83
+ client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :bearer_token => "BT")
84
+ expect(client.bearer_token?).to be_true
85
+ end
86
+ it "returns false if the bearer_token is not present" do
87
+ client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS")
88
+ expect(client.bearer_token?).to be_false
89
+ end
90
+ end
91
+
92
+ describe "#credentials?" do
93
+ it "returns true if all credentials are present" do
94
+ client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT", :access_token_secret => "AS")
95
+ expect(client.credentials?).to be_true
96
+ end
97
+ it "returns false if any credentials are missing" do
98
+ client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT")
99
+ expect(client.credentials?).to be_false
100
+ end
101
+ end
102
+
103
+ describe "#connection" do
104
+ it "looks like Faraday connection" do
105
+ expect(@client.send(:connection)).to respond_to(:run_request)
106
+ end
107
+ it "memoizes the connection" do
108
+ c1, c2 = @client.send(:connection), @client.send(:connection)
109
+ expect(c1.object_id).to eq(c2.object_id)
110
+ end
111
+ end
112
+
113
+ describe "#request" do
114
+ it "encodes the entire body when no uploaded media is present" do
115
+ stub_post("/1.1/statuses/update.json").with(:body => {:status => "Update"}).to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
116
+ @client.update("Update")
117
+ expect(a_post("/1.1/statuses/update.json").with(:body => {:status => "Update"})).to have_been_made
118
+ end
119
+ it "encodes none of the body when uploaded media is present" do
120
+ stub_post("/1.1/statuses/update_with_media.json").to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
121
+ @client.update_with_media("Update", fixture("pbjt.gif"))
122
+ expect(a_post("/1.1/statuses/update_with_media.json")).to have_been_made
123
+ end
124
+ it "catches Faraday errors" do
125
+ allow(@client).to receive(:connection).and_raise(Faraday::Error::ClientError.new("Oops"))
126
+ expect{@client.send(:request, :get, "/path")}.to raise_error Twitter::Error
127
+ end
128
+ it "catches JSON::ParserError errors" do
129
+ allow(@client).to receive(:connection).and_raise(JSON::ParserError.new("unexpected token"))
130
+ expect{@client.send(:request, :get, "/path")}.to raise_error Twitter::Error
131
+ end
132
+ end
133
+
134
+ describe "#oauth_auth_header" do
135
+ it "creates the correct auth headers" do
136
+ uri = Twitter::REST::Client::ENDPOINT + "/1.1/direct_messages.json"
137
+ authorization = @client.send(:oauth_auth_header, :get, uri)
138
+ expect(authorization.options[:signature_method]).to eq("HMAC-SHA1")
139
+ expect(authorization.options[:version]).to eq("1.0")
140
+ expect(authorization.options[:consumer_key]).to eq("CK")
141
+ expect(authorization.options[:consumer_secret]).to eq("CS")
142
+ expect(authorization.options[:token]).to eq("AT")
143
+ expect(authorization.options[:token_secret]).to eq("AS")
144
+ end
145
+ it "submits the correct auth header when no media is present" do
146
+ # We use static values for nounce and timestamp to get a stable signature
147
+ secret = {:consumer_key => "CK", :consumer_secret => "CS",
148
+ :token => "OT", :token_secret => "OS",
149
+ :nonce => "b6ebe4c2a11af493f8a2290fe1296965", :timestamp => "1370968658"}
150
+ header = {"Authorization" => /oauth_signature="FbthwmgGq02iQw%2FuXGEWaL6V6eM%3D"/}
151
+
152
+ allow(@client).to receive(:credentials).and_return(secret)
153
+ stub_post("/1.1/statuses/update.json").with(:body => {:status => "Just a test"}).to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
154
+ @client.update("Just a test")
155
+ expect(a_post("/1.1/statuses/update.json").
156
+ with(:headers => header)).to have_been_made
157
+ end
158
+ it "submits the correct auth header when media is present" do
159
+ # We use static values for nounce and timestamp to get a stable signature
160
+ secret = {:consumer_key => "CK", :consumer_secret => "CS",
161
+ :token => "OT", :token_secret => "OS",
162
+ :nonce => "e08201ad0dab4897c99445056feefd95", :timestamp => "1370967652"}
163
+ header = {"Authorization" => /oauth_signature="9ziouUPwZT9IWWRbJL8r0BerKYA%3D"/}
164
+
165
+ allow(@client).to receive(:credentials).and_return(secret)
166
+ stub_post("/1.1/statuses/update_with_media.json").to_return(:body => fixture("status.json"), :headers => header)
167
+ @client.update_with_media("Just a test", fixture("pbjt.gif"))
168
+ expect(a_post("/1.1/statuses/update_with_media.json").
169
+ with(:headers => header)).to have_been_made
170
+ end
171
+ end
172
+
173
+ describe "#bearer_auth_header" do
174
+ it "creates the correct auth headers with supplied bearer_token" do
175
+ client = Twitter::REST::Client.new(:bearer_token => "BT")
176
+ authorization = client.send(:bearer_auth_header)
177
+ expect(authorization).to eq("Bearer BT")
178
+ end
179
+ it "creates the correct auth headers with supplied bearer token" do
180
+ token = Twitter::Token.new(:token_type => "bearer", :access_token => "BT")
181
+ client = Twitter::REST::Client.new(:bearer_token => token)
182
+ authorization = client.send(:bearer_auth_header)
183
+ expect(authorization).to eq("Bearer BT")
184
+ end
185
+ end
186
+
187
+ describe "#bearer_token_credentials_auth_header" do
188
+ it "creates the correct auth header with supplied consumer_key and consumer_secret" do
189
+ authorization = @client.send(:bearer_token_credentials_auth_header)
190
+ expect(authorization).to eq("Basic Q0s6Q1M=")
191
+ end
192
+ end
193
+ end