pinch_hitter 0.3 → 0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9ad281bbcbc46749dd62398bed9d7d5541e988b9
4
+ data.tar.gz: 6d1bf2170e91d25b57c85b1f457dd29b00c904b4
5
+ SHA512:
6
+ metadata.gz: ca0d42f73c2a46a473e77ec4c0c0fe57b68fb1e7e48e254b2c70e5679d0c5d74afe5266961492e7b381d4bffbab7cfd85fc517228e7442cdfbcca61bc4008181
7
+ data.tar.gz: a34aea95d209d1e1b27ee7d52e1d95b0352716f7dc3d7ecc4cbb6a54c16497f7710501486310ff09de7026acbfcf0bdba5dfa3d0abd170170c564de4b159bd80
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ pinch_hitter
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.0.0-p353
data/.travis.yml CHANGED
@@ -2,4 +2,5 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 1.9.2
5
- - 1.8.7
5
+ - 2.0.0
6
+ - 2.1.1
data/Changelog CHANGED
@@ -6,3 +6,7 @@ Switch json to do overrides by key rather than path (like xml)
6
6
 
7
7
  === Release 0.3 / 2013-3-22
8
8
  Add ability to register modules for custom message handling
9
+
10
+ === Release 0.4 / 2014-3-3
11
+ * Add ability to retrieve requests made by the application
12
+ * Support PUT, PATCH, DELETE
data/Rakefile CHANGED
@@ -10,7 +10,11 @@ Rake::TestTask.new(:unit) do |t|
10
10
  end
11
11
 
12
12
  Cucumber::Rake::Task.new(:features) do |t|
13
- t.profile = 'default'
13
+ if RUBY_VERSION == '1.9.2'
14
+ t.profile = '1.9.2'
15
+ else
16
+ t.profile = 'default'
17
+ end
14
18
  end
15
19
 
16
20
  desc 'Run all unit tests and features'
data/cucumber.yml CHANGED
@@ -1 +1,2 @@
1
- default: --no-source --color --format pretty
1
+ default: --no-source --color --format pretty
2
+ 1.9.2: --no-source --color --format pretty --tags ~@not_1.9.2
@@ -0,0 +1,77 @@
1
+ <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
2
+ <soapenv:Header></soapenv:Header>
3
+ <soapenv:Body>
4
+ <SubmitXmlResponse>
5
+ <SubmitXmlResult>
6
+ <CarStandardAvail_9 xmlns="">
7
+ <CarAvailDetail>
8
+ <Signature>0</Signature>
9
+ <DataQual>
10
+ <MktgTxtAry></MktgTxtAry>
11
+ <RateSepTextAry></RateSepTextAry>
12
+ <RefPt>GRAND FORKS MARK ANDREWS IN</RefPt>
13
+ <City>GFK</City>
14
+ <State>ND</State>
15
+ <Country>US</Country>
16
+ <DistUnit>M</DistUnit>
17
+ <RateTypeDesc>DAILY</RateTypeDesc>
18
+ <RateCatDesc> STND/PROM</RateCatDesc>
19
+ <Currency>USD</Currency>
20
+ <DecPos>2</DecPos>
21
+ <TruncDec>N</TruncDec>
22
+ <AltRateInd>5</AltRateInd>
23
+ <MoreCarsInd>N</MoreCarsInd>
24
+ <CarDetailAry>
25
+ <CarDetail>
26
+ <Vnd>ZI</Vnd>
27
+ <LocAffiliate>001</LocAffiliate>
28
+ <PrimeLocn>P</PrimeLocn>
29
+ <LinkInd>I</LinkInd>
30
+ <City>GFK</City>
31
+ <LocnCat>T</LocnCat>
32
+ <LocnExpansion></LocnExpansion>
33
+ <LocnNum>1</LocnNum>
34
+ <LocnCarRental>T</LocnCarRental>
35
+ <Dist></Dist>
36
+ <Dir>T</Dir>
37
+ <GeoLat></GeoLat>
38
+ <GeoLon></GeoLon>
39
+ <CarType>MVAR</CarType>
40
+ <YieldMgmt></YieldMgmt>
41
+ <Amt>10299</Amt>
42
+ <BaseRateAmt>10299</BaseRateAmt>
43
+ <DropChargeIncInd></DropChargeIncInd>
44
+ <UpsellInd></UpsellInd>
45
+ <RatePlcmtInd>3</RatePlcmtInd>
46
+ <RateType>D</RateType>
47
+ <RateGuar>G</RateGuar>
48
+ <AdditionalCharges></AdditionalCharges>
49
+ <AvailStatus>N</AvailStatus>
50
+ <MileRate>22</MileRate>
51
+ <Mile> 100</Mile>
52
+ <DropOffRestrictions>Y</DropOffRestrictions>
53
+ <RateCat>S</RateCat>
54
+ <MileageRestrictInd></MileageRestrictInd>
55
+ <FltInd></FltInd>
56
+ <CCInd></CCInd>
57
+ <Rate>2E</Rate>
58
+ <InclRateQual>
59
+ <RateDesc>DAILY PROMO</RateDesc>
60
+ <InclRate1></InclRate1>
61
+ <InclRate2></InclRate2>
62
+ <InclRate3></InclRate3>
63
+ <InclRate4></InclRate4>
64
+ <PrePayInd></PrePayInd>
65
+ <CarTypeDesc>FORD FREESTAR 4DR/7PS</CarTypeDesc>
66
+ <DropChargeAmt></DropChargeAmt>
67
+ <ApproxTotAmt>12762</ApproxTotAmt>
68
+ </InclRateQual>
69
+ </CarDetail>
70
+ </CarDetailAry>
71
+ </DataQual>
72
+ </CarAvailDetail>
73
+ </CarStandardAvail_9>
74
+ </SubmitXmlResult>
75
+ </SubmitXmlResponse>
76
+ </soapenv:Body>
77
+ </soapenv:Envelope>
@@ -35,3 +35,8 @@ Feature: Test WS replay
35
35
  |request| response |
