Skip to content

Commit 9afea51

Browse files
authored
feat: add Rack 3 compatibility (#146)
1 parent 43dec1d commit 9afea51

File tree

6 files changed

+23
-20
lines changed

6 files changed

+23
-20
lines changed

lib/pact/consumer/server.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,11 @@ def responsive?
6666
end
6767

6868
def run_default_server(app, port)
69-
require 'rack/handler/webrick'
69+
begin
70+
require 'rack/handler/webrick'
71+
rescue LoadError
72+
require 'rackup/handler/webrick'
73+
end
7074
Rack::Handler::WEBrick.run(app, **webrick_opts) do |server|
7175
@port = server[:Port]
7276
end

lib/pact/mock_service/cli.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,11 @@ def version
171171

172172
def require_common_dependencies
173173
require 'webrick/https'
174-
require 'rack/handler/webrick'
174+
begin
175+
require 'rack/handler/webrick'
176+
rescue LoadError
177+
require 'rackup/handler/webrick'
178+
end
175179
require 'fileutils'
176180
require 'pact/mock_service/server/wait_for_server_up'
177181
require 'pact/mock_service/cli/pidfile'

lib/pact/mock_service/request_handlers/interaction_post.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def request_method
2121
end
2222

2323
def respond env
24-
request_body = env['rack.input'].string
24+
request_body = env['rack.input'].read
2525
parsing_options = { pact_specification_version: pact_specification_version }
2626
interaction = Interaction.from_hash(JSON.load(request_body), parsing_options) # Load creates the Pact::XXX classes
2727

lib/pact/stub_service/cli.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
require 'pact/mock_service/cli/custom_thor'
22
require 'webrick/https'
3-
require 'rack/handler/webrick'
3+
begin
4+
require 'rack/handler/webrick'
5+
rescue LoadError
6+
require 'rackup/handler/webrick'
7+
end
48
require 'fileutils'
59
require 'pact/mock_service/server/wait_for_server_up'
610
require 'pact/mock_service/cli/pidfile'

pact-mock_service.gemspec

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ Gem::Specification.new do |gem|
2020
gem.require_paths = ["lib"]
2121
gem.license = 'MIT'
2222

23-
gem.add_runtime_dependency 'rack', '~> 2.0'
23+
gem.add_runtime_dependency 'rack', '>= 2.0', '< 4.0'
24+
gem.add_runtime_dependency 'rackup', '~> 2.0'
2425
gem.add_runtime_dependency 'rspec', '>=2.14'
2526
gem.add_runtime_dependency 'find_a_port', '~> 1.0.1'
2627
gem.add_runtime_dependency 'thor', '>= 0.19', '< 2.0'
2728
gem.add_runtime_dependency 'json'
2829
gem.add_runtime_dependency 'webrick', '~> 1.8'
2930
gem.add_runtime_dependency 'pact-support', '~> 1.16', '>= 1.16.4'
3031

31-
gem.add_development_dependency 'rack-test', '~> 0.7'
32+
gem.add_development_dependency 'rack-test', '>= 0.7', '< 3.0'
3233
gem.add_development_dependency 'rake', '~> 13.0', '>= 13.0.1'
3334
gem.add_development_dependency 'webmock', '~> 3.4'
3435
gem.add_development_dependency 'pry'

spec/integration/cli_spec.rb

+4-14
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
it "starts up and responds with mocked responses" do
1414
response = setup_interaction 8888
1515
expect(response.status).to eq 200
16+
expect(response.headers['X-Pact-Mock-Service-Location']).to eq 'http://0.0.0.0:8888'
1617

1718
response = invoke_expected_request 8888
1819
puts response.body if response.status != 200
@@ -21,37 +22,26 @@
2122

2223
write_pact 8888
2324
expect(response.status).to eq 200
24-
end
2525

26-
it "respects headers with underscores" do
2726
setup_interaction_with_underscored_header 8888
2827
response = invoke_request_with_underscored_header 8888
2928
puts response.body unless response.status == 200
3029
expect(response.status).to eq 200
31-
end
3230

33-
it "sets the X-Pact-Mock-Service-Location header" do
34-
response = setup_interaction 8888
35-
expect(response.headers['X-Pact-Mock-Service-Location']).to eq 'http://0.0.0.0:8888'
31+
Process.kill "INT", @pid
32+
sleep 1 # Naughty, but so much less code
33+
@pid = nil
3634
end
3735

3836
it "writes logs to the specified log file" do
3937
expect(File.exist?('tmp/integration.log')).to be true
4038
end
4139

4240
it "writes the pact to the specified directory" do
43-
clear_interactions 8888
44-
setup_interaction 8888
45-
invoke_expected_request 8888
4641
expect(File.exist?('tmp/pacts/consumer-provider.json')).to be true
4742
end
4843

4944
it "sets the pact specification version" do
50-
clear_interactions 8888
51-
setup_interaction 8888
52-
invoke_expected_request 8888
53-
54-
write_pact 8888
5545
expect(File.read("tmp/pacts/consumer-provider.json")).to include "3.0.0"
5646
end
5747

0 commit comments

Comments
 (0)