twitter 5.0.0.rc.1 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG.md +7 -1
  3. data/CONTRIBUTING.md +13 -15
  4. data/README.md +53 -33
  5. data/Rakefile +6 -0
  6. data/lib/twitter/arguments.rb +3 -0
  7. data/lib/twitter/base.rb +88 -89
  8. data/lib/twitter/client.rb +5 -41
  9. data/lib/twitter/configuration.rb +4 -5
  10. data/lib/twitter/core_ext/kernel.rb +5 -1
  11. data/lib/twitter/creatable.rb +6 -1
  12. data/lib/twitter/cursor.rb +16 -12
  13. data/lib/twitter/entity/uri.rb +2 -1
  14. data/lib/twitter/enumerable.rb +1 -1
  15. data/lib/twitter/error.rb +42 -39
  16. data/lib/twitter/factory.rb +12 -5
  17. data/lib/twitter/geo.rb +2 -7
  18. data/lib/twitter/geo_factory.rb +11 -7
  19. data/lib/twitter/geo_results.rb +12 -8
  20. data/lib/twitter/identity.rb +4 -12
  21. data/lib/twitter/list.rb +6 -3
  22. data/lib/twitter/media/photo.rb +5 -3
  23. data/lib/twitter/media_factory.rb +11 -7
  24. data/lib/twitter/null_object.rb +4 -3
  25. data/lib/twitter/place.rb +10 -16
  26. data/lib/twitter/profile_banner.rb +4 -5
  27. data/lib/twitter/rate_limit.rb +3 -0
  28. data/lib/twitter/relationship.rb +0 -9
  29. data/lib/twitter/rest/api/direct_messages.rb +9 -6
  30. data/lib/twitter/rest/api/favorites.rb +6 -11
  31. data/lib/twitter/rest/api/friends_and_followers.rb +6 -9
  32. data/lib/twitter/rest/api/lists.rb +27 -20
  33. data/lib/twitter/rest/api/oauth.rb +17 -0
  34. data/lib/twitter/rest/api/places_and_geo.rb +0 -18
  35. data/lib/twitter/rest/api/saved_searches.rb +6 -4
  36. data/lib/twitter/rest/api/suggested_users.rb +2 -2
  37. data/lib/twitter/rest/api/tweets.rb +7 -9
  38. data/lib/twitter/rest/api/users.rb +6 -6
  39. data/lib/twitter/rest/api/utils.rb +44 -17
  40. data/lib/twitter/rest/client.rb +25 -43
  41. data/lib/twitter/rest/response/parse_error_json.rb +15 -0
  42. data/lib/twitter/rest/response/parse_json.rb +5 -1
  43. data/lib/twitter/search_results.rb +12 -8
  44. data/lib/twitter/size.rb +2 -15
  45. data/lib/twitter/streaming/client.rb +23 -11
  46. data/lib/twitter/streaming/event.rb +35 -0
  47. data/lib/twitter/streaming/friend_list.rb +13 -0
  48. data/lib/twitter/streaming/message_parser.rb +18 -0
  49. data/lib/twitter/streaming/response.rb +4 -0
  50. data/lib/twitter/suggestion.rb +5 -10
  51. data/lib/twitter/token.rb +3 -1
  52. data/lib/twitter/trend.rb +2 -7
  53. data/lib/twitter/trend_results.rb +20 -14
  54. data/lib/twitter/tweet.rb +18 -23
  55. data/lib/twitter/user.rb +34 -19
  56. data/lib/twitter/version.rb +1 -1
  57. data/spec/fixtures/request_token.txt +6 -0
  58. data/spec/fixtures/track_streaming_user.json +5 -0
  59. data/spec/twitter/base_spec.rb +0 -16
  60. data/spec/twitter/basic_user_spec.rb +3 -3
  61. data/spec/twitter/cursor_spec.rb +4 -4
  62. data/spec/twitter/direct_message_spec.rb +9 -9
  63. data/spec/twitter/entity/uri_spec.rb +12 -11
  64. data/spec/twitter/geo/point_spec.rb +5 -5
  65. data/spec/twitter/geo/polygon_spec.rb +5 -5
  66. data/spec/twitter/geo_factory_spec.rb +2 -2
  67. data/spec/twitter/geo_spec.rb +6 -6
  68. data/spec/twitter/identifiable_spec.rb +5 -5
  69. data/spec/twitter/list_spec.rb +7 -7
  70. data/spec/twitter/media/photo_spec.rb +19 -18
  71. data/spec/twitter/media_factory_spec.rb +2 -2
  72. data/spec/twitter/null_object_spec.rb +7 -6
  73. data/spec/twitter/oembed_spec.rb +6 -6
  74. data/spec/twitter/place_spec.rb +37 -37
  75. data/spec/twitter/rate_limit_spec.rb +0 -17
  76. data/spec/twitter/relationship_spec.rb +4 -12
  77. data/spec/twitter/rest/api/direct_messages_spec.rb +8 -8
  78. data/spec/twitter/rest/api/friends_and_followers_spec.rb +50 -120
  79. data/spec/twitter/rest/api/geo_spec.rb +0 -14
  80. data/spec/twitter/rest/api/lists_spec.rb +39 -39
  81. data/spec/twitter/rest/api/oauth_spec.rb +15 -4
  82. data/spec/twitter/rest/api/saved_searches_spec.rb +6 -6
  83. data/spec/twitter/rest/api/tweets_spec.rb +6 -6
  84. data/spec/twitter/rest/api/users_spec.rb +4 -4
  85. data/spec/twitter/rest/client_spec.rb +9 -9
  86. data/spec/twitter/saved_search_spec.rb +5 -5
  87. data/spec/twitter/search_results_spec.rb +3 -3
  88. data/spec/twitter/settings_spec.rb +2 -2
  89. data/spec/twitter/size_spec.rb +5 -15
  90. data/spec/twitter/source_user_spec.rb +3 -3
  91. data/spec/twitter/streaming/client_spec.rb +33 -16
  92. data/spec/twitter/streaming/event_spec.rb +45 -0
  93. data/spec/twitter/suggestion_spec.rb +5 -15
  94. data/spec/twitter/target_user_spec.rb +3 -3
  95. data/spec/twitter/token_spec.rb +2 -2
  96. data/spec/twitter/trend_results_spec.rb +6 -6
  97. data/spec/twitter/trend_spec.rb +7 -17
  98. data/spec/twitter/tweet_spec.rb +31 -25
  99. data/spec/twitter/user_spec.rb +16 -16
  100. data/twitter.gemspec +5 -2
  101. metadata +67 -15
  102. metadata.gz.sig +0 -0
