requester_test.rb 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. require 'test_helper'
  2. require 'docs'
  3. class DocsRequesterTest < MiniTest::Spec
  4. def stub_request(url)
  5. Typhoeus.stub(url).and_return(Typhoeus::Response.new)
  6. end
  7. let :requester do
  8. Docs::Requester.new(options)
  9. end
  10. let :url do
  11. 'http://example.com'
  12. end
  13. let :options do
  14. Hash.new
  15. end
  16. let :block do
  17. Proc.new {}
  18. end
  19. after do
  20. Typhoeus::Expectation.clear
  21. end
  22. describe ".new" do
  23. it "defaults the :max_concurrency to 20" do
  24. assert_equal 20, Docs::Requester.new.max_concurrency
  25. assert_equal 10, Docs::Requester.new(max_concurrency: 10).max_concurrency
  26. end
  27. it "duplicates and stores :request_options" do
  28. options[:request_options] = { params: 'test' }
  29. assert_equal options[:request_options], requester.request_options
  30. refute_same options[:request_options], requester.request_options
  31. end
  32. end
  33. describe "#request" do
  34. context "with a url" do
  35. it "returns a request" do
  36. assert_instance_of Docs::Request, requester.request(url)
  37. end
  38. describe "the request" do
  39. it "is queued" do
  40. request = requester.request(url)
  41. assert_includes requester.queued_requests, request
  42. end
  43. it "has the given url" do
  44. request = requester.request(url)
  45. assert_equal url, request.base_url
  46. end
  47. it "has the default :request_options" do
  48. options[:request_options] = { params: 'test' }
  49. request = requester.request(url)
  50. assert_equal 'test', request.options[:params]
  51. end
  52. it "has the given options" do
  53. options[:request_options] = { params: '' }
  54. request = requester.request(url, params: 'test')
  55. assert_equal 'test', request.options[:params]
  56. end
  57. it "has the given block as an on_complete callback" do
  58. request = requester.request(url, &block)
  59. assert_includes request.on_complete, block
  60. end
  61. end
  62. end
  63. context "with an array of urls" do
  64. let :urls do
  65. ['one', 'two']
  66. end
  67. it "returns an array of requests" do
  68. result = requester.request(urls, { params: 'test' }, &block)
  69. assert_instance_of Array, result
  70. assert_equal urls.length, result.length
  71. assert result.all? { |obj| obj.instance_of? Docs::Request }
  72. urls.each_with_index do |url, i|
  73. assert_equal url, result[i].base_url
  74. assert_equal 'test', result[i].options[:params]
  75. assert_includes result[i].on_complete, block
  76. end
  77. end
  78. it "queues the requests in the given order" do
  79. queue = []
  80. stub(requester).queue { |request| queue << request }
  81. assert_equal urls, requester.request(urls).map(&:base_url)
  82. end
  83. end
  84. end
  85. describe "#on_response" do
  86. it "returns an array" do
  87. assert_instance_of Array, requester.on_response
  88. end
  89. it "stores a callback" do
  90. requester.on_response(&block)
  91. assert_includes requester.on_response, block
  92. end
  93. end
  94. describe "#run" do
  95. before do
  96. stub_request(url)
  97. end
  98. it "calls the #on_response callbacks after each request" do
  99. one = 0; requester.on_response { one += 1 }
  100. two = 0; requester.on_response { two += 2 }
  101. 2.times do |i|
  102. stub_request url = "example.com/#{i}"
  103. requester.request(url)
  104. end
  105. assert_difference 'one', 2 do
  106. assert_difference 'two', 4 do
  107. requester.run
  108. end
  109. end
  110. end
  111. it "passes the response to the #on_response callbacks" do
  112. requester.on_response { |arg| @arg = arg }
  113. request = requester.request(url)
  114. request.run
  115. assert @arg
  116. assert_equal request.response, @arg
  117. end
  118. context "when an #on_response callback returns an array" do
  119. it "requests the urls in the array" do
  120. requester.on_response { ['one', 'two'] }
  121. requester.request(url)
  122. mock(requester).request('one').then.request('two')
  123. requester.run
  124. end
  125. end
  126. end
  127. end