webtrap 0.0.1 → 0.1.0
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 +4 -4
- data/.travis.yml +2 -4
- data/Gemfile +2 -1
- data/Gemfile.lock +49 -14
- data/README.md +5 -1
- data/lib/webtrap/rspec/matchers/send_request.rb +57 -26
- data/lib/webtrap/rspec/matchers.rb +7 -7
- data/lib/webtrap/rspec.rb +0 -2
- data/lib/webtrap/shared/rack_app.rb +33 -0
- data/lib/webtrap/shared/validators/equivalent_xml_content_validator.rb +49 -0
- data/lib/webtrap/shared/validators/request_sent_validator.rb +36 -0
- data/lib/webtrap/shared/validators.rb +12 -0
- data/lib/webtrap/shared.rb +11 -0
- data/lib/webtrap/version.rb +1 -1
- data/webtrap.gemspec +3 -2
- metadata +29 -12
- data/lib/webtrap/rspec/matchers/send_request_with_xml.rb +0 -90
- data/lib/webtrap/server.rb +0 -39
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a15e9e6f37a30d98232e8f3d32903ae6a8bc6a90
|
|
4
|
+
data.tar.gz: 8b30c18bed81414f5ee9fcc77eba9960ab0b37ae
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 147dafeaf072c3603589c96954649695afe74fad643fd7664531b998fc3f404620695990a14ecbeab3ddf7361c6ef3a5bb0c61f8243b72ac8b840e8e680aa4b4
|
|
7
|
+
data.tar.gz: ed986d9cae9ca4bd8f98457a38948eb7d316e97065c2cfe3dce6737f10bffa6553a2ecc5e1867bd1592bbb25ed231dfa3cd828c4608ee38493bfa32f057b3bf9
|
data/.travis.yml
CHANGED
|
@@ -5,12 +5,10 @@ cache:
|
|
|
5
5
|
- ../bundle
|
|
6
6
|
bundler_args: "--standalone --path ../bundle"
|
|
7
7
|
rvm:
|
|
8
|
-
- 2.0.0
|
|
9
|
-
- 2.1
|
|
10
8
|
- 2.2.5
|
|
11
9
|
- 2.3.3
|
|
12
10
|
- 2.4.0
|
|
13
11
|
- ruby-head
|
|
14
|
-
before_install: gem install bundler
|
|
12
|
+
before_install: gem install bundler
|
|
15
13
|
script:
|
|
16
|
-
- bundle exec
|
|
14
|
+
- bundle exec rake
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
webtrap (0.0.
|
|
4
|
+
webtrap (0.0.1)
|
|
5
5
|
equivalent-xml (~> 0.6.0)
|
|
6
|
+
rack (~> 2.0)
|
|
6
7
|
rspec (~> 3.0)
|
|
7
|
-
sinatra (~> 1.0)
|
|
8
8
|
webmock (~> 2.0)
|
|
9
9
|
|
|
10
10
|
GEM
|
|
11
|
-
remote:
|
|
11
|
+
remote: https://rubygems.org/
|
|
12
12
|
specs:
|
|
13
13
|
addressable (2.5.0)
|
|
14
14
|
public_suffix (~> 2.0, >= 2.0.2)
|
|
15
|
+
archive-tar-minitar (0.6.1)
|
|
16
|
+
minitar (~> 0.6)
|
|
17
|
+
minitar-cli (~> 0.6)
|
|
15
18
|
ast (2.3.0)
|
|
16
19
|
builder (3.2.3)
|
|
20
|
+
coderay (1.1.1)
|
|
17
21
|
crack (0.4.3)
|
|
18
22
|
safe_yaml (~> 1.0.0)
|
|
19
23
|
cucumber (2.4.0)
|
|
@@ -28,24 +32,54 @@ GEM
|
|
|
28
32
|
gherkin (~> 4.0)
|
|
29
33
|
cucumber-wire (0.0.1)
|
|
30
34
|
diff-lcs (1.3)
|
|
35
|
+
domain_name (0.5.20170223)
|
|
36
|
+
unf (>= 0.0.5, < 1.0.0)
|
|
31
37
|
equivalent-xml (0.6.0)
|
|
32
38
|
nokogiri (>= 1.4.3)
|
|
33
39
|
gherkin (4.0.0)
|
|
34
40
|
hashdiff (0.3.2)
|
|
41
|
+
hashie (3.5.5)
|
|
42
|
+
http-cookie (1.0.3)
|
|
43
|
+
domain_name (~> 0.5)
|
|
44
|
+
json (2.0.3)
|
|
45
|
+
method_source (0.8.2)
|
|
46
|
+
mime-types (3.1)
|
|
47
|
+
mime-types-data (~> 3.2015)
|
|
48
|
+
mime-types-data (3.2016.0521)
|
|
35
49
|
mini_portile2 (2.1.0)
|
|
50
|
+
minitar (0.6.1)
|
|
51
|
+
minitar-cli (0.6.1)
|
|
52
|
+
minitar (~> 0.6.0)
|
|
53
|
+
powerbar (~> 1.0)
|
|
36
54
|
multi_json (1.12.1)
|
|
37
55
|
multi_test (0.1.2)
|
|
56
|
+
netrc (0.11.0)
|
|
38
57
|
nokogiri (1.6.8.1)
|
|
39
58
|
mini_portile2 (~> 2.1.0)
|
|
40
59
|
parser (2.4.0.0)
|
|
41
60
|
ast (~> 2.2)
|
|
61
|
+
powerbar (1.0.18)
|
|
62
|
+
hashie (>= 1.1.0)
|
|
42
63
|
powerpack (0.1.1)
|
|
64
|
+
pry (0.10.4)
|
|
65
|
+
coderay (~> 1.1.0)
|
|
66
|
+
method_source (~> 0.8.1)
|
|
67
|
+
slop (~> 3.4)
|
|
68
|
+
pry-remote (0.1.8)
|
|
69
|
+
pry (~> 0.9)
|
|
70
|
+
slop (~> 3.0)
|
|
43
71
|
public_suffix (2.0.5)
|
|
44
|
-
rack (
|
|
45
|
-
rack-protection (1.5.3)
|
|
46
|
-
rack
|
|
72
|
+
rack (2.0.1)
|
|
47
73
|
rainbow (2.2.1)
|
|
48
|
-
rake (
|
|
74
|
+
rake (12.0.0)
|
|
75
|
+
relish (0.7.1)
|
|
76
|
+
archive-tar-minitar (>= 0.5.2)
|
|
77
|
+
json (>= 1.4.6)
|
|
78
|
+
rest-client (>= 1.7.2)
|
|
79
|
+
rest-client (2.0.1)
|
|
80
|
+
http-cookie (>= 1.0.2, < 2.0)
|
|
81
|
+
mime-types (>= 1.16, < 4.0)
|
|
82
|
+
netrc (~> 0.8)
|
|
49
83
|
rspec (3.5.0)
|
|
50
84
|
rspec-core (~> 3.5.0)
|
|
51
85
|
rspec-expectations (~> 3.5.0)
|
|
@@ -67,11 +101,10 @@ GEM
|
|
|
67
101
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
|
68
102
|
ruby-progressbar (1.8.1)
|
|
69
103
|
safe_yaml (1.0.4)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
tilt (2.0.6)
|
|
104
|
+
slop (3.6.0)
|
|
105
|
+
unf (0.1.4)
|
|
106
|
+
unf_ext
|
|
107
|
+
unf_ext (0.0.7.2)
|
|
75
108
|
unicode-display_width (1.1.3)
|
|
76
109
|
webmock (2.3.2)
|
|
77
110
|
addressable (>= 2.3.6)
|
|
@@ -85,10 +118,12 @@ PLATFORMS
|
|
|
85
118
|
DEPENDENCIES
|
|
86
119
|
bundler (~> 1.13)
|
|
87
120
|
cucumber (~> 2.0)
|
|
88
|
-
|
|
121
|
+
pry-remote (~> 0.1.8)
|
|
122
|
+
rake (~> 12.0)
|
|
123
|
+
relish (~> 0.7.1)
|
|
89
124
|
rubocop (~> 0.47.1)
|
|
90
125
|
webtrap!
|
|
91
126
|
yard (~> 0.9.8)
|
|
92
127
|
|
|
93
128
|
BUNDLED WITH
|
|
94
|
-
1.
|
|
129
|
+
1.14.5
|
data/README.md
CHANGED
|
@@ -5,7 +5,11 @@ WebTrap
|
|
|
5
5
|
[](https://travis-ci.org/pfac/webtrap)
|
|
6
6
|
[](https://gemnasium.com/github.com/pfac/webtrap)
|
|
7
7
|
[](https://codeclimate.com/github/pfac/webtrap)
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
Documentation:
|
|
10
|
+
[](http://www.relishapp.com/pfac/webtrap/docs)
|
|
11
|
+
[](http://www.rubydoc.info/gems/webtrap)
|
|
12
|
+
[](https://inch-ci.org/github/pfac/webtrap)
|
|
9
13
|
|
|
10
14
|
WebTrap allows you to write tests that assert on outgoing requests. This allows
|
|
11
15
|
you to verify that such requests match the documentation of external services
|
|
@@ -1,71 +1,102 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "webmock/rspec"
|
|
4
|
+
require "webtrap/shared"
|
|
5
|
+
require "rack"
|
|
4
6
|
|
|
5
7
|
module WebTrap
|
|
6
8
|
module RSpec
|
|
7
9
|
module Matchers
|
|
8
10
|
# @api private
|
|
9
|
-
# Provides the implementation for
|
|
11
|
+
# Provides the implementation for <code>send_request</code>.
|
|
12
|
+
#
|
|
10
13
|
# Not intended to be instantiated directly.
|
|
14
|
+
#
|
|
15
|
+
# @see http://www.rubydoc.info/github/rspec/rspec-expectations/RSpec/Matchers/MatcherProtocol RSpec Matcher Protocol
|
|
11
16
|
class SendRequest
|
|
17
|
+
# Initialize a new matcher.
|
|
18
|
+
#
|
|
19
|
+
# Unless more constraints are chained, this matcher will pass as long
|
|
20
|
+
# as any HTTP request gets intercepted.
|
|
21
|
+
#
|
|
22
|
+
# @see Shared::Validators::RequestSentValidator
|
|
23
|
+
def initialize
|
|
24
|
+
add_validator(Shared::Validators::RequestSentValidator.new)
|
|
25
|
+
end
|
|
26
|
+
|
|
12
27
|
# @api public
|
|
13
28
|
# Specifies the XML payload of the request.
|
|
14
29
|
#
|
|
15
30
|
# The expectation will pass only if a request is sent with a payload
|
|
16
|
-
# that is considered equivalent to the reference.
|
|
17
|
-
# see the {https://github.com/mbklein/equivalent-xml equivalent-xml}
|
|
18
|
-
# gem.
|
|
31
|
+
# that is considered equivalent to the reference.
|
|
19
32
|
#
|
|
20
|
-
# @param xml []
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
# to
|
|
33
|
+
# @param xml [String]
|
|
34
|
+
# The reference XML payload.
|
|
35
|
+
# @return [SendRequest]
|
|
36
|
+
# This matcher instance, to allow further chaining.
|
|
37
|
+
# @see Shared::Validators::EquivalentXmlContentValidator
|
|
24
38
|
def with_xml(xml)
|
|
25
|
-
|
|
39
|
+
add_validator(Shared::Validators::EquivalentXmlContentValidator.new(xml))
|
|
40
|
+
self
|
|
26
41
|
end
|
|
27
42
|
|
|
28
43
|
# @api private
|
|
29
|
-
#
|
|
44
|
+
# Whether a request was intercepted that matches all validators.
|
|
45
|
+
#
|
|
46
|
+
# Executes the provided proc, intercepting all transmitted HTTP requests
|
|
47
|
+
# and running them through the set of validators.
|
|
48
|
+
#
|
|
30
49
|
# @param transmission_proc [Proc]
|
|
31
|
-
# The proc that
|
|
32
|
-
# @return
|
|
33
|
-
# Whether an HTTP request was sent.
|
|
34
|
-
# @see {RSpec::Matchers::MatcherProtocol#matches?}
|
|
50
|
+
# The proc that is expected to send the requests.
|
|
51
|
+
# @return {Boolean}
|
|
35
52
|
def matches?(transmission_proc)
|
|
36
53
|
perform_transmission(transmission_proc)
|
|
37
|
-
|
|
54
|
+
failure_message.nil?
|
|
38
55
|
end
|
|
39
56
|
|
|
40
57
|
# @api private
|
|
41
|
-
# Message to be shown if
|
|
58
|
+
# Message to be shown if no request is intercepted for which all
|
|
59
|
+
# validators are successful.
|
|
60
|
+
#
|
|
42
61
|
# @return [String]
|
|
43
62
|
def failure_message
|
|
44
|
-
|
|
63
|
+
return if failed_validator.nil?
|
|
64
|
+
failed_validator.failure_message
|
|
45
65
|
end
|
|
46
66
|
|
|
47
67
|
# @api private
|
|
48
68
|
# Allows the matcher to be used with block expectations.
|
|
49
|
-
#
|
|
69
|
+
#
|
|
70
|
+
# @return [true]
|
|
50
71
|
def supports_block_expectations?
|
|
51
72
|
true
|
|
52
73
|
end
|
|
53
74
|
|
|
54
75
|
private
|
|
55
76
|
|
|
77
|
+
def validators
|
|
78
|
+
@_validators ||= []
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def add_validator(validator)
|
|
82
|
+
validators << validator
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def failed_validator
|
|
86
|
+
validators.find(&:failed?)
|
|
87
|
+
end
|
|
88
|
+
|
|
56
89
|
def perform_transmission(transmission_proc)
|
|
57
90
|
WebMock.disable_net_connect!
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
@request_sent = true
|
|
63
|
-
end
|
|
91
|
+
WebMock::API.stub_request(:any, /.*/).to_rack(app)
|
|
92
|
+
|
|
93
|
+
transmission_proc.call
|
|
94
|
+
|
|
64
95
|
WebMock.allow_net_connect!
|
|
65
96
|
end
|
|
66
97
|
|
|
67
|
-
def
|
|
68
|
-
@
|
|
98
|
+
def app
|
|
99
|
+
@_app ||= Shared::RackApp.new(validators)
|
|
69
100
|
end
|
|
70
101
|
end
|
|
71
102
|
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "webtrap/rspec/matchers/send_request"
|
|
4
|
-
require "webtrap/rspec/matchers/send_request_with_xml"
|
|
5
|
-
|
|
6
3
|
module WebTrap
|
|
7
4
|
module RSpec
|
|
8
|
-
#
|
|
9
|
-
# expections about outgoing requests.
|
|
5
|
+
# Set of matchers available to define expections about outgoing requests.
|
|
10
6
|
module Matchers
|
|
11
|
-
|
|
7
|
+
autoload :SendRequest, "webtrap/rspec/matchers/send_request"
|
|
8
|
+
|
|
9
|
+
# Passes if the expectation block sends an HTTP request.
|
|
10
|
+
#
|
|
11
|
+
# Constraints to specify the expected request can be chained.
|
|
12
12
|
#
|
|
13
13
|
# @return [SendRequest]
|
|
14
|
-
# The matcher to verify that
|
|
14
|
+
# The matcher instance to verify that a request is sent.
|
|
15
15
|
def send_request
|
|
16
16
|
SendRequest.new
|
|
17
17
|
end
|
data/lib/webtrap/rspec.rb
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# @api private
|
|
4
|
+
# Rack applications used to intercept HTTP requests and apply a set of
|
|
5
|
+
# validators on them.
|
|
6
|
+
class WebTrap::Shared::RackApp
|
|
7
|
+
# Instantiate a new Rack application with the provided set of validators.
|
|
8
|
+
#
|
|
9
|
+
# @param validators [Array]
|
|
10
|
+
# Set of validators used on the intercepted request to assert its validity.
|
|
11
|
+
# @example Intercept any request
|
|
12
|
+
# require "webmock"
|
|
13
|
+
# # ...
|
|
14
|
+
# WebMock::API.stub_request(:any, /.*/).to_rack RackApp.new(validators)
|
|
15
|
+
def initialize(validators)
|
|
16
|
+
@validators = validators
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Handle an HTTP request.
|
|
20
|
+
#
|
|
21
|
+
# @param request [Hash]
|
|
22
|
+
# Request environment, as defined by the Rack spec.
|
|
23
|
+
# @return [Array<Fixnum, Hash, Array>]
|
|
24
|
+
# An empty successful response.
|
|
25
|
+
# @see http://www.rubydoc.info/github/rack/rack/master/file/SPEC
|
|
26
|
+
# Rack spec
|
|
27
|
+
def call(request)
|
|
28
|
+
@validators.find do |v|
|
|
29
|
+
v.validate(request).failed?
|
|
30
|
+
end
|
|
31
|
+
[200, {}, []]
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "equivalent-xml"
|
|
4
|
+
|
|
5
|
+
# @api private
|
|
6
|
+
# Validator for asserting a request was sent with an equivalent XML payload.
|
|
7
|
+
#
|
|
8
|
+
# @see https://github.com/mbklein/equivalent-xml
|
|
9
|
+
# equivalent-xml gem
|
|
10
|
+
class WebTrap::Shared::Validators::EquivalentXmlContentValidator
|
|
11
|
+
# Instantiate a new validator with the provided payload.
|
|
12
|
+
#
|
|
13
|
+
# @param xml [String]
|
|
14
|
+
# The XML payload requests will be compared against.
|
|
15
|
+
def initialize(xml)
|
|
16
|
+
@failed = true
|
|
17
|
+
@xml = xml
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Whether no request with an equivalent payload was validated.
|
|
21
|
+
#
|
|
22
|
+
# @return [Boolean]
|
|
23
|
+
def failed?
|
|
24
|
+
@failed
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# The message to be used if no request is validated with an equivalent
|
|
28
|
+
# payload.
|
|
29
|
+
#
|
|
30
|
+
# @return [String]
|
|
31
|
+
def failure_message
|
|
32
|
+
"expected block to send an HTTP request with XML body, but payload was not equivalent"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Validate if the request has an equivalent XML payload.
|
|
36
|
+
#
|
|
37
|
+
# @param request [Hash]
|
|
38
|
+
# Request environment passed by {WebTrap::Shared::RackApp#call}.
|
|
39
|
+
# @return [EquivalentXmlContentValidator]
|
|
40
|
+
# This validator instance.
|
|
41
|
+
def validate(request)
|
|
42
|
+
@failed = EquivalentXml.equivalent?(xml, request["rack.input"].string)
|
|
43
|
+
self
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
attr_reader :xml
|
|
49
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# @api private
|
|
4
|
+
# Validator for asserting whether a request was sent.
|
|
5
|
+
class WebTrap::Shared::Validators::RequestSentValidator
|
|
6
|
+
# Initialize a new validator.
|
|
7
|
+
def initialize
|
|
8
|
+
@failed = true
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Whether no request was validated.
|
|
12
|
+
#
|
|
13
|
+
# @return [Boolean]
|
|
14
|
+
def failed?
|
|
15
|
+
@failed
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# The message to be used if no request is validated.
|
|
19
|
+
#
|
|
20
|
+
# @return [String]
|
|
21
|
+
def failure_message
|
|
22
|
+
"expected block to send an HTTP request, but nothing was sent out"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Validate a request.
|
|
26
|
+
#
|
|
27
|
+
# Since validators are run against intercepted requests this validator will
|
|
28
|
+
# succeed for any request.
|
|
29
|
+
#
|
|
30
|
+
# @return [RequestSentValidator]
|
|
31
|
+
# This validator instance.
|
|
32
|
+
def validate(_)
|
|
33
|
+
@failed = false
|
|
34
|
+
self
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WebTrap
|
|
4
|
+
module Shared
|
|
5
|
+
# @api private
|
|
6
|
+
# Validators used to assert constraints over the intercepted HTTP requests.
|
|
7
|
+
module Validators
|
|
8
|
+
autoload :EquivalentXmlContentValidator, "webtrap/shared/validators/equivalent_xml_content_validator"
|
|
9
|
+
autoload :RequestSentValidator, "webtrap/shared/validators/request_sent_validator"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "webtrap/shared/validators"
|
|
4
|
+
|
|
5
|
+
module WebTrap
|
|
6
|
+
# @api private
|
|
7
|
+
# Shared components used by all implementations for specific testing tools.
|
|
8
|
+
module Shared
|
|
9
|
+
autoload :RackApp, "webtrap/shared/rack_app"
|
|
10
|
+
end
|
|
11
|
+
end
|
data/lib/webtrap/version.rb
CHANGED
data/webtrap.gemspec
CHANGED
|
@@ -36,12 +36,13 @@ Gem::Specification.new do |spec|
|
|
|
36
36
|
spec.require_paths = ["lib"]
|
|
37
37
|
|
|
38
38
|
spec.add_dependency "equivalent-xml", "~> 0.6.0"
|
|
39
|
+
spec.add_dependency "rack", "~> 2.0"
|
|
39
40
|
spec.add_dependency "rspec", "~> 3.0"
|
|
40
|
-
spec.add_dependency "sinatra", "~> 1.0"
|
|
41
41
|
spec.add_dependency "webmock", "~> 2.0"
|
|
42
42
|
|
|
43
43
|
spec.add_development_dependency "bundler", "~> 1.13"
|
|
44
44
|
spec.add_development_dependency "cucumber", "~> 2.0"
|
|
45
|
-
spec.add_development_dependency "
|
|
45
|
+
spec.add_development_dependency "pry-remote", "~> 0.1.8"
|
|
46
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
|
46
47
|
spec.add_development_dependency "rubocop", "~> 0.47.1"
|
|
47
48
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: webtrap
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pedro Costa
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-
|
|
11
|
+
date: 2017-03-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: equivalent-xml
|
|
@@ -25,33 +25,33 @@ dependencies:
|
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: 0.6.0
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
28
|
+
name: rack
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '2.0'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
40
|
+
version: '2.0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
42
|
+
name: rspec
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
47
|
+
version: '3.0'
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '
|
|
54
|
+
version: '3.0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: webmock
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -94,20 +94,34 @@ dependencies:
|
|
|
94
94
|
- - "~>"
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
96
|
version: '2.0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: pry-remote
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: 0.1.8
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: 0.1.8
|
|
97
111
|
- !ruby/object:Gem::Dependency
|
|
98
112
|
name: rake
|
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
|
100
114
|
requirements:
|
|
101
115
|
- - "~>"
|
|
102
116
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: '
|
|
117
|
+
version: '12.0'
|
|
104
118
|
type: :development
|
|
105
119
|
prerelease: false
|
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
121
|
requirements:
|
|
108
122
|
- - "~>"
|
|
109
123
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: '
|
|
124
|
+
version: '12.0'
|
|
111
125
|
- !ruby/object:Gem::Dependency
|
|
112
126
|
name: rubocop
|
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -149,8 +163,11 @@ files:
|
|
|
149
163
|
- lib/webtrap/rspec.rb
|
|
150
164
|
- lib/webtrap/rspec/matchers.rb
|
|
151
165
|
- lib/webtrap/rspec/matchers/send_request.rb
|
|
152
|
-
- lib/webtrap/
|
|
153
|
-
- lib/webtrap/
|
|
166
|
+
- lib/webtrap/shared.rb
|
|
167
|
+
- lib/webtrap/shared/rack_app.rb
|
|
168
|
+
- lib/webtrap/shared/validators.rb
|
|
169
|
+
- lib/webtrap/shared/validators/equivalent_xml_content_validator.rb
|
|
170
|
+
- lib/webtrap/shared/validators/request_sent_validator.rb
|
|
154
171
|
- lib/webtrap/version.rb
|
|
155
172
|
- webtrap.gemspec
|
|
156
173
|
homepage: https://github.com/pfac/webtrap
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "equivalent-xml"
|
|
4
|
-
require "webmock/rspec"
|
|
5
|
-
|
|
6
|
-
module WebTrap
|
|
7
|
-
module RSpec
|
|
8
|
-
module Matchers
|
|
9
|
-
# @api private
|
|
10
|
-
# Used to specify the XML payload of the request.
|
|
11
|
-
class SendRequestWithXml < SendRequest
|
|
12
|
-
# Reference to be compared with the payload of outgoing XML requests.
|
|
13
|
-
attr_reader :expected_payload
|
|
14
|
-
|
|
15
|
-
# Allows the parameterization of the matcher with the reference payload.
|
|
16
|
-
# @param expected_payload []
|
|
17
|
-
# Reference to be compared with the payload of outgoing XML requests.
|
|
18
|
-
def initialize(expected_payload)
|
|
19
|
-
@expected_payload = expected_payload
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# @api private
|
|
23
|
-
# Checks if the provided Proc sends a request with an XML payload
|
|
24
|
-
# equivalent to the expected reference.
|
|
25
|
-
# @param transmission_proc [Proc]
|
|
26
|
-
# The proc that should send a valid request.
|
|
27
|
-
# @return
|
|
28
|
-
# Whether a request was sent with an equivalent XML payload.
|
|
29
|
-
# @see {RSpec::Matchers::MatcherProtocol#matches?}
|
|
30
|
-
def matches?(transmission_proc)
|
|
31
|
-
perform_transmission(transmission_proc)
|
|
32
|
-
request_sent? && valid_payload?
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# @api private
|
|
36
|
-
# Message to be shown if the expectation fails to pass.
|
|
37
|
-
# @return [String]
|
|
38
|
-
# @see {RSpec::Matchers::MatcherProtocol#failure_message}
|
|
39
|
-
def failure_message
|
|
40
|
-
return super unless request_sent?
|
|
41
|
-
|
|
42
|
-
"expected block to send an HTTP request with XML body, but payload was not equivalent"
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# @api private
|
|
46
|
-
# Allows the matcher to be used with block expectations.
|
|
47
|
-
# @return [TrueClass]
|
|
48
|
-
# @see {RSpec::Matchers::MatcherProtocol#supports_block_expectations?}
|
|
49
|
-
def supports_block_expectations?
|
|
50
|
-
true
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
private
|
|
54
|
-
|
|
55
|
-
def perform_transmission(transmission_proc)
|
|
56
|
-
WebMock.disable_net_connect!
|
|
57
|
-
WebMock::API.stub_request(:post, /.*/).to_rack(server)
|
|
58
|
-
|
|
59
|
-
transmission_proc.call
|
|
60
|
-
|
|
61
|
-
WebMock.allow_net_connect!
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def server
|
|
65
|
-
expected_payload = self.expected_payload
|
|
66
|
-
|
|
67
|
-
@_server ||= ::Class.new(::WebTrap::Server) do
|
|
68
|
-
@payload_was_valid = false
|
|
69
|
-
@request_received = false
|
|
70
|
-
|
|
71
|
-
post "*" do
|
|
72
|
-
actual_payload = request.body.string
|
|
73
|
-
|
|
74
|
-
self.class.request_received = true
|
|
75
|
-
self.class.payload_was_valid = EquivalentXml.equivalent?(actual_payload, expected_payload)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def request_sent?
|
|
81
|
-
super || server.request_received?
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def valid_payload?
|
|
85
|
-
server.payload_was_valid?
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
data/lib/webtrap/server.rb
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "sinatra"
|
|
4
|
-
|
|
5
|
-
module WebTrap
|
|
6
|
-
# Base class for creating fake web application to capture outgoing web
|
|
7
|
-
# requests and assert on them.
|
|
8
|
-
#
|
|
9
|
-
# Descendants of this class are in charge of setting the required rules to
|
|
10
|
-
# correctly intercept the target requests.
|
|
11
|
-
#
|
|
12
|
-
# Currently it is only used by SendRequestWithXml.
|
|
13
|
-
class Server < Sinatra::Base
|
|
14
|
-
@payload_was_valid = false
|
|
15
|
-
@request_received = false
|
|
16
|
-
|
|
17
|
-
class << self
|
|
18
|
-
# Set whether the payload met the matcher constraints.
|
|
19
|
-
# @param value [Boolean]
|
|
20
|
-
attr_writer :payload_was_valid
|
|
21
|
-
|
|
22
|
-
# Set whether a request was received at all.
|
|
23
|
-
# @param value [Boolean]
|
|
24
|
-
attr_writer :request_received
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Whether the payload met the matcher constraints.
|
|
28
|
-
# @return [Boolean] `false` by default.
|
|
29
|
-
def self.payload_was_valid?
|
|
30
|
-
@payload_was_valid
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Whether a request was received at all.
|
|
34
|
-
# @return [Boolean] `false` by default.
|
|
35
|
-
def self.request_received?
|
|
36
|
-
@request_received
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|