@@ -18,10 +18,7 @@ describe Twitter::REST::API::OAuth do
18
18
  end
19
19
  it "requests with the correct headers" do
20
20
  @client.token
21
- expect(a_request(:post, @oauth2_token_url).with(:headers => {
22
- :content_type => "application/x-www-form-urlencoded; charset=UTF-8",
23
- :accept => "*/*"
24
- })).to have_been_made
21
+ expect(a_request(:post, @oauth2_token_url).with(:headers => {:content_type => "application/x-www-form-urlencoded; charset=UTF-8", :accept => "*/*"})).to have_been_made
25
22
  end
26
23
  it "returns the bearer token" do
27
24
  bearer_token = @client.token
@@ -53,4 +50,18 @@ describe Twitter::REST::API::OAuth do
53
50
  end
54
51
  end
55
52
 
53
+ describe "#reverse_token" do
54
+ before do
55
+ # WebMock treats Basic Auth differently so we have to chack against the full URL with credentials.
56
+ @oauth_request_token_url = "https://api.twitter.com/oauth/request_token?x_auth_mode=reverse_auth"
57
+ stub_request(:post, @oauth_request_token_url).to_return(:body => fixture('request_token.txt'), :headers => {:content_type => "text/html; charset=utf-8"})
58
+ end
59
+ it "requests the correct resource" do
60
+ @client.reverse_token
61
+ expect(a_request(:post, @oauth_request_token_url).with(:params => {:x_auth_mode => "reverse_auth"})).to have_been_made
62
+ end
63
+ it "requests the correct resource" do
64
+ expect(@client.reverse_token).to eql fixture('request_token.txt').read
65
+ end
66
+ end
56
67
  end
@@ -54,31 +54,31 @@ describe Twitter::REST::API::SavedSearches do
54
54
  end
55
55
  end
56
56
 
57
- describe "#saved_search_create" do
57
+ describe "#create_saved_search" do
58
58
  before do
59
59
  stub_post("/1.1/saved_searches/create.json").with(:body => {:query => "twitter"}).to_return(:body => fixture("saved_search.json"), :headers => {:content_type => "application/json; charset=utf-8"})
60
60
  end
61
61
  it "requests the correct resource" do
62
- @client.saved_search_create("twitter")
62
+ @client.create_saved_search("twitter")
63
63
  expect(a_post("/1.1/saved_searches/create.json").with(:body => {:query => "twitter"})).to have_been_made
64
64
  end
65
65
  it "returns the created saved search" do
66
- saved_search = @client.saved_search_create("twitter")
66
+ saved_search = @client.create_saved_search("twitter")
67
67
  expect(saved_search).to be_a Twitter::SavedSearch
68
68
  expect(saved_search.name).to eq("twitter")
69
69
  end
70
70
  end
71
71
 
72
- describe "#saved_search_destroy" do
72
+ describe "#destroy_saved_search" do
73
73
  before do
74
74
  stub_post("/1.1/saved_searches/destroy/16129012.json").to_return(:body => fixture("saved_search.json"), :headers => {:content_type => "application/json; charset=utf-8"})
75
75
  end
76
76
  it "requests the correct resource" do
77
- @client.saved_search_destroy(16129012)
77
+ @client.destroy_saved_search(16129012)
78
78
  expect(a_post("/1.1/saved_searches/destroy/16129012.json")).to have_been_made
79
79
  end
80
80
  it "returns an array of deleted saved searches" do
