devfu-twitter-search-watcher 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -1,5 +1,10 @@
1
1
  %w( rubygems cgi json open-uri ostruct ).each {|lib| require lib }
2
2
 
3
+ #
4
+ # = Usage
5
+ #
6
+ # coming soon
7
+ #
3
8
  class TwitterSearchWatcher
4
9
 
5
10
  TWITTER_SEARCH_URL = 'http://search.twitter.com/search.json'
@@ -87,7 +92,7 @@ class TwitterSearchWatcher
87
92
 
88
93
  # Performs a search. Accepts the same parameters as #search_url
89
94
  def search! additional_parameters = nil
90
- JSON.parse open( search_url(additional_parameters), 'User-Agent' => user_agent ).read
95
+ json search_url(additional_parameters)
91
96
  end
92
97
 
93
98
  # Performs a search, given the response from another search.
@@ -114,6 +119,68 @@ class TwitterSearchWatcher
114
119
  search!( (additional_parameters || {}).merge( :page => (response['page'] + 1), :max_id => response['max_id'] ) ) if response['next_page']
115
120
  end
116
121
 
122
+ # Performs a search! and search_more! as needed to return a response with *all* pages of tweets.
123
+ #
124
+ # This respects max_pages and will only make max_pages number of additional requests to get paginated tweets.
125
+ #
126
+ # The response object returned is similar to the responses returned by all other methods, but we only
127
+ # currently have a 'results' key on the Hash returned. If you're used to getting some of the other keys
128
+ # returned by the other methods (which Twitter returns), be warned!
129
+ #
130
+ # To get the tweets off of the response:
131
+ #
132
+ # tweets = watcher.search_with_pagination!['results']
133
+ def search_with_pagination! additional_parameters = nil
134
+ response = search! additional_parameters
135
+
136
+ max_requests = max_pages
137
+ max_requests = additional_parameters[:max_pages] if additional_parameters && additional_parameters[:max_pages]
138
+
139
+ tweets = { 'results' => [] }
140
+ pages_requested_so_far = 0
141
+
142
+ if response['next_page']
143
+ while response = search_more!(response)
144
+ tweets['results'] << response['results']
145
+ pages_requested_so_far += 1
146
+
147
+ break if max_requests && pages_requested_so_far >= max_requests
148
+ end
149
+ end
150
+
151
+ tweets
152
+ end
153
+
154
+ # Helper to do an HTTP GET request and return the response body
155
+ def get url
156
+ TwitterSearchWatcher.get url, 'User-Agent' => user_agent
157
+ end
158
+
159
+ # Helper to do an HTTP GET request and return the response body
160
+ def self.get url, options = {}
161
+ open( url, { 'User-Agent' => DEFAULT_USER_AGENT }.merge(options) ).read
162
+ end
163
+
164
+ # Helper to #get a url and return the response body parsed as JSON
165
+ def json url
166
+ JSON.parse get(url)
167
+ end
168
+
169
+ # Helper to #get a url and return the response body parsed as JSON
170
+ def self.json url
171
+ JSON.parse get(url)
172
+ end
173
+
174
+ # Instantiates a new TwitterSearchWatcher given the search_string and options and then
175
+ # calls search_with_pagination! on the instance, returning the response.
176
+ #
177
+ # tweets_json = TwitterSearchWatcher.search_with_pagination!('foo')['results']
178
+ #
179
+ def self.search_with_pagination! search_string, options = nil
180
+ watcher = TwitterSearchWatcher.new search_string, options
181
+ watcher.search_with_pagination!
182
+ end
183
+
117
184
  # Instantiates a new TwitterSearchWatcher given the search_string and options and then
118
185
  # calls #watch on the instance using the block given.
119
186
  def self.watch! search_string, options = nil, &block