36
36
  |ABC | 123 |
37
37
  |DEF | Comedy Jam |
38
+
39
+ Scenario: Replay with DELETE
40
+ Given I have a car reservation I want to delete
41
+ When I delete a car reservation
42
+ Then I should see a car reservation cancellation
@@ -7,7 +7,7 @@ Given /^I want a car rental$/ do
7
7
  end
8
8
 
9
9
  When /^I make a reservation$/ do
10
- @response = app.post '/car_rental', ''
10
+ @response = app.post '/car_rental', '{"reservation": "yes"}'
11
11
  end
12
12
 
13
13
  Then /^I see a car reservation$/ do
@@ -53,3 +53,15 @@ end
53
53
  Then(/^I see (.*?) in the service response$/) do |response|
54
54
  @response.body.to_s.should == "<response>#{response}</response>"
55
55
  end
56
+
57
+ Given(/^I have a car reservation I want to delete$/) do
58
+ mock.prime '/car_rental', :cancelled_reservation
59
+ end
60
+
61
+ When(/^I delete a car reservation$/) do
62
+ @response = app.delete '/car_rental'
63
+ end
64
+
65
+ Then(/^I should see a car reservation cancellation$/) do
66
+ @response.body.to_s.should == messages.load(:cancelled_reservation).squish
67
+ end
@@ -0,0 +1,28 @@
1
+ Given /^I setup my capture service$/ do
2
+ mock.reset
3
+ end
4
+
5
+ When /^I make (\d+) posts$/ do |number|
6
+ number.to_i.times.each do
7
+ app.post '/test_post', '{"reservation": "yes"}'
8
+ end
9
+ end
10
+
11
+ Then /^the service has received (\d+) posts(?:s?)$/ do |number|
12
+ mock.request_log('/test_post').count.should == number.to_i
13
+ end
14
+
15
+ When /^I do a (.*?) on "(.*?)"$/ do |method, endpoint|
16
+ app.send method.downcase, endpoint, '{"payload": "2tons"}'
17
+ end
18
+
19
+ Then(/^the service has recieved a request on "(.*?)"$/) do |endpoint|
20
+ mock.request_log(endpoint).count.should be > 0
21
+ end
22
+
23
+ When /^the headers for the request on "(.*?)" should contain:$/ do |endpoint, table|
24
+ headers = mock.request_log(endpoint).first.headers
25
+ table.rows_hash.each do |key, value|
26
+ headers[key].should == value
27
+ end
28
+ end
@@ -15,7 +15,7 @@ def app
15
15
  end