81
- saved_searches = @client.saved_search_destroy(16129012)
81
+ saved_searches = @client.destroy_saved_search(16129012)
82
82
  expect(saved_searches).to be_an Array
83
83
  expect(saved_searches.first).to be_a Twitter::SavedSearch
84
84
  expect(saved_searches.first.name).to eq("twitter")
@@ -169,16 +169,16 @@ describe Twitter::REST::API::Tweets do
169
169
  end
170
170
  end
171
171
 
172
- describe "#status_destroy" do
172
+ describe "#destroy_status" do
173
173
  before do
174
174
  stub_post("/1.1/statuses/destroy/25938088801.json").to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
175
175
  end
176
176
  it "requests the correct resource" do
177
- @client.status_destroy(25938088801)
177
+ @client.destroy_status(25938088801)
178
178
  expect(a_post("/1.1/statuses/destroy/25938088801.json")).to have_been_made
179
179
  end
180
180
  it "returns an array of Tweets" do
181
- tweets = @client.status_destroy(25938088801)
181
+ tweets = @client.destroy_status(25938088801)
182
182
  expect(tweets).to be_an Array
183
183
  expect(tweets.first).to be_a Twitter::Tweet
184
184
  expect(tweets.first.text).to eq("The problem with your code is that it's doing exactly what you told it to do.")
@@ -186,20 +186,20 @@ describe Twitter::REST::API::Tweets do
186
186
  context "with a URI object passed" do
187
187
  it "requests the correct resource" do
188
188
  tweet = URI.parse("https://twitter.com/sferik/status/25938088801")
189
- @client.status_destroy(tweet)
189
+ @client.destroy_status(tweet)
190
190
  expect(a_post("/1.1/statuses/destroy/25938088801.json")).to have_been_made
191
191
  end
192
192
  end
193
193
  context "with a URI string passed" do
194
194
  it "requests the correct resource" do
195
- @client.status_destroy("https://twitter.com/sferik/status/25938088801")
195
+ @client.destroy_status("https://twitter.com/sferik/status/25938088801")
196
196
  expect(a_post("/1.1/statuses/destroy/25938088801.json")).to have_been_made
197
197
  end
198
198
  end
199
199
  context "with a Tweet passed" do
200
200
  it "requests the correct resource" do
201
201
  tweet = Twitter::Tweet.new(:id => 25938088801)
202
- @client.status_destroy(tweet)
202
+ @client.destroy_status(tweet)
203
203
  expect(a_post("/1.1/statuses/destroy/25938088801.json")).to have_been_made
204
204
  end
205
205
  end
@@ -238,11 +238,11 @@ describe Twitter::REST::API::Users do
238
238
  end
239
239
  it "returns true if block exists" do
240
240
  block = @client.block?("pengwynn")
241
- expect(block).to be_true
241
+ expect(block).to be true
242
242
  end
243
243
  it "returns false if block does not exist" do
244
244
  block = @client.block?("sferik")
245
- expect(block).to be_false
245
+ expect(block).to be false
246
246
  end
247
247
  end
248
248
  context "with a user ID passed" do
@@ -528,11 +528,11 @@ describe Twitter::REST::API::Users do
528
528
  end
529
529
  it "returns true if user exists" do
530
530
  user = @client.user?("sferik")
531
- expect(user).to be_true
531
+ expect(user).to be true
532
532
  end
533
533
  it "returns false if user does not exist" do
534
534
  user = @client.user?("pengwynn")
535
- expect(user).to be_false
535
+ expect(user).to be false
536
536
  end
537
537
  end
538
538
 
@@ -27,15 +27,15 @@ describe Twitter::REST::Client do
27
27
  describe ".credentials?" do
28
28
  it "returns true if only bearer_token is supplied" do
29
29
  client = Twitter::REST::Client.new(:bearer_token => "BT")
30
- expect(client.credentials?).to be_true
30
+ expect(client.credentials?).to be true
31
31
  end
32
32
  it "returns true if all OAuth credentials are present" do
33
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
34
+ expect(client.credentials?).to be true
35
35
  end
36
36
  it "returns false if any credentials are missing" do
37
37
  client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT")
38
- expect(client.credentials?).to be_false
38
+ expect(client.credentials?).to be false
39
39
  end
40
40
  end
41
41
 
@@ -70,33 +70,33 @@ describe Twitter::REST::Client do
70
70
  describe "#user_token?" do
71
71
  it "returns true if the user token/secret are present" do
72
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
73
+ expect(client.user_token?).to be true
74
74
  end
75
75
  it "returns false if the user token/secret are not completely present" do
76
76
  client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT")
77
- expect(client.user_token?).to be_false
77
+ expect(client.user_token?).to be false
78
78
  end
79
79
  end
80
80
 
81
81
  describe "#bearer_token?" do
82
82
  it "returns true if the app token is present" do
83
83
  client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :bearer_token => "BT")
84
- expect(client.bearer_token?).to be_true
84
+ expect(client.bearer_token?).to be true
85
85
  end
