pact-mock_service 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 +5 -13
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/CHANGELOG.md +4 -0
- data/lib/pact/consumer/mock_service/interaction_post.rb +3 -2
- data/lib/pact/consumer/mock_service/interaction_replay.rb +5 -4
- data/lib/pact/consumer/mock_service_client.rb +10 -2
- data/lib/pact/consumer_contract/consumer_contract_decorator.rb +33 -0
- data/lib/pact/consumer_contract/consumer_contract_writer.rb +41 -8
- data/lib/pact/consumer_contract/interaction_decorator.rb +43 -0
- data/lib/pact/consumer_contract/request_decorator.rb +69 -0
- data/lib/pact/consumer_contract/response_decorator.rb +29 -0
- data/lib/pact/mock_service/interaction_decorator.rb +48 -0
- data/lib/pact/mock_service/request_decorator.rb +36 -0
- data/lib/pact/mock_service/response_decorator.rb +31 -0
- data/lib/pact/mock_service/version.rb +1 -1
- data/pact-mock-service.gemspec +1 -3
- data/spec/lib/pact/consumer/mock_service_client_spec.rb +1 -1
- data/spec/lib/pact/consumer_contract/consumer_contract_writer_spec.rb +2 -2
- data/spec/lib/pact/consumer_contract/request_decorator_spec.rb +80 -0
- data/spec/lib/pact/consumer_contract/response_decorator_spec.rb +10 -0
- data/spec/lib/pact/mock_service/interaction_decorator_spec.rb +74 -0
- data/spec/lib/pact/mock_service/request_decorator_spec.rb +76 -0
- data/spec/lib/pact/mock_service/response_decorator_spec.rb +12 -0
- data/spec/support/shared_examples_for_response_decorator.rb +25 -0
- metadata +54 -26
- data/Gemfile.lock +0 -100
- data/lib/pact/consumer/mock_service_interaction_expectation.rb +0 -37
- data/lib/pact/consumer/request.rb +0 -27
- data/spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb +0 -54
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZDgyMzllNDQ5MTc1NDlkNjRhZmQyYzU1ZTRiM2M5N2JkYjRkNWUxMA==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d4d778c67c786242b411bfeb2ea68de4d8a8ba02
|
4
|
+
data.tar.gz: be3a2b3caab987b807e6844f35311450e51b5a7f
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
YmM3MWU1OWY2NTg4MGRiYWU2OWM4NDZjYjlhNGQwNzRlMDA0M2QyMDk3Nzdj
|
11
|
-
NTA4MGI0YzAzOTg5ZWI5OTczNThkNzE3MWJhYmFmZTNjZjQxZGQ=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MDQxMWZmNGI3YjI5NmM1ZDk4Yzc3YjkyM2U5Y2Q3OGE2NWMwYWE3ZGFkMjVi
|
14
|
-
Y2ZlZTU5N2U5ZjM4YTEwMTVmNjFhNmJmNGU3ZTE0NjhjYTI2MzExOTY2ZmVm
|
15
|
-
ZGZmYzRjZTdhZjJlZTE5MjA5OGE4NzQxZWU1MzA4YzAzNWU5MTg=
|
6
|
+
metadata.gz: 77f56fc00125a93dc33d68e7ec16c1355393fa05f30b89df2370000b794ebe0d6a245d11c35476155c1934f29a09df1b7aec9a5e772996919d4573df6f9702d0
|
7
|
+
data.tar.gz: b3b60e97d6553ce8318bbe71e76c681263fed8598fe5cf22e25db38a0be6ac1704c4cad12ef7f169706b8d9e8ddfd5727a12eff13d6e55ca8bddf247e6d92ff8
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,3 +2,7 @@ Do this to generate your change history
|
|
2
2
|
|
3
3
|
git log --pretty=format:' * %h - %s (%an, %ad)'
|
4
4
|
|
5
|
+
### 0.1.0 (22 October 2014)
|
6
|
+
|
7
|
+
* 62caf8e - Removed Gemfile.lock from git (bethesque, Wed Oct 22 13:07:54 2014 +1100)
|
8
|
+
* 5b4d54e - Moved JSON serialisation code into decorators. Serialisation between DSL and mock service is different from serialisation to the pact file. (bethesque, Wed Oct 22 13:07:00 2014 +1100)
|
@@ -20,10 +20,11 @@ module Pact
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def respond env
|
23
|
-
|
23
|
+
request_body = env['rack.input'].string
|
24
|
+
interaction = Interaction.from_hash(JSON.load(request_body))
|
24
25
|
interaction_list.add interaction
|
25
26
|
logger.info "Registered expected interaction #{interaction.request.method_and_path}"
|
26
|
-
logger.debug JSON.pretty_generate JSON.parse(
|
27
|
+
logger.debug JSON.pretty_generate JSON.parse(request_body)
|
27
28
|
[200, {}, ['Added interaction']]
|
28
29
|
end
|
29
30
|
end
|
@@ -3,6 +3,7 @@ require 'pact/consumer/mock_service/rack_request_helper'
|
|
3
3
|
require 'pact/consumer/mock_service/interaction_mismatch'
|
4
4
|
require 'pact/consumer_contract'
|
5
5
|
require 'pact/consumer/interactions_filter'
|
6
|
+
require 'pact/mock_service/response_decorator'
|
6
7
|
|
7
8
|
module Pact
|
8
9
|
module Consumer
|
@@ -37,7 +38,7 @@ module Pact
|
|
37
38
|
def find_response request_hash
|
38
39
|
actual_request = Request::Actual.from_hash(request_hash)
|
39
40
|
logger.info "Received request #{actual_request.method_and_path}"
|
40
|
-
logger.debug pretty_generate
|
41
|
+
logger.debug pretty_generate request_hash
|
41
42
|
candidate_interactions = interaction_list.find_candidate_interactions actual_request
|
42
43
|
matching_interactions = find_matching_interactions actual_request, from: candidate_interactions
|
43
44
|
|
@@ -61,7 +62,7 @@ module Pact
|
|
61
62
|
add_verified_interaction interaction
|
62
63
|
response = response_from(interaction.response)
|
63
64
|
logger.info "Found matching response for #{interaction.request.method_and_path}"
|
64
|
-
logger.debug pretty_generate(interaction.response)
|
65
|
+
logger.debug pretty_generate(Pact::MockService::ResponseDecorator.new(interaction.response))
|
65
66
|
response
|
66
67
|
end
|
67
68
|
|
@@ -76,7 +77,7 @@ module Pact
|
|
76
77
|
def handle_more_than_one_matching_interaction actual_request, matching_interactions
|
77
78
|
logger.error "Multiple interactions found for #{actual_request.method_and_path}:"
|
78
79
|
matching_interactions.each do | interaction |
|
79
|
-
logger.debug pretty_generate(interaction)
|
80
|
+
logger.debug pretty_generate(Pact::MockService::InteractionDecorator.new(interaction))
|
80
81
|
end
|
81
82
|
multiple_interactions_found_response actual_request, matching_interactions
|
82
83
|
end
|
@@ -88,7 +89,7 @@ module Pact
|
|
88
89
|
def request_summary_for interaction
|
89
90
|
summary = {:description => interaction.description}
|
90
91
|
summary[:provider_state] if interaction.provider_state
|
91
|
-
summary[:request] = interaction.request
|
92
|
+
summary[:request] = Pact::MockService::RequestDecorator.new(interaction.request)
|
92
93
|
summary
|
93
94
|
end
|
94
95
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'net/http'
|
2
|
-
require 'pact/
|
2
|
+
require 'pact/mock_service/interaction_decorator'
|
3
3
|
|
4
4
|
module Pact
|
5
5
|
module Consumer
|
@@ -32,7 +32,11 @@ module Pact
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def add_expected_interaction interaction
|
35
|
-
response = http.request_post(
|
35
|
+
response = http.request_post(
|
36
|
+
'/interactions',
|
37
|
+
interaction_json(interaction),
|
38
|
+
MOCK_SERVICE_ADMINISTRATON_HEADERS.merge("Content-Type" => "application/json")
|
39
|
+
)
|
36
40
|
raise "\e[31m#{response.body}\e[m" unless response.is_a? Net::HTTPSuccess
|
37
41
|
end
|
38
42
|
|
@@ -60,6 +64,10 @@ module Pact
|
|
60
64
|
end
|
61
65
|
end
|
62
66
|
|
67
|
+
def interaction_json interaction
|
68
|
+
Pact::MockService::InteractionDecorator.new(interaction).to_json
|
69
|
+
end
|
70
|
+
|
63
71
|
end
|
64
72
|
end
|
65
73
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'pact/shared/active_support_support'
|
2
|
+
require 'pact/consumer_contract/interaction_decorator'
|
3
|
+
|
4
|
+
module Pact
|
5
|
+
class ConsumerContractDecorator
|
6
|
+
|
7
|
+
include ActiveSupportSupport
|
8
|
+
|
9
|
+
def initialize consumer_contract
|
10
|
+
@consumer_contract = consumer_contract
|
11
|
+
end
|
12
|
+
|
13
|
+
def as_json(options = {})
|
14
|
+
fix_all_the_things(
|
15
|
+
consumer: consumer_contract.consumer.as_json,
|
16
|
+
provider: consumer_contract.provider.as_json,
|
17
|
+
interactions: consumer_contract.interactions.collect{ |i| InteractionDecorator.new(i).as_json},
|
18
|
+
metadata: {
|
19
|
+
pactSpecificationVersion: "1.0.0"
|
20
|
+
}
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_json(options = {})
|
25
|
+
as_json.to_json(options)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :consumer_contract
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -1,12 +1,17 @@
|
|
1
1
|
require 'pact/consumer_contract'
|
2
2
|
require 'pact/consumer/interactions_filter'
|
3
3
|
require 'pact/consumer_contract/file_name'
|
4
|
+
require 'pact/consumer_contract/pact_file'
|
5
|
+
require 'pact/consumer_contract/consumer_contract_decorator'
|
6
|
+
require 'pact/shared/active_support_support'
|
4
7
|
|
5
8
|
module Pact
|
6
9
|
|
7
10
|
class ConsumerContractWriter
|
8
11
|
|
9
|
-
|
12
|
+
include Pact::FileName
|
13
|
+
include Pact::PactFile
|
14
|
+
include ActiveSupportSupport
|
10
15
|
|
11
16
|
def initialize consumer_contract_details, logger
|
12
17
|
@logger = logger
|
@@ -23,13 +28,37 @@ module Pact
|
|
23
28
|
end
|
24
29
|
|
25
30
|
def write
|
26
|
-
|
27
|
-
|
31
|
+
update_pactfile
|
32
|
+
pact_json
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :consumer_contract_details, :pactfile_write_mode, :interactions, :logger
|
38
|
+
|
39
|
+
def pactfile_path
|
40
|
+
raise 'You must specify a consumer and provider name' unless (consumer_name && provider_name)
|
41
|
+
file_path consumer_name, provider_name, Pact.configuration.pact_dir
|
42
|
+
end
|
43
|
+
|
44
|
+
def update_pactfile
|
45
|
+
logger.debug "Updating pact file for #{provider_name} at #{pactfile_path}"
|
46
|
+
File.open(pactfile_path, 'w') do |f|
|
47
|
+
f.write pact_json
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def pact_json
|
52
|
+
@pact_json ||= fix_json_formatting(JSON.pretty_generate(decorated_pact))
|
53
|
+
end
|
54
|
+
|
55
|
+
def decorated_pact
|
56
|
+
@decorated_pact ||= Pact::ConsumerContractDecorator.new(consumer_contract)
|
28
57
|
end
|
29
58
|
|
30
59
|
def interactions_for_new_consumer_contract
|
31
60
|
if pactfile_write_mode == :update
|
32
|
-
merged_interactions = existing_interactions
|
61
|
+
merged_interactions = existing_interactions.dup
|
33
62
|
filter = Consumer::UpdatableInteractionsFilter.new(merged_interactions)
|
34
63
|
interactions.each {|i| filter << i }
|
35
64
|
merged_interactions
|
@@ -62,10 +91,6 @@ module Pact
|
|
62
91
|
File.exist?(pactfile_path)
|
63
92
|
end
|
64
93
|
|
65
|
-
def pactfile_path
|
66
|
-
Pact::FileName.file_path consumer_contract_details[:consumer][:name], consumer_contract_details[:provider][:name]
|
67
|
-
end
|
68
|
-
|
69
94
|
def existing_consumer_contract
|
70
95
|
Pact::ConsumerContract.from_uri(pactfile_path)
|
71
96
|
end
|
@@ -79,6 +104,14 @@ module Pact
|
|
79
104
|
$stdout.puts msg
|
80
105
|
logger.info msg
|
81
106
|
end
|
107
|
+
|
108
|
+
def consumer_name
|
109
|
+
consumer_contract_details[:consumer][:name]
|
110
|
+
end
|
111
|
+
|
112
|
+
def provider_name
|
113
|
+
consumer_contract_details[:provider][:name]
|
114
|
+
end
|
82
115
|
end
|
83
116
|
|
84
117
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'pact/shared/active_support_support'
|
2
|
+
require 'pact/consumer_contract/request_decorator'
|
3
|
+
require 'pact/consumer_contract/response_decorator'
|
4
|
+
|
5
|
+
module Pact
|
6
|
+
class InteractionDecorator
|
7
|
+
|
8
|
+
include ActiveSupportSupport
|
9
|
+
|
10
|
+
def initialize interaction
|
11
|
+
@interaction = interaction
|
12
|
+
end
|
13
|
+
|
14
|
+
def as_json options = {}
|
15
|
+
fix_all_the_things to_hash
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_json(options = {})
|
19
|
+
as_json.to_json(options)
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_hash
|
23
|
+
hash = { :description => interaction.description }
|
24
|
+
hash[:provider_state] = interaction.provider_state if interaction.provider_state
|
25
|
+
hash[:request] = decorate_request.as_json
|
26
|
+
hash[:response] = decorate_response.as_json
|
27
|
+
hash
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :interaction
|
33
|
+
|
34
|
+
def decorate_request
|
35
|
+
RequestDecorator.new(interaction.request)
|
36
|
+
end
|
37
|
+
|
38
|
+
def decorate_response
|
39
|
+
ResponseDecorator.new(interaction.response)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'pact/reification'
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
class RequestDecorator
|
5
|
+
|
6
|
+
def initialize request
|
7
|
+
@request = request
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_json(options = {})
|
11
|
+
as_json.to_json(options)
|
12
|
+
end
|
13
|
+
|
14
|
+
def as_json options = {}
|
15
|
+
to_hash
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_hash
|
19
|
+
hash = {
|
20
|
+
method: request.method,
|
21
|
+
path: request.path,
|
22
|
+
}
|
23
|
+
hash[:query] = query if request.specified?(:query)
|
24
|
+
hash[:headers] = request.headers if request.specified?(:headers)
|
25
|
+
hash[:body] = body if request.specified?(:body)
|
26
|
+
hash
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :request
|
32
|
+
|
33
|
+
# This feels wrong to be checking the class type of the Query
|
34
|
+
# Do this better somehow.
|
35
|
+
def query
|
36
|
+
if request.query.is_a?(Pact::QueryHash)
|
37
|
+
Pact::Reification.from_term(request.query)
|
38
|
+
else
|
39
|
+
request.query
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# This feels wrong to be checking the class type of the body
|
44
|
+
# Do this better somehow.
|
45
|
+
def body
|
46
|
+
if content_type_is_form && request.body.is_a?(Hash)
|
47
|
+
URI.encode_www_form convert_hash_body_to_array_of_arrays
|
48
|
+
else
|
49
|
+
request.body
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def content_type_is_form
|
54
|
+
request.content_type? 'application/x-www-form-urlencoded'
|
55
|
+
end
|
56
|
+
|
57
|
+
#This probably belongs somewhere else.
|
58
|
+
def convert_hash_body_to_array_of_arrays
|
59
|
+
arrays = []
|
60
|
+
request.body.keys.each do | key |
|
61
|
+
[*request.body[key]].each do | value |
|
62
|
+
arrays << [key, Pact::Reification.from_term(value)]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
arrays
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Pact
|
2
|
+
class ResponseDecorator
|
3
|
+
|
4
|
+
def initialize response
|
5
|
+
@response = response
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_json(options = {})
|
9
|
+
as_json.to_json(options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def as_json options = {}
|
13
|
+
to_hash
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_hash
|
17
|
+
hash = {}
|
18
|
+
hash[:status] = response.status if response.specified?(:status)
|
19
|
+
hash[:headers] = response.headers if response.specified?(:headers)
|
20
|
+
hash[:body] = response.body if response.specified?(:body)
|
21
|
+
hash
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :response
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'pact/shared/active_support_support'
|
2
|
+
require 'pact/mock_service/request_decorator'
|
3
|
+
require 'pact/mock_service/response_decorator'
|
4
|
+
|
5
|
+
# Represents the Interaction in the form required by the MockService
|
6
|
+
# The json generated will be posted to the MockService to register the expectation
|
7
|
+
|
8
|
+
module Pact
|
9
|
+
module MockService
|
10
|
+
class InteractionDecorator
|
11
|
+
|
12
|
+
include ActiveSupportSupport
|
13
|
+
|
14
|
+
def initialize interaction
|
15
|
+
@interaction = interaction
|
16
|
+
end
|
17
|
+
|
18
|
+
def as_json options = {}
|
19
|
+
fix_all_the_things to_hash
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_json(options = {})
|
23
|
+
as_json.to_json(options)
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_hash
|
27
|
+
hash = { :description => interaction.description }
|
28
|
+
hash[:provider_state] = interaction.provider_state if interaction.provider_state
|
29
|
+
hash[:request] = decorate_request.as_json
|
30
|
+
hash[:response] = decorate_response.as_json
|
31
|
+
hash
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
attr_reader :interaction
|
37
|
+
|
38
|
+
def decorate_request
|
39
|
+
RequestDecorator.new(interaction.request)
|
40
|
+
end
|
41
|
+
|
42
|
+
def decorate_response
|
43
|
+
ResponseDecorator.new(interaction.response)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Pact
|
2
|
+
module MockService
|
3
|
+
class RequestDecorator
|
4
|
+
|
5
|
+
def initialize request
|
6
|
+
@request = request
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_json(options = {})
|
10
|
+
as_json.to_json(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def as_json options = {}
|
14
|
+
to_hash
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_hash
|
18
|
+
hash = {
|
19
|
+
method: request.method,
|
20
|
+
path: request.path,
|
21
|
+
}
|
22
|
+
|
23
|
+
hash[:query] = request.query if request.specified?(:query)
|
24
|
+
hash[:headers] = request.headers if request.specified?(:headers)
|
25
|
+
hash[:body] = request.body if request.specified?(:body)
|
26
|
+
hash[:options] = request.options if request.options.any?
|
27
|
+
hash
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :request
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Pact
|
2
|
+
module MockService
|
3
|
+
class ResponseDecorator
|
4
|
+
|
5
|
+
def initialize response
|
6
|
+
@response = response
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_json(options = {})
|
10
|
+
as_json.to_json(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def as_json options = {}
|
14
|
+
to_hash
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_hash
|
18
|
+
hash = {}
|
19
|
+
hash[:status] = response.status if response.specified?(:status)
|
20
|
+
hash[:headers] = response.headers if response.specified?(:headers)
|
21
|
+
hash[:body] = response.body if response.specified?(:body)
|
22
|
+
hash
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :response
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/pact-mock-service.gemspec
CHANGED
@@ -27,9 +27,7 @@ Gem::Specification.new do |gem|
|
|
27
27
|
gem.add_runtime_dependency 'webrick'
|
28
28
|
gem.add_runtime_dependency 'term-ansicolor', '~> 1.0'
|
29
29
|
|
30
|
-
|
31
|
-
gem.add_runtime_dependency 'pact-support', '~> 0.0.1'
|
32
|
-
end
|
30
|
+
gem.add_runtime_dependency 'pact-support', '~> 0.1.1'
|
33
31
|
|
34
32
|
gem.add_development_dependency 'rake', '~> 10.0.3'
|
35
33
|
gem.add_development_dependency 'webmock', '~> 1.18.0'
|
@@ -11,7 +11,7 @@ module Pact
|
|
11
11
|
|
12
12
|
describe "#add_expected_interaction" do
|
13
13
|
let(:interaction) { InteractionFactory.create }
|
14
|
-
let(:request_body) {
|
14
|
+
let(:request_body) { Pact::MockService::InteractionDecorator.new(interaction).to_json }
|
15
15
|
|
16
16
|
context "when successful" do
|
17
17
|
let!(:post_interaction) do
|
@@ -100,8 +100,8 @@ module Pact
|
|
100
100
|
end
|
101
101
|
|
102
102
|
describe "write" do
|
103
|
-
it "writes the pact file" do
|
104
|
-
expect_any_instance_of(
|
103
|
+
it "writes the pact file, this is a useless test" do
|
104
|
+
expect_any_instance_of(ConsumerContractWriter).to receive(:update_pactfile)
|
105
105
|
consumer_contract_writer.write
|
106
106
|
end
|
107
107
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/consumer_contract/request_decorator'
|
3
|
+
require 'pact/consumer/request'
|
4
|
+
|
5
|
+
module Pact
|
6
|
+
describe RequestDecorator do
|
7
|
+
|
8
|
+
let(:options) { {some: 'opts'} }
|
9
|
+
let(:body) { {some: "bod"} }
|
10
|
+
let(:headers) { {some: "header"} }
|
11
|
+
let(:query) { "param=foo" }
|
12
|
+
let(:request_params) do
|
13
|
+
{
|
14
|
+
method: :get,
|
15
|
+
query: query,
|
16
|
+
headers: headers,
|
17
|
+
path: "/",
|
18
|
+
body: body
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:request) { Pact::Request::Expected.from_hash(request_params) }
|
23
|
+
|
24
|
+
subject { RequestDecorator.new(request) }
|
25
|
+
|
26
|
+
describe "#to_json" do
|
27
|
+
|
28
|
+
let(:parsed_json) { JSON.parse subject.to_json, symbolize_names: true }
|
29
|
+
|
30
|
+
it "renders the keys in a meaningful order" do
|
31
|
+
expect(subject.to_json).to match(/method.*path.*query.*headers.*body/)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "does not render the options" do
|
35
|
+
expect(subject.to_json).to_not include('options')
|
36
|
+
end
|
37
|
+
|
38
|
+
context "with a query hash containing a Pact::Term" do
|
39
|
+
let(:query) { { param: Pact::Term.new(generate: 'apple', matcher: /a/) } }
|
40
|
+
|
41
|
+
it "reifies the query for backwards compatibility with pact-specification 1.0.0" do
|
42
|
+
expect(parsed_json[:query]).to eq "param=apple"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "with a Pact::Term query" do
|
47
|
+
let(:query) { Pact::Term.new(generate: 'param=apple', matcher: /param=a/) }
|
48
|
+
|
49
|
+
it "serialises the Pact::Term to Ruby specific JSON that is not compatible with pact-specification 1.0.0" do
|
50
|
+
expect(subject.to_json).to include "Pact::Term"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "with a Content-Type of form and body specified as a hash with a Pact::Term" do
|
55
|
+
let(:headers) { { 'Content-Type' => 'application/x-www-form-urlencoded' } }
|
56
|
+
let(:body) { {"param" => Pact::Term.new(generate: 'apple', matcher: /a/ )} }
|
57
|
+
|
58
|
+
it "reifies the body for backwards compatibility with pact-specification 1.0.0" do
|
59
|
+
expect(parsed_json[:body]).to eq "param=apple"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "with a Content-Type of form and body specified as a hash with an array value" do
|
64
|
+
let(:headers) { { 'Content-Type' => 'application/x-www-form-urlencoded' } }
|
65
|
+
let(:body) { {"param" => ['pear', Pact::Term.new(generate: 'apple', matcher: /a/ )] } }
|
66
|
+
|
67
|
+
it "reifies the body for backwards compatibility with pact-specification 1.0.0" do
|
68
|
+
expect(parsed_json[:body]).to eq "param=pear¶m=apple"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "with no Content-Type and a body specified as a Hash" do
|
73
|
+
it "renders the body as JSON" do
|
74
|
+
expect(parsed_json[:body]).to eq body
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/mock_service/interaction_decorator'
|
3
|
+
|
4
|
+
module Pact
|
5
|
+
module MockService
|
6
|
+
describe InteractionDecorator do
|
7
|
+
|
8
|
+
describe "#to_json" do
|
9
|
+
|
10
|
+
let(:request) do
|
11
|
+
{
|
12
|
+
method: 'post',
|
13
|
+
path: '/foo',
|
14
|
+
body: Term.new(generate: 'waffle', matcher: /ffl/),
|
15
|
+
headers: { 'Content-Type' => 'application/json' },
|
16
|
+
query: '',
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:response) do
|
21
|
+
{ body: { baz: /qux/, wiffle: Term.new(generate: 'wiffle', matcher: /iff/) } }
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:interaction) do
|
25
|
+
Interaction.from_hash(
|
26
|
+
'description' => 'description',
|
27
|
+
'provider_state' => 'provider_state',
|
28
|
+
'response' => response,
|
29
|
+
'request' => request)
|
30
|
+
end
|
31
|
+
|
32
|
+
subject { InteractionDecorator.new(interaction) }
|
33
|
+
|
34
|
+
let(:parsed_result) do
|
35
|
+
JSON.load(subject.to_json)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "contains the request" do
|
39
|
+
expect(parsed_result).to have_key('request')
|
40
|
+
end
|
41
|
+
|
42
|
+
it "contains the response" do
|
43
|
+
expect(parsed_result).to have_key('request')
|
44
|
+
end
|
45
|
+
|
46
|
+
it "contains the description" do
|
47
|
+
expect(parsed_result['description']).to eq 'description'
|
48
|
+
end
|
49
|
+
|
50
|
+
context "with a provider state" do
|
51
|
+
it "contains the provider_state" do
|
52
|
+
expect(parsed_result['provider_state']).to eq 'provider_state'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "without a provider state" do
|
57
|
+
|
58
|
+
let(:interaction) do
|
59
|
+
Interaction.from_hash(
|
60
|
+
'description' => 'description',
|
61
|
+
'response' => response,
|
62
|
+
'request' => request)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "does not contain the provider_state" do
|
66
|
+
expect(parsed_result).to_not have_key 'provider_state'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/mock_service/request_decorator'
|
3
|
+
require 'pact/consumer_contract/request'
|
4
|
+
|
5
|
+
|
6
|
+
module Pact
|
7
|
+
module MockService
|
8
|
+
describe RequestDecorator do
|
9
|
+
|
10
|
+
let(:options) { {} }
|
11
|
+
let(:body) { {some: "bod"} }
|
12
|
+
let(:headers) { {some: "header"} }
|
13
|
+
let(:request_params) do
|
14
|
+
{
|
15
|
+
method: :get,
|
16
|
+
query: "param=foo",
|
17
|
+
headers: headers,
|
18
|
+
path: "/",
|
19
|
+
body: body
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:request) { Pact::Request::Expected.from_hash(request_params) }
|
24
|
+
|
25
|
+
subject { RequestDecorator.new(request) }
|
26
|
+
|
27
|
+
describe "#to_json" do
|
28
|
+
|
29
|
+
let(:parsed_json) { JSON.parse subject.to_json, symbolize_names: true}
|
30
|
+
|
31
|
+
it "renders the keys in a meaningful order" do
|
32
|
+
expect(subject.to_json).to match(/method.*path.*query.*headers.*body/)
|
33
|
+
end
|
34
|
+
|
35
|
+
context "with a body specified as a Hash" do
|
36
|
+
it "serialises the body as a Hash" do
|
37
|
+
expect(parsed_json[:body]).to eq body
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with a body specified as a Hash containing a Pact::Term" do
|
42
|
+
let(:body) { { some: Pact::Term.new(generate: 'apple', matcher: /a/) } }
|
43
|
+
|
44
|
+
it "serialises the Pact::Term to Ruby specific JSON that is not compatible with pact-specification 1.0.0" do
|
45
|
+
expect(subject.to_json).to include "Pact::Term"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#as_json" do
|
51
|
+
context "without options" do
|
52
|
+
it "does not include the options key" do
|
53
|
+
expect(subject.as_json.key?(:options)).to be false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "with options" do
|
58
|
+
let(:request_params) do
|
59
|
+
{
|
60
|
+
method: :get,
|
61
|
+
path: "/",
|
62
|
+
options: options
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
let(:options) { {:opts => 'blah'} }
|
67
|
+
|
68
|
+
it "includes the options in the request hash" do
|
69
|
+
expect(subject.as_json[:options]).to eq options
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'pact/consumer_contract/response'
|
2
|
+
|
3
|
+
shared_examples_for "request decorator to_json" do
|
4
|
+
|
5
|
+
describe "#to_json" do
|
6
|
+
|
7
|
+
let(:response) { Pact::Response.new(status: 200, body: body) }
|
8
|
+
let(:body) { { baz: /qux/, wiffle: Pact::Term.new(generate: 'wiffle', matcher: /iff/) } }
|
9
|
+
|
10
|
+
let(:decorator) { described_class.new(response) }
|
11
|
+
|
12
|
+
subject { JSON.load decorator.to_json }
|
13
|
+
|
14
|
+
it "serialises regexes" do
|
15
|
+
expect(subject['body']['baz']).to eql /qux/
|
16
|
+
end
|
17
|
+
|
18
|
+
it "serialises terms" do
|
19
|
+
parsed_term = subject['body']['wiffle']
|
20
|
+
expect(parsed_term.matcher).to eql /iff/
|
21
|
+
expect(parsed_term.generate).to eql 'wiffle'
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact-mock_service
|
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
|
- James Fraser
|
@@ -12,34 +12,34 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2014-10-
|
15
|
+
date: 2014-10-22 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rack
|
19
19
|
requirement: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
|
-
- -
|
21
|
+
- - '>='
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: '0'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- -
|
28
|
+
- - '>='
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: '0'
|
31
31
|
- !ruby/object:Gem::Dependency
|
32
32
|
name: rspec
|
33
33
|
requirement: !ruby/object:Gem::Requirement
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
37
|
version: '2.14'
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
|
-
- -
|
42
|
+
- - '>='
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
version: '2.14'
|
45
45
|
- !ruby/object:Gem::Dependency
|
@@ -88,42 +88,42 @@ dependencies:
|
|
88
88
|
name: thor
|
89
89
|
requirement: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
|
-
- -
|
91
|
+
- - '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
94
|
type: :runtime
|
95
95
|
prerelease: false
|
96
96
|
version_requirements: !ruby/object:Gem::Requirement
|
97
97
|
requirements:
|
98
|
-
- -
|
98
|
+
- - '>='
|
99
99
|
- !ruby/object:Gem::Version
|
100
100
|
version: '0'
|
101
101
|
- !ruby/object:Gem::Dependency
|
102
102
|
name: json
|
103
103
|
requirement: !ruby/object:Gem::Requirement
|
104
104
|
requirements:
|
105
|
-
- -
|
105
|
+
- - '>='
|
106
106
|
- !ruby/object:Gem::Version
|
107
107
|
version: '0'
|
108
108
|
type: :runtime
|
109
109
|
prerelease: false
|
110
110
|
version_requirements: !ruby/object:Gem::Requirement
|
111
111
|
requirements:
|
112
|
-
- -
|
112
|
+
- - '>='
|
113
113
|
- !ruby/object:Gem::Version
|
114
114
|
version: '0'
|
115
115
|
- !ruby/object:Gem::Dependency
|
116
116
|
name: webrick
|
117
117
|
requirement: !ruby/object:Gem::Requirement
|
118
118
|
requirements:
|
119
|
-
- -
|
119
|
+
- - '>='
|
120
120
|
- !ruby/object:Gem::Version
|
121
121
|
version: '0'
|
122
122
|
type: :runtime
|
123
123
|
prerelease: false
|
124
124
|
version_requirements: !ruby/object:Gem::Requirement
|
125
125
|
requirements:
|
126
|
-
- -
|
126
|
+
- - '>='
|
127
127
|
- !ruby/object:Gem::Version
|
128
128
|
version: '0'
|
129
129
|
- !ruby/object:Gem::Dependency
|
@@ -140,6 +140,20 @@ dependencies:
|
|
140
140
|
- - ~>
|
141
141
|
- !ruby/object:Gem::Version
|
142
142
|
version: '1.0'
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
name: pact-support
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 0.1.1
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ~>
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: 0.1.1
|
143
157
|
- !ruby/object:Gem::Dependency
|
144
158
|
name: rake
|
145
159
|
requirement: !ruby/object:Gem::Requirement
|
@@ -172,14 +186,14 @@ dependencies:
|
|
172
186
|
name: pry
|
173
187
|
requirement: !ruby/object:Gem::Requirement
|
174
188
|
requirements:
|
175
|
-
- -
|
189
|
+
- - '>='
|
176
190
|
- !ruby/object:Gem::Version
|
177
191
|
version: '0'
|
178
192
|
type: :development
|
179
193
|
prerelease: false
|
180
194
|
version_requirements: !ruby/object:Gem::Requirement
|
181
195
|
requirements:
|
182
|
-
- -
|
196
|
+
- - '>='
|
183
197
|
- !ruby/object:Gem::Version
|
184
198
|
version: '0'
|
185
199
|
- !ruby/object:Gem::Dependency
|
@@ -214,28 +228,28 @@ dependencies:
|
|
214
228
|
name: activesupport
|
215
229
|
requirement: !ruby/object:Gem::Requirement
|
216
230
|
requirements:
|
217
|
-
- -
|
231
|
+
- - '>='
|
218
232
|
- !ruby/object:Gem::Version
|
219
233
|
version: '0'
|
220
234
|
type: :development
|
221
235
|
prerelease: false
|
222
236
|
version_requirements: !ruby/object:Gem::Requirement
|
223
237
|
requirements:
|
224
|
-
- -
|
238
|
+
- - '>='
|
225
239
|
- !ruby/object:Gem::Version
|
226
240
|
version: '0'
|
227
241
|
- !ruby/object:Gem::Dependency
|
228
242
|
name: faraday
|
229
243
|
requirement: !ruby/object:Gem::Requirement
|
230
244
|
requirements:
|
231
|
-
- -
|
245
|
+
- - '>='
|
232
246
|
- !ruby/object:Gem::Version
|
233
247
|
version: '0'
|
234
248
|
type: :development
|
235
249
|
prerelease: false
|
236
250
|
version_requirements: !ruby/object:Gem::Requirement
|
237
251
|
requirements:
|
238
|
-
- -
|
252
|
+
- - '>='
|
239
253
|
- !ruby/object:Gem::Version
|
240
254
|
version: '0'
|
241
255
|
description:
|
@@ -255,7 +269,6 @@ files:
|
|
255
269
|
- .travis.yml
|
256
270
|
- CHANGELOG.md
|
257
271
|
- Gemfile
|
258
|
-
- Gemfile.lock
|
259
272
|
- LICENSE.txt
|
260
273
|
- README.md
|
261
274
|
- Rakefile
|
@@ -276,12 +289,17 @@ files:
|
|
276
289
|
- lib/pact/consumer/mock_service/rack_request_helper.rb
|
277
290
|
- lib/pact/consumer/mock_service/verification_get.rb
|
278
291
|
- lib/pact/consumer/mock_service_client.rb
|
279
|
-
- lib/pact/consumer/mock_service_interaction_expectation.rb
|
280
|
-
- lib/pact/consumer/request.rb
|
281
292
|
- lib/pact/consumer/server.rb
|
293
|
+
- lib/pact/consumer_contract/consumer_contract_decorator.rb
|
282
294
|
- lib/pact/consumer_contract/consumer_contract_writer.rb
|
295
|
+
- lib/pact/consumer_contract/interaction_decorator.rb
|
296
|
+
- lib/pact/consumer_contract/request_decorator.rb
|
297
|
+
- lib/pact/consumer_contract/response_decorator.rb
|
283
298
|
- lib/pact/mock_service.rb
|
284
299
|
- lib/pact/mock_service/cli.rb
|
300
|
+
- lib/pact/mock_service/interaction_decorator.rb
|
301
|
+
- lib/pact/mock_service/request_decorator.rb
|
302
|
+
- lib/pact/mock_service/response_decorator.rb
|
285
303
|
- lib/pact/mock_service/version.rb
|
286
304
|
- pact-mock-service.gemspec
|
287
305
|
- spec/lib/pact/consumer/app_manager_spec.rb
|
@@ -292,9 +310,13 @@ files:
|
|
292
310
|
- spec/lib/pact/consumer/mock_service/rack_request_helper_spec.rb
|
293
311
|
- spec/lib/pact/consumer/mock_service/verification_get_spec.rb
|
294
312
|
- spec/lib/pact/consumer/mock_service_client_spec.rb
|
295
|
-
- spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb
|
296
313
|
- spec/lib/pact/consumer/service_consumer_spec.rb
|
297
314
|
- spec/lib/pact/consumer_contract/consumer_contract_writer_spec.rb
|
315
|
+
- spec/lib/pact/consumer_contract/request_decorator_spec.rb
|
316
|
+
- spec/lib/pact/consumer_contract/response_decorator_spec.rb
|
317
|
+
- spec/lib/pact/mock_service/interaction_decorator_spec.rb
|
318
|
+
- spec/lib/pact/mock_service/request_decorator_spec.rb
|
319
|
+
- spec/lib/pact/mock_service/response_decorator_spec.rb
|
298
320
|
- spec/spec_helper.rb
|
299
321
|
- spec/support/a_consumer-a_producer.json
|
300
322
|
- spec/support/a_consumer-a_provider.json
|
@@ -315,6 +337,7 @@ files:
|
|
315
337
|
- spec/support/options_app.rb
|
316
338
|
- spec/support/pact_helper.rb
|
317
339
|
- spec/support/shared_examples_for_request.rb
|
340
|
+
- spec/support/shared_examples_for_response_decorator.rb
|
318
341
|
- spec/support/spec_support.rb
|
319
342
|
- spec/support/stubbing.json
|
320
343
|
- spec/support/stubbing_using_allow.rb
|
@@ -333,17 +356,17 @@ require_paths:
|
|
333
356
|
- lib
|
334
357
|
required_ruby_version: !ruby/object:Gem::Requirement
|
335
358
|
requirements:
|
336
|
-
- -
|
359
|
+
- - '>='
|
337
360
|
- !ruby/object:Gem::Version
|
338
361
|
version: '0'
|
339
362
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
340
363
|
requirements:
|
341
|
-
- -
|
364
|
+
- - '>='
|
342
365
|
- !ruby/object:Gem::Version
|
343
366
|
version: '0'
|
344
367
|
requirements: []
|
345
368
|
rubyforge_project:
|
346
|
-
rubygems_version: 2.
|
369
|
+
rubygems_version: 2.0.14
|
347
370
|
signing_key:
|
348
371
|
specification_version: 4
|
349
372
|
summary: Provides a mock service for use with Pact
|
@@ -356,9 +379,13 @@ test_files:
|
|
356
379
|
- spec/lib/pact/consumer/mock_service/rack_request_helper_spec.rb
|
357
380
|
- spec/lib/pact/consumer/mock_service/verification_get_spec.rb
|
358
381
|
- spec/lib/pact/consumer/mock_service_client_spec.rb
|
359
|
-
- spec/lib/pact/consumer/mock_service_interaction_expectation_spec.rb
|
360
382
|
- spec/lib/pact/consumer/service_consumer_spec.rb
|
361
383
|
- spec/lib/pact/consumer_contract/consumer_contract_writer_spec.rb
|
384
|
+
- spec/lib/pact/consumer_contract/request_decorator_spec.rb
|
385
|
+
- spec/lib/pact/consumer_contract/response_decorator_spec.rb
|
386
|
+
- spec/lib/pact/mock_service/interaction_decorator_spec.rb
|
387
|
+
- spec/lib/pact/mock_service/request_decorator_spec.rb
|
388
|
+
- spec/lib/pact/mock_service/response_decorator_spec.rb
|
362
389
|
- spec/spec_helper.rb
|
363
390
|
- spec/support/a_consumer-a_producer.json
|
364
391
|
- spec/support/a_consumer-a_provider.json
|
@@ -379,6 +406,7 @@ test_files:
|
|
379
406
|
- spec/support/options_app.rb
|
380
407
|
- spec/support/pact_helper.rb
|
381
408
|
- spec/support/shared_examples_for_request.rb
|
409
|
+
- spec/support/shared_examples_for_response_decorator.rb
|
382
410
|
- spec/support/spec_support.rb
|
383
411
|
- spec/support/stubbing.json
|
384
412
|
- spec/support/stubbing_using_allow.rb
|
data/Gemfile.lock
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
pact-mock_service (0.0.1)
|
5
|
-
awesome_print (~> 1.1)
|
6
|
-
find_a_port (~> 1.0.1)
|
7
|
-
json
|
8
|
-
rack
|
9
|
-
rack-test (~> 0.6.2)
|
10
|
-
rspec (>= 2.14)
|
11
|
-
term-ansicolor (~> 1.0)
|
12
|
-
thor
|
13
|
-
webrick
|
14
|
-
|
15
|
-
PATH
|
16
|
-
remote: ../pact-support
|
17
|
-
specs:
|
18
|
-
pact-support (0.0.1)
|
19
|
-
awesome_print (~> 1.1)
|
20
|
-
find_a_port (~> 1.0.1)
|
21
|
-
json
|
22
|
-
rack-test (~> 0.6.2)
|
23
|
-
randexp (~> 0.1.7)
|
24
|
-
rspec (>= 2.14)
|
25
|
-
term-ansicolor (~> 1.0)
|
26
|
-
thor
|
27
|
-
|
28
|
-
GEM
|
29
|
-
remote: https://rubygems.org/
|
30
|
-
specs:
|
31
|
-
activesupport (4.1.1)
|
32
|
-
i18n (~> 0.6, >= 0.6.9)
|
33
|
-
json (~> 1.7, >= 1.7.7)
|
34
|
-
minitest (~> 5.1)
|
35
|
-
thread_safe (~> 0.1)
|
36
|
-
tzinfo (~> 1.1)
|
37
|
-
addressable (2.3.6)
|
38
|
-
awesome_print (1.2.0)
|
39
|
-
coderay (1.1.0)
|
40
|
-
crack (0.4.2)
|
41
|
-
safe_yaml (~> 1.0.0)
|
42
|
-
diff-lcs (1.2.5)
|
43
|
-
fakefs (0.5.2)
|
44
|
-
faraday (0.9.0)
|
45
|
-
multipart-post (>= 1.2, < 3)
|
46
|
-
find_a_port (1.0.1)
|
47
|
-
hashie (2.1.1)
|
48
|
-
i18n (0.6.9)
|
49
|
-
json (1.8.1)
|
50
|
-
method_source (0.8.2)
|
51
|
-
minitest (5.3.4)
|
52
|
-
multipart-post (2.0.0)
|
53
|
-
pry (0.10.0)
|
54
|
-
coderay (~> 1.1.0)
|
55
|
-
method_source (~> 0.8.1)
|
56
|
-
slop (~> 3.4)
|
57
|
-
rack (1.5.2)
|
58
|
-
rack-test (0.6.2)
|
59
|
-
rack (>= 1.0)
|
60
|
-
rake (10.0.4)
|
61
|
-
randexp (0.1.7)
|
62
|
-
rspec (3.1.0)
|
63
|
-
rspec-core (~> 3.1.0)
|
64
|
-
rspec-expectations (~> 3.1.0)
|
65
|
-
rspec-mocks (~> 3.1.0)
|
66
|
-
rspec-core (3.1.6)
|
67
|
-
rspec-support (~> 3.1.0)
|
68
|
-
rspec-expectations (3.1.2)
|
69
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
70
|
-
rspec-support (~> 3.1.0)
|
71
|
-
rspec-mocks (3.1.3)
|
72
|
-
rspec-support (~> 3.1.0)
|
73
|
-
rspec-support (3.1.2)
|
74
|
-
safe_yaml (1.0.3)
|
75
|
-
slop (3.5.0)
|
76
|
-
term-ansicolor (1.3.0)
|
77
|
-
tins (~> 1.0)
|
78
|
-
thor (0.19.1)
|
79
|
-
thread_safe (0.3.4)
|
80
|
-
tins (1.3.3)
|
81
|
-
tzinfo (1.2.1)
|
82
|
-
thread_safe (~> 0.1)
|
83
|
-
webmock (1.18.0)
|
84
|
-
addressable (>= 2.3.6)
|
85
|
-
crack (>= 0.3.2)
|
86
|
-
webrick (1.3.1)
|
87
|
-
|
88
|
-
PLATFORMS
|
89
|
-
ruby
|
90
|
-
|
91
|
-
DEPENDENCIES
|
92
|
-
activesupport
|
93
|
-
fakefs (~> 0.4)
|
94
|
-
faraday
|
95
|
-
hashie (~> 2.0)
|
96
|
-
pact-mock_service!
|
97
|
-
pact-support!
|
98
|
-
pry
|
99
|
-
rake (~> 10.0.3)
|
100
|
-
webmock (~> 1.18.0)
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'pact/reification'
|
2
|
-
|
3
|
-
# Represents the Interaction in the form required by the MockService
|
4
|
-
# The json generated will be posted to the MockService to register the expectation
|
5
|
-
module Pact
|
6
|
-
module Consumer
|
7
|
-
class MockServiceInteractionExpectation
|
8
|
-
|
9
|
-
|
10
|
-
def initialize interaction
|
11
|
-
@interaction = interaction
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_hash
|
15
|
-
hash = {:description => interaction.description}
|
16
|
-
hash[:provider_state] = interaction.provider_state if interaction.provider_state
|
17
|
-
options = interaction.request.options.empty? ? {} : { options: interaction.request.options}
|
18
|
-
hash[:request] = interaction.request.as_json.merge(options)
|
19
|
-
hash[:response] = interaction.response
|
20
|
-
hash
|
21
|
-
end
|
22
|
-
|
23
|
-
def as_json options = {}
|
24
|
-
to_hash
|
25
|
-
end
|
26
|
-
|
27
|
-
def to_json opts = {}
|
28
|
-
as_json.to_json(opts)
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
attr_reader :interaction
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'pact/shared/request'
|
2
|
-
require 'pact/shared/key_not_found'
|
3
|
-
|
4
|
-
module Pact
|
5
|
-
module Consumer
|
6
|
-
module Request
|
7
|
-
class Actual < Pact::Request::Base
|
8
|
-
|
9
|
-
def self.from_hash(hash)
|
10
|
-
sym_hash = symbolize_keys hash
|
11
|
-
method = sym_hash.fetch(:method)
|
12
|
-
path = sym_hash.fetch(:path)
|
13
|
-
query = sym_hash.fetch(:query)
|
14
|
-
headers = sym_hash.fetch(:headers)
|
15
|
-
body = sym_hash.fetch(:body, nil)
|
16
|
-
new(method, path, headers, body, query)
|
17
|
-
end
|
18
|
-
|
19
|
-
protected
|
20
|
-
|
21
|
-
def self.key_not_found
|
22
|
-
nil
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'pact/consumer/mock_service_interaction_expectation'
|
3
|
-
|
4
|
-
describe Pact::Consumer::MockServiceInteractionExpectation do
|
5
|
-
describe "as_json" do
|
6
|
-
|
7
|
-
let(:options ) { {} }
|
8
|
-
let(:request_as_json) { {a: 'request'} }
|
9
|
-
let(:request) { instance_double('Pact::Request::Expected', :as_json => request_as_json, :options => options)}
|
10
|
-
let(:response) { double('response') }
|
11
|
-
let(:generated_response ) { double('generated_response', :to_json => 'generated_response') }
|
12
|
-
let(:interaction) { instance_double('Pact::Interaction', :description => 'description', :request => request, :response => response, :provider_state => 'some state') }
|
13
|
-
subject { described_class.new(interaction)}
|
14
|
-
let(:expected_hash) { {:response => generated_response, :request => as_json_with_options, :description => '' } }
|
15
|
-
|
16
|
-
before do
|
17
|
-
allow(Pact::Reification).to receive(:from_term).with(response).and_return(generated_response)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "includes the response" do
|
21
|
-
expect(subject.as_json[:response]).to eq response
|
22
|
-
end
|
23
|
-
|
24
|
-
it "includes the options in the request" do
|
25
|
-
expect(subject.as_json[:request]).to eq request_as_json
|
26
|
-
end
|
27
|
-
|
28
|
-
it "includes the provider state" do
|
29
|
-
expect(subject.as_json[:provider_state]).to eq 'some state'
|
30
|
-
end
|
31
|
-
|
32
|
-
it "includes the description" do
|
33
|
-
expect(subject.as_json[:description]).to eq 'description'
|
34
|
-
end
|
35
|
-
|
36
|
-
it "doesn't have any other keys" do
|
37
|
-
expect(subject.as_json.keys).to eq [:description, :provider_state, :request, :response]
|
38
|
-
end
|
39
|
-
|
40
|
-
context "without options" do
|
41
|
-
it "does not include the options key" do
|
42
|
-
expect(subject.as_json.key?(:options)).to be false
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
context "with options" do
|
47
|
-
let(:options) { {:opts => 'blah'} }
|
48
|
-
it "includes the options in the request hash" do
|
49
|
-
expect(subject.as_json[:request][:options]).to eq options
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|