16
16
 
17
17
  def mock
18
- @@mock ||= MockWebService.new app_host, app_port
18
+ $mock ||= MockWebService.new app_host, app_port
19
19
  end
20
20
 
21
21
  def messages
@@ -0,0 +1,40 @@
1
+ Feature: Verify application's output
2
+ I want to test that my application sends the correct requests to an external service
3
+ As a tester trying to test the application
4
+ So that I can verify my application independently of external services
5
+
6
+ Background:
7
+ Given I setup my capture service
8
+
9
+ Scenario: Retrieve posts
10
+ When I make 3 posts
11
+ Then the service has received 3 posts
12
+
13
+ Scenario Outline: HTTP methods
14
+ When I do a <method> on "<endpoint>"
15
+ Then the service has recieved a request on "<endpoint>"
16
+ Examples:
17
+ | method | endpoint |
18
+ | POST | /poster |
19
+ | PUT | /putter |
20
+
21
+ @not_1.9.2
22
+ Scenario Outline: HTTP methods
23
+ When I do a <method> on "<endpoint>"
24
+ Then the service has recieved a request on "<endpoint>"
25
+ Examples:
26
+ | method | endpoint |
27
+ | PATCH | /patcher |
28
+
29
+ Scenario: Verifying headers
30
+ When I do a POST on "/poster"
31
+ #This is not an exhaustive list
32
+ When the headers for the request on "/poster" should contain:
33
+ | PATH_INFO | /poster |
34
+ | QUERY_STRING | |
35
+ | REQUEST_METHOD | POST |
36
+ | SERVER_NAME | 127.0.0.1 |
37
+ | SERVER_PORT | 9292 |
38
+ | SERVER_PROTOCOL | HTTP/1.1 |
39
+ | HTTP_VERSION | HTTP/1.1 |
40
+ | REQUEST_PATH | /poster |
@@ -25,7 +25,11 @@ module PinchHitter::Message
25
25
  end
26
26
 
27
27
  def find_filename(file)
28
- Dir["#{message_directory}/#{file}*"].first
28
+ filename = Dir["#{message_directory}/#{file}*"].first
29
+ unless filename
30
+ fail "Could not find message for '#{file}' in '#{File.expand_path(File.dirname(message_directory))}'"
31
+ end
32
+ filename
29
33
  end
30
34
 
31
35
  end
@@ -1,4 +1,5 @@
1
1
  require_relative 'message_queue'
2
+ require_relative 'endpoint_recorder'
2
3
 
3
4
  module PinchHitter::Service
4
5
  class EndpointHandlers
@@ -7,16 +8,20 @@ module PinchHitter::Service
7
8
  end
8
9
 
9
10
  def store_message(endpoint, body)
10
- handler_for(endpoint) << body.squish
11
+ handler_for(endpoint).store body.squish
11
12
  end
12
13
 
13
- def respond_to(endpoint='/', request='')
14
+ def respond_to(endpoint='/', request=nil)
14
15
  message = handler_for(endpoint).respond_to(request)
15
16
  message.squish if message
16
17
  end
17
18
 
19
+ def requests(endpoint)
20
+ handler_for(endpoint).requests
21
+ end
22
+
18
23
  def handler_for(endpoint='/')
19
- handlers[normalize(endpoint)] || store_handler(endpoint)
24
+ handlers[normalize(endpoint)] || store_handler(endpoint)
20
25
  end
21
26
 
22
27
  def register_module(endpoint, mod)
@@ -26,7 +31,7 @@ module PinchHitter::Service
26
31
  end
27
32
 
