http_stub 0.16.0.pre1 → 0.17.0.pre1
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 +13 -5
- data/lib/http_stub.rb +10 -5
- data/lib/http_stub/configurer.rb +1 -21
- data/lib/http_stub/configurer/dsl/{sanctioned.rb → server.rb} +7 -1
- data/lib/http_stub/configurer/dsl/stub_builder.rb +4 -0
- data/lib/http_stub/configurer/request/stub.rb +1 -0
- data/lib/http_stub/configurer/server/command_processor.rb +3 -3
- data/lib/http_stub/rake/server_tasks.rb +1 -1
- data/lib/http_stub/server/daemon.rb +3 -1
- data/lib/http_stub/server/stub/instance.rb +3 -2
- data/lib/http_stub/server/stub/json_request_body.rb +35 -0
- data/lib/http_stub/server/stub/request_body.rb +44 -0
- data/lib/http_stub/server/stub/simple_request_body.rb +23 -0
- data/lib/http_stub/server/stub/truthy_request_matcher.rb +23 -0
- data/lib/http_stub/server/views/_stub.haml +3 -0
- data/lib/http_stub/version.rb +1 -1
- data/spec/acceptance/configurer_initialization_spec.rb +1 -1
- data/spec/acceptance/stub_body_schema_validation_spec.rb +67 -0
- data/spec/acceptance/stub_control_values_spec.rb +2 -2
- data/spec/acceptance/stub_spec.rb +1 -1
- data/spec/lib/http_stub/configurer/dsl/{sanctioned_spec.rb → server_spec.rb} +34 -15
- data/spec/lib/http_stub/configurer/dsl/stub_builder_spec.rb +18 -0
- data/spec/lib/http_stub/configurer/request/stub_spec.rb +52 -20
- data/spec/lib/http_stub/configurer/server/command_processor_integration_spec.rb +7 -4
- data/spec/lib/http_stub/rake/server_tasks_smoke_spec.rb +54 -13
- data/spec/lib/http_stub/server/application_integration_spec.rb +22 -2
- data/spec/lib/http_stub/server/daemon_integration_spec.rb +1 -1
- data/spec/lib/http_stub/server/daemon_spec.rb +50 -2
- data/spec/lib/http_stub/server/stub/instance_spec.rb +44 -10
- data/spec/lib/http_stub/server/stub/json_request_body_spec.rb +102 -0
- data/spec/lib/http_stub/server/stub/request_body_spec.rb +120 -0
- data/spec/lib/http_stub/server/stub/simple_request_body_spec.rb +43 -0
- data/spec/lib/http_stub/server/stub/string_value_matcher_spec.rb +2 -2
- data/spec/lib/http_stub/server/stub/truthy_request_matcher_spec.rb +23 -0
- data/spec/lib/http_stub/server/stub/uri_spec.rb +1 -1
- data/spec/spec_helper.rb +3 -2
- data/spec/support/configurer_integration.rb +2 -2
- data/spec/support/stub_fixture.rb +2 -1
- metadata +307 -281
- data/spec/lib/http_stub/configurer_spec.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YTlmNDUyNWZjZjhjODYwMjcyNDViZWE1MDY4NzljZTc3MDJhYmYxMA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTdhZmExMjY3NTBkNzZmZGMwYTdjMTJhZWM1ODAzMzcyZWZhZThmOQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZWI2MDc1ZThkNjQ4OWE2YWQ4YWM3MjM1YThlYzc5ZTg4OWE1MzFmM2EyZGUx
|
10
|
+
N2ZiM2Q5Y2ZhN2I3MGQ2ZGUzNTdmM2ViM2M0MGQwNDI5ODZhMTdjODM5MjBl
|
11
|
+
ZjMyNmMwMTJkMWNmNjk4MTk3NDg5ZGIxNTRlYmFiNDk1MzJjYWI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OWI1OGY4MzNiOGU3MjdkNGFmZDgxNjRhMjlkNmIxZjA5N2FmYjc0NDE3MmM5
|
14
|
+
NThiZDAyNzQzNTRjMTBjODFlMTA3MDJhZGEwMjUwZmUxMTBjOTcxNWMwZDhm
|
15
|
+
NWVlYzgxMzIwNWYxZmJhZTk5NWUxOWUzZTYzMTQzOTdhNjJiZTQ=
|
data/lib/http_stub.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'sinatra'
|
2
2
|
require 'sinatra/partial'
|
3
|
-
require 'haml'
|
4
|
-
require 'sass'
|
5
3
|
require 'json'
|
6
4
|
require 'net/http'
|
7
5
|
require 'net/http/post/multipart'
|
6
|
+
require 'json-schema'
|
8
7
|
require 'http_server_manager'
|
8
|
+
require 'haml'
|
9
|
+
require 'sass'
|
9
10
|
|
10
11
|
require 'active_support/core_ext/module/aliasing'
|
11
12
|
require 'active_support/core_ext/module/delegation'
|
@@ -28,10 +29,14 @@ require_relative 'http_stub/server/stub/headers'
|
|
28
29
|
require_relative 'http_stub/server/stub/request_header_parser'
|
29
30
|
require_relative 'http_stub/server/stub/payload_file_consolidator'
|
30
31
|
require_relative 'http_stub/server/stub/request_parser'
|
31
|
-
require_relative 'http_stub/server/stub/
|
32
|
+
require_relative 'http_stub/server/stub/truthy_request_matcher'
|
32
33
|
require_relative 'http_stub/server/stub/uri'
|
33
|
-
require_relative 'http_stub/server/stub/
|
34
|
+
require_relative 'http_stub/server/stub/method'
|
34
35
|
require_relative 'http_stub/server/stub/request_headers'
|
36
|
+
require_relative 'http_stub/server/stub/request_parameters'
|
37
|
+
require_relative 'http_stub/server/stub/simple_request_body'
|
38
|
+
require_relative 'http_stub/server/stub/json_request_body'
|
39
|
+
require_relative 'http_stub/server/stub/request_body'
|
35
40
|
require_relative 'http_stub/server/stub/response/base'
|
36
41
|
require_relative 'http_stub/server/stub/response/text'
|
37
42
|
require_relative 'http_stub/server/stub/response/file'
|
@@ -70,6 +75,6 @@ require_relative 'http_stub/configurer/dsl/stub_builder_producer'
|
|
70
75
|
require_relative 'http_stub/configurer/dsl/scenario_activator'
|
71
76
|
require_relative 'http_stub/configurer/dsl/scenario_builder'
|
72
77
|
require_relative 'http_stub/configurer/dsl/stub_activator_builder'
|
73
|
-
require_relative 'http_stub/configurer/dsl/
|
78
|
+
require_relative 'http_stub/configurer/dsl/server'
|
74
79
|
require_relative 'http_stub/configurer/dsl/deprecated'
|
75
80
|
require_relative 'http_stub/configurer'
|
data/lib/http_stub/configurer.rb
CHANGED
@@ -10,28 +10,8 @@ module HttpStub
|
|
10
10
|
|
11
11
|
module ClassMethods
|
12
12
|
|
13
|
-
def get_host
|
14
|
-
@host
|
15
|
-
end
|
16
|
-
|
17
|
-
def host(host)
|
18
|
-
@host = host
|
19
|
-
end
|
20
|
-
|
21
|
-
def get_port
|
22
|
-
@port
|
23
|
-
end
|
24
|
-
|
25
|
-
def port(port)
|
26
|
-
@port = port
|
27
|
-
end
|
28
|
-
|
29
|
-
def get_base_uri
|
30
|
-
"http://#{@host}:#{@port}"
|
31
|
-
end
|
32
|
-
|
33
13
|
def stub_server
|
34
|
-
@
|
14
|
+
@stub_server ||= HttpStub::Configurer::DSL::Server.new(server_facade)
|
35
15
|
end
|
36
16
|
|
37
17
|
def initialize!
|
@@ -2,15 +2,21 @@ module HttpStub
|
|
2
2
|
module Configurer
|
3
3
|
module DSL
|
4
4
|
|
5
|
-
class
|
5
|
+
class Server
|
6
6
|
include HttpStub::Configurer::DSL::StubBuilderProducer
|
7
7
|
include HttpStub::Configurer::DSL::ScenarioActivator
|
8
8
|
|
9
|
+
attr_accessor :host, :port
|
10
|
+
|
9
11
|
def initialize(server_facade)
|
10
12
|
@server_facade = server_facade
|
11
13
|
@response_defaults = {}
|
12
14
|
end
|
13
15
|
|
16
|
+
def base_uri
|
17
|
+
"http://#{host}:#{port}"
|
18
|
+
end
|
19
|
+
|
14
20
|
def response_defaults=(args)
|
15
21
|
@response_defaults = args
|
16
22
|
end
|
@@ -18,6 +18,7 @@ module HttpStub
|
|
18
18
|
method: @request[:method],
|
19
19
|
headers: HttpStub::Configurer::Request::ControllableValue.format(@request[:headers] || {}),
|
20
20
|
parameters: HttpStub::Configurer::Request::ControllableValue.format(@request[:parameters] || {}),
|
21
|
+
body: HttpStub::Configurer::Request::ControllableValue.format(@request[:body] || {}),
|
21
22
|
response: @response.payload,
|
22
23
|
triggers: @triggers.map(&:payload)
|
23
24
|
}
|
@@ -20,15 +20,15 @@ module HttpStub
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def host
|
23
|
-
@configurer.
|
23
|
+
@configurer.stub_server.host
|
24
24
|
end
|
25
25
|
|
26
26
|
def port
|
27
|
-
@configurer.
|
27
|
+
@configurer.stub_server.port
|
28
28
|
end
|
29
29
|
|
30
30
|
def error_message_prefix(command)
|
31
|
-
"Error occurred #{command.description} whilst configuring #{@configurer.
|
31
|
+
"Error occurred #{command.description} whilst configuring #{@configurer.stub_server.base_uri}: "
|
32
32
|
end
|
33
33
|
|
34
34
|
end
|
@@ -16,8 +16,10 @@ module HttpStub
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def initialize(args)
|
19
|
-
super({ host: "localhost" }.merge(args))
|
20
19
|
@configurer = args[:configurer]
|
20
|
+
default_args = @configurer ?
|
21
|
+
{ host: @configurer.stub_server.host, port: @configurer.stub_server.port } : { host: "localhost" }
|
22
|
+
super(default_args.merge(args))
|
21
23
|
end
|
22
24
|
|
23
25
|
def start!
|
@@ -4,20 +4,21 @@ module HttpStub
|
|
4
4
|
|
5
5
|
class Instance
|
6
6
|
|
7
|
-
attr_reader :method, :uri, :headers, :parameters, :response, :triggers
|
7
|
+
attr_reader :method, :uri, :headers, :parameters, :body, :response, :triggers
|
8
8
|
|
9
9
|
def initialize(args)
|
10
10
|
@method = HttpStub::Server::Stub::Method.new(args["method"])
|
11
11
|
@uri = HttpStub::Server::Stub::Uri.new(args["uri"])
|
12
12
|
@headers = HttpStub::Server::Stub::RequestHeaders.new(args["headers"])
|
13
13
|
@parameters = HttpStub::Server::Stub::RequestParameters.new(args["parameters"])
|
14
|
+
@body = HttpStub::Server::Stub::RequestBody.create(args["body"])
|
14
15
|
@response = HttpStub::Server::Stub::Response.create(args["response"])
|
15
16
|
@triggers = HttpStub::Server::Stub::Triggers.new(args["triggers"])
|
16
17
|
@description = args.to_s
|
17
18
|
end
|
18
19
|
|
19
20
|
def satisfies?(request)
|
20
|
-
[ @uri, @method, @headers, @parameters ].all? { |matcher| matcher.match?(request) }
|
21
|
+
[ @uri, @method, @headers, @parameters, @body ].all? { |matcher| matcher.match?(request) }
|
21
22
|
end
|
22
23
|
|
23
24
|
def to_s
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module HttpStub
|
2
|
+
module Server
|
3
|
+
module Stub
|
4
|
+
|
5
|
+
class JsonRequestBody
|
6
|
+
|
7
|
+
def initialize(schema_definition)
|
8
|
+
@schema_definition = schema_definition
|
9
|
+
end
|
10
|
+
|
11
|
+
def match?(request)
|
12
|
+
validate_against_schema(request).tap do |errors|
|
13
|
+
errors.each { |error| request.logger.info(error) }
|
14
|
+
end.empty?
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
@schema_definition.to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def validate_against_schema(request)
|
24
|
+
begin
|
25
|
+
JSON::Validator.fully_validate(@schema_definition, request.body.read, validate_schema: true, json: true)
|
26
|
+
rescue Exception => exc
|
27
|
+
[ exc.message ]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module HttpStub
|
2
|
+
module Server
|
3
|
+
module Stub
|
4
|
+
|
5
|
+
class RequestBody
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
SCHEMA_PROPERTIES = %w{ type definition }.freeze
|
10
|
+
|
11
|
+
public
|
12
|
+
|
13
|
+
class << self
|
14
|
+
|
15
|
+
def create(body)
|
16
|
+
matcher = create_schema_request_body(body["schema"]) if body.is_a?(Hash) && body["schema"]
|
17
|
+
matcher ||= HttpStub::Server::Stub::SimpleRequestBody.new(body) if !body.blank?
|
18
|
+
matcher || HttpStub::Server::Stub::TruthyRequestMatcher
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def create_schema_request_body(schema)
|
24
|
+
validate_schema_properties(schema)
|
25
|
+
begin
|
26
|
+
HttpStub::Server::Stub.const_get("#{schema["type"].capitalize}RequestBody").new(schema["definition"])
|
27
|
+
rescue NameError
|
28
|
+
raise "Stub request body schema #{schema} is invalid: #{schema["type"]} schema is not supported"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate_schema_properties(schema)
|
33
|
+
SCHEMA_PROPERTIES.each do |property|
|
34
|
+
raise "Stub request body schema #{schema} is invalid: #{property} expected" unless schema[property]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module HttpStub
|
2
|
+
module Server
|
3
|
+
module Stub
|
4
|
+
|
5
|
+
class SimpleRequestBody
|
6
|
+
|
7
|
+
def initialize(body)
|
8
|
+
@body = HttpStub::Server::Stub::StringValueMatcher.new(body)
|
9
|
+
end
|
10
|
+
|
11
|
+
def match?(request)
|
12
|
+
@body.match?(request.body.read)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
@body.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/http_stub/version.rb
CHANGED
@@ -9,7 +9,7 @@ describe "Configurer initialization acceptance" do
|
|
9
9
|
|
10
10
|
context "that contains a class stub" do
|
11
11
|
|
12
|
-
let(:configurer) { HttpStub::Examples::
|
12
|
+
let(:configurer) { HttpStub::Examples::ConfigurerWithTrivialStub.new }
|
13
13
|
|
14
14
|
it "registers the stub" do
|
15
15
|
response = HTTParty.get("#{server_uri}/a_class_stub")
|
@@ -0,0 +1,67 @@
|
|
1
|
+
describe "Scenario acceptance" do
|
2
|
+
include_context "configurer integration"
|
3
|
+
|
4
|
+
context "when a configurer that contains a stub matching a request body schema" do
|
5
|
+
|
6
|
+
let(:configurer) { HttpStub::Examples::ConfigurerWithSchemaValidatingStub.new }
|
7
|
+
|
8
|
+
before(:example) { configurer.class.initialize! }
|
9
|
+
|
10
|
+
context "and a request is made with a request body" do
|
11
|
+
|
12
|
+
context "that completely matches" do
|
13
|
+
|
14
|
+
let(:response) do
|
15
|
+
issue_request(body: { string_property: "some string",
|
16
|
+
integer_property: 88,
|
17
|
+
float_property: 77.7 }.to_json)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "responds with the configured response" do
|
21
|
+
expect(response.code).to eql(204)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
context "that partially matches" do
|
27
|
+
|
28
|
+
let(:response) do
|
29
|
+
issue_request(body: { string_property: "some string",
|
30
|
+
integer_property: 88 }.to_json)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "responds with a 404 status code" do
|
34
|
+
expect(response.code).to eql(404)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
context "that is completely different" do
|
40
|
+
|
41
|
+
let(:response) { issue_request(body: { some_other_key: "some string" }.to_json) }
|
42
|
+
|
43
|
+
it "responds with a 404 status code" do
|
44
|
+
expect(response.code).to eql(404)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
context "that is empty" do
|
50
|
+
|
51
|
+
let(:response) { issue_request(body: {}) }
|
52
|
+
|
53
|
+
it "responds with a 404 status code" do
|
54
|
+
expect(response.code).to eql(404)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
def issue_request(args)
|
62
|
+
HTTParty.post("#{server_uri}/matches_on_body_schema", args)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
describe "Stub control value acceptance" do
|
2
2
|
include_context "configurer integration"
|
3
3
|
|
4
|
-
let(:configurer) { HttpStub::Examples::
|
4
|
+
let(:configurer) { HttpStub::Examples::ConfigurerWithTrivialStub.new }
|
5
5
|
|
6
6
|
before(:example) { configurer.class.initialize! }
|
7
7
|
|
@@ -145,7 +145,7 @@ describe "Stub control value acceptance" do
|
|
145
145
|
configurer.stub_response!("/some_stub_path", method: :get, response: { delay_in_seconds: 2 })
|
146
146
|
end
|
147
147
|
|
148
|
-
it "delays
|
148
|
+
it "delays the response by the time provided" do
|
149
149
|
start_time = Time.now
|
150
150
|
|
151
151
|
response = HTTParty.get("#{server_uri}/some_stub_path")
|