@@ -0,0 +1,131 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe TwitterSearchWatcher, 'searching' do
4
+
5
+ it 'should be able to execute search' do
6
+ watcher = TSW.new 'chunky bacon'
7
+ TSW.should_receive(:get).with(watcher.search_url, 'User-Agent' => watcher.user_agent).and_return(fake_response)
8
+ response = watcher.search!
9
+ response.should be_a_kind_of(Hash)
10
+ response['query'].should == 'remitaylor' # make sure it's getting our fake date
11
+ end
12
+
13
+ it 'should be able to search!(:rpp => 15) ... inotherwords, should be able to pass additional parameters to search!' do
14
+ watcher = TSW.new 'foo'
15
+
16
+ TSW.should_receive(:get).with(/99/, 'User-Agent' => watcher.user_agent).and_return(fake_response)
17
+ watcher.search! :rpp => 99
18
+
19
+ TSW.should_receive(:get).with(/foo/, 'User-Agent' => watcher.user_agent).and_return(fake_response)
20
+ watcher.search! :rpp => 99
21
+ end
22
+
23
+ it 'should be able to search!(:rpp => nil) to override an existing parameter' do
24
+ watcher = TSW.new 'foo', :rpp => 50
25
+ watcher.search_url.should include('rpp=50')
26
+ watcher.search_url.should include('q=foo')
27
+
28
+ # double check that normal overrides are working properly
29
+ watcher.search_url( :rpp => 99 ).should_not include('rpp=50')
30
+ watcher.search_url( :rpp => 99 ).should include('rpp=99')
31
+
32
+ watcher.search_url( :rpp => nil ).should_not include('rpp=50')
33
+ watcher.search_url( :rpp => nil ).should_not include('rpp')
34
+ end
35
+
36
+ it 'should be able to search_newer!(result_set) to get results newer than a given result set' do
37
+ watcher = TSW.new 'chunky bacon'
38
+ TSW.should_receive(:get).with(watcher.search_url, 'User-Agent' => watcher.user_agent).and_return(fake_response(:max_id => 5555))
39
+ response = watcher.search!
40
+
41
+ TSW.should_receive(:get).with(/since_id=5555/, 'User-Agent' => watcher.user_agent).and_return(fake_response)
42
+ watcher.search_newer! response
43
+ end
44
+
45
+ it 'should be able to search_more!(result_set) to get paginated results' do
46
+ with_next_page = fake_response :page => 1, :max_id => 1, :next_page => '?page=2&max_id=444&q=chunky+bacon'
47
+ without_next_page = fake_response :page => 1, :max_id => 2, :next_page => nil
48
+
49
+ watcher = TSW.new 'chunky bacon'
50
+
51
+ TSW.should_receive(:get).once.with(watcher.search_url, 'User-Agent' => watcher.user_agent).and_return(with_next_page)
52
+ response = watcher.search!
53
+
54
+ TSW.should_receive(:get).once.with(/page=2/, 'User-Agent' => watcher.user_agent).and_return(without_next_page)
55
+ response2 = watcher.search_more! response
56
+
57
+ watcher.should_not_receive(:open)
58
+ watcher.search_more!( response2 ).should be_nil # because no next_page
59
+ end
60
+
61
+ it 'should be able to watch! on a watcher' do
62
+ # it's a PITA to test the loop, so i'm not currently testing that check_every and max_pages are actually used correctly
63
+ watcher = TSW.new 'chunky bacon', :check_every => 120, :max_pages => 5
64
+ watcher.check_every.should == 120
65
+ watcher.max_pages.should == 5
66
+ watcher.should respond_to(:watch!)
67
+ end
68
+
69
+ it 'should be able to TSW.search_with_pagination!' do
70
+ _2_pages_left = fake_response :page => 1, :max_id => 1, :next_page => '?page=2&max_id=1&q=foo'
71
+ _1_page_left = fake_response :page => 2, :max_id => 2, :next_page => '?page=3&max_id=1&q=foo'
72
+ _0_pages_left = fake_response :page => 3, :max_id => 3, :next_page => nil
73
+
74
+ TSW.should_receive(:get).once.with(/q=foo/, anything).and_return(_2_pages_left)
75
+ TSW.should_receive(:get).once.with(/page=2/, anything).and_return(_1_page_left)
76
+ TSW.should_receive(:get).once.with(/page=3/, anything).and_return(_0_pages_left)
77
+
78
+ TSW.search_with_pagination! 'foo'
79
+ end
80
+
81
+ it 'should be able to search_with_pagination!' do
82
+ _2_pages_left = fake_response :page => 1, :max_id => 1, :next_page => '?page=2&max_id=1&q=foo'
83
+ _1_page_left = fake_response :page => 2, :max_id => 2, :next_page => '?page=3&max_id=1&q=foo'
84
+ _0_pages_left = fake_response :page => 3, :max_id => 3, :next_page => nil
85
+
86
+ watcher = TSW.new 'foo'
87
+
88
+ TSW.should_receive(:get).once.with(/q=foo/, anything).and_return(_2_pages_left)
89
+ TSW.should_receive(:get).once.with(/page=2/, anything).and_return(_1_page_left)
90
+ TSW.should_receive(:get).once.with(/page=3/, anything).and_return(_0_pages_left)
91
+
92
+ watcher.search_with_pagination!
93
+ end
94
+
95
+ it 'search_with_pagination! should respect max_pages (instance)' do
96
+ _2_pages_left = fake_response :page => 1, :max_id => 1, :next_page => '?page=2&max_id=1&q=foo'
97
+ _1_page_left = fake_response :page => 2, :max_id => 2, :next_page => '?page=3&max_id=1&q=foo'
98
+ _0_pages_left = fake_response :page => 3, :max_id => 3, :next_page => nil
99
+
100
+ watcher = TSW.new 'foo', :max_pages => 1 # it'll only get 1 page *after* doing the original search! request
101
+
102
+ TSW.should_receive(:get).once.with(/q=foo/, 'User-Agent' => watcher.user_agent).and_return(_2_pages_left)
103
+ TSW.should_receive(:get).once.with(/page=2/, 'User-Agent' => watcher.user_agent).and_return(_1_page_left)
104
+ watcher.should_not_receive(:open)
105
+
106
+ watcher.search_with_pagination!
107
+ end
108
+
109
+ it 'search_with_pagination! should respect max_pages (override)' do
110
+ _2_pages_left = fake_response :page => 1, :max_id => 1, :next_page => '?page=2&max_id=1&q=foo'
111
+ _1_page_left = fake_response :page => 2, :max_id => 2, :next_page => '?page=3&max_id=1&q=foo'
112
+ _0_pages_left = fake_response :page => 3, :max_id => 3, :next_page => nil
113
+
114
+ watcher = TSW.new 'foo', :max_pages => 99
115
+
116
+ TSW.should_receive(:get).once.with(watcher.search_url, 'User-Agent' => watcher.user_agent).and_return(_2_pages_left)
117
+ TSW.should_receive(:get).once.with(/page=2/, 'User-Agent' => watcher.user_agent).and_return(_1_page_left)
118
+ watcher.should_not_receive(:open)
119
+
120
+ watcher.search_with_pagination! :max_pages => 1
121
+ end
122
+
123
+ # Ideas ...
124
+
125
+ #it 'should be able to search! (with pagination)'
126
+ #it 'should default to getting additional pages when doing a search!'
127
+ #it 'default rpp should be 100 (the max)'
128
+ #it 'should have a nice method to call that will make a new watcher and start watching'
129
+ #it 'should be able to watch! with pagination (will search! while there is a :next_page to request)'
130
+
131
+ end
@@ -0,0 +1,72 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe TwitterSearchWatcher, '#search_url generation' do
4
+
5
+ it 'should be able to initialize with a search string' do
6
+ TwitterSearchWatcher.new('foo').search_url.should == 'http://search.twitter.com/search.json?q=foo'
7
+ TwitterSearchWatcher.new('#foo').search_url.should == 'http://search.twitter.com/search.json?q=%23foo'
8
+ TwitterSearchWatcher.new('@foo').search_url.should == 'http://search.twitter.com/search.json?q=%40foo'
9
+ end
10
+
11
+ it 'should be able to search for replies :to someone' do
12
+ TwitterSearchWatcher.new( :to => 'remitaylor' ).search_url.should end_with('search.json?to=remitaylor')
13
+ end
14
+
15
+ it 'should be able to search for tweets :from someone' do
16
+ TwitterSearchWatcher.new( :from => 'remitaylor' ).search_url.should end_with('search.json?from=remitaylor')
17
+ end
18
+
19
+ it 'should be able to search for tweets :from someone that are :to someone' do
20
+ watcher = TwitterSearchWatcher.new :from => 'remitaylor', :to => 'wickd_wanda'
21
+ watcher.search_url.should include('from=remitaylor')
22
+ watcher.search_url.should include('to=wickd_wanda')
23
+ end
24
+
25
+ it 'should have a good default User-Agent' do
26
+ watcher = TwitterSearchWatcher.new
27
+ watcher.user_agent.should == 'TwitterSearchWatcher RubyGem http://github.com/devfu/twitter-search-watcher'
28
+ watcher.user_agent = 'foo'
29
+ watcher.user_agent.should == 'foo'
30
+ end
31
+
32
+ it 'should be able to override User-Agent' do
33
+ watcher = TwitterSearchWatcher.new 'x', :user_agent => 'bar'
34
+ watcher.search_url.should == 'http://search.twitter.com/search.json?q=x'
35
+ watcher.user_agent.should == 'bar'
36
+
37
+ watcher = TwitterSearchWatcher.new :user_agent => 'bar'
38
+ watcher.search_url.should == 'http://search.twitter.com/search.json?'
39
+ watcher.user_agent.should == 'bar'
40
+ end
41
+
42
+ it 'should allow quotes in query string' do
43
+ TwitterSearchWatcher.new('"hello there"').search_url.should end_with('q="hello+there"')
44
+ end
45
+
46
+ it 'should replace all spaces in query string with + signs' do
47
+ TwitterSearchWatcher.new('hello there').search_url.should end_with('q=hello+there')
48
+ end
49
+
50
+ it 'should be able to request a particular :page (pagination)' do
51
+ TwitterSearchWatcher.new( 'foo', :page => 2 ).search_url.should include("page=2")
52
+ TwitterSearchWatcher.new( 'foo', :page => 2 ).search_url.should include("q=foo")
53
+ end
54
+
55
+ it 'should be able to request since a particular twitter ID (:since_id)' do
56
+ TwitterSearchWatcher.new( 'foo', :since_id => 1234 ).search_url.should include("since_id=1234")
57
+ TwitterSearchWatcher.new( 'foo', :since_id => 1234 ).search_url.should include("q=foo")
58
+ end
59
+
60
+ it 'should be able to request with a particular :max_id (used with :page)' do
61
+ TwitterSearchWatcher.new( 'foo', :max_id => 4321 ).search_url.should include("max_id=4321")
62
+ TwitterSearchWatcher.new( 'foo', :max_id => 4321 ).search_url.should include("q=foo")
63
+ end
64
+
65
+ it 'should be able to request with a particular :rpp (results_per_page)' do
66
+ TwitterSearchWatcher.new( 'foo', :rpp => 90 ).search_url.should include("rpp=90")
67
+ TwitterSearchWatcher.new( 'foo', :rpp => 90 ).search_url.should include("q=foo")
68
+
69
+ lambda { TwitterSearchWatcher.new( 'foo', :rpp => 101 ) }.should raise_error(/100/)
70
+ end
71
+
72
+ end
@@ -2,6 +2,9 @@ require File.dirname(__FILE__) + '/../lib/twitter-search-watcher'
2
2
  require 'rubygems'