28
33
  def store_handler(endpoint, handler=MessageQueue.new)
29
- handlers[normalize(endpoint)] = handler
34
+ handlers[normalize(endpoint)] = EndpointRecorder.new handler
30
35
  end
31
36
 
32
37
  def normalize(endpoint)
@@ -35,11 +40,7 @@ module PinchHitter::Service
35
40
  end
36
41
 
37
42
  def reset
38
- handlers.values.each do |handler|
39
- if(handler.respond_to? :reset)
40
- handler.reset
41
- end
42
- end
43
+ handlers.values.each(&:reset)
43
44
  end
44
45
  end
45
46
  end
@@ -0,0 +1,28 @@
1
+ module PinchHitter::Service
2
+ class EndpointRecorder
3
+ attr_reader :handler
4
+
5
+ def initialize(handler)
6
+ @handler = handler
7
+ end
8
+
9
+ def store message
10
+ handler << message if handler.respond_to? :<<
11
+ end
12
+
13
+ def respond_to(request)
14
+ requests << request if request
15
+ message = request[:body] if request
16
+ handler.respond_to message
17
+ end
18
+
19
+ def requests
20
+ @requests ||= []
21
+ end
22
+
23
+ def reset
24
+ requests.clear
25
+ handler.reset if handler.respond_to? :reset
26
+ end
27
+ end
28
+ end
@@ -37,16 +37,32 @@ module PinchHitter::Service
37
37
  status 200
38
38
  end
39
39
 
40
+ get '/received_requests' do
41
+ requests request["endpoint"]
42
+ end
43
+
40
44
  post '/respond' do
41
45
  respond nil
42
46
  end
43
47
 
44
48
  get '/*' do
45
- respond params[:splat].first
49
+ respond params[:splat].first, request
50
+ end
51
+
52
+ delete '/*' do
53
+ respond params[:splat].first, request
46
54
  end
47
55
 
48
56
  post '/*' do
49
- respond params[:splat].first, request.body.read
57
+ respond params[:splat].first, request
58
+ end
59
+
60
+ put '/*' do
61
+ respond params[:splat].first, request
62
+ end
63
+
64
+ patch '/*' do
65
+ respond params[:splat].first, request
50
66
  end
51
67
 
52
68
  def store(endpoint='/', message=nil)
@@ -54,7 +70,7 @@ module PinchHitter::Service
54
70
  end
55
71
 
56
72
  def respond(endpoint='/', request=nil)
57
- message = @@handlers.respond_to endpoint, request
73
+ message = @@handlers.respond_to endpoint, wrap(request)
58
74
  content_type determine_content_type message
59
75
  puts "No message found for #{endpoint}" unless message
60
76
  message
@@ -64,5 +80,18 @@ module PinchHitter::Service
64
80
  @@handlers.register_module endpoint, Marshal.load(mod)
65
81
  end
66
82
 
83
+ def requests endpoint
84
+ content_type 'application/json'
85
+ { requests: @@handlers.requests(endpoint) }.to_json
86
+ end
87
+
88
+ def wrap request
89
+ return nil unless request
90
+ { headers: request_headers, body: request.body.read }
91
+ end
92
+
93
+ def request_headers
94
+ env.select { |key, value| key.upcase == key }
95
+ end
67
96
  end
68
97
  end
@@ -1,3 +1,3 @@
1
1
  module PinchHitter
2
- VERSION = "0.3"
2
+ VERSION = "0.4"
3
3
  end
data/lib/pinch_hitter.rb CHANGED
@@ -34,4 +34,14 @@ module PinchHitter
34
34
  @session.post "/register_module?endpoint=#{endpoint}", Marshal.dump(handler)
35
35
  end
36
36
 
37
+ def request_log(endpoint)
38
+ requests = @session.get "/received_requests?endpoint=#{endpoint}"
39
+ requests = JSON.parse(requests.body)['requests']
40
+ requests.map { |h| Struct.new(:body, :headers).new(h['body'], h['headers']) }
41
+ end
42
+
43
+ def received_messages(endpoint)
44
+ request_log(endpoint).map { |request| request.body }
45
+ end
46
+
37
47
  end