86
86
  it "returns false if the bearer_token is not present" do
87
87
  client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS")
88
- expect(client.bearer_token?).to be_false
88
+ expect(client.bearer_token?).to be false
89
89
  end
90
90
  end
91
91
 
92
92
  describe "#credentials?" do
93
93
  it "returns true if all credentials are present" do
94
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
95
+ expect(client.credentials?).to be true
96
96
  end
97
97
  it "returns false if any credentials are missing" do
98
98
  client = Twitter::REST::Client.new(:consumer_key => "CK", :consumer_secret => "CS", :access_token => "AT")
99
- expect(client.credentials?).to be_false
99
+ expect(client.credentials?).to be false
100
100
  end
101
101
  end
102
102
 
@@ -6,17 +6,17 @@ describe Twitter::SavedSearch do
6
6
  it "returns true when objects IDs are the same" do
7
7
  saved_search = Twitter::SavedSearch.new(:id => 1, :name => "foo")
8
8
  other = Twitter::SavedSearch.new(:id => 1, :name => "bar")
9
- expect(saved_search == other).to be_true
9
+ expect(saved_search == other).to be true
10
10
  end
11
11
  it "returns false when objects IDs are different" do
12
12
  saved_search = Twitter::SavedSearch.new(:id => 1)
13
13
  other = Twitter::SavedSearch.new(:id => 2)
14
- expect(saved_search == other).to be_false
14
+ expect(saved_search == other).to be false
15
15
  end
16
16
  it "returns false when classes are different" do
17
17
  saved_search = Twitter::SavedSearch.new(:id => 1)
18
18
  other = Twitter::Identity.new(:id => 1)
19
- expect(saved_search == other).to be_false
19
+ expect(saved_search == other).to be false
20
20
  end
21
21
  end
22
22
 
@@ -34,11 +34,11 @@ describe Twitter::SavedSearch do
34
34
  describe "#created?" do
35
35
  it "returns true when created_at is set" do
36
36
  saved_search = Twitter::SavedSearch.new(:id => 16129012, :created_at => "Mon Jul 16 12:59:01 +0000 2007")
37
- expect(saved_search.created?).to be_true
37
+ expect(saved_search.created?).to be true
38
38
  end
39
39
  it "returns false when created_at is not set" do
40
40
  saved_search = Twitter::SavedSearch.new(:id => 16129012)
41
- expect(saved_search.created?).to be_false
41
+ expect(saved_search.created?).to be false
42
42
  end
43
43
  end
44
44
 
@@ -95,15 +95,15 @@ describe Twitter::SearchResults do
95
95
  describe "#next_results?" do
96
96
  it "returns true when next_results is set" do
97
97
  next_results = Twitter::SearchResults.new(:search_metadata => {:next_results => "?"}).next_results?
98
- expect(next_results).to be_true
98
+ expect(next_results).to be true
99
99
  end
100
100
  it "returns false when next_results is not set" do
101
101
  next_results = Twitter::SearchResults.new(:search_metadata => {}).next_results?
102
- expect(next_results).to be_false
102
+ expect(next_results).to be false
103
103
  end
104
104
  it "returns false is search_metadata is not set" do
105
105
  next_results = Twitter::SearchResults.new().next_results?
106
- expect(next_results).to be_false
106
+ expect(next_results).to be false
107
107
  end
108
108
  end
109
109
 
@@ -16,11 +16,11 @@ describe Twitter::Settings do
16
16
  describe "#trend_location?" do
17
17
  it "returns true when trend_location is set" do
18
18
  settings = Twitter::Settings.new(:trend_location => {:countryCode => "US", :name => "San Francisco", :country => "United States", :placeType => {:name => "Town", :code => 7}, :woeid => 2487956, :parentid => 23424977, :url => "http://where.yahooapis.com/v1/place/2487956"})
19
- expect(settings.trend_location?).to be_true
19
+ expect(settings.trend_location?).to be true
20
20
  end
21
21
  it "returns false when trend_location is not set" do
22
22
  settings = Twitter::Settings.new
23
- expect(settings.trend_location?).to be_false
23
+ expect(settings.trend_location?).to be false
24
24
  end
25
25
  end
26
26
 
@@ -3,35 +3,25 @@ require 'helper'
3
3
  describe Twitter::Size do
4
4
 
5
5
  describe "#==" do
6
- it "returns false for empty objects" do
6
+ it "returns true for empty objects" do
7
7
  size = Twitter::Size.new
8
8
  other = Twitter::Size.new
9
- expect(size == other).to be_false
9
+ expect(size == other).to be true
10
10
  end
11
11
  it "returns true when objects height and width are the same" do
12
12
  size = Twitter::Size.new(:h => 1, :w => 1, :resize => true)
13
13
  other = Twitter::Size.new(:h => 1, :w => 1, :resize => false)
14
- expect(size == other).to be_true
14
+ expect(size == other).to be true
15
15
  end
16
16
  it "returns false when objects height or width are different" do
17
17
  size = Twitter::Size.new(:h => 1, :w => 1)