3
3
  require 'spec'
4
4
  require 'ostruct'
5
+ require 'activesupport' # for stringify_keys
6
+
7
+ TSW = TwitterSearchWatcher
5
8
 
6
9
  def readable value
7
10
  OpenStruct.new({ :read => value })
@@ -12,20 +15,18 @@ def fake_response_for watcher
12
15
  end
13
16
 
14
17
  def fake_response options = {}
15
- readable(
16
- {
17
- 'max_id' => 1234,
18
- 'since_id' => 0,
19
- 'total' => 15, # doesn't appear if next_page present?
20
- 'next_page' => '?page=2&max_id=1234&q=remitaylor', # only appears if there are additional pages
21
- 'refresh_url' => '?since_id=1234&q=remitaylor',
22
- 'page' => 1,
23
- 'results_per_page' => 15,
24
- 'completed_in' => 0.1234,
25
- 'query' => 'remitaylor',
26
- 'results' => fake_tweets
27
- }.merge(options).to_json
28
- )
18
+ {
19
+ 'max_id' => 1234,
20
+ 'since_id' => 0,
21
+ 'total' => 15, # doesn't appear if next_page present?
22
+ 'next_page' => '?page=2&max_id=1234&q=remitaylor', # only appears if there are additional pages
23
+ 'refresh_url' => '?since_id=1234&q=remitaylor',
24
+ 'page' => 1,
25
+ 'results_per_page' => 15,
26
+ 'completed_in' => 0.1234,
27
+ 'query' => 'remitaylor',
28
+ 'results' => fake_tweets
29
+ }.merge(options.stringify_keys).to_json
29
30
  end
