http_stub 0.0.1
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.
- data/lib/http/stub/server.rb +63 -0
- data/lib/http/stub/version.rb +5 -0
- data/spec/curl_sample.txt +1 -0
- data/spec/lib/http/server_spec.rb +65 -0
- data/spec/spec_helper.rb +5 -0
- metadata +55 -0
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
Bundler.require(:default)
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
module Http
|
7
|
+
module Stub
|
8
|
+
|
9
|
+
class Server < ::Sinatra::Base
|
10
|
+
|
11
|
+
SUPPORTED_REQUEST_TYPES = [:get, :post, :put, :delete, :patch, :options].freeze
|
12
|
+
|
13
|
+
enable :dump_errors, :logging
|
14
|
+
|
15
|
+
def initialize()
|
16
|
+
super()
|
17
|
+
@response_register = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def self.any_request_type(path, opts={}, &block)
|
23
|
+
SUPPORTED_REQUEST_TYPES.each { |type| self.send(type, path, opts, &block) }
|
24
|
+
end
|
25
|
+
|
26
|
+
public
|
27
|
+
|
28
|
+
# Sample request body:
|
29
|
+
# {
|
30
|
+
# "uri": "/some/path",
|
31
|
+
# "method": "get",
|
32
|
+
# "response": {
|
33
|
+
# "status": "200",
|
34
|
+
# "body": "Hello World"
|
35
|
+
# }
|
36
|
+
# }
|
37
|
+
post "/stub" do
|
38
|
+
data = JSON.parse(request.body.read)
|
39
|
+
logger.info "Stub registered: #{data}"
|
40
|
+
@response_register[data["uri"]] = data
|
41
|
+
halt 200
|
42
|
+
end
|
43
|
+
|
44
|
+
any_request_type(//) { handle_stub_request }
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def handle_stub_request
|
49
|
+
logger.info "Stub response requested: #{request}"
|
50
|
+
stub_data = @response_register[request.path_info]
|
51
|
+
if stub_data && stub_data["method"].downcase == request.request_method.downcase
|
52
|
+
response_data = stub_data["response"]
|
53
|
+
halt response_data["status"] unless response_data["status"] == "200"
|
54
|
+
response_data["body"]
|
55
|
+
else
|
56
|
+
halt 404
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"uri": "/test", "method": "get", "response": {"status":"200", "body":"Foo"}}' http://localhost:8000/register_stub
|
@@ -0,0 +1,65 @@
|
|
1
|
+
describe Http::Stub::Server do
|
2
|
+
include Rack::Test::Methods
|
3
|
+
|
4
|
+
let(:app) { Http::Stub::Server }
|
5
|
+
let(:response) { last_response }
|
6
|
+
let(:response_body) { response.body.to_s }
|
7
|
+
|
8
|
+
shared_examples "a server that stubs a response" do |options|
|
9
|
+
|
10
|
+
let(:request_type) { options[:request_type] }
|
11
|
+
let(:different_request_type) { options[:different_request_type] }
|
12
|
+
let(:test_url) { "/test_#{request_type}" }
|
13
|
+
|
14
|
+
before(:each) do
|
15
|
+
post "/stub", '{"uri": "' + test_url + '", "method": "' + request_type.to_s + '", "response": {"status":"200", "body":"Foo"}}'
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "when a #{options[:request_type]} request is made" do
|
19
|
+
|
20
|
+
before(:each) { self.send(request_type, test_url) }
|
21
|
+
|
22
|
+
it "should respond with the stubbed response code" do
|
23
|
+
response.status.should eql(200)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should respond with the stubbed body" do
|
27
|
+
response_body.should eql("Foo")
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "and a request of type '#{options[:different_request_type]}' is made" do
|
33
|
+
|
34
|
+
before(:each) { self.send(different_request_type, test_url) }
|
35
|
+
|
36
|
+
it "should respond with a 404 response code" do
|
37
|
+
response.status.should eql(404)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
all_request_types = [:get, :post, :put, :delete, :patch, :options]
|
45
|
+
all_request_types.each_with_index do |request_type, i|
|
46
|
+
|
47
|
+
describe "when a #{request_type} request is stubbed" do
|
48
|
+
|
49
|
+
it_should_behave_like "a server that stubs a response", request_type: request_type, different_request_type: all_request_types[i - 1]
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "when a request is made that is not stubbed" do
|
56
|
+
|
57
|
+
before(:each) { get "/not_stubbed" }
|
58
|
+
|
59
|
+
it "should respond with 404 response code" do
|
60
|
+
response.status.should eql(404)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: http_stub
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Matthew Ueckerman
|
9
|
+
- Russell Van Bert
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-02-08 00:00:00.000000000 Z
|
14
|
+
dependencies: []
|
15
|
+
description: Configure server responses via requests to /stub. Intended as an acceptance
|
16
|
+
/ integration testing tool.
|
17
|
+
email: matthew.ueckerman@myob.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- ./lib/http/stub/server.rb
|
23
|
+
- ./lib/http/stub/version.rb
|
24
|
+
- ./spec/curl_sample.txt
|
25
|
+
- ./spec/lib/http/server_spec.rb
|
26
|
+
- ./spec/spec_helper.rb
|
27
|
+
homepage: http://github.com/MYOB-Technology/http_stub
|
28
|
+
licenses:
|
29
|
+
- MIT
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 1.9.3
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubyforge_project: http_stub
|
48
|
+
rubygems_version: 1.8.25
|
49
|
+
signing_key:
|
50
|
+
specification_version: 3
|
51
|
+
summary: A Http Server replaying configured stub responses
|
52
|
+
test_files:
|
53
|
+
- ./spec/curl_sample.txt
|
54
|
+
- ./spec/lib/http/server_spec.rb
|
55
|
+
- ./spec/spec_helper.rb
|