18
18
  other = Twitter::Size.new(:h => 1, :w => 2)
19
- expect(size == other).to be_false
19
+ expect(size == other).to be false
20
20
  end
21
21
  it "returns false when classes are different" do
22
22
  size = Twitter::Size.new(:h => 1, :w => 1)
23
23
  other = Twitter::Base.new(:h => 1, :w => 1)
24
- expect(size == other).to be_false
25
- end
26
- it "returns true when objects non-height and width attributes are the same" do
27
- size = Twitter::Size.new(:resize => true)
28
- other = Twitter::Size.new(:resize => true)
29
- expect(size == other).to be_true
30
- end
31
- it "returns false when objects non-height and width attributes are different" do
32
- size = Twitter::Size.new(:resize => true)
33
- other = Twitter::Size.new(:resize => false)
34
- expect(size == other).to be_false
24
+ expect(size == other).to be false
35
25
  end
36
26
  end
37
27
 
@@ -6,17 +6,17 @@ describe Twitter::SourceUser do
6
6
  it "returns true when objects IDs are the same" do
7
7
  saved_search = Twitter::SourceUser.new(:id => 1, :name => "foo")
8
8
  other = Twitter::SourceUser.new(:id => 1, :name => "bar")
9
- expect(saved_search == other).to be_true
9
+ expect(saved_search == other).to be true
10
10
  end
11
11
  it "returns false when objects IDs are different" do
12
12
  saved_search = Twitter::SourceUser.new(:id => 1)
13
13
  other = Twitter::SourceUser.new(:id => 2)
14
- expect(saved_search == other).to be_false
14
+ expect(saved_search == other).to be false
15
15
  end
16
16
  it "returns false when classes are different" do
17
17
  saved_search = Twitter::SourceUser.new(:id => 1)
18
18
  other = Twitter::Identity.new(:id => 1)
19
- expect(saved_search == other).to be_false
19
+ expect(saved_search == other).to be false
20
20
  end
21
21
  end
22
22
 
@@ -17,59 +17,76 @@ describe Twitter::Streaming::Client do
17
17
  end
18
18
  end
19
19
 
20
- it "supports tracking keywords" do
20
+ it "#before_request" do
21
+ @client.connection = FakeConnection.new(fixture("track_streaming.json"))
22
+ var = false
23
+ @client.before_request do
24
+ var = true
25
+ end
26
+ expect(var).to be false
27
+ @client.user{}
28
+ expect(var).to be true
29
+ end
30
+
31
+ it "#filter" do
21
32
  @client.connection = FakeConnection.new(fixture("track_streaming.json"))
22
33
  tweets = []
23
34
  @client.filter(:track => "india") do |tweet|
24
35
  tweets << tweet
25
36
  end
26
- expect(tweets).to have(2).entries
37
+ expect(tweets.size).to eq(2)
27
38
  expect(tweets.first).to be_a Twitter::Tweet
28
39
  expect(tweets.first.text).to eq "The problem with your code is that it's doing exactly what you told it to do."
29
40
  end
30
41
 
31
- it "supports firehose" do
42
+ it "#firehose" do
32
43
  @client.connection = FakeConnection.new(fixture("track_streaming.json"))
33
44
  tweets = []
34
45
  @client.firehose do |tweet|
35
46
  tweets << tweet
36
47
  end
37
- expect(tweets).to have(2).entries
48
+ expect(tweets.size).to eq(2)
38
49
  expect(tweets.first).to be_a Twitter::Tweet
39
50
  expect(tweets.first.text).to eq "The problem with your code is that it's doing exactly what you told it to do."
40
51
  end
41
52
 
42
- it "supports sample" do
53
+ it "#sample" do
43
54
  @client.connection = FakeConnection.new(fixture("track_streaming.json"))
44
55
  tweets = []
45
56
  @client.sample do |tweet|
46
57
  tweets << tweet
47
58
  end
48
- expect(tweets).to have(2).entries
59
+ expect(tweets.size).to eq(2)
49
60
  expect(tweets.first).to be_a Twitter::Tweet
50
61
  expect(tweets.first.text).to eq "The problem with your code is that it's doing exactly what you told it to do."
51
62
  end
52
63
 
53
- it "supports site streams" do
64
+ it "#site" do
54
65
  @client.connection = FakeConnection.new(fixture("track_streaming.json"))
55
66
  tweets = []
56
67
  @client.site(7505382) do |tweet|
57
68
  tweets << tweet
58
69
  end
59
- expect(tweets).to have(2).entries
70
+ expect(tweets.size).to eq(2)
60
71
  expect(tweets.first).to be_a Twitter::Tweet
61
72
  expect(tweets.first.text).to eq "The problem with your code is that it's doing exactly what you told it to do."
62
73
  end
63
74
 
64
- it "supports user streams" do
65
- @client.connection = FakeConnection.new(fixture("track_streaming.json"))
66
- tweets = []
67
- @client.user do |tweet|
68
- tweets << tweet
75
+ it "#user" do
76
+ @client.connection = FakeConnection.new(fixture("track_streaming_user.json"))
77
+ items = []
78
+ @client.user do |item|
79
+ items << item
69
80
  end
