twitter 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (210) hide show
  1. data/CHANGELOG.md +673 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +415 -0
  4. data/Rakefile +11 -0
  5. data/lib/twitter.rb +29 -0
  6. data/lib/twitter/action/favorite.rb +19 -0
  7. data/lib/twitter/action/follow.rb +31 -0
  8. data/lib/twitter/action/list_member_added.rb +41 -0
  9. data/lib/twitter/action/mention.rb +48 -0
  10. data/lib/twitter/action/reply.rb +27 -0
  11. data/lib/twitter/action/retweet.rb +27 -0
  12. data/lib/twitter/action/tweet.rb +22 -0
  13. data/lib/twitter/action_factory.rb +22 -0
  14. data/lib/twitter/api.rb +2442 -0
  15. data/lib/twitter/base.rb +119 -0
  16. data/lib/twitter/basic_user.rb +8 -0
  17. data/lib/twitter/client.rb +96 -0
  18. data/lib/twitter/configurable.rb +67 -0
  19. data/lib/twitter/configuration.rb +20 -0
  20. data/lib/twitter/core_ext/array.rb +7 -0
  21. data/lib/twitter/core_ext/enumerable.rb +11 -0
  22. data/lib/twitter/core_ext/hash.rb +100 -0
  23. data/lib/twitter/core_ext/kernel.rb +15 -0
  24. data/lib/twitter/core_ext/string.rb +10 -0
  25. data/lib/twitter/creatable.rb +20 -0
  26. data/lib/twitter/cursor.rb +87 -0
  27. data/lib/twitter/default.rb +101 -0
  28. data/lib/twitter/direct_message.rb +21 -0
  29. data/lib/twitter/entity.rb +7 -0
  30. data/lib/twitter/entity/hashtag.rb +9 -0
  31. data/lib/twitter/entity/url.rb +9 -0
  32. data/lib/twitter/entity/user_mention.rb +9 -0
  33. data/lib/twitter/error.rb +34 -0
  34. data/lib/twitter/error/bad_gateway.rb +11 -0
  35. data/lib/twitter/error/bad_request.rb +10 -0
  36. data/lib/twitter/error/client_error.rb +35 -0
  37. data/lib/twitter/error/decode_error.rb +9 -0
  38. data/lib/twitter/error/forbidden.rb +10 -0
  39. data/lib/twitter/error/gateway_timeout.rb +11 -0
  40. data/lib/twitter/error/identity_map_key_error.rb +9 -0
  41. data/lib/twitter/error/internal_server_error.rb +11 -0
  42. data/lib/twitter/error/not_acceptable.rb +10 -0
  43. data/lib/twitter/error/not_found.rb +10 -0
  44. data/lib/twitter/error/rate_limited.rb +11 -0
  45. data/lib/twitter/error/server_error.rb +28 -0
  46. data/lib/twitter/error/service_unavailable.rb +11 -0
  47. data/lib/twitter/error/unauthorized.rb +10 -0
  48. data/lib/twitter/factory.rb +21 -0
  49. data/lib/twitter/geo.rb +15 -0
  50. data/lib/twitter/geo/point.rb +22 -0
  51. data/lib/twitter/geo/polygon.rb +8 -0
  52. data/lib/twitter/geo_factory.rb +18 -0
  53. data/lib/twitter/identity.rb +50 -0
  54. data/lib/twitter/identity_map.rb +22 -0
  55. data/lib/twitter/language.rb +7 -0
  56. data/lib/twitter/list.rb +18 -0
  57. data/lib/twitter/media/photo.rb +22 -0
  58. data/lib/twitter/media_factory.rb +17 -0
  59. data/lib/twitter/metadata.rb +7 -0
  60. data/lib/twitter/oembed.rb +8 -0
  61. data/lib/twitter/place.rb +34 -0
  62. data/lib/twitter/rate_limit.rb +45 -0
  63. data/lib/twitter/relationship.rb +36 -0
  64. data/lib/twitter/request/multipart_with_file.rb +41 -0
  65. data/lib/twitter/response/parse_json.rb +25 -0
  66. data/lib/twitter/response/raise_error.rb +30 -0
  67. data/lib/twitter/saved_search.rb +9 -0
  68. data/lib/twitter/search_results.rb +48 -0
  69. data/lib/twitter/settings.rb +17 -0
  70. data/lib/twitter/size.rb +24 -0
  71. data/lib/twitter/source_user.rb +15 -0
  72. data/lib/twitter/suggestion.rb +22 -0
  73. data/lib/twitter/target_user.rb +8 -0
  74. data/lib/twitter/trend.rb +14 -0
  75. data/lib/twitter/tweet.rb +145 -0
  76. data/lib/twitter/user.rb +97 -0
  77. data/lib/twitter/version.rb +18 -0
  78. data/spec/fixtures/about_me.json +1 -0
  79. data/spec/fixtures/activity_summary.json +1 -0
  80. data/spec/fixtures/all.json +1 -0
  81. data/spec/fixtures/bad_gateway.json +1 -0
  82. data/spec/fixtures/bad_request.json +1 -0
  83. data/spec/fixtures/by_friends.json +1 -0
  84. data/spec/fixtures/category.json +1 -0
  85. data/spec/fixtures/configuration.json +1 -0
  86. data/spec/fixtures/contributees.json +1 -0
  87. data/spec/fixtures/contributors.json +1 -0
  88. data/spec/fixtures/direct_message.json +1 -0
  89. data/spec/fixtures/direct_messages.json +1 -0
  90. data/spec/fixtures/end_session.json +1 -0
  91. data/spec/fixtures/enhance_your_calm.text +11 -0
  92. data/spec/fixtures/favorites.json +1 -0
  93. data/spec/fixtures/following.json +1 -0
  94. data/spec/fixtures/forbidden.json +1 -0
  95. data/spec/fixtures/friendships.json +1 -0
  96. data/spec/fixtures/ids.json +1 -0
  97. data/spec/fixtures/ids_list.json +1 -0
  98. data/spec/fixtures/ids_list2.json +1 -0
  99. data/spec/fixtures/image_facets.json +1 -0
  100. data/spec/fixtures/internal_server_error.json +1 -0
  101. data/spec/fixtures/languages.json +1 -0
  102. data/spec/fixtures/list.json +1 -0
  103. data/spec/fixtures/lists.json +1 -0
  104. data/spec/fixtures/locations.json +1 -0
  105. data/spec/fixtures/matching_trends.json +1 -0
  106. data/spec/fixtures/me.jpeg +0 -0
  107. data/spec/fixtures/media_timeline.json +1 -0
  108. data/spec/fixtures/members.json +1 -0
  109. data/spec/fixtures/no_user_matches.json +1 -0
  110. data/spec/fixtures/not_acceptable.json +1 -0
  111. data/spec/fixtures/not_following.json +1 -0
  112. data/spec/fixtures/not_found.json +1 -0
  113. data/spec/fixtures/oembed.json +1 -0
  114. data/spec/fixtures/pbjt.gif +0 -0
  115. data/spec/fixtures/pengwynn.json +1 -0
  116. data/spec/fixtures/phoenix_search.phoenix +1 -0
  117. data/spec/fixtures/place.json +1 -0
  118. data/spec/fixtures/places.json +1 -0
  119. data/spec/fixtures/privacy.json +1 -0
  120. data/spec/fixtures/profile_image.text +24 -0
  121. data/spec/fixtures/rate_limit_status.json +1 -0
  122. data/spec/fixtures/recommendations.json +1 -0
  123. data/spec/fixtures/related_results.json +1 -0
  124. data/spec/fixtures/resolve.json +1 -0
  125. data/spec/fixtures/retweet.json +1 -0
  126. data/spec/fixtures/retweeted_status.json +1 -0
  127. data/spec/fixtures/retweeters_of.json +1 -0
  128. data/spec/fixtures/retweets.json +1 -0
  129. data/spec/fixtures/saved_search.json +1 -0
  130. data/spec/fixtures/saved_searches.json +1 -0
  131. data/spec/fixtures/search.json +1 -0
  132. data/spec/fixtures/search_malformed.json +1 -0
  133. data/spec/fixtures/service_unavailable.json +1 -0
  134. data/spec/fixtures/settings.json +1 -0
  135. data/spec/fixtures/sferik.json +1 -0
  136. data/spec/fixtures/status.json +1 -0
  137. data/spec/fixtures/status_with_media.json +104 -0
  138. data/spec/fixtures/statuses.json +1 -0
  139. data/spec/fixtures/suggestions.json +1 -0
  140. data/spec/fixtures/tos.json +1 -0
  141. data/spec/fixtures/totals.json +1 -0
  142. data/spec/fixtures/trends.json +1 -0
  143. data/spec/fixtures/trends_current.json +1 -0
  144. data/spec/fixtures/trends_daily.json +1 -0
  145. data/spec/fixtures/trends_weekly.json +1 -0
  146. data/spec/fixtures/unauthorized.json +1 -0
  147. data/spec/fixtures/user_search.json +1 -0
  148. data/spec/fixtures/user_timeline.json +1 -0
  149. data/spec/fixtures/users.json +1 -0
  150. data/spec/fixtures/users_list.json +1 -0
  151. data/spec/fixtures/video_facets.json +1 -0
  152. data/spec/fixtures/we_concept_bg2.png +0 -0
  153. data/spec/fixtures/wildcomet2.jpe +0 -0
  154. data/spec/helper.rb +53 -0
  155. data/spec/twitter/action/favorite_spec.rb +29 -0
  156. data/spec/twitter/action/follow_spec.rb +29 -0
  157. data/spec/twitter/action/list_member_added_spec.rb +41 -0
  158. data/spec/twitter/action/mention_spec.rb +52 -0
  159. data/spec/twitter/action/reply_spec.rb +41 -0
  160. data/spec/twitter/action/retweet_spec.rb +41 -0
  161. data/spec/twitter/action_factory_spec.rb +37 -0
  162. data/spec/twitter/action_spec.rb +16 -0
  163. data/spec/twitter/api/account_spec.rb +148 -0
  164. data/spec/twitter/api/activity_spec.rb +41 -0
  165. data/spec/twitter/api/blocks_spec.rb +167 -0
  166. data/spec/twitter/api/direct_messages_spec.rb +142 -0
  167. data/spec/twitter/api/friendships_spec.rb +567 -0
  168. data/spec/twitter/api/geo_spec.rb +100 -0
  169. data/spec/twitter/api/help_spec.rb +76 -0
  170. data/spec/twitter/api/lists_spec.rb +900 -0
  171. data/spec/twitter/api/report_spam_spec.rb +29 -0
  172. data/spec/twitter/api/saved_searches_spec.rb +100 -0
  173. data/spec/twitter/api/search_spec.rb +68 -0
  174. data/spec/twitter/api/statuses_spec.rb +559 -0
  175. data/spec/twitter/api/trends_spec.rb +80 -0
  176. data/spec/twitter/api/users_spec.rb +419 -0
  177. data/spec/twitter/base_spec.rb +113 -0
  178. data/spec/twitter/basic_user_spec.rb +23 -0
  179. data/spec/twitter/client_spec.rb +175 -0
  180. data/spec/twitter/configuration_spec.rb +17 -0
  181. data/spec/twitter/cursor_spec.rb +102 -0
  182. data/spec/twitter/direct_message_spec.rb +56 -0
  183. data/spec/twitter/error/client_error_spec.rb +40 -0
  184. data/spec/twitter/error/server_error_spec.rb +24 -0
  185. data/spec/twitter/error_spec.rb +20 -0
  186. data/spec/twitter/geo/point_spec.rb +41 -0
  187. data/spec/twitter/geo/polygon_spec.rb +29 -0
  188. data/spec/twitter/geo_factory_spec.rb +21 -0
  189. data/spec/twitter/geo_spec.rb +29 -0
  190. data/spec/twitter/identifiable_spec.rb +54 -0
  191. data/spec/twitter/list_spec.rb +45 -0
  192. data/spec/twitter/media/photo_spec.rb +35 -0
  193. data/spec/twitter/media_factory_spec.rb +17 -0
  194. data/spec/twitter/oembed_spec.rb +146 -0
  195. data/spec/twitter/place_spec.rb +75 -0
  196. data/spec/twitter/rate_limit_spec.rb +76 -0
  197. data/spec/twitter/relationship_spec.rb +35 -0
  198. data/spec/twitter/saved_search_spec.rb +34 -0
  199. data/spec/twitter/search_results_spec.rb +89 -0
  200. data/spec/twitter/settings_spec.rb +16 -0
  201. data/spec/twitter/size_spec.rb +38 -0
  202. data/spec/twitter/source_user_spec.rb +23 -0
  203. data/spec/twitter/suggestion_spec.rb +50 -0
  204. data/spec/twitter/target_user_spec.rb +23 -0
  205. data/spec/twitter/trend_spec.rb +38 -0
  206. data/spec/twitter/tweet_spec.rb +307 -0
  207. data/spec/twitter/user_spec.rb +127 -0
  208. data/spec/twitter_spec.rb +93 -0
  209. data/twitter.gemspec +30 -0
  210. metadata +584 -0