30
31
 
31
32
  def fake_tweets
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devfu-twitter-search-watcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - remi
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-06 00:00:00 -07:00
12
+ date: 2009-09-04 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -26,9 +26,10 @@ files:
26
26
  - Rakefile
27
27
  - VERSION
28
28
  - lib/twitter-search-watcher.rb
29
+ - spec/search_spec.rb
30
+ - spec/search_url_generation_spec.rb
29
31
  - spec/spec.opts
30
32
  - spec/spec_helper.rb
31
- - spec/twitter_search_watcher_spec.rb
32
33
  has_rdoc: false
33
34
  homepage: http://github.com/devfu/twitter-search-watcher
34
35
  licenses:
@@ -57,5 +58,6 @@ signing_key:
57
58
  specification_version: 3
58
59
  summary: for watching a Twitter search
59
60
  test_files:
60
- - spec/twitter_search_watcher_spec.rb
61
+ - spec/search_spec.rb
61
62
  - spec/spec_helper.rb
63
+ - spec/search_url_generation_spec.rb
@@ -1,140 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
-
3
- describe TwitterSearchWatcher do
4
-
5
- it 'should be able to initialize with a search string' do
6
- TwitterSearchWatcher.new('foo').search_url.should == 'http://search.twitter.com/search.json?q=foo'
7
- TwitterSearchWatcher.new('#foo').search_url.should == 'http://search.twitter.com/search.json?q=%23foo'
8
- TwitterSearchWatcher.new('@foo').search_url.should == 'http://search.twitter.com/search.json?q=%40foo'
9
- end
10
-
11
- it 'should be able to search for replies :to someone' do
12
- TwitterSearchWatcher.new( :to => 'remitaylor' ).search_url.should end_with('search.json?to=remitaylor')
13
- end
14
-
15
- it 'should be able to search for tweets :from someone' do
16
- TwitterSearchWatcher.new( :from => 'remitaylor' ).search_url.should end_with('search.json?from=remitaylor')
17
- end
18
-
19
- it 'should be able to search for tweets :from someone that are :to someone' do
20
- watcher = TwitterSearchWatcher.new :from => 'remitaylor', :to => 'wickd_wanda'
21
- watcher.search_url.should include('from=remitaylor')
22
- watcher.search_url.should include('to=wickd_wanda')
23
- end
24
-
25
- it 'should have a good default User-Agent' do
26
- watcher = TwitterSearchWatcher.new
27
- watcher.user_agent.should == 'TwitterSearchWatcher RubyGem http://github.com/devfu/twitter-search-watcher'
28
- watcher.user_agent = 'foo'
29
- watcher.user_agent.should == 'foo'
30
- end
31
-
32
- it 'should be able to override User-Agent' do
33
- watcher = TwitterSearchWatcher.new 'x', :user_agent => 'bar'
34
- watcher.search_url.should == 'http://search.twitter.com/search.json?q=x'
35
- watcher.user_agent.should == 'bar'
36
-
37
- watcher = TwitterSearchWatcher.new :user_agent => 'bar'
38
- watcher.search_url.should == 'http://search.twitter.com/search.json?'
39
- watcher.user_agent.should == 'bar'
40
- end
41
-
42
- it 'should allow quotes in query string' do
43
- TwitterSearchWatcher.new('"hello there"').search_url.should end_with('q="hello+there"')
44
- end
45
-
46
- it 'should replace all spaces in query string with + signs' do
47
- TwitterSearchWatcher.new('hello there').search_url.should end_with('q=hello+there')
48
- end
49
-
50
- it 'should be able to execute search' do
51
- watcher = TwitterSearchWatcher.new 'chunky bacon'
52
- watcher.should_receive(:open).with(watcher.search_url, 'User-Agent' => watcher.user_agent).and_return(fake_response)
53
- response = watcher.search!
54
- response.should be_a_kind_of(Hash)
55
- response['query'].should == 'remitaylor' # make sure it's getting our fake date
56
- end
57
-
58
- it 'should be able to request a particular :page (pagination)' do
59
- TwitterSearchWatcher.new( 'foo', :page => 2 ).search_url.should include("page=2")
60
- TwitterSearchWatcher.new( 'foo', :page => 2 ).search_url.should include("q=foo")
61
- end
62
-
63
- it 'should be able to request since a particular twitter ID (:since_id)' do
64
- TwitterSearchWatcher.new( 'foo', :since_id => 1234 ).search_url.should include("since_id=1234")
65
- TwitterSearchWatcher.new( 'foo', :since_id => 1234 ).search_url.should include("q=foo")
66
- end
67
-
68
- it 'should be able to request with a particular :max_id (used with :page)' do
69
- TwitterSearchWatcher.new( 'foo', :max_id => 4321 ).search_url.should include("max_id=4321")
70
- TwitterSearchWatcher.new( 'foo', :max_id => 4321 ).search_url.should include("q=foo")
71
- end
72
-
73
- it 'should be able to request with a particular :rpp (results_per_page)' do
74
- TwitterSearchWatcher.new( 'foo', :rpp => 90 ).search_url.should include("rpp=90")
75
- TwitterSearchWatcher.new( 'foo', :rpp => 90 ).search_url.should include("q=foo")
76
-
77
- lambda { TwitterSearchWatcher.new( 'foo', :rpp => 101 ) }.should raise_error(/100/)
78
- end
79
-
80
- it 'should be able to search!(:rpp => 15) ... inotherwords, should be able to pass additional parameters to search!' do
81
- watcher = TwitterSearchWatcher.new 'foo'
82
-
83
- watcher.should_receive(:open).with(/99/, 'User-Agent' => watcher.user_agent).and_return(fake_response)
84
- watcher.search! :rpp => 99
85
-
86
- watcher.should_receive(:open).with(/foo/, 'User-Agent' => watcher.user_agent).and_return(fake_response)
87
- watcher.search! :rpp => 99
88
- end
89
-
90
- it 'should be able to search!(:rpp => nil) to override an existing parameter' do
91
- watcher = TwitterSearchWatcher.new 'foo', :rpp => 50
92
- watcher.search_url.should include('rpp=50')
93
- watcher.search_url.should include('q=foo')
94
-
95
- # double check that normal overrides are working properly
96
- watcher.search_url( :rpp => 99 ).should_not include('rpp=50')
97
- watcher.search_url( :rpp => 99 ).should include('rpp=99')
98
-
99
- watcher.search_url( :rpp => nil ).should_not include('rpp=50')
100
- watcher.search_url( :rpp => nil ).should_not include('rpp')
101
- end
102
-
103
- it 'should be able to search_newer!(result_set) to get results newer than a given result set' do
104
- watcher = TwitterSearchWatcher.new 'chunky bacon'
105
- watcher.should_receive(:open).with(watcher.search_url, 'User-Agent' => watcher.user_agent).and_return(fake_response(:max_id => 5555))
106
- response = watcher.search!
107
-
108
- watcher.should_receive(:open).with(/since_id=5555/, 'User-Agent' => watcher.user_agent).and_return(fake_response)
109
- watcher.search_newer! response
110
- end
111
-
112
- it 'should be able to search_more!(result_set) to get paginated results' do
113
- watcher = TwitterSearchWatcher.new 'chunky bacon'
114
- watcher.should_receive(:open).with(watcher.search_url, 'User-Agent' => watcher.user_agent).and_return(fake_response(:page => 1, :max_id => 444, :next_page => '?page=2&max_id=444&q=chunky+bacon'))
115
- response = watcher.search!
116
-
117
- watcher.should_receive(:open).with(/page=2/, 'User-Agent' => watcher.user_agent).and_return(fake_response(:page => 2, :max_id => 445, :next_page => nil))
118
- response2 = watcher.search_more! response
119
- watcher.should_receive(:open).with(/max_id=444/, 'User-Agent' => watcher.user_agent).and_return(fake_response(:page => 2, :max_id => 445, :next_page => nil))
120
- response2 = watcher.search_more! response
121
-
122
- watcher.should_not_receive(:open)
123
- watcher.search_more!( response2 ).should be_nil # because no next_page
124
- end
125
-
126
- it 'should be able to watch! on a watcher' do
127
- # it's a PITA to test the loop, so i'm not currently testing that check_every and max_pages are actually used correctly
128
- watcher = TwitterSearchWatcher.new 'chunky bacon', :check_every => 120, :max_pages => 5
129
- watcher.check_every.should == 120
130
- watcher.max_pages.should == 5
131
- watcher.should respond_to(:watch!)
132
- end
133
-
134
- it 'default rpp should be 100 (the max)'
135
-
136
- it 'should have a nice method to call that will make a new watcher and start watching'
137
-
138
- it 'should be able to watch! with pagination (will search! while there is a :next_page to request)'
139
-
140
- end