70
- expect(tweets).to have(2).entries
71
- expect(tweets.first).to be_a Twitter::Tweet
72
- expect(tweets.first.text).to eq "The problem with your code is that it's doing exactly what you told it to do."
81
+ expect(items.size).to eq(5)
82
+ expect(items[0]).to be_a Twitter::Streaming::FriendList
83
+ expect(items[0].friend_ids).to eq([488736931,311444249])
84
+ expect(items[1]).to be_a Twitter::Tweet
85
+ expect(items[1].text).to eq "The problem with your code is that it's doing exactly what you told it to do."
86
+ expect(items[3]).to be_a Twitter::DirectMessage
87
+ expect(items[3].text).to eq "hello bot"
88
+ expect(items[4]).to be_a Twitter::Streaming::Event
89
+ expect(items[4].name).to be(:follow)
73
90
  end
74
91
 
75
92
  end
@@ -0,0 +1,45 @@
1
+ require 'helper'
2
+
3
+ describe Twitter::Streaming::Event do
4
+ describe "#initialize" do
5
+ before(:each) do
6
+ @data = {:event=>"follow", :source=>{:id=>10083602, :id_str=>"10083602", :name=>"Adam Bird", :screen_name=>"adambird", :location=>"Nottingham, UK", :url=>"http://t.co/M1eaIKDQyz", :description=>"CEO @onediaryapp, ex @esendex CTO and co-founder, still cycling", :protected=>false, :followers_count=>1295, :friends_count=>850, :listed_count=>53, :created_at=>"Fri Nov 09 00:35:12 +0000 2007", :favourites_count=>93, :utc_offset=>0, :time_zone=>"London", :geo_enabled=>true, :verified=>false, :statuses_count=>13507, :lang=>"en", :contributors_enabled=>false, :is_translator=>false, :profile_background_color=>"C0DEED", :profile_background_image_url=>"http://abs.twimg.com/images/themes/theme1/bg.png", :profile_background_image_url_https=>"https://abs.twimg.com/images/themes/theme1/bg.png", :profile_background_tile=>false, :profile_image_url=>"http://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg", :profile_image_url_https=>"https://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg", :profile_link_color=>"0084B4", :profile_sidebar_border_color=>"C0DEED", :profile_sidebar_fill_color=>"DDEEF6", :profile_text_color=>"333333", :profile_use_background_image=>true, :default_profile=>true, :default_profile_image=>false, :following=>false, :follow_request_sent=>false, :notifications=>false}, :target=>{:id=>1292911088, :id_str=>"1292911088", :name=>"One Diary Bot", :screen_name=>"onediarybot", :location=>nil, :url=>"http://t.co/etHGc0xHX4", :description=>"I'm the One Diary bot, here to help you with your life including personal cycling weather forecasts.", :protected=>false, :followers_count=>123, :friends_count=>157, :listed_count=>1, :created_at=>"Sat Mar 23 23:52:18 +0000 2013", :favourites_count=>0, :utc_offset=>nil, :time_zone=>nil, :geo_enabled=>false, :verified=>false, :statuses_count=>9637, :lang=>"en", :contributors_enabled=>false, :is_translator=>false, :profile_background_color=>"C0DEED", :profile_background_image_url=>"http://abs.twimg.com/images/themes/theme1/bg.png", :profile_background_image_url_https=>"https://abs.twimg.com/images/themes/theme1/bg.png", :profile_background_tile=>false, :profile_image_url=>"http://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg", :profile_image_url_https=>"https://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg", :profile_link_color=>"0084B4", :profile_sidebar_border_color=>"C0DEED", :profile_sidebar_fill_color=>"DDEEF6", :profile_text_color=>"333333", :profile_use_background_image=>true, :default_profile=>true, :default_profile_image=>false, :following=>false, :follow_request_sent=>false, :notifications=>false}, :created_at=>"Sun Oct 27 20:44:19 +0000 2013"}
7
+ end
8
+
9
+ subject { Twitter::Streaming::Event.new(@data) }
10
+
11
+ it "should set the name to be a symbolised version of string string" do
12
+ expect(subject.name).to eq(:follow)
13
+ end
14
+ it "should set the source to be the User" do
15
+ expect(subject.source).to be_a(Twitter::User)
16
+ expect(subject.source.id).to eq(10083602)
17
+ end
18
+ it "should set the target to be the User" do
19
+ expect(subject.target).to be_a(Twitter::User)
20
+ expect(subject.target.id).to eq(1292911088)
21
+ end
22
+
23
+ context "when target object is a list" do
24
+ before(:each) do
25
+ @data = {:event=>"list_member_added", :target_object=>{:full_name=>"@adambird/lists/dev", :user=>{:default_profile_image=>false, :profile_text_color=>"333333", :created_at=>"Fri Nov 09 00:35:12 +0000 2007", :is_translator=>false, :name=>"Adam Bird", :screen_name=>"adambird", :geo_enabled=>true, :follow_request_sent=>false, :profile_sidebar_border_color=>"C0DEED", :default_profile=>true, :id=>10083602, :contributors_enabled=>false, :followers_count=>1295, :lang=>"en", :profile_background_tile=>false, :url=>"http://about.me/adambird", :profile_sidebar_fill_color=>"DDEEF6", :listed_count=>53, :utc_offset=>0, :location=>"Nottingham, UK", :time_zone=>"London", :profile_background_color=>"C0DEED", :following=>false, :protected=>false, :description=>"CEO @onediaryapp, ex @esendex CTO and co-founder, still cycling", :profile_image_url_https=>"https://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg", :profile_background_image_url=>"http://abs.twimg.com/images/themes/theme1/bg.png", :profile_link_color=>"0084B4", :notifications=>false, :profile_background_image_url_https=>"https://abs.twimg.com/images/themes/theme1/bg.png", :favourites_count=>93, :id_str=>"10083602", :statuses_count=>13507, :verified=>false, :profile_image_url=>"http://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg", :profile_use_background_image=>true, :friends_count=>851}, :uri=>"/adambird/lists/dev", :subscriber_count=>0, :id_str=>"60314359", :created_at=>"Sun Dec 04 19:54:20 +0000 2011", :id=>60314359, :following=>false, :mode=>"public", :member_count=>13, :description=>"", :slug=>"dev", :name=>"dev"}, :source=>{:default_profile_image=>false, :profile_text_color=>"333333", :created_at=>"Fri Nov 09 00:35:12 +0000 2007", :is_translator=>false, :name=>"Adam Bird", :screen_name=>"adambird", :geo_enabled=>true, :follow_request_sent=>false, :profile_sidebar_border_color=>"C0DEED", :default_profile=>true, :id=>10083602, :contributors_enabled=>false, :followers_count=>1295, :lang=>"en", :profile_background_tile=>false, :url=>"http://about.me/adambird", :profile_sidebar_fill_color=>"DDEEF6", :listed_count=>53, :utc_offset=>0, :location=>"Nottingham, UK", :time_zone=>"London", :profile_background_color=>"C0DEED", :following=>false, :protected=>false, :description=>"CEO @onediaryapp, ex @esendex CTO and co-founder, still cycling", :profile_image_url_https=>"https://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg", :profile_background_image_url=>"http://abs.twimg.com/images/themes/theme1/bg.png", :profile_link_color=>"0084B4", :notifications=>false, :profile_background_image_url_https=>"https://abs.twimg.com/images/themes/theme1/bg.png", :favourites_count=>93, :id_str=>"10083602", :statuses_count=>13507, :verified=>false, :profile_image_url=>"http://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg", :profile_use_background_image=>true, :friends_count=>851}, :created_at=>"Sun Oct 27 20:54:51 +0000 2013", :target=>{:default_profile_image=>false, :profile_text_color=>"333333", :created_at=>"Sat Mar 23 23:52:18 +0000 2013", :is_translator=>false, :name=>"One Diary Bot", :screen_name=>"onediarybot", :geo_enabled=>false, :follow_request_sent=>false, :profile_sidebar_border_color=>"C0DEED", :default_profile=>true, :id=>1292911088, :contributors_enabled=>false, :followers_count=>124, :lang=>"en", :profile_background_tile=>false, :url=>"http://www.onediary.com", :profile_sidebar_fill_color=>"DDEEF6", :listed_count=>2, :utc_offset=>nil, :location=>nil, :time_zone=>nil, :profile_background_color=>"C0DEED", :following=>true, :protected=>false, :description=>"I'm the One Diary bot, here to help you with your life including personal cycling weather forecasts.", :profile_image_url_https=>"https://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg", :profile_background_image_url=>"http://abs.twimg.com/images/themes/theme1/bg.png", :profile_link_color=>"0084B4", :notifications=>false, :profile_background_image_url_https=>"https://abs.twimg.com/images/themes/theme1/bg.png", :favourites_count=>0, :id_str=>"1292911088", :statuses_count=>9637, :verified=>false, :profile_image_url=>"http://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg", :profile_use_background_image=>true, :friends_count=>157}}
26
+ end
27
+
28
+ it "should have the list object as the target object" do
29
+ expect(subject.target_object).to be_a(Twitter::List)
30
+ expect(subject.target_object.full_name).to eq("@adambird/lists/dev")
31
+ end
32
+ end
33
+
34
+ context "when target object is a tweet" do
35
+ before(:each) do
36
+ @data = {:event=>"favorite", :target_object=>{:in_reply_to_status_id=>394341960603172864, :favorited=>true, :entities=>{:hashtags=>[], :urls=>[], :user_mentions=>[{:screen_name=>"darrenliddell", :id_str=>"18845675", :id=>18845675, :indices=>[0, 14], :name=>"Darren Liddell"}]}, :user=>{:default_profile_image=>false, :profile_text_color=>"333333", :created_at=>"Sat Mar 23 23:52:18 +0000 2013", :is_translator=>false, :name=>"One Diary Bot", :screen_name=>"onediarybot", :geo_enabled=>false, :follow_request_sent=>false, :profile_sidebar_border_color=>"C0DEED", :default_profile=>true, :id=>1292911088, :contributors_enabled=>false, :followers_count=>124, :lang=>"en", :profile_background_tile=>false, :url=>"http://www.onediary.com", :profile_sidebar_fill_color=>"DDEEF6", :listed_count=>1, :utc_offset=>nil, :location=>nil, :time_zone=>nil, :profile_background_color=>"C0DEED", :following=>true, :protected=>false, :description=>"I'm the One Diary bot, here to help you with your life including personal cycling weather forecasts.", :profile_background_image_url=>"http://abs.twimg.com/images/themes/theme1/bg.png", :profile_link_color=>"0084B4", :notifications=>false, :profile_background_image_url_https=>"https://abs.twimg.com/images/themes/theme1/bg.png", :favourites_count=>0, :id_str=>"1292911088", :statuses_count=>9637, :verified=>false, :profile_image_url=>"http://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg", :profile_use_background_image=>true, :profile_image_url_https=>"https://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg", :friends_count=>157}, :in_reply_to_screen_name=>"darrenliddell", :place=>nil, :coordinates=>nil, :id_str=>"394454214132256768", :source=>"web", :retweet_count=>0, :id=>394454214132256768, :created_at=>"Sun Oct 27 13:23:07 +0000 2013", :in_reply_to_status_id_str=>"394341960603172864", :retweeted=>false, :in_reply_to_user_id=>18845675, :truncated=>false, :contributors=>nil, :geo=>nil, :in_reply_to_user_id_str=>"18845675", :text=>"@darrenliddell my programmers thought that they had that one covered. I have admonished them."}, :source=>{:default_profile_image=>false, :profile_text_color=>"333333", :created_at=>"Fri Nov 09 00:35:12 +0000 2007", :is_translator=>false, :name=>"Adam Bird", :screen_name=>"adambird", :geo_enabled=>true, :follow_request_sent=>false, :profile_sidebar_border_color=>"C0DEED", :default_profile=>true, :id=>10083602, :contributors_enabled=>false, :followers_count=>1295, :lang=>"en", :profile_background_tile=>false, :url=>"http://about.me/adambird", :profile_sidebar_fill_color=>"DDEEF6", :listed_count=>53, :utc_offset=>0, :location=>"Nottingham, UK", :time_zone=>"London", :profile_background_color=>"C0DEED", :following=>false, :protected=>false, :description=>"CEO @onediaryapp, ex @esendex CTO and co-founder, still cycling", :profile_background_image_url=>"http://abs.twimg.com/images/themes/theme1/bg.png", :profile_link_color=>"0084B4", :notifications=>false, :profile_background_image_url_https=>"https://abs.twimg.com/images/themes/theme1/bg.png", :favourites_count=>93, :id_str=>"10083602", :statuses_count=>13507, :verified=>false, :profile_image_url=>"http://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg", :profile_use_background_image=>true, :profile_image_url_https=>"https://pbs.twimg.com/profile_images/378800000477232297/23d85bb78f71534eea1e1133fb771f86_normal.jpeg", :friends_count=>851}, :created_at=>"Sun Oct 27 21:05:35 +0000 2013", :target=>{:default_profile_image=>false, :profile_text_color=>"333333", :created_at=>"Sat Mar 23 23:52:18 +0000 2013", :is_translator=>false, :name=>"One Diary Bot", :screen_name=>"onediarybot", :geo_enabled=>false, :follow_request_sent=>false, :profile_sidebar_border_color=>"C0DEED", :default_profile=>true, :id=>1292911088, :contributors_enabled=>false, :followers_count=>124, :lang=>"en", :profile_background_tile=>false, :url=>"http://www.onediary.com", :profile_sidebar_fill_color=>"DDEEF6", :listed_count=>1, :utc_offset=>nil, :location=>nil, :time_zone=>nil, :profile_background_color=>"C0DEED", :following=>true, :protected=>false, :description=>"I'm the One Diary bot, here to help you with your life including personal cycling weather forecasts.", :profile_background_image_url=>"http://abs.twimg.com/images/themes/theme1/bg.png", :profile_link_color=>"0084B4", :notifications=>false, :profile_background_image_url_https=>"https://abs.twimg.com/images/themes/theme1/bg.png", :favourites_count=>0, :id_str=>"1292911088", :statuses_count=>9637, :verified=>false, :profile_image_url=>"http://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg", :profile_use_background_image=>true, :profile_image_url_https=>"https://pbs.twimg.com/profile_images/3651575369/090551d8dd92080198f707769239ff43_normal.jpeg", :friends_count=>157}}
37
+ end
38
+
39
+ it "should have the tweet as the target object" do
40
+ expect(subject.target_object).to be_a(Twitter::Tweet)
41
+ expect(subject.target_object.id).to eq(394454214132256768)
42
+ end
43
+ end
44
+ end
45
+ end