-
-
Save dkubb/1434673 to your computer and use it in GitHub Desktop.
| cassettes |
| #!/usr/bin/env ruby -Ku | |
| # encoding: utf-8 | |
| # = Usage | |
| # | |
| # $ rspec test.rb | |
| require 'io/wait' | |
| require 'webrick' | |
| require 'webrick/httpproxy' | |
| require 'rubygems' | |
| require 'active_support/deprecation' # for feedzirra | |
| require 'feedzirra' | |
| require 'rspec' | |
| require 'vcr' | |
| module WEBrick | |
| class VCRProxyServer < HTTPProxyServer | |
| def service(*args) | |
| VCR.use_cassette('proxied') { super(*args) } | |
| end | |
| end | |
| end | |
| VCR.config do |config| | |
| config.stub_with :fakeweb | |
| config.cassette_library_dir = 'cassettes' | |
| config.default_cassette_options = { :record => :new_episodes } | |
| end | |
| describe 'A test with vcr and a transparent proxy' do | |
| IP = '127.0.0.1' | |
| PORT = 9000 | |
| before :all do | |
| reader, writer = IO.pipe | |
| @pid = fork do | |
| reader.close | |
| $stderr = writer | |
| server = WEBrick::VCRProxyServer.new(:BindAddress => IP, :Port => PORT) | |
| trap('INT') { server.shutdown } | |
| server.start | |
| end | |
| raise 'VCR Proxy did not start in 10 seconds' unless reader.wait(10) | |
| end | |
| after :all do | |
| Process.kill('INT', @pid) | |
| end | |
| it 'proxies to an RSS feed' do | |
| feed = Feedzirra::Feed.fetch_and_parse( | |
| 'http://blog.wildfireapp.com/?feed=rss2', | |
| :proxy_url => IP, | |
| :proxy_port => PORT | |
| ) | |
| feed.should be_instance_of(Feedzirra::Parser::RSS) | |
| end | |
| end |
This is pretty cool. I've setup VCR in a local proxy server before so that I can test HTTP requests from other languages (e.g. JS tests in Jasmine) and it worked quite nicely.
FWIW, VCR includes a rack middleware to make this pretty easy. That said, the Webrick approach you've done here looks even simpler. I don't know Webrick really at all (besides using it to boot rack apps) so I wasn't aware it had a built-in-proxy server. I've also been thinking of making a vcr-proxy-server gem that would make this even easier, and seeing your Webrick approach makes me think I may use Webrick instead of Rack like I was planning :).
One other thought: do you have other tests that use this VCR proxy setup besides the one here? Given the fact that you're only asserting that it is an instance of Feedzirra::Parser::RSS, and not actually making any assertion about what gets parsed out of the feed...it seems a bit like overkill to use VCR. Something simpler may do the trick.
@myronmarston: Oh, this was a code spike. The real tests this was written for include over a hundred tests that currently stub out Feedzirra. I was hoping to replace all that code with "real" calls to the backend services and use vcr to record/playback the requests.
I also did use the VCR rack middleware originally. In the git commit history I have a mostly fully functional HTTP proxy built on top of Net::HTTP and the middleware, but once I found out that WEBrick included it's own Net::HTTP based proxy I figured this was a nice way to cut out 50-60 loc. WEBRick's also included support for edge cases, as well as CONNECT support. Oddly enough though it does not include support for proxying PUT/DELETE, although those would be pretty easy to add if needed.
thx, very helpful!
This approach is needed because Feedzirra is based on Curb::Multi, which is not currently supported by Feedzirra.
I looked at two other approaches, replacing Feedzirra in the application I maintain (but did not write), or changing it to use a different HTTP library. In both cases the amount of effort it would take seemed to be much greater than the benefits, so I settled on using a proxy until that code is rewritten at some point in the future.