@@ -1,10 +1,8 @@
1
1
  ENV['RACK_ENV'] = 'test'
2
2
 
3
3
  require 'minitest/autorun'
4
- require 'pinch_hitter/service/endpoint_handlers'
5
4
 
6
-
7
- class TestEndpointHandlers < MiniTest::Unit::TestCase
5
+ class TestEndpointHandlers < MiniTest::Test
8
6
 
9
7
  def setup
10
8
  @handlers = PinchHitter::Service::EndpointHandlers.new
@@ -14,13 +12,6 @@ class TestEndpointHandlers < MiniTest::Unit::TestCase
14
12
  %Q{{"key"::"value"}}
15
13
  end
16
14
 
17
- def test_message_queue
18
- @handlers.store_message 'endpoint', json
19
- handler = @handlers.handler_for 'endpoint'
20
- assert_instance_of(PinchHitter::Service::MessageQueue, handler)
21
- assert_equal json, handler.respond_to
22
- end
23
-
24
15
  def test_defaults_to_message_queue
25
16
  @handlers.store_message 'endpoint', json
26
17
  assert_equal json, @handlers.respond_to('endpoint')
@@ -49,6 +40,12 @@ class TestEndpointHandlers < MiniTest::Unit::TestCase
49
40
  assert_equal "THIS IS A TEST", @handlers.respond_to('endpoint')
50
41
  end
51
42
 
43
+ def test_requests
44
+ request = { body: '{"Hot Rod" : "Williams"}' }
45
+ @handlers.respond_to('endpoint', request)
46
+ assert_equal [request], @handlers.requests('endpoint')
47
+ end
48
+
52
49
 
53
50
  module TestModule
54
51
  def respond_to(msg)
@@ -0,0 +1,43 @@
1
+ ENV['RACK_ENV'] = 'test'
2
+
3
+ require 'minitest/autorun'
4
+
5
+ class TestEndpointRecorder < MiniTest::Test
6
+
7
+ def setup
8
+ @mock = MiniTest::Mock.new
9
+ @recorder = PinchHitter::Service::EndpointRecorder.new @mock
10
+ end
11
+
12
+ def test_is_facade_for_handler
13
+ @mock.expect(:<<, nil, ['blah'])
14
+ @recorder.store 'blah'
15
+ @mock.verify
16
+ end
17
+
18
+ def test_is_facade_reset
19
+ @mock.expect(:reset, nil)
20
+ @recorder.reset
21
+ @mock.verify
22
+ end
23
+
24
+ def test_stores_request_if_present
25
+ @mock.expect(:respond_to, '', [String])
26
+ @recorder.respond_to({ body: 'request' })
27
+ assert_equal [{body: 'request'}], @recorder.requests
28
+ end
29
+
30
+ def test_passes_body_to_handler_if_present
31
+ @mock.expect(:respond_to, '', ['request'])
32
+ @recorder.respond_to({ body: 'request' })
33
+ @mock.verify
34
+ end
35
+
36
+ def reset_clears_stored_requests
37
+ @mock.expect(:respond_to, '', [String])
38
+ @mock.expect(:reset, nil)
39
+ @recorder.respond_to({ body: 'request' })
40
+ @recorder.reset
41
+ assert_empty @recorder.requests
42
+ end
43
+ end
@@ -1,9 +1,8 @@
1
-
2
1
  ENV['RACK_ENV'] = 'test'
3
2
 
4
3
  require 'minitest/autorun'
5
4
 
6
- class TestJsonMessage < MiniTest::Unit::TestCase
5
+ class TestJsonMessage < MiniTest::Test
7
6
 
8
7
  def setup
9
8
  File.open(filename, 'w') {|f| f.write(our_message) }
data/test/test_message.rb CHANGED
@@ -1,9 +1,8 @@
1
-
2
1
  ENV['RACK_ENV'] = 'test'
3
2
 
4
3
  require 'minitest/autorun'
5
- require 'pinch_hitter/message/message_store'
6
- class TestMessage < MiniTest::Unit::TestCase
4
+
5
+ class TestMessage < MiniTest::Test
7
6
 
