Skip to content

Commit

Permalink
A Spike to get dynamic auth tokens in request headers
Browse files Browse the repository at this point in the history
  • Loading branch information
Stefan Leszkiewicz committed Nov 27, 2014
1 parent 61fcb38 commit 18c247a
Show file tree
Hide file tree
Showing 13 changed files with 94 additions and 32 deletions.
1 change: 1 addition & 0 deletions lib/pact/consumer/interaction_builder.rb
Expand Up @@ -24,6 +24,7 @@ def given provider_state
end

def with(request_details)
#require 'pry'; binding.pry
interaction.request = Pact::Request::Expected.from_hash(request_details)
self
end
Expand Down
2 changes: 1 addition & 1 deletion lib/pact/provider/request.rb
Expand Up @@ -67,4 +67,4 @@ def with_http_prefix header
end
end
end
end
end
4 changes: 2 additions & 2 deletions lib/pact/provider/rspec.rb
Expand Up @@ -77,15 +77,15 @@ def describe_interaction interaction, options
before do | example |
interaction_context.run_once :before do
Pact.configuration.logger.info "Running example '#{Pact::RSpec.full_description(example)}'"
set_up_provider_state interaction.provider_state, options[:consumer]
set_up_provider_state interaction, options[:consumer]
replay_interaction interaction
interaction_context.last_response = last_response
end
end

after do
interaction_context.run_once :after do
tear_down_provider_state interaction.provider_state, options[:consumer]
tear_down_provider_state interaction, options[:consumer]
end
end

Expand Down
6 changes: 4 additions & 2 deletions lib/pact/provider/state/provider_state.rb
Expand Up @@ -68,6 +68,7 @@ class ProviderState

attr_accessor :name
attr_accessor :namespace
attr_accessor :interaction

extend Pact::DSL

Expand Down Expand Up @@ -116,7 +117,8 @@ def register_no_op
@no_op_defined = true
end

def set_up
def set_up interaction
@interaction = interaction
if @set_up_block
include_provider_state_configured_modules
instance_eval &@set_up_block
Expand Down Expand Up @@ -168,7 +170,7 @@ def include_provider_state_configured_modules

class NoOpProviderState

def self.set_up
def self.set_up interaction=nil

end

Expand Down
20 changes: 10 additions & 10 deletions lib/pact/provider/state/provider_state_manager.rb
Expand Up @@ -2,31 +2,31 @@ module Pact
module Provider::State
class ProviderStateManager

attr_reader :provider_state_name, :consumer
attr_reader :interaction, :consumer

def initialize provider_state_name, consumer
@provider_state_name = provider_state_name
def initialize interaction, consumer
@interaction = interaction
@consumer = consumer
end

def set_up_provider_state
get_global_base_provider_state.set_up
get_consumer_base_provider_state.set_up
if provider_state_name
get_provider_state.set_up
if interaction && interaction.provider_state
get_global_base_provider_state.set_up(interaction)
get_consumer_base_provider_state.set_up(interaction)
get_provider_state.set_up(interaction)
end
end

def tear_down_provider_state
if provider_state_name
if interaction && interaction.provider_state
get_provider_state.tear_down
end
get_consumer_base_provider_state.tear_down
get_global_base_provider_state.tear_down
end

def get_provider_state
Pact.provider_world.provider_states.get(provider_state_name, :for => consumer)
Pact.provider_world.provider_states.get(interaction.provider_state, :for => consumer)
end

def get_consumer_base_provider_state
Expand All @@ -39,4 +39,4 @@ def get_global_base_provider_state

end
end
end
end
8 changes: 4 additions & 4 deletions lib/pact/provider/test_methods.rb
Expand Up @@ -34,12 +34,12 @@ def parse_body_from_response rack_response
end
end

def set_up_provider_state provider_state_name, consumer
State::ProviderStateManager.new(provider_state_name, consumer).set_up_provider_state
def set_up_provider_state interaction, consumer
State::ProviderStateManager.new(interaction, consumer).set_up_provider_state
end

def tear_down_provider_state provider_state_name, consumer
State::ProviderStateManager.new(provider_state_name, consumer).tear_down_provider_state
def tear_down_provider_state interaction, consumer
State::ProviderStateManager.new(interaction, consumer).tear_down_provider_state
end

end
Expand Down
6 changes: 4 additions & 2 deletions spec/lib/pact/provider/state/provider_state_manager_spec.rb
@@ -1,5 +1,6 @@
require 'spec_helper'
require 'pact/provider/state/provider_state_manager'
require 'pact/consumer_contract/interaction'

module Pact::Provider::State

Expand Down Expand Up @@ -42,7 +43,8 @@ module Pact::Provider::State
end
end

let(:provider_state_manager) { ProviderStateManager.new("a custom state", "a consumer with provider states") }
let(:interaction) { Pact::Interaction.new(provider_state: "a custom state") }
let(:provider_state_manager) { ProviderStateManager.new(interaction, "a consumer with provider states") }

describe "set_up_provider_state" do

Expand Down Expand Up @@ -86,4 +88,4 @@ module Pact::Provider::State

end

end
end
21 changes: 12 additions & 9 deletions spec/lib/pact/provider/state/provider_state_spec.rb
Expand Up @@ -5,6 +5,8 @@ module Pact
module Provider::State

describe ProviderStates do

let(:interaction) { double(:interaction).as_null_object }
MESSAGES = []

before do
Expand All @@ -13,7 +15,6 @@ module Provider::State

describe 'global ProviderState' do


Pact.provider_state :no_alligators do
set_up do
MESSAGES << 'set_up'
Expand All @@ -27,12 +28,11 @@ module Provider::State
no_op
end


