twitter 5.0.0.rc.1 → 5.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 (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