8
7
  def setup
9
8
  File.open("#{xml_filename}.xml", 'w') {|f| f.write(xml_message) }
@@ -1,18 +1,18 @@
1
1
  ENV['RACK_ENV'] = 'test'
2
2
 
3
- require 'pinch_hitter/service/replay_ws'
4
- require 'pinch_hitter'
5
3
  require 'minitest/autorun'
4
+ require 'pinch_hitter'
6
5
  require 'rack/test'
7
6
 
8
- class TestPinchHitter < MiniTest::Unit::TestCase
7
+ class TestPinchHitter < MiniTest::Test
9
8
  include Rack::Test::Methods
10
9
 
11
10
  def setup
12
11
  @test = Object.new
13
12
  @test.extend(PinchHitter)
14
13
  @test.session=session
15
- @test.messages_directory = File.dirname('.')
14
+ @test.reset
15
+ @test.messages_directory = File.dirname('.')
16
16
  File.open(message_file, 'w') {|f| f.write(message_content) }
17
17
  end
18
18
 
@@ -27,7 +27,7 @@ class TestPinchHitter < MiniTest::Unit::TestCase
27
27
  def message_content
28
28
  "{fizzbuzz}"
29
29
  end
30
-
30
+
31
31
  def app
32
32
  PinchHitter::Service::ReplayWs
33
33
  end
@@ -52,10 +52,39 @@ class TestPinchHitter < MiniTest::Unit::TestCase
52
52
  assert_equal message_content, session.last_response.body
53
53
  end
54
54
 
55
+ def test_prime_with_missing_message
56
+ begin
57
+ @test.prime '/foo', :non_existent_file
58
+ rescue => e
59
+ assert_match "Could not find message", e.message
60
+ assert_match :non_existent_file.to_s, e.message
61
+ end
62
+ end
63
+
55
64
  def test_store
56
65
  @test.store '/foo', message_content
57
66
  session.get '/foo'
58
67
  assert_equal message_content, session.last_response.body
59
68
  end
60
69
 
70
+ def test_request_body
71
+ update_request = '{"update": "please"}'
72
+ session.put '/foo', update_request
73
+ assert_equal update_request, @test.request_log('/foo').first.body
74
+ end
75
+
76
+ def test_request_headers
77
+ session.delete '/foo'
78
+ headers = @test.request_log('/foo').first.headers
79
+ end
80
+
81
+ def test_received_messages
82
+ @test.store '/foo', message_content
83
+ @test.store '/foo', message_content
84
+ messages = [ '{"abc": "123"}', '{"def": "456"}' ]
85
+ session.post '/foo', messages.first
86
+ session.post '/foo', messages.last
87
+ assert_equal messages, @test.received_messages('/foo')
88
+ end
89
+
61
90
  end
data/test/test_service.rb CHANGED
@@ -1,12 +1,9 @@
1
1
  ENV['RACK_ENV'] = 'test'
2
2
 
3
- require 'pinch_hitter/service/replay_ws'
4
3
  require 'minitest/autorun'
5
- require 'rack/test'
6
- require 'nokogiri'
7
4
  require_relative 'message_assertions'
8
5
 
9
- class TestService < MiniTest::Unit::TestCase
6
+ class TestService < MiniTest::Test
10
7
  include Rack::Test::Methods
11
8
  include MessageAssertions
12
9
 
@@ -93,6 +90,24 @@ class TestService < MiniTest::Unit::TestCase
93
90
  assert_equal '', last_response.body
94
91
  end
95
92
 
93
+ def test_put
94
+ post '/store/endpoint1', xml_message
95
+ put '/endpoint1'
96
+ assert_received xml_message
97
+ end
98
+
99
+ def test_patch
100
+ post '/store/endpoint1', xml_message
101
+ patch '/endpoint1'
102
+ assert_received xml_message
103
+ end
104
+
105
+ def test_delete
106
+ post '/store/endpoint1', xml_message
107
+ delete '/endpoint1'
108
+ assert_received xml_message
109
+ end
110
+
96
111
  def test_module