subject { ProviderStates.get('no_alligators') }

describe 'set_up' do
it 'should call the block passed to set_up' do
subject.set_up
subject.set_up interaction
expect(MESSAGES).to eq ['set_up']
end
end
Expand All @@ -59,12 +59,13 @@ module Provider::State
end

describe 'no_op' do

context "when a no_op is defined instead of a set_up or tear_down" do
it "treats set_up and tear_down as empty blocks" do
Pact.provider_state 'with_no_op' do
no_op
end
ProviderStates.get('with_no_op').set_up
ProviderStates.get('with_no_op').set_up interaction
ProviderStates.get('with_no_op').tear_down
end
end
Expand Down Expand Up @@ -134,14 +135,15 @@ module Provider::State
describe 'set_up' do
context 'for a consumer' do
it 'runs its own setup' do
ProviderStates.get('the weather is sunny', :for => 'a consumer').set_up
ProviderStates.get('the weather is sunny', :for => 'a consumer').set_up interaction
expect(NAMESPACED_MESSAGES).to eq ['sunny!']
end
end
end
end

describe "base_provider_state" do

Pact.provider_states_for "a consumer with base state" do
set_up do
MESSAGES << "setting up base provider state"
Expand All @@ -150,15 +152,15 @@ module Provider::State

context "when the base state has been declared" do
it "creates a base state for the provider" do
ProviderStates.get_base(:for => "a consumer with base state").set_up
ProviderStates.get_base(:for => "a consumer with base state").set_up interaction
expect(MESSAGES).to eq ["setting up base provider state"]
end

end

context "when a base state has not been declared" do
it "returns a no op state" do
ProviderStates.get_base(:for => "a consumer that does not exist").set_up
ProviderStates.get_base(:for => "a consumer that does not exist").set_up nil
ProviderStates.get_base(:for => "a consumer that does not exist").tear_down
end
end
Expand All @@ -167,6 +169,7 @@ module Provider::State

describe "global base_provider_state" do


before(:all) do
Pact.set_up do
MESSAGES << "setting up global base provider state"
Expand All @@ -175,15 +178,15 @@ module Provider::State

context "when the base state has been declared" do
it "creates a base state for the provider" do
ProviderStates.get_base.set_up
ProviderStates.get_base.set_up interaction
expect(MESSAGES).to eq ["setting up global base provider state"]
end

end

context "when a base state has not been declared" do
it "returns a no op state" do
ProviderStates.get_base.set_up
ProviderStates.get_base.set_up interaction
ProviderStates.get_base.tear_down
end
end
Expand Down
1 change: 1 addition & 0 deletions spec/spec_helper.rb
Expand Up @@ -13,6 +13,7 @@

RSpec.configure do | config |
config.include(FakeFS::SpecHelpers, :fakefs => true)
config.fail_fast = false

config.extend Pact::Provider::RSpec::ClassMethods
config.include Pact::Provider::RSpec::InstanceMethods
Expand Down
21 changes: 21 additions & 0 deletions spec/support/intercept_request_headers.json
@@ -0,0 +1,21 @@
{
"consumer": {
"name": "Consumer"
},
"provider": {
"name": "Provider"
},
"interactions": [
{
"description": "",
"provider_state": "intercepted_request_with_dynamic_auth_token",
"request": {
"method": "get",
"path": "/authorized_call"
},
"response": {
"status": 200
}
}
]
}
27 changes: 27 additions & 0 deletions spec/support/intercept_request_headers.rb
@@ -0,0 +1,27 @@
require 'json'
require 'pact/provider/rspec'
require './spec/support/active_support_if_configured'

class App

def call env
if env['PATH_INFO'] == '/authorized_call' && env['HTTP_AUTHORIZATION'] == 'some dynamic token'
[200, {'Content-Type' => 'application/json'}, [{message: 'so secure...'}.to_json]]
end
end

Pact.service_provider "Provider" do
app { App.new }

honours_pact_with 'Consumer' do
pact_uri './spec/support/intercept_request_headers.json'
end
end

Pact.provider_state "intercepted_request_with_dynamic_auth_token" do
set_up do
interaction.request.instance_eval('@headers = {}') # hack this in there to create some headers for now.
interaction.request.headers['Authorization'] = 'some dynamic token'
end
end
end
2 changes: 1 addition & 1 deletion spec/support/stubbing_using_allow.rb
Expand Up @@ -26,4 +26,4 @@ def self.call env

Pact.service_provider 'Provider' do
app { App }
end
end
7 changes: 6 additions & 1 deletion tasks/pact-test.rake
Expand Up @@ -42,6 +42,10 @@ Pact::VerificationTask.new('test_app:content_type') do | pact |
pact.uri './spec/support/test_app_with_right_content_type_differ.json'
end

Pact::VerificationTask.new('test_app:intercept_request_headers') do | pact |
pact.uri './spec/support/intercept_request_headers.json', pact_helper: './spec/support/intercept_request_headers.rb'
end

Pact::VerificationTask.new('test_app:fail') do | pact |
pact.uri './spec/support/test_app_fail.json', pact_helper: './spec/support/pact_helper.rb'
end
Expand All @@ -59,6 +63,7 @@ namespace :pact do
Rake::Task['pact:test:fail'].execute
Rake::Task['pact:test:pactfile'].execute
Rake::Task['pact:verify:test_app:content_type'].execute
Rake::Task['pact:verify:test_app:intercept_request_headers'].execute
Rake::Task['pact:verify:case_insensitive_response_header_matching'].execute
end

Expand Down Expand Up @@ -111,4 +116,4 @@ namespace :pact do
end
end

end
end

0 comments on commit 18c247a

Please sign in to comment.