spec/sitehub/integration_spec.rb in sitehub-0.5.0.alpha3 vs spec/sitehub/integration_spec.rb in sitehub-0.5.0.alpha4
- old
+ new
@@ -1,20 +1,198 @@
require 'async/middleware'
-describe 'proxying calls' do
- include_context :site_hub
+require 'stringio'
+shared_context :site_hub do
+ let(:downstream_url) { 'http://localhost:12345' }
+ let(:experiment1_url) { "#{downstream_url}/experiment1" }
+ let(:experiment2_url) { "#{downstream_url}/experiment2" }
- describe 'supported HTTP verbs' do
- before do
- WebMock.enable!
+ before do
+ WebMock.enable!
+ stub_request(:get, experiment1_url).to_return(body: 'hello')
+ stub_request(:get, experiment2_url).to_return(body: 'experiment1_body')
+ end
+
+ let(:builder) do
+ SiteHub::Builder.new.tap do |builder|
+ builder.access_logger StringIO.new
+ builder.error_logger StringIO.new
+ experiment1_url = experiment1_url()
+ experiment2_url = experiment2_url()
+
+ builder.proxy '/endpoint' do
+ split(label: :experiment1, percentage: 100) do
+ split percentage: 100, label: 'variant1', url: experiment1_url
+ end
+
+ split(label: :experiment2, percentage: 0) do
+ split percentage: 100, label: 'variant1', url: experiment2_url
+ end
+ end
end
+ end
- let(:app) { Async::Middleware.new(rack_application) }
+ let(:rack_application) do
+ builder.build
+ end
+end
+describe 'proxying calls' do
+ include_context :site_hub
+
+ let(:app) { Async::Middleware.new(rack_application) }
+ describe 'supported HTTP verbs' do
%i(get post put delete).each do |verb|
it 'forwards the downstream' do
- stub_request(verb, downstream_url).to_return(body: 'hello')
+ stub_request(verb, experiment1_url).to_return(body: 'hello')
send(verb, '/endpoint')
expect(app.last_response.body).to eq(['hello'])
end
end
end
+
+ describe 'route affinity' do
+ context 'requested route cookie not present' do
+ it 'drops a cookie to keep you on the same path' do
+ stub_request(:get, downstream_url).to_return(body: 'hello')
+ get('/endpoint')
+ expect(app.last_response.cookies[SiteHub::RECORDED_ROUTES_COOKIE][:value]).to eq('experiment1|variant1')
+ end
+ end
+
+ context 'requested route cookie present' do
+ it 'proxies to the preselected route' do
+ get('/endpoint', {}, 'HTTP_COOKIE' => "#{SiteHub::RECORDED_ROUTES_COOKIE}=experiment2|variant1")
+ expect(app.last_response.body).to eq(['experiment1_body'])
+
+ expect(app.last_response.cookies[SiteHub::RECORDED_ROUTES_COOKIE][:value]).to eq('experiment2|variant1')
+ end
+ end
+ end
+
+ # describe 'middleware' do
+ #
+ # include_context :middleware_test
+ #
+ # let(:app) { Async::Middleware.new(rack_application) }
+ #
+ # def middleware name
+ # create_middleware.tap do |clazz|
+ # clazz.class_eval do
+ # define_method :call do |env|
+ # callback = env['async.callback'] || env['async.orig_callback']
+ # env['async.orig_callback'] = env['async.callback'] = proc do |status, headers, body|
+ # if body.is_a?(Rack::BodyProxy)
+ # body = "#{name}, #{body.body.join}"
+ # end
+ #
+ # callback.call(status, headers, body)
+ # end
+ # @app.call(env)
+ # end
+ # end
+ # end
+ # end
+ #
+ # before do
+ # stub_request(:get, downstream_url).to_return(body: 'hello')
+ # end
+ #
+ # context 'middleware added to top level' do
+ # let(:builder) do
+ # middleware = middleware(:middleware1)
+ # downstream_url = downstream_url()
+ #
+ # SiteHub::Builder.new do
+ # access_logger StringIO.new
+ # use middleware
+ # proxy '/1' => downstream_url
+ # proxy '/2' => downstream_url
+ # end
+ # end
+ #
+ # it 'adds it to each route' do
+ # get('/1')
+ # expect(app.last_response.body.join).to eq('middleware1, hello')
+ # get('/2')
+ # expect(app.last_response.body.join).to eq('middleware1, hello')
+ # end
+ # end
+ #
+ # context 'middleware added to specific route' do
+ # let(:builder) do
+ # middleware = middleware(:middleware1)
+ # downstream_url = downstream_url()
+ #
+ # SiteHub::Builder.new do
+ # access_logger StringIO.new
+ # proxy '/1' do
+ # use middleware
+ # route label: :with_middleware, url: downstream_url
+ # end
+ # proxy '/2' => downstream_url
+ # end
+ # end
+ #
+ # it 'adds it to that route only' do
+ # get('/1')
+ # expect(app.last_response.body.join).to eq('middleware1, hello')
+ # get('/2')
+ # expect(app.last_response.body.join).to eq('hello')
+ # end
+ # end
+ #
+ # context 'base inherited middleware' do
+ # let(:builder) do
+ # middleware1 = middleware(:middleware1)
+ # middleware2 = middleware(:middleware2)
+ # downstream_url = downstream_url()
+ #
+ # SiteHub::Builder.new do
+ # access_logger StringIO.new
+ # use middleware1
+ # proxy '/1' do
+ # use middleware2
+ # route label: :with_middleware, url: downstream_url
+ # end
+ # # proxy '/2' => downstream_url
+ # end
+ # end
+ #
+ # it 'adds it to that route only' do
+ # get('/1')
+ # expect(app.last_response.body.join).to eq('middleware1, middleware2, hello')
+ # get('/2')
+ # expect(app.last_response.body.join).to eq('middleware1, hello')
+ # end
+ # end
+ #
+ # context 'nested inherited middleware' do
+ # let(:builder) do
+ # middleware1 = middleware(:middleware1)
+ # middleware2 = middleware(:middleware2)
+ # downstream_url = downstream_url()
+ #
+ # SiteHub::Builder.new do
+ # access_logger StringIO.new
+ #
+ # proxy '/1' do
+ # split percentage: 100, label: :experiment1 do
+ # use middleware1
+ # split percentage: 100, label: :with_middleware do
+ # use middleware2
+ # split percentage: 100, label: :with_nested_middleware, url: downstream_url
+ # end
+ # end
+ # end
+ # proxy '/2' => downstream_url
+ # end
+ # end
+ #
+ # it 'adds it to that route only' do
+ # get('/1')
+ # expect(app.last_response.body.join).to eq('middleware1, middleware2, hello')
+ # get('/2')
+ # expect(app.last_response.body.join).to eq('middleware1, hello')
+ # end
+ # end
+ # end
end