97
112
  post '/register_module?endpoint=stuff', Marshal.dump(TestModule)
98
113
  post '/stuff', ''
@@ -107,4 +122,16 @@ class TestService < MiniTest::Unit::TestCase
107
122
  end
108
123
  end
109
124
 
125
+ def test_received_requests
126
+ user_post = '{ "command": "Gimme stuff" }'
127
+ post "/store?endpoint=do_things", xml_message
128
+ post "/do_things", user_post
129
+ get '/received_requests?endpoint=do_things'
130
+
131
+ response = JSON.parse(last_response.body)['requests']
132
+ assert_equal 1, response.length
133
+ assert_equal user_post, response.first['body']
134
+ assert response.first['headers']
135
+ end
136
+
110
137
  end
@@ -2,7 +2,7 @@ ENV['RACK_ENV'] = 'test'
2
2
 
3
3
  require 'minitest/autorun'
4
4
 
5
- class TestXmlMessage < MiniTest::Unit::TestCase
5
+ class TestXmlMessage < MiniTest::Test
6
6
 
7
7
  def setup
8
8
  File.open(filename, 'w') {|f| f.write(our_message) }
metadata CHANGED
@@ -1,142 +1,125 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinch_hitter
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.3'
5
- prerelease:
4
+ version: '0.4'
6
5
  platform: ruby
7
6
  authors:
8
7
  - Steve Jackson
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-23 00:00:00.000000000 Z
11
+ date: 2014-03-03 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: sinatra
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 1.3.3
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: 1.3.3
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: nokogiri
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: 1.5.6
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: 1.5.6
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: json
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: 1.7.6
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: 1.7.6
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: minitest
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: 4.3.3
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: 4.3.3
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rack-test
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: 0.6.2
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: 0.6.2
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: rake
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: 10.0.3
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: 10.0.3
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: rspec
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: 2.12.0
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: 2.12.0
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: cucumber
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: 1.2.1
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: 1.2.1
142
125
  description: A simple web service that returns primed responses in FIFO order
@@ -147,7 +130,8 @@ extensions: []
147
130
  extra_rdoc_files: []
148
131
  files:
149
132
  - .gitignore
150
- - .rvmrc
133
+ - .ruby-gemset
134
+ - .ruby-version
151
135
  - .travis.yml
152
136
  - Changelog
153
137
  - Gemfile
@@ -156,13 +140,16 @@ files:
156
140
  - Rakefile
157
141
  - config.ru
158
142
  - cucumber.yml
143
+ - features/messages/cancelled_reservation.xml
159
144
  - features/messages/car_rental.xml
160
145
  - features/messages/glossary.json
161
- - features/step_definitions/test_replay_steps.rb
146
+ - features/replay.feature
147
+ - features/step_definitions/replay_steps.rb
148
+ - features/step_definitions/verify_requests_steps.rb
162
149
  - features/support/env.rb
163
150
  - features/support/mock_web_service.rb
164
151
  - features/support/xml_parser.rb
165
- - features/test_replay.feature
152
+ - features/verify.feature
166
153
  - lib/pinch_hitter.rb
167
154
  - lib/pinch_hitter/core_ext/string.rb
168
155
  - lib/pinch_hitter/message/content_type.rb
@@ -170,6 +157,7 @@ files:
170
157
  - lib/pinch_hitter/message/message_store.rb
171
158
  - lib/pinch_hitter/message/xml.rb
172
159
  - lib/pinch_hitter/service/endpoint_handlers.rb
160
+ - lib/pinch_hitter/service/endpoint_recorder.rb
173
161
  - lib/pinch_hitter/service/message_queue.rb
174
162
  - lib/pinch_hitter/service/replay_ws.rb
175
163
  - lib/pinch_hitter/service/runner.rb
@@ -177,6 +165,7 @@ files:
177
165
  - pinch_hitter.gemspec
178
166
  - test/message_assertions.rb
179
167
  - test/test_endpoint_handlers.rb