@@ -0,0 +1,29 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::API do
4
+
5
+ before do
6
+ @client = Twitter::Client.new
7
+ end
8
+
9
+ describe "#report_spam" do
10
+ before do
11
+ stub_post("/1.1/report_spam.json").
12
+ with(:body => {:screen_name => "sferik"}).
13
+ to_return(:body => fixture("sferik.json"), :headers => {:content_type => "application/json; charset=utf-8"})
14
+ end
15
+ it "requests the correct resource" do
16
+ @client.report_spam("sferik")
17
+ a_post("/1.1/report_spam.json").
18
+ with(:body => {:screen_name => "sferik"}).
19
+ should have_been_made
20
+ end
21
+ it "returns an array of users" do
22
+ users = @client.report_spam("sferik")
23
+ users.should be_an Array
24
+ users.first.should be_a Twitter::User
25
+ users.first.id.should eq 7505382
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,100 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::API do
4
+
5
+ before do
6
+ @client = Twitter::Client.new
7
+ end
8
+
9
+ describe "#saved_searches" do
10
+ context "with ids passed" do
11
+ before do
12
+ stub_get("/1.1/saved_searches/show/16129012.json").
13
+ to_return(:body => fixture("saved_search.json"), :headers => {:content_type => "application/json; charset=utf-8"})
14
+ end
15
+ it "requests the correct resource" do
16
+ @client.saved_searches(16129012)
17
+ a_get("/1.1/saved_searches/show/16129012.json").
18
+ should have_been_made
19
+ end
20
+ it "returns an array of saved searches" do
21
+ saved_searches = @client.saved_searches(16129012)
22
+ saved_searches.should be_an Array
23
+ saved_searches.first.should be_a Twitter::SavedSearch
24
+ saved_searches.first.name.should eq "twitter"
25
+ end
26
+ end
27
+ context "without ids passed" do
28
+ before do
29
+ stub_get("/1.1/saved_searches/list.json").
30
+ to_return(:body => fixture("saved_searches.json"), :headers => {:content_type => "application/json; charset=utf-8"})
31
+ end
32
+ it "requests the correct resource" do
33
+ @client.saved_searches
34
+ a_get("/1.1/saved_searches/list.json").
35
+ should have_been_made
36
+ end
37
+ it "returns the authenticated user's saved search queries" do
38
+ saved_searches = @client.saved_searches
39
+ saved_searches.should be_an Array
40
+ saved_searches.first.should be_a Twitter::SavedSearch
41
+ saved_searches.first.name.should eq "twitter"
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "#saved_search" do
47
+ before do
48
+ stub_get("/1.1/saved_searches/show/16129012.json").
49
+ to_return(:body => fixture("saved_search.json"), :headers => {:content_type => "application/json; charset=utf-8"})
50
+ end
51
+ it "requests the correct resource" do
52
+ @client.saved_search(16129012)
53
+ a_get("/1.1/saved_searches/show/16129012.json").
54
+ should have_been_made
55
+ end
56
+ it "returns a saved search" do
57
+ saved_search = @client.saved_search(16129012)
58
+ saved_search.should be_a Twitter::SavedSearch
59
+ saved_search.name.should eq "twitter"
60
+ end
61
+ end
62
+
63
+ describe "#saved_search_create" do
64
+ before do
65
+ stub_post("/1.1/saved_searches/create.json").
66
+ with(:body => {:query => "twitter"}).
67
+ to_return(:body => fixture("saved_search.json"), :headers => {:content_type => "application/json; charset=utf-8"})
68
+ end
69
+ it "requests the correct resource" do
70
+ @client.saved_search_create("twitter")
71
+ a_post("/1.1/saved_searches/create.json").
72
+ with(:body => {:query => "twitter"}).
73
+ should have_been_made
74
+ end
75
+ it "returns the created saved search" do
76
+ saved_search = @client.saved_search_create("twitter")
77
+ saved_search.should be_a Twitter::SavedSearch
78
+ saved_search.name.should eq "twitter"
79
+ end
80
+ end
81
+
82
+ describe "#saved_search_destroy" do
83
+ before do
84
+ stub_post("/1.1/saved_searches/destroy/16129012.json").
85
+ to_return(:body => fixture("saved_search.json"), :headers => {:content_type => "application/json; charset=utf-8"})
86
+ end
87
+ it "requests the correct resource" do
88
+ @client.saved_search_destroy(16129012)
89
+ a_post("/1.1/saved_searches/destroy/16129012.json").
90
+ should have_been_made
91
+ end
92
+ it "returns an array of deleted saved searches" do
93
+ saved_searches = @client.saved_search_destroy(16129012)
94
+ saved_searches.should be_an Array
95
+ saved_searches.first.should be_a Twitter::SavedSearch
96
+ saved_searches.first.name.should eq "twitter"
97
+ end
98
+ end
99
+
100
+ end
@@ -0,0 +1,68 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::API do
4
+
5
+ before do
6
+ @client = Twitter::Client.new
7
+ end
8
+
9
+ describe "#search" do
10
+ before do
11
+ stub_get("/1.1/search/tweets.json").
12
+ with(:query => {:q => "twitter"}).
13
+ to_return(:body => fixture("search.json"), :headers => {:content_type => "application/json; charset=utf-8"})
14
+ end
15
+ it "requests the correct resource" do
16
+ @client.search('twitter')
17
+ a_get("/1.1/search/tweets.json").
18
+ with(:query => {:q => "twitter"}).
19
+ should have_been_made
20
+ end
21
+ it "returns recent Tweets related to a query with images and videos embedded" do
22
+ search = @client.search('twitter')
23
+ search.should be_a Twitter::SearchResults
24
+ search.results.should be_an Array
25
+ search.results.first.should be_a Twitter::Tweet
26
+ search.results.first.text.should eq "Bubble Mailer #freebandnames"
27
+ end
28
+ it "returns the max_id value for a search result" do
29
+ search = @client.search('twitter')
30
+ search.max_id.should eq(250126199840518145)
31
+ end
32
+
33
+ context "when search API responds a malformed result" do
34
+ before do
35
+ stub_get("/1.1/search/tweets.json").
36
+ with(:query => {:q => "twitter"}).
37
+ to_return(:body => fixture("/search_malformed.json"), :headers => {:content_type => "application/json; charset=utf-8"})
38
+ end
39
+
40
+ it "returns an empty array" do
41
+ search = @client.search('twitter')
42
+ search.results.should be_an Array
43
+ search.results.should be_empty
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "#phoenix_search" do
49
+ before do
50
+ stub_get("/phoenix_search.phoenix").
51
+ with(:query => {:q => "twitter"}).
52
+ to_return(:body => fixture("phoenix_search.phoenix"), :headers => {:content_type => "application/json; charset=utf-8"})
53
+ end
54
+ it "requests the correct resource" do
55
+ @client.phoenix_search('twitter')
56
+ a_get("/phoenix_search.phoenix").
57
+ with(:query => {:q => "twitter"}).
58
+ should have_been_made
59
+ end
60
+ it "returns recent Tweets related to a query with images and videos embedded" do
61
+ search = @client.phoenix_search('twitter')
62
+ search.should be_an Array
63
+ search.first.should be_a Twitter::Tweet
64
+ search.first.text.should eq "looking at twitter trends just makes me realize how little i really understand about mankind."
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,559 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::API do
4
+
5
+ before do
6
+ @client = Twitter::Client.new
7
+ end
8
+
9
+ describe "#favorites" do
10
+ context "with a screen name passed" do
11
+ before do
12
+ stub_get("/1.1/favorites/list.json").
13
+ with(:query => {:screen_name => "sferik"}).
14
+ to_return(:body => fixture("favorites.json"), :headers => {:content_type => "application/json; charset=utf-8"})
15
+ end
16
+ it "requests the correct resource" do
17
+ @client.favorites("sferik")
18
+ a_get("/1.1/favorites/list.json").
19
+ with(:query => {:screen_name => "sferik"}).
20
+ should have_been_made
21
+ end
22
+ it "returns the 20 most recent favorite Tweets for the authenticating user or user specified by the ID parameter" do
23
+ favorites = @client.favorites("sferik")
24
+ favorites.should be_an Array
25
+ favorites.first.should be_a Twitter::Tweet
26
+ favorites.first.user.id.should eq 2404341
27
+ end
28
+ end
29
+ context "without arguments passed" do
30
+ before do
31
+ stub_get("/1.1/favorites/list.json").
32
+ to_return(:body => fixture("favorites.json"), :headers => {:content_type => "application/json; charset=utf-8"})
33
+ end
34
+ it "requests the correct resource" do
35
+ @client.favorites
36
+ a_get("/1.1/favorites/list.json").
37
+ should have_been_made
38
+ end
39
+ it "returns the 20 most recent favorite Tweets for the authenticating user or user specified by the ID parameter" do
40
+ favorites = @client.favorites
41
+ favorites.should be_an Array
42
+ favorites.first.should be_a Twitter::Tweet
43
+ favorites.first.user.id.should eq 2404341
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "#favorite" do
49
+ before do
50
+ stub_post("/1.1/favorites/create.json").
51
+ with(:body => {:id => "25938088801"}).
52
+ to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
53
+ end
54
+ it "requests the correct resource" do
55
+ @client.favorite(25938088801)
56
+ a_post("/1.1/favorites/create.json").
57
+ with(:body => {:id => "25938088801"}).
58
+ should have_been_made
59
+ end
60
+ it "returns an array of favorited Tweets" do
61
+ tweets = @client.favorite(25938088801)
62
+ tweets.should be_an Array
63
+ tweets.first.should be_a Twitter::Tweet
64
+ tweets.first.text.should eq "@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!"
65
+ end
66
+ end
67
+
68
+ describe "#unfavorite" do
69
+ before do
70
+ stub_post("/1.1/favorites/destroy.json").
71
+ with(:body => {:id => "25938088801"}).
72
+ to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
73
+ end
74
+ it "requests the correct resource" do
75
+ @client.unfavorite(25938088801)
76
+ a_post("/1.1/favorites/destroy.json").
77
+ with(:body => {:id => "25938088801"}).
78
+ should have_been_made
79
+ end
80
+ it "returns an array of un-favorited Tweets" do
81
+ tweets = @client.unfavorite(25938088801)
82
+ tweets.should be_an Array
83
+ tweets.first.should be_a Twitter::Tweet
84
+ tweets.first.text.should eq "@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!"
85
+ end
86
+ end
87
+
88
+ describe "#home_timeline" do
89
+ before do
90
+ stub_get("/1.1/statuses/home_timeline.json").
91
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
92
+ end
93
+ it "requests the correct resource" do
94
+ @client.home_timeline
95
+ a_get("/1.1/statuses/home_timeline.json").
96
+ should have_been_made
97
+ end
98
+ it "returns the 20 most recent Tweets, including retweets if they exist, posted by the authenticating user and the user's they follow" do
99
+ tweets = @client.home_timeline
100
+ tweets.should be_an Array
101
+ tweets.first.should be_a Twitter::Tweet
102
+ tweets.first.text.should eq "Happy Birthday @imdane. Watch out for those @rally pranksters!"
103
+ end
104
+ end
105
+
106
+ describe "#mentions_timeline" do
107
+ before do
108
+ stub_get("/1.1/statuses/mentions_timeline.json").
109
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
110
+ end
111
+ it "requests the correct resource" do
112
+ @client.mentions_timeline
113
+ a_get("/1.1/statuses/mentions_timeline.json").
114
+ should have_been_made
115
+ end
116
+ it "returns the 20 most recent mentions (status containing @username) for the authenticating user" do
117
+ tweets = @client.mentions_timeline
118
+ tweets.should be_an Array
119
+ tweets.first.should be_a Twitter::Tweet
120
+ tweets.first.text.should eq "Happy Birthday @imdane. Watch out for those @rally pranksters!"
121
+ end
122
+ end
123
+
124
+ describe "#retweeted_by_user" do
125
+ before do
126
+ stub_get("/1.1/statuses/user_timeline.json").
127
+ with(:query => {:include_rts => "true", :screen_name => "sferik", :count => "200"}).
128
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
129
+ stub_get("/1.1/statuses/user_timeline.json").
130
+ with(:query => {:include_rts => "true", :screen_name => "sferik", :count => "200", :max_id => "244102729860009983"}).
131
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
132
+ end
133
+ it "requests the correct resource" do
134
+ @client.retweeted_by_user("sferik")
135
+ a_get("/1.1/statuses/user_timeline.json").
136
+ with(:query => {:include_rts => "true", :screen_name => "sferik", :count => "200"}).
137
+ should have_been_made
138
+ a_get("/1.1/statuses/user_timeline.json").
139
+ with(:query => {:include_rts => "true", :screen_name => "sferik", :count => "200", :max_id => "244102729860009983"}).
140
+ should have_been_made.times(3)
141
+ end
142
+ it "returns the 20 most recent retweets posted by the authenticating user" do
143
+ tweets = @client.retweeted_by_user("sferik")
144
+ tweets.should be_an Array
145
+ tweets.first.should be_a Twitter::Tweet
146
+ tweets.first.text.should eq "RT @olivercameron: Mosaic looks cool: http://t.co/A8013C9k"
147
+ end
148
+ end
149
+
150
+ describe "#retweeted_by_me" do
151
+ before do
152
+ stub_get("/1.1/statuses/user_timeline.json").
153
+ with(:query => {:include_rts => "true", :count => "200"}).
154
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
155
+ stub_get("/1.1/statuses/user_timeline.json").
156
+ with(:query => {:include_rts => "true", :count => "200", :max_id => "244102729860009983"}).
157
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
158
+ end
159
+ it "requests the correct resource" do
160
+ @client.retweeted_by_me
161
+ a_get("/1.1/statuses/user_timeline.json").
162
+ with(:query => {:include_rts => "true", :count => "200"}).
163
+ should have_been_made
164
+ a_get("/1.1/statuses/user_timeline.json").
165
+ with(:query => {:include_rts => "true", :count => "200", :max_id => "244102729860009983"}).
166
+ should have_been_made.times(3)
167
+ end
168
+ it "returns the 20 most recent retweets posted by the authenticating user" do
169
+ tweets = @client.retweeted_by_me
170
+ tweets.should be_an Array
171
+ tweets.first.should be_a Twitter::Tweet
172
+ tweets.first.text.should eq "RT @olivercameron: Mosaic looks cool: http://t.co/A8013C9k"
173
+ end
174
+ end
175
+
176
+ describe "#retweeted_to_me" do
177
+ before do
178
+ stub_get("/1.1/statuses/home_timeline.json").
179
+ with(:query => {:include_rts => "true", :count => "200"}).
180
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
181
+ stub_get("/1.1/statuses/home_timeline.json").
182
+ with(:query => {:include_rts => "true", :count => "200", :max_id => "244102729860009983"}).
183
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
184
+ end
185
+ it "requests the correct resource" do
186
+ @client.retweeted_to_me
187
+ stub_get("/1.1/statuses/home_timeline.json").
188
+ with(:query => {:include_rts => "true", :count => "200"}).
189
+ should have_been_made
190
+ stub_get("/1.1/statuses/home_timeline.json").
191
+ with(:query => {:include_rts => "true", :count => "200", :max_id => "244102729860009983"}).
192
+ should have_been_made.times(3)
193
+ end
194
+ it "returns the 20 most recent retweets posted by users the authenticating user follow" do
195
+ tweets = @client.retweeted_to_me
196
+ tweets.should be_an Array
197
+ tweets.first.should be_a Twitter::Tweet
198
+ tweets.first.text.should eq "RT @olivercameron: Mosaic looks cool: http://t.co/A8013C9k"
199
+ end
200
+ end
201
+
202
+ describe "#retweets_of_me" do
203
+ before do
204
+ stub_get("/1.1/statuses/user_timeline.json").
205
+ with(:query => {:include_rts => "false", :count => "200"}).
206
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
207
+ stub_get("/1.1/statuses/user_timeline.json").
208
+ with(:query => {:include_rts => "false", :count => "200", :max_id => "244102490646278145"}).
209
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
210
+ end
211
+ it "requests the correct resource" do
212
+ @client.retweets_of_me
213
+ a_get("/1.1/statuses/user_timeline.json").
214
+ with(:query => {:include_rts => "false", :count => "200"}).
215
+ should have_been_made
216
+ a_get("/1.1/statuses/user_timeline.json").
217
+ with(:query => {:include_rts => "false", :count => "200", :max_id => "244102490646278145"}).
218
+ should have_been_made
219
+ end
220
+ it "returns the 20 most recent tweets of the authenticated user that have been retweeted by others" do
221
+ tweets = @client.retweets_of_me
222
+ tweets.should be_an Array
223
+ tweets.first.should be_a Twitter::Tweet
224
+ tweets.first.text.should eq "RT @olivercameron: Mosaic looks cool: http://t.co/A8013C9k"
225
+ end
226
+ end
227
+
228
+ describe "#user_timeline" do
229
+ context "with a screen name passed" do
230
+ before do
231
+ stub_get("/1.1/statuses/user_timeline.json").
232
+ with(:query => {:screen_name => "sferik"}).
233
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
234
+ end
235
+ it "requests the correct resource" do
236
+ @client.user_timeline("sferik")
237
+ a_get("/1.1/statuses/user_timeline.json").
238
+ with(:query => {:screen_name => "sferik"}).
239
+ should have_been_made
240
+ end
241
+ it "returns the 20 most recent Tweets posted by the user specified by screen name or user id" do
242
+ tweets = @client.user_timeline("sferik")
243
+ tweets.should be_an Array
244
+ tweets.first.should be_a Twitter::Tweet
245
+ tweets.first.text.should eq "Happy Birthday @imdane. Watch out for those @rally pranksters!"
246
+ end
247
+ end
248
+ context "without a screen name passed" do
249
+ before do
250
+ stub_get("/1.1/statuses/user_timeline.json").
251
+ to_return(:body => fixture("statuses.json"), :headers => {:content_type => "application/json; charset=utf-8"})
252
+ end
253
+ it "requests the correct resource" do
254
+ @client.user_timeline
255
+ a_get("/1.1/statuses/user_timeline.json").
256
+ should have_been_made
257
+ end
258
+ end
259
+ end
260
+
261
+ describe "#media_timeline" do
262
+ context "with a screen name passed" do
263
+ before do
264
+ stub_get("/1.1/statuses/media_timeline.json").
265
+ with(:query => {:screen_name => "sferik"}).
266
+ to_return(:body => fixture("media_timeline.json"), :headers => {:content_type => "application/json; charset=utf-8"})
267
+ end
268
+ it "requests the correct resource" do
269
+ @client.media_timeline("sferik")
270
+ a_get("/1.1/statuses/media_timeline.json").
271
+ with(:query => {:screen_name => "sferik"}).
272
+ should have_been_made
273
+ end
274
+ it "returns the 20 most recent images posted by the user specified by screen name or user id" do
275
+ tweets = @client.media_timeline("sferik")
276
+ tweets.should be_an Array
277
+ tweets.first.should be_a Twitter::Tweet
278
+ tweets.first.text.should eq "Google is throwing up a question mark for Sunday's weather in Boston. At least they're being honest. http://t.co/Jh7bAhS"
279
+ end
280
+ end
281
+ context "without a screen name passed" do
282
+ before do
283
+ stub_get("/1.1/statuses/media_timeline.json").
284
+ to_return(:body => fixture("media_timeline.json"), :headers => {:content_type => "application/json; charset=utf-8"})
285
+ end
286
+ it "requests the correct resource" do
287
+ @client.media_timeline
288
+ a_get("/1.1/statuses/media_timeline.json").
289
+ should have_been_made
290
+ end
291
+ end
292
+ end
293
+
294
+ describe "#retweeters_of" do
295
+ context "with ids_only passed" do
296
+ before do
297
+ stub_get("/1.1/statuses/retweets/28561922516.json").
298
+ to_return(:body => fixture("retweets.json"), :headers => {:content_type => "application/json; charset=utf-8"})
299
+ end
300
+ it "requests the correct resource" do
301
+ @client.retweeters_of(28561922516, :ids_only => true)
302
+ a_get("/1.1/statuses/retweets/28561922516.json").
303
+ should have_been_made
304
+ end
305
+ it "returns an array of numeric user IDs of retweeters of a Tweet" do
306
+ ids = @client.retweeters_of(28561922516, :ids_only => true)
307
+ ids.should be_an Array
308
+ ids.first.should eq 7505382
309
+ end
310
+ end
311
+ context "without ids_only passed" do
312
+ before do
313
+ stub_get("/1.1/statuses/retweets/28561922516.json").
314
+ to_return(:body => fixture("retweets.json"), :headers => {:content_type => "application/json; charset=utf-8"})
315
+ end
316
+ it "requests the correct resource" do
317
+ @client.retweeters_of(28561922516)
318
+ a_get("/1.1/statuses/retweets/28561922516.json").
319
+ should have_been_made
320
+ end
321
+ it "returns an array of user of retweeters of a Tweet" do
322
+ users = @client.retweeters_of(28561922516)
323
+ users.should be_an Array
324
+ users.first.should be_a Twitter::User
325
+ users.first.id.should eq 7505382
326
+ end
327
+ end
328
+ end
329
+
330
+ describe "#retweets" do
331
+ before do
332
+ stub_get("/1.1/statuses/retweets/28561922516.json").
333
+ to_return(:body => fixture("retweets.json"), :headers => {:content_type => "application/json; charset=utf-8"})
334
+ end
335
+ it "requests the correct resource" do
336
+ @client.retweets(28561922516)
337
+ a_get("/1.1/statuses/retweets/28561922516.json").
338
+ should have_been_made
339
+ end
340
+ it "returns up to 100 of the first retweets of a given tweet" do
341
+ tweets = @client.retweets(28561922516)
342
+ tweets.should be_an Array
343
+ tweets.first.should be_a Twitter::Tweet
344
+ tweets.first.text.should eq "RT @gruber: As for the Series, I'm for the Giants. Fuck Texas, fuck Nolan Ryan, fuck George Bush."
345
+ end
346
+ end
347
+
348
+ describe "#status" do
349
+ before do
350
+ stub_get("/1.1/statuses/show/25938088801.json").
351
+ to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
352
+ end
353
+ it "requests the correct resource" do
354
+ @client.status(25938088801)
355
+ a_get("/1.1/statuses/show/25938088801.json").
356
+ should have_been_made
357
+ end
358
+ it "returns a Tweet" do
359
+ tweet = @client.status(25938088801)
360
+ tweet.should be_a Twitter::Tweet
361
+ tweet.text.should eq "@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!"
362
+ end
363
+ end
364
+
365
+ describe "#statuses" do
366
+ before do
367
+ stub_get("/1.1/statuses/show/25938088801.json").
368
+ to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
369
+ end
370
+ it "requests the correct resource" do
371
+ @client.statuses(25938088801)
372
+ a_get("/1.1/statuses/show/25938088801.json").
373
+ should have_been_made
374
+ end
375
+ it "returns an array of Tweets" do
376
+ tweets = @client.statuses(25938088801)
377
+ tweets.should be_an Array
378
+ tweets.first.should be_a Twitter::Tweet
379
+ tweets.first.text.should eq "@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!"
380
+ end
381
+ end
382
+
383
+ describe "#status_activity" do
384
+ before do
385
+ stub_get("/i/statuses/25938088801/activity/summary.json").
386
+ to_return(:body => fixture("activity_summary.json"), :headers => {:content_type => "application/json; charset=utf-8"})
387
+ end
388
+ it "requests the correct resource" do
389
+ @client.status_activity(25938088801)
390
+ a_get("/i/statuses/25938088801/activity/summary.json").
391
+ should have_been_made
392
+ end
393
+ it "returns a Tweet" do
394
+ tweet = @client.status_activity(25938088801)
395
+ tweet.should be_a Twitter::Tweet
396
+ tweet.retweeters_count.should eq 1
397
+ end
398
+ end
399
+
400
+ describe "#statuses_activity" do
401
+ before do
402
+ stub_get("/i/statuses/25938088801/activity/summary.json").
403
+ to_return(:body => fixture("activity_summary.json"), :headers => {:content_type => "application/json; charset=utf-8"})
404
+ end
405
+ it "requests the correct resource" do
406
+ @client.statuses_activity(25938088801)
407
+ a_get("/i/statuses/25938088801/activity/summary.json").
408
+ should have_been_made
409
+ end
410
+ it "returns an array of Tweets" do
411
+ tweets = @client.statuses_activity(25938088801)
412
+ tweets.should be_an Array
413
+ tweets.first.should be_a Twitter::Tweet
414
+ tweets.first.retweeters_count.should eq 1
415
+ end
416
+ end
417
+
418
+ describe "#status_destroy" do
419
+ before do
420
+ stub_post("/1.1/statuses/destroy/25938088801.json").
421
+ to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
422
+ end
423
+ it "requests the correct resource" do
424
+ @client.status_destroy(25938088801)
425
+ a_post("/1.1/statuses/destroy/25938088801.json").
426
+ should have_been_made
427
+ end
428
+ it "returns an array of Tweets" do
429
+ tweets = @client.status_destroy(25938088801)
430
+ tweets.should be_an Array
431
+ tweets.first.should be_a Twitter::Tweet
432
+ tweets.first.text.should eq "@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!"
433
+ end
434
+ end
435
+
436
+ describe "#retweet" do
437
+ before do
438
+ stub_post("/1.1/statuses/retweet/28561922516.json").
439
+ to_return(:body => fixture("retweet.json"), :headers => {:content_type => "application/json; charset=utf-8"})
440
+ end
441
+ it "requests the correct resource" do
442
+ @client.retweet(28561922516)
443
+ a_post("/1.1/statuses/retweet/28561922516.json").
444
+ should have_been_made
445
+ end
446
+ it "returns an array of Tweets with retweet details embedded" do
447
+ tweets = @client.retweet(28561922516)
448
+ tweets.should be_an Array
449
+ tweets.first.should be_a Twitter::Tweet
450
+ tweets.first.text.should eq "As for the Series, I'm for the Giants. Fuck Texas, fuck Nolan Ryan, fuck George Bush."
451
+ tweets.first.retweeted_tweet.text.should eq "RT @gruber: As for the Series, I'm for the Giants. Fuck Texas, fuck Nolan Ryan, fuck George Bush."
452
+ tweets.first.retweeted_tweet.id.should_not == tweets.first.id
453
+ end
454
+ end
455
+
456
+ describe "#tweet" do
457
+ before do
458
+ stub_post("/1.1/statuses/update.json").
459
+ with(:body => {:status => "@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!"}).
460
+ to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
461
+ end
462
+ it "requests the correct resource" do
463
+ @client.update("@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!")
464
+ a_post("/1.1/statuses/update.json").
465
+ with(:body => {:status => "@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!"}).
466
+ should have_been_made
467
+ end
468
+ it "returns a Tweet" do
469
+ tweet = @client.update("@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!")
470
+ tweet.should be_a Twitter::Tweet
471
+ tweet.text.should eq "@noradio working on implementing #NewTwitter API methods in the twitter gem. Twurl is making it easy. Thank you!"
472
+ end
473
+ end
474
+
475
+ describe "#update_with_media" do
476
+ before do
477
+ stub_post("/1.1/statuses/update_with_media.json").
478
+ to_return(:body => fixture("status_with_media.json"), :headers => {:content_type => "application/json; charset=utf-8"})
479
+ end
480
+ context "a gif image" do
481
+ it "requests the correct resource" do
482
+ @client.update_with_media("You always have options", fixture("pbjt.gif"))
483
+ a_post("/1.1/statuses/update_with_media.json").
484
+ should have_been_made
485
+ end
486
+ it "returns a Tweet" do
487
+ tweet = @client.update_with_media("You always have options", fixture("pbjt.gif"))
488
+ tweet.should be_a Twitter::Tweet
489
+ tweet.text.should eq "You always have options http://t.co/CBYa7Ri"
490
+ end
491
+ end
492
+ context "a jpe image" do
493
+ it "requests the correct resource" do
494
+ @client.update_with_media("You always have options", fixture("wildcomet2.jpe"))
495
+ a_post("/1.1/statuses/update_with_media.json").
496
+ should have_been_made
497
+ end
498
+ end
499
+ context "a jpeg image" do
500
+ it "requests the correct resource" do
501
+ @client.update_with_media("You always have options", fixture("me.jpeg"))
502
+ a_post("/1.1/statuses/update_with_media.json").
503
+ should have_been_made
504
+ end
505
+ end
506
+ context "a png image" do
507
+ it "requests the correct resource" do
508
+ @client.update_with_media("You always have options", fixture("we_concept_bg2.png"))
509
+ a_post("/1.1/statuses/update_with_media.json").
510
+ should have_been_made
511
+ end
512
+ end
513
+ context "a Tempfile" do
514
+ it "requests the correct resource" do
515
+ @client.update_with_media("You always have options", Tempfile.new("tmp"))
516
+ a_post("/1.1/statuses/update_with_media.json").
517
+ should have_been_made
518
+ end
519
+ end
520
+ end
521
+
522
+ describe "#oembed" do
523
+ before do
524
+ stub_get("/1.1/statuses/oembed.json").
525
+ with(:query => {:id => "25938088801"}).
526
+ to_return(:body => fixture("oembed.json"), :headers => {:content_type => "application/json; charset=utf-8"})
527
+ end
528
+ it "requests the correct resource" do
529
+ @client.oembed(25938088801)
530
+ a_get("/1.1/statuses/oembed.json").
531
+ with(:query => {:id => "25938088801"}).
532
+ should have_been_made
533
+ end
534
+ it "returns an array of OEmbed instances" do
535
+ oembed = @client.oembed(25938088801)
536
+ oembed.should be_a Twitter::OEmbed
537
+ end
538
+ end
539
+
540
+ describe "#oembeds" do
541
+ before do
542
+ stub_get("/1.1/statuses/oembed.json").
543
+ with(:query => {:id => "25938088801"}).
544
+ to_return(:body => fixture("oembed.json"), :headers => {:content_type => "application/json; charset=utf-8"})
545
+ end
546
+ it "requests the correct resource" do
547
+ @client.oembeds(25938088801)
548
+ a_get("/1.1/statuses/oembed.json").
549
+ with(:query => {:id => "25938088801"}).
550
+ should have_been_made
551
+ end
552
+ it "returns an array of OEmbed instances" do
553
+ oembeds = @client.oembeds(25938088801)
554
+ oembeds.should be_an Array
555
+ oembeds.first.should be_a Twitter::OEmbed
556
+ end
557
+ end
558
+
559
+ end