twitter 4.0.0

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 (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,23 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::TargetUser do
4
+
5
+ describe "#==" do
6
+ it "returns true when objects IDs are the same" do
7
+ saved_search = Twitter::TargetUser.new(:id => 1, :name => "foo")
8
+ other = Twitter::TargetUser.new(:id => 1, :name => "bar")
9
+ (saved_search == other).should be_true
10
+ end
11
+ it "returns false when objects IDs are different" do
12
+ saved_search = Twitter::TargetUser.new(:id => 1)
13
+ other = Twitter::TargetUser.new(:id => 2)
14
+ (saved_search == other).should be_false
15
+ end
16
+ it "returns false when classes are different" do
17
+ saved_search = Twitter::TargetUser.new(:id => 1)
18
+ other = Twitter::Identity.new(:id => 1)
19
+ (saved_search == other).should be_false
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,38 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::Trend do
4
+
5
+ describe "#==" do
6
+ it "returns false for empty objects" do
7
+ trend = Twitter::Trend.new
8
+ other = Twitter::Trend.new
9
+ (trend == other).should be_false
10
+ end
11
+ it "returns true when objects names are the same" do
12
+ trend = Twitter::Trend.new(:name => "#sevenwordsaftersex", :query => "foo")
13
+ other = Twitter::Trend.new(:name => "#sevenwordsaftersex", :query => "bar")
14
+ (trend == other).should be_true
15
+ end
16
+ it "returns false when objects names are different" do
17
+ trend = Twitter::Trend.new(:name => "#sevenwordsaftersex")
18
+ other = Twitter::Trend.new(:name => "#sixwordsaftersex")
19
+ (trend == other).should be_false
20
+ end
21
+ it "returns false when classes are different" do
22
+ trend = Twitter::Trend.new(:name => "#sevenwordsaftersex")
23
+ other = Twitter::Base.new(:name => "#sevenwordsaftersex")
24
+ (trend == other).should be_false
25
+ end
26
+ it "returns true when objects non-name attributes are the same" do
27
+ trend = Twitter::Trend.new(:query => "foo")
28
+ other = Twitter::Trend.new(:query => "foo")
29
+ (trend == other).should be_true
30
+ end
31
+ it "returns false when objects non-name attributes are different" do
32
+ trend = Twitter::Trend.new(:query => "foo")
33
+ other = Twitter::Trend.new(:query => "bar")
34
+ (trend == other).should be_false
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,307 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::Tweet do
4
+
5
+ before do
6
+ @old_stderr = $stderr
7
+ $stderr = StringIO.new
8
+ end
9
+
10
+ after do
11
+ $stderr = @old_stderr
12
+ end
13
+
14
+ describe "#==" do
15
+ it "returns true when objects IDs are the same" do
16
+ tweet = Twitter::Tweet.new(:id => 1, :text => "foo")
17
+ other = Twitter::Tweet.new(:id => 1, :text => "bar")
18
+ (tweet == other).should be_true
19
+ end
20
+ it "returns false when objects IDs are different" do
21
+ tweet = Twitter::Tweet.new(:id => 1)
22
+ other = Twitter::Tweet.new(:id => 2)
23
+ (tweet == other).should be_false
24
+ end
25
+ it "returns false when classes are different" do
26
+ tweet = Twitter::Tweet.new(:id => 1)
27
+ other = Twitter::Identity.new(:id => 1)
28
+ (tweet == other).should be_false
29
+ end
30
+ end
31
+
32
+ describe "#created_at" do
33
+ it "returns a Time when set" do
34
+ tweet = Twitter::Tweet.new(:id => 28669546014, :created_at => "Mon Jul 16 12:59:01 +0000 2007")
35
+ tweet.created_at.should be_a Time
36
+ end
37
+ it "returns nil when not set" do
38
+ tweet = Twitter::Tweet.new(:id => 28669546014)
39
+ tweet.created_at.should be_nil
40
+ end
41
+ end
42
+
43
+ describe "#favoriters_count" do
44
+ it "returns the count of favoriters when favoriters_count is set" do
45
+ tweet = Twitter::Tweet.new(:id => 28669546014, :favoriters_count => '1')
46
+ tweet.favoriters_count.should be_an Integer
47
+ tweet.favoriters_count.should eq 1
48
+ end
49
+ it "returns nil when not set" do
50
+ tweet = Twitter::Tweet.new(:id => 28669546014)
51
+ tweet.favoriters_count.should be_nil
52
+ end
53
+ end
54
+
55
+ describe "#from_user" do
56
+ it "returns a screen name when from_user is set" do
57
+ tweet = Twitter::Tweet.new(:id => 28669546014, :from_user => 'sferik')
58
+ tweet.from_user.should be_a String
59
+ tweet.from_user.should eq "sferik"
60
+ end
61
+ it "returns a screen name when screen_name is set" do
62
+ tweet = Twitter::Tweet.new(:id => 28669546014, :user => {:id => 7505382, :screen_name => 'sferik'})
63
+ tweet.from_user.should be_a String
64
+ tweet.from_user.should eq "sferik"
65
+ end
66
+ it "returns nil when not set" do
67
+ tweet = Twitter::Tweet.new(:id => 28669546014)
68
+ tweet.from_user.should be_nil
69
+ end
70
+ end
71
+
72
+ describe "#full_text" do
73
+ it "returns the text of a Tweet" do
74
+ tweet = Twitter::Tweet.new(:id => 28669546014, :text => 'BOOSH')
75
+ tweet.full_text.should be_a String
76
+ tweet.full_text.should eq "BOOSH"
77
+ end
78
+ it "returns the text of a Tweet without a user" do
79
+ tweet = Twitter::Tweet.new(:id => 28669546014, :text => 'BOOSH', :retweeted_status => {:id => 28561922517, :text => 'BOOSH'})
80
+ tweet.full_text.should be_a String
81
+ tweet.full_text.should eq "BOOSH"
82
+ end
83
+ it "returns the full text of a retweeted Tweet" do
84
+ tweet = Twitter::Tweet.new(:id => 28669546014, :retweeted_status => {:id => 28561922516, :text => 'BOOSH', :user => {:id => 7505382, :screen_name => 'sferik'}})
85
+ tweet.full_text.should be_a String
86
+ tweet.full_text.should eq "RT @sferik: BOOSH"
87
+ end
88
+ it "returns nil when retweeted_status is not set" do
89
+ tweet = Twitter::Tweet.new(:id => 28669546014)
90
+ tweet.full_text.should be_nil
91
+ end
92
+ end
93
+
94
+ describe "#geo" do
95
+ it "returns a Twitter::Geo::Point when set" do
96
+ tweet = Twitter::Tweet.new(:id => 28669546014, :geo => {:id => 1, :type => 'Point'})
97
+ tweet.geo.should be_a Twitter::Geo::Point
98
+ end
99
+ it "returns nil when not set" do
100
+ tweet = Twitter::Tweet.new(:id => 28669546014)
101
+ tweet.geo.should be_nil
102
+ end
103
+ end
104
+
105
+ describe "#hashtags" do
106
+ it "returns an Array of Entity::Hashtag when entities are set" do
107
+ hashtags_hash = [
108
+ {
109
+ :text => 'twitter',
110
+ :indices => [10, 33],
111
+ }
112
+ ]
113
+ hashtags = Twitter::Tweet.new(:id => 28669546014, :entities => {:hashtags => hashtags_hash}).hashtags
114
+ hashtags.should be_an Array
115
+ hashtags.first.should be_a Twitter::Entity::Hashtag
116
+ hashtags.first.indices.should eq [10, 33]
117
+ hashtags.first.text.should eq 'twitter'
118
+ end
119
+ it "is empty when not set" do
120
+ hashtags = Twitter::Tweet.new(:id => 28669546014).hashtags
121
+ hashtags.should be_empty
122
+ end
123
+ it "warns when not set" do
124
+ Twitter::Tweet.new(:id => 28669546014).hashtags
125
+ $stderr.string.should =~ /To get hashtags, you must pass `:include_entities => true` when requesting the Twitter::Tweet\./
126
+ end
127
+ end
128
+
129
+ describe "#media" do
130
+ it "returns media" do
131
+ media = Twitter::Tweet.new(:id => 28669546014, :entities => {:media => [{:id => 1, :type => 'photo'}]}).media
132
+ media.should be_an Array
133
+ media.first.should be_a Twitter::Media::Photo
134
+ end
135
+ it "is empty when not set" do
136
+ media = Twitter::Tweet.new(:id => 28669546014).media
137
+ media.should be_empty
138
+ end
139
+ it "warns when not set" do
140
+ Twitter::Tweet.new(:id => 28669546014).media
141
+ $stderr.string.should =~ /To get media, you must pass `:include_entities => true` when requesting the Twitter::Tweet\./
142
+ end
143
+ end
144
+
145
+ describe "#metadata" do
146
+ it "returns a User when user is set" do
147
+ metadata = Twitter::Tweet.new(:id => 28669546014, :metadata => {}).metadata
148
+ metadata.should be_a Twitter::Metadata
149
+ end
150
+ it "returns nil when user is not set" do
151
+ metadata = Twitter::Tweet.new(:id => 28669546014).metadata
152
+ metadata.should be_nil
153
+ end
154
+ end
155
+
156
+ describe "#place" do
157
+ it "returns a Twitter::Place when set" do
158
+ tweet = Twitter::Tweet.new(:id => 28669546014, :place => {:id => "247f43d441defc03"})
159
+ tweet.place.should be_a Twitter::Place
160
+ end
161
+ it "returns nil when not set" do
162
+ tweet = Twitter::Tweet.new(:id => 28669546014)
163
+ tweet.place.should be_nil
164
+ end
165
+ end
166
+
167
+ describe "#repliers_count" do
168
+ it "returns the count of favoriters when repliers_count is set" do
169
+ tweet = Twitter::Tweet.new(:id => 28669546014, :repliers_count => '1')
170
+ tweet.repliers_count.should be_an Integer
171
+ tweet.repliers_count.should eq 1
172
+ end
173
+ it "returns nil when not set" do
174
+ tweet = Twitter::Tweet.new(:id => 28669546014)
175
+ tweet.repliers_count.should be_nil
176
+ end
177
+ end
178
+
179
+ describe "#retweet?" do
180
+ it "returns true when there is a retweeted status" do
181
+ tweet = Twitter::Tweet.new(:id => 28669546014, :retweeted_status => {:id => 28561922516, :text => 'BOOSH'})
182
+ tweet.retweet?.should be_true
183
+ end
184
+ it "returns false when retweeted_status is not set" do
185
+ tweet = Twitter::Tweet.new(:id => 28669546014)
186
+ tweet.retweet?.should be_false
187
+ end
188
+ end
189
+
190
+ describe "#retweeted_status" do
191
+ it "has text when retweeted_status is set" do
192
+ tweet = Twitter::Tweet.new(:id => 28669546014, :retweeted_status => {:id => 28561922516, :text => 'BOOSH'})
193
+ tweet.retweeted_tweet.should be_a Twitter::Tweet
194
+ tweet.retweeted_tweet.text.should eq 'BOOSH'
195
+ end
196
+ it "returns nil when retweeted_status is not set" do
197
+ tweet = Twitter::Tweet.new(:id => 28669546014)
198
+ tweet.retweeted_tweet.should be_nil
199
+ end
200
+ end
201
+
202
+ describe "#retweeters_count" do
203
+ it "returns the count of favoriters when retweet_count is set" do
204
+ tweet = Twitter::Tweet.new(:id => 28669546014, :retweet_count => '1')
205
+ tweet.retweeters_count.should be_an Integer
206
+ tweet.retweeters_count.should eq 1
207
+ end
208
+ it "returns the count of favoriters when retweeters_count is set" do
209
+ tweet = Twitter::Tweet.new(:id => 28669546014, :retweeters_count => '1')
210
+ tweet.retweeters_count.should be_an Integer
211
+ tweet.retweeters_count.should eq 1
212
+ end
213
+ it "returns nil when not set" do
214
+ tweet = Twitter::Tweet.new(:id => 28669546014)
215
+ tweet.retweeters_count.should be_nil
216
+ end
217
+ end
218
+
219
+ describe "#entities?" do
220
+ it "returns false if there are no entities set" do
221
+ tweet = Twitter::Tweet.new(:id => 28669546014)
222
+ tweet.entities?.should be_false
223
+ end
224
+
225
+ it "returns true if there are entities set" do
226
+ urls_hash = [
227
+ {
228
+ :url => 'http://example.com/t.co',
229
+ :expanded_url => 'http://example.com/expanded',
230
+ :display_url => 'example.com/expanded',
231
+ :indices => [10, 33],
232
+ }
233
+ ]
234
+ tweet = Twitter::Tweet.new(:id => 28669546014, :entities => {:urls => urls_hash})
235
+ tweet.entities?.should be_true
236
+ end
237
+ end
238
+
239
+ describe "#urls" do
240
+ it "returns an Array of Entity::Url when entities are set" do
241
+ urls_hash = [
242
+ {
243
+ :url => 'http://example.com/t.co',
244
+ :expanded_url => 'http://example.com/expanded',
245
+ :display_url => 'example.com/expanded',
246
+ :indices => [10, 33],
247
+ }
248
+ ]
249
+ urls = Twitter::Tweet.new(:id => 28669546014, :entities => {:urls => urls_hash}).urls
250
+ urls.should be_an Array
251
+ urls.first.should be_a Twitter::Entity::Url
252
+ urls.first.indices.should eq [10, 33]
253
+ urls.first.display_url.should eq 'example.com/expanded'
254
+ end
255
+ it "is empty when not set" do
256
+ urls = Twitter::Tweet.new(:id => 28669546014).urls
257
+ urls.should be_empty
258
+ end
259
+ it "warns when not set" do
260
+ Twitter::Tweet.new(:id => 28669546014).urls
261
+ $stderr.string.should =~ /To get urls, you must pass `:include_entities => true` when requesting the Twitter::Tweet\./
262
+ end
263
+ end
264
+
265
+ describe "#user" do
266
+ it "returns a User when user is set" do
267
+ user = Twitter::Tweet.new(:id => 28669546014, :user => {:id => 7505382}).user
268
+ user.should be_a Twitter::User
269
+ end
270
+ it "returns nil when user is not set" do
271
+ user = Twitter::Tweet.new(:id => 28669546014).user
272
+ user.should be_nil
273
+ end
274
+ it "has a status when status is set" do
275
+ user = Twitter::Tweet.new(:id => 28669546014, :text => 'Tweet text.', :user => {:id => 7505382}).user
276
+ user.status.should be_a Twitter::Tweet
277
+ end
278
+ end
279
+
280
+ describe "#user_mentions" do
281
+ it "returns an Array of Entity::UserMention when entities are set" do
282
+ user_mentions_hash = [
283
+ {
284
+ :screen_name => 'sferik',
285
+ :name => 'Erik Michaels-Ober',
286
+ :id_str => '7505382',
287
+ :indices => [0, 6],
288
+ :id => 7505382,
289
+ }
290
+ ]
291
+ user_mentions = Twitter::Tweet.new(:id => 28669546014, :entities => {:user_mentions => user_mentions_hash}).user_mentions
292
+ user_mentions.should be_an Array
293
+ user_mentions.first.should be_a Twitter::Entity::UserMention
294
+ user_mentions.first.indices.should eq [0, 6]
295
+ user_mentions.first.id.should eq 7505382
296
+ end
297
+ it "is empty when not set" do
298
+ user_mentions = Twitter::Tweet.new(:id => 28669546014).user_mentions
299
+ user_mentions.should be_empty
300
+ end
301
+ it "warns when not set" do
302
+ Twitter::Tweet.new(:id => 28669546014).user_mentions
303
+ $stderr.string.should =~ /To get user mentions, you must pass `:include_entities => true` when requesting the Twitter::Tweet\./
304
+ end
305
+ end
306
+
307
+ end
@@ -0,0 +1,127 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::User do
4
+
5
+ describe "#==" do
6
+ it "returns true when objects IDs are the same" do
7
+ user = Twitter::User.new(:id => 1, :screen_name => "foo")
8
+ other = Twitter::User.new(:id => 1, :screen_name => "bar")
9
+ (user == other).should be_true
10
+ end
11
+ it "returns false when objects IDs are different" do
12
+ user = Twitter::User.new(:id => 1)
13
+ other = Twitter::User.new(:id => 2)
14
+ (user == other).should be_false
15
+ end
16
+ it "returns false when classes are different" do
17
+ user = Twitter::User.new(:id => 1)
18
+ other = Twitter::Identity.new(:id => 1)
19
+ (user == other).should be_false
20
+ end
21
+ end
22
+
23
+ describe "#created_at" do
24
+ it "returns a Time when created_at is set" do
25
+ user = Twitter::User.new(:id => 7505382, :created_at => "Mon Jul 16 12:59:01 +0000 2007")
26
+ user.created_at.should be_a Time
27
+ end
28
+ it "returns nil when created_at is not set" do
29
+ user = Twitter::User.new(:id => 7505382)
30
+ user.created_at.should be_nil
31
+ end
32
+ end
33
+
34
+ describe "#profile_image_url" do
35
+ it "returns a String when profile_image_url is set" do
36
+ user = Twitter::User.new(:id => 7505382, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
37
+ user.profile_image_url.should be_a String
38
+ end
39
+ it "returns nil when created_at is not set" do
40
+ user = Twitter::User.new(:id => 7505382)
41
+ user.profile_image_url.should be_nil
42
+ end
43
+ it "returns the normal-sized image" do
44
+ user = Twitter::User.new(:id => 7505382, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
45
+ user.profile_image_url.should eq "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png"
46
+ end
47
+ context "with :original passed" do
48
+ it "returns the original image" do
49
+ user = Twitter::User.new(:id => 7505382, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
50
+ user.profile_image_url(:original).should eq "http://a0.twimg.com/profile_images/1759857427/image1326743606.png"
51
+ end
52
+ end
53
+ context "with :bigger passed" do
54
+ it "returns the bigger-sized image" do
55
+ user = Twitter::User.new(:id => 7505382, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
56
+ user.profile_image_url(:bigger).should eq "http://a0.twimg.com/profile_images/1759857427/image1326743606_bigger.png"
57
+ end
58
+ end
59
+ context "with :mini passed" do
60
+ it "returns the mini-sized image" do
61
+ user = Twitter::User.new(:id => 7505382, :profile_image_url => "http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
62
+ user.profile_image_url(:mini).should eq "http://a0.twimg.com/profile_images/1759857427/image1326743606_mini.png"
63
+ end
64
+ end
65
+ end
66
+
67
+ describe "#profile_image_url_https" do
68
+ it "returns a String when profile_image_url_https is set" do
69
+ user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
70
+ user.profile_image_url_https.should be_a String
71
+ end
72
+ it "returns nil when created_at is not set" do
73
+ user = Twitter::User.new(:id => 7505382)
74
+ user.profile_image_url_https.should be_nil
75
+ end
76
+ it "returns the normal-sized image" do
77
+ user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
78
+ user.profile_image_url_https.should eq "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png"
79
+ end
80
+ context "with :original passed" do
81
+ it "returns the original image" do
82
+ user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
83
+ user.profile_image_url_https(:original).should eq "https://a0.twimg.com/profile_images/1759857427/image1326743606.png"
84
+ end
85
+ end
86
+ context "with :bigger passed" do
87
+ it "returns the bigger-sized image" do
88
+ user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
89
+ user.profile_image_url_https(:bigger).should eq "https://a0.twimg.com/profile_images/1759857427/image1326743606_bigger.png"
90
+ end
91
+ end
92
+ context "with :mini passed" do
93
+ it "returns the mini-sized image" do
94
+ user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
95
+ user.profile_image_url_https(:mini).should eq "https://a0.twimg.com/profile_images/1759857427/image1326743606_mini.png"
96
+ end
97
+ end
98
+ end
99
+
100
+ describe "#status" do
101
+ it "returns a Status when status is set" do
102
+ tweet = Twitter::User.new(:id => 7505382, :status => {:id => 25938088801}).status
103
+ tweet.should be_a Twitter::Tweet
104
+ end
105
+ it "returns nil when status is not set" do
106
+ tweet = Twitter::User.new(:id => 7505382).status
107
+ tweet.should be_nil
108
+ end
109
+ it "includes a User when user is set" do
110
+ tweet = Twitter::User.new(:id => 7505382, :screen_name => 'sferik', :status => {:id => 25938088801}).status
111
+ tweet.user.should be_a Twitter::User
112
+ tweet.user.id.should eq 7505382
113
+ end
114
+ end
115
+
116
+ describe "#status?" do
117
+ it "returns true when status is set" do
118
+ tweet = Twitter::User.new(:id => 7505382, :status => {:id => 25938088801}).status?
119
+ tweet.should be_true
120
+ end
121
+ it "returns false when status is not set" do
122
+ tweet = Twitter::User.new(:id => 7505382).status?
123
+ tweet.should be_false
124
+ end
125
+ end
126
+
127
+ end