168
+ - test/test_endpoint_recorder.rb
180
169
  - test/test_json_message.rb
181
170
  - test/test_message.rb
182
171
  - test/test_pinch_hitter.rb
@@ -184,44 +173,41 @@ files:
184
173
  - test/test_xml_message.rb
185
174
  homepage: https://github.com/stevenjackson/pinch_hitter
186
175
  licenses: []
176
+ metadata: {}
187
177
  post_install_message:
188
178
  rdoc_options: []
189
179
  require_paths:
190
180
  - lib
191
181
  required_ruby_version: !ruby/object:Gem::Requirement
192
- none: false
193
182
  requirements:
194
- - - ! '>='
183
+ - - '>='
195
184
  - !ruby/object:Gem::Version
196
185
  version: '0'
197
- segments:
198
- - 0
199
- hash: 4282640623209066746
200
186
  required_rubygems_version: !ruby/object:Gem::Requirement
201
- none: false
202
187
  requirements:
203
- - - ! '>='
188
+ - - '>='
204
189
  - !ruby/object:Gem::Version
205
190
  version: '0'
206
- segments:
207
- - 0
208
- hash: 4282640623209066746
209
191
  requirements: []
210
192
  rubyforge_project:
211
- rubygems_version: 1.8.25
193
+ rubygems_version: 2.1.11
212
194
  signing_key:
213
- specification_version: 3
195
+ specification_version: 4
214
196
  summary: Test utility for mocking out external web responses
215
197
  test_files:
198
+ - features/messages/cancelled_reservation.xml
216
199
  - features/messages/car_rental.xml
217
200
  - features/messages/glossary.json
218
- - features/step_definitions/test_replay_steps.rb
201
+ - features/replay.feature
202
+ - features/step_definitions/replay_steps.rb
203
+ - features/step_definitions/verify_requests_steps.rb
219
204
  - features/support/env.rb
220
205
  - features/support/mock_web_service.rb
221
206
  - features/support/xml_parser.rb
222
- - features/test_replay.feature
207
+ - features/verify.feature
223
208
  - test/message_assertions.rb
224
209
  - test/test_endpoint_handlers.rb
210
+ - test/test_endpoint_recorder.rb
225
211
  - test/test_json_message.rb
226
212
  - test/test_message.rb
227
213
  - test/test_pinch_hitter.rb
data/.rvmrc DELETED
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
- # development environment upon cd'ing into the directory
5
-
6
- # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
7
- # Only full ruby name is supported here, for short names use:
8
- # echo "rvm use 1.9.3" > .rvmrc
9
- environment_id="ruby-1.9.3-p327@pinch_hitter"
10
-
11
-
12
- # First we attempt to load the desired environment directly from the environment
13
- # file. This is very fast and efficient compared to running through the entire
14
- # CLI and selector. If you want feedback on which environment was used then
15
- # insert the word 'use' after --create as this triggers verbose mode.
16
- if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
17
- && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
18
- then
19
- \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
20
-
21
- if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
22
- then
23
- . "${rvm_path:-$HOME/.rvm}/hooks/after_use"
24
- fi
25
- else
26
- # If the environment file has not yet been created, use the RVM CLI to select.
27
- if ! rvm --create "$environment_id"
28
- then
29
- echo "Failed to create RVM environment '${environment_id}'."
30
- return 1
31
- fi
32
- fi
33
-
34
-
35
- # If you use bundler, this might be useful to you:
36
- if [[ -s Gemfile ]] && ! command -v bundle >/dev/null
37
- then
38
- printf "The rubygem 'bundler' is not installed. Installing it now.\n"
39
- gem install bundler
40
- fi
41
- if [[ -s Gemfile ]] && command -v bundle
42
- then
43
- bundle install
44
- fi
45
-
46
- if [[ $- == *i* ]] # check for interactive shells
47
- then
48
- echo "Using: $(tput setaf 2)$GEM_HOME$(tput sgr0)" # show the user the ruby and gemset they are using in green
49
- else
50
- echo "Using: $GEM_HOME" # don't use colors in interactive shells
51
- fi
52
-