| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- require 'test_helper'
- require 'docs'
- class DocsRequesterTest < MiniTest::Spec
- def stub_request(url)
- Typhoeus.stub(url).and_return(Typhoeus::Response.new)
- end
- let :requester do
- Docs::Requester.new(options)
- end
- let :url do
- 'http://example.com'
- end
- let :options do
- Hash.new
- end
- let :block do
- Proc.new {}
- end
- after do
- Typhoeus::Expectation.clear
- end
- describe ".new" do
- it "defaults the :max_concurrency to 20" do
- assert_equal 20, Docs::Requester.new.max_concurrency
- assert_equal 10, Docs::Requester.new(max_concurrency: 10).max_concurrency
- end
- it "duplicates and stores :request_options" do
- options[:request_options] = { params: 'test' }
- assert_equal options[:request_options], requester.request_options
- refute_same options[:request_options], requester.request_options
- end
- end
- describe "#request" do
- context "with a url" do
- it "returns a request" do
- assert_instance_of Docs::Request, requester.request(url)
- end
- describe "the request" do
- it "is queued" do
- request = requester.request(url)
- assert_includes requester.queued_requests, request
- end
- it "has the given url" do
- request = requester.request(url)
- assert_equal url, request.base_url
- end
- it "has the default :request_options" do
- options[:request_options] = { params: 'test' }
- request = requester.request(url)
- assert_equal 'test', request.options[:params]
- end
- it "has the given options" do
- options[:request_options] = { params: '' }
- request = requester.request(url, params: 'test')
- assert_equal 'test', request.options[:params]
- end
- it "has the given block as an on_complete callback" do
- request = requester.request(url, &block)
- assert_includes request.on_complete, block
- end
- end
- end
- context "with an array of urls" do
- let :urls do
- ['one', 'two']
- end
- it "returns an array of requests" do
- result = requester.request(urls, { params: 'test' }, &block)
- assert_instance_of Array, result
- assert_equal urls.length, result.length
- assert result.all? { |obj| obj.instance_of? Docs::Request }
- urls.each_with_index do |url, i|
- assert_equal url, result[i].base_url
- assert_equal 'test', result[i].options[:params]
- assert_includes result[i].on_complete, block
- end
- end
- it "queues the requests in the given order" do
- queue = []
- stub(requester).queue { |request| queue << request }
- assert_equal urls, requester.request(urls).map(&:base_url)
- end
- end
- end
- describe "#on_response" do
- it "returns an array" do
- assert_instance_of Array, requester.on_response
- end
- it "stores a callback" do
- requester.on_response(&block)
- assert_includes requester.on_response, block
- end
- end
- describe "#run" do
- before do
- stub_request(url)
- end
- it "calls the #on_response callbacks after each request" do
- one = 0; requester.on_response { one += 1 }
- two = 0; requester.on_response { two += 2 }
- 2.times do |i|
- stub_request url = "example.com/#{i}"
- requester.request(url)
- end
- assert_difference 'one', 2 do
- assert_difference 'two', 4 do
- requester.run
- end
- end
- end
- it "passes the response to the #on_response callbacks" do
- requester.on_response { |arg| @arg = arg }
- request = requester.request(url)
- request.run
- assert @arg
- assert_equal request.response, @arg
- end
- context "when an #on_response callback returns an array" do
- it "requests the urls in the array" do
- requester.on_response { ['one', 'two'] }
- requester.request(url)
- mock(requester).request('one').then.request('two')
- requester.run
- end
- end
- end
- end
|