shokkenki-consumer 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/shokkenki/consumer/configuration/provider_configuration.rb +30 -0
- data/lib/shokkenki/consumer/configuration/session.rb +38 -0
- data/lib/shokkenki/consumer/consumer.rb +9 -0
- data/lib/shokkenki/consumer/dsl/http_methods.rb +16 -0
- data/lib/shokkenki/consumer/dsl/order.rb +70 -0
- data/lib/shokkenki/consumer/dsl/session.rb +13 -0
- data/lib/shokkenki/consumer/dsl/term_dsl.rb +13 -0
- data/lib/shokkenki/consumer/model/fixture.rb +21 -0
- data/lib/shokkenki/consumer/model/interaction.rb +29 -0
- data/lib/shokkenki/consumer/model/patronage.rb +31 -0
- data/lib/shokkenki/consumer/model/provider.rb +33 -0
- data/lib/shokkenki/consumer/model/role.rb +27 -0
- data/lib/shokkenki/consumer/model/simplification.rb +16 -0
- data/lib/shokkenki/consumer/model/ticket.rb +38 -0
- data/lib/shokkenki/consumer/rspec/example_group_binding.rb +17 -0
- data/lib/shokkenki/consumer/rspec/hooks.rb +32 -0
- data/lib/shokkenki/consumer/rspec/rspec_configuration.rb +25 -0
- data/lib/shokkenki/consumer/rspec.rb +2 -0
- data/lib/shokkenki/consumer/session.rb +83 -0
- data/lib/shokkenki/consumer/stubber/http_stubber.rb +97 -0
- data/lib/shokkenki/consumer/stubber/interaction.rb +51 -0
- data/lib/shokkenki/consumer/stubber/interactions.rb +41 -0
- data/lib/shokkenki/consumer/stubber/interactions_middleware.rb +34 -0
- data/lib/shokkenki/consumer/stubber/rack_response.rb +28 -0
- data/lib/shokkenki/consumer/stubber/request.rb +72 -0
- data/lib/shokkenki/consumer/stubber/restful_middleware.rb +33 -0
- data/lib/shokkenki/consumer/stubber/server.rb +69 -0
- data/lib/shokkenki/consumer/stubber/server_application_error.rb +16 -0
- data/lib/shokkenki/consumer/stubber/stub_server_middleware.rb +46 -0
- data/lib/shokkenki/consumer/stubber/stubbed_response_middleware.rb +34 -0
- data/lib/shokkenki/consumer/stubber/unmatched_requests_middleware.rb +22 -0
- data/lib/shokkenki/consumer/stubber/unused_interactions_middleware.rb +21 -0
- data/lib/shokkenki/consumer/version.rb +7 -0
- metadata +258 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative '../model/provider'
|
2
|
+
|
3
|
+
module Shokkenki
|
4
|
+
module Consumer
|
5
|
+
module Configuration
|
6
|
+
class ProviderConfiguration
|
7
|
+
|
8
|
+
attr_writer :label
|
9
|
+
|
10
|
+
def initialize name, stubber_classes
|
11
|
+
@name = name
|
12
|
+
@stubber_classes = stubber_classes
|
13
|
+
end
|
14
|
+
|
15
|
+
def stub_with stubber_name, attributes = {}
|
16
|
+
stubber_class = @stubber_classes[stubber_name] || raise("No stubber found named '#{stubber_name}'.")
|
17
|
+
@stubber = stubber_class.new attributes
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_provider
|
21
|
+
Shokkenki::Consumer::Model::Provider.new(
|
22
|
+
:stubber => @stubber,
|
23
|
+
:name => @name,
|
24
|
+
:label => @label
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'provider_configuration'
|
2
|
+
require_relative '../stubber/http_stubber'
|
3
|
+
|
4
|
+
module Shokkenki
|
5
|
+
module Consumer
|
6
|
+
module Configuration
|
7
|
+
module Session
|
8
|
+
|
9
|
+
attr_reader :stubber_classes
|
10
|
+
|
11
|
+
def configure &block
|
12
|
+
instance_eval &block if block
|
13
|
+
end
|
14
|
+
|
15
|
+
def tickets location
|
16
|
+
self.ticket_location = location
|
17
|
+
end
|
18
|
+
|
19
|
+
def stubber_classes
|
20
|
+
@stubber_classes ||= { :local_server => Shokkenki::Consumer::Stubber::HttpStubber }
|
21
|
+
end
|
22
|
+
|
23
|
+
def register_stubber name, clazz
|
24
|
+
stubber_classes[name] = clazz
|
25
|
+
end
|
26
|
+
|
27
|
+
def define_provider name, &block
|
28
|
+
provider_config = ProviderConfiguration.new(
|
29
|
+
name,
|
30
|
+
stubber_classes
|
31
|
+
)
|
32
|
+
provider_config.instance_eval &block if block
|
33
|
+
add_provider provider_config.to_provider
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Shokkenki
|
2
|
+
module Consumer
|
3
|
+
module DSL
|
4
|
+
module HttpMethods
|
5
|
+
|
6
|
+
[:get, :put, :post, :delete, :options, :head].each do |meth|
|
7
|
+
|
8
|
+
define_method meth do |path, details={}|
|
9
|
+
receive({:path => path, :method => meth}.merge(details))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'shokkenki/term/core_ext'
|
2
|
+
require_relative '../model/interaction'
|
3
|
+
require_relative '../model/fixture'
|
4
|
+
require_relative 'http_methods'
|
5
|
+
require_relative 'term_dsl'
|
6
|
+
|
7
|
+
module Shokkenki
|
8
|
+
module Consumer
|
9
|
+
module DSL
|
10
|
+
class Order
|
11
|
+
include HttpMethods
|
12
|
+
include TermDSL
|
13
|
+
|
14
|
+
def initialize patronage
|
15
|
+
@patronage = patronage
|
16
|
+
@fixtures = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def during label
|
20
|
+
@interaction_label = label
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def receive details
|
25
|
+
raise "No request method has been specified." unless details.has_key?(:method)
|
26
|
+
raise "The request method must be a symbol." unless @request_details = details[:method].is_a?(Symbol)
|
27
|
+
|
28
|
+
raise "No request path has been specified." unless details.has_key?(:path)
|
29
|
+
raise "The request path must be a string." unless details[:path].is_a?(String)
|
30
|
+
|
31
|
+
@request_details = details
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def and_respond details
|
36
|
+
@response_details = details
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def given name, arguments=nil
|
41
|
+
@fixtures << Shokkenki::Consumer::Model::Fixture.new(
|
42
|
+
:name => name,
|
43
|
+
:arguments => arguments
|
44
|
+
)
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def validate!
|
49
|
+
raise "No request has been specified." unless @request_details
|
50
|
+
raise "No response has been specified." unless @response_details
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_interaction
|
54
|
+
Shokkenki::Consumer::Model::Interaction.new(
|
55
|
+
:label => @interaction_label,
|
56
|
+
:request => @request_details.to_shokkenki_term,
|
57
|
+
:response => @response_details.to_shokkenki_term,
|
58
|
+
:fixtures => @fixtures
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
def to &block
|
63
|
+
instance_eval &block
|
64
|
+
validate!
|
65
|
+
@patronage.add_interaction to_interaction
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Shokkenki
|
2
|
+
module Consumer
|
3
|
+
module Model
|
4
|
+
class Fixture
|
5
|
+
|
6
|
+
attr_reader :name, :arguments
|
7
|
+
|
8
|
+
def initialize attributes
|
9
|
+
@name = attributes[:name]
|
10
|
+
@arguments = attributes[:arguments]
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_hash
|
14
|
+
hash = {:name => @name}
|
15
|
+
hash.merge!(:arguments => @arguments) if @arguments
|
16
|
+
hash
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Shokkenki
|
2
|
+
module Consumer
|
3
|
+
module Model
|
4
|
+
class Interaction
|
5
|
+
|
6
|
+
attr_reader :label, :request, :response, :time, :fixtures
|
7
|
+
|
8
|
+
def initialize attributes
|
9
|
+
@label = attributes[:label]
|
10
|
+
@request = attributes[:request]
|
11
|
+
@response = attributes[:response]
|
12
|
+
@fixtures = attributes[:fixtures]
|
13
|
+
@time = Time.now
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_hash
|
17
|
+
hash = {
|
18
|
+
:request => @request.to_hash,
|
19
|
+
:response => @response.to_hash,
|
20
|
+
:time => @time.utc.iso8601
|
21
|
+
}
|
22
|
+
hash.merge!(:label => @label) if @label
|
23
|
+
hash.merge!(:fixtures => @fixtures.map{ |f| f.to_hash }) if @fixtures
|
24
|
+
hash
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'ticket'
|
2
|
+
|
3
|
+
module Shokkenki
|
4
|
+
module Consumer
|
5
|
+
module Model
|
6
|
+
class Patronage
|
7
|
+
|
8
|
+
attr_reader :provider, :consumer, :interactions
|
9
|
+
|
10
|
+
def initialize attributes
|
11
|
+
@provider = attributes[:provider]
|
12
|
+
@consumer = attributes[:consumer]
|
13
|
+
@interactions = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_interaction interaction
|
17
|
+
@interactions << interaction
|
18
|
+
@provider.stub_interaction interaction
|
19
|
+
end
|
20
|
+
|
21
|
+
def ticket
|
22
|
+
Ticket.new(
|
23
|
+
:consumer => @consumer,
|
24
|
+
:provider => @provider,
|
25
|
+
:interactions => @interactions
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'role'
|
2
|
+
require_relative '../stubber/http_stubber'
|
3
|
+
|
4
|
+
module Shokkenki
|
5
|
+
module Consumer
|
6
|
+
module Model
|
7
|
+
class Provider < Role
|
8
|
+
extend Forwardable
|
9
|
+
def_delegators :@stubber, :stub_interaction, :clear_interaction_stubs,
|
10
|
+
:session_started, :session_closed
|
11
|
+
|
12
|
+
attr_reader :stubber
|
13
|
+
|
14
|
+
def initialize attributes
|
15
|
+
super attributes
|
16
|
+
@stubber = attributes[:stubber] || Shokkenki::Consumer::Stubber::HttpStubber.new({})
|
17
|
+
end
|
18
|
+
|
19
|
+
def assert_all_requests_matched!
|
20
|
+
unmatched_requests = @stubber.unmatched_requests
|
21
|
+
message = "In provider '#{@name}' the following requests were not matched: #{JSON.pretty_generate(unmatched_requests)}"
|
22
|
+
raise message unless unmatched_requests.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
def assert_all_interactions_used!
|
26
|
+
unused_interactions = @stubber.unused_interactions
|
27
|
+
message = "In provider '#{@name}' the following interactions were never used: #{JSON.pretty_generate(unused_interactions)}"
|
28
|
+
raise message unless unused_interactions.empty?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative 'simplification'
|
2
|
+
require 'active_support/core_ext/string/inflections'
|
3
|
+
|
4
|
+
module Shokkenki
|
5
|
+
module Consumer
|
6
|
+
module Model
|
7
|
+
class Role
|
8
|
+
include Simplification
|
9
|
+
|
10
|
+
attr_reader :name, :label
|
11
|
+
|
12
|
+
def initialize arguments
|
13
|
+
@name = simplify(arguments[:name])
|
14
|
+
@label = arguments[:label] || @name.to_s.titleize
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_hash
|
18
|
+
{
|
19
|
+
:name => @name,
|
20
|
+
:label => @label
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative '../version'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Shokkenki
|
5
|
+
module Consumer
|
6
|
+
module Model
|
7
|
+
class Ticket
|
8
|
+
|
9
|
+
attr_reader :provider, :consumer, :interactions
|
10
|
+
attr_accessor :time, :version
|
11
|
+
|
12
|
+
def initialize attributes
|
13
|
+
@provider = attributes[:provider]
|
14
|
+
@consumer = attributes[:consumer]
|
15
|
+
@interactions = attributes[:interactions]
|
16
|
+
@version = Shokkenki::Consumer::Version::STRING
|
17
|
+
end
|
18
|
+
|
19
|
+
def filename
|
20
|
+
"#{@consumer.name}-#{@provider.name}.json"
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_hash
|
24
|
+
{
|
25
|
+
:consumer => @consumer.to_hash,
|
26
|
+
:provider => @provider.to_hash,
|
27
|
+
:interactions => @interactions.collect(&:to_hash),
|
28
|
+
:version => @version
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_json
|
33
|
+
JSON.pretty_generate to_hash
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative '../consumer'
|
2
|
+
require_relative '../model/role'
|
3
|
+
|
4
|
+
module Shokkenki
|
5
|
+
module Consumer
|
6
|
+
module RSpec
|
7
|
+
class Hooks
|
8
|
+
|
9
|
+
def self.before_suite
|
10
|
+
Shokkenki.consumer.start
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.before_each name
|
14
|
+
Shokkenki.consumer.add_consumer(Shokkenki::Consumer::Model::Role.new(:name => name)) unless Shokkenki.consumer.consumer(name)
|
15
|
+
Shokkenki.consumer.set_current_consumer name
|
16
|
+
Shokkenki.consumer.clear_interaction_stubs
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.after_each
|
20
|
+
Shokkenki.consumer.assert_all_requests_matched!
|
21
|
+
Shokkenki.consumer.assert_all_interactions_used!
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.after_suite
|
25
|
+
Shokkenki.consumer.print_tickets
|
26
|
+
Shokkenki.consumer.close
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'example_group_binding'
|
2
|
+
require_relative 'hooks'
|
3
|
+
require 'rspec'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
7
|
+
config.include(
|
8
|
+
Shokkenki::Consumer::RSpec::ExampleGroupBinding,
|
9
|
+
:shokkenki_consumer => lambda{ |x| true }
|
10
|
+
)
|
11
|
+
|
12
|
+
config.before(:suite) { Shokkenki::Consumer::RSpec::Hooks.before_suite }
|
13
|
+
|
14
|
+
shokkenki_consumer_examples = { :shokkenki_consumer => lambda{ |x| true } }
|
15
|
+
|
16
|
+
config.before(:each, shokkenki_consumer_examples) do |example_group|
|
17
|
+
Shokkenki::Consumer::RSpec::Hooks.before_each example_group.example.metadata[:shokkenki_consumer]
|
18
|
+
end
|
19
|
+
|
20
|
+
config.after(:each, shokkenki_consumer_examples) do
|
21
|
+
Shokkenki::Consumer::RSpec::Hooks.after_each
|
22
|
+
end
|
23
|
+
|
24
|
+
config.after(:suite) { Shokkenki::Consumer::RSpec::Hooks.after_suite }
|
25
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require_relative 'model/patronage'
|
2
|
+
require_relative 'model/simplification'
|
3
|
+
require_relative 'dsl/session'
|
4
|
+
require_relative 'configuration/session'
|
5
|
+
|
6
|
+
module Shokkenki
|
7
|
+
module Consumer
|
8
|
+
class Session
|
9
|
+
include Shokkenki::Consumer::Model::Simplification
|
10
|
+
include Shokkenki::Consumer::DSL::Session
|
11
|
+
include Shokkenki::Consumer::Configuration::Session
|
12
|
+
|
13
|
+
attr_reader :current_consumer, :patronages, :configuration, :providers, :consumers
|
14
|
+
attr_accessor :ticket_location
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@consumers = {}
|
18
|
+
@providers = {}
|
19
|
+
@patronages = {}
|
20
|
+
@ticket_location = 'tickets'
|
21
|
+
end
|
22
|
+
|
23
|
+
def current_patronage_for provider_name
|
24
|
+
consumer = @current_consumer
|
25
|
+
provider = provider(provider_name) || raise("The provider '#{provider_name}' is not recognised. Have you defined it?")
|
26
|
+
key = { consumer => provider }
|
27
|
+
@patronages[key] ||= Shokkenki::Consumer::Model::Patronage.new :consumer => consumer, :provider => provider
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_provider provider
|
31
|
+
@providers[simplify(provider.name)] = provider
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_provider provider
|
35
|
+
@providers[simplify(provider.name)] = provider
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_consumer consumer
|
39
|
+
@consumers[simplify(consumer.name)] = consumer
|
40
|
+
end
|
41
|
+
|
42
|
+
def provider name
|
43
|
+
@providers[simplify(name)]
|
44
|
+
end
|
45
|
+
|
46
|
+
def consumer name
|
47
|
+
@consumers[simplify(name)]
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_current_consumer name
|
51
|
+
@current_consumer = consumer name
|
52
|
+
end
|
53
|
+
|
54
|
+
def clear_interaction_stubs
|
55
|
+
@providers.values.each { |p| p.clear_interaction_stubs }
|
56
|
+
end
|
57
|
+
|
58
|
+
def start
|
59
|
+
@providers.values.each { |p| p.session_started }
|
60
|
+
end
|
61
|
+
|
62
|
+
def close
|
63
|
+
@providers.values.each { |p| p.session_closed }
|
64
|
+
end
|
65
|
+
|
66
|
+
def print_tickets
|
67
|
+
@patronages.values.collect(&:ticket).each do |ticket|
|
68
|
+
ticket_path = File.expand_path(File.join(ticket_location, ticket.filename))
|
69
|
+
File.open(ticket_path, 'w') { |file| file.write(ticket.to_json) }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def assert_all_requests_matched!
|
74
|
+
@providers.values.each { |p| p.assert_all_requests_matched! }
|
75
|
+
end
|
76
|
+
|
77
|
+
def assert_all_interactions_used!
|
78
|
+
@providers.values.each { |p| p.assert_all_interactions_used! }
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require_relative 'server'
|
2
|
+
require_relative 'stub_server_middleware'
|
3
|
+
require 'httparty'
|
4
|
+
require 'uri'
|
5
|
+
require 'find_a_port'
|
6
|
+
|
7
|
+
module Shokkenki
|
8
|
+
module Consumer
|
9
|
+
module Stubber
|
10
|
+
class HttpStubber
|
11
|
+
|
12
|
+
attr_reader :port, :host, :scheme, :interactions_path, :server
|
13
|
+
|
14
|
+
def initialize attributes
|
15
|
+
@port = attributes[:port]
|
16
|
+
@scheme = attributes[:scheme] || :http
|
17
|
+
@host = attributes[:host] || 'localhost'
|
18
|
+
@interactions_path = attributes[:interactions_path] || '/shokkenki/interactions'
|
19
|
+
@unmatched_requests_path = '/shokkenki/requests/unmatched'
|
20
|
+
@unused_interactions_path = '/shokkenki/interactions/unused'
|
21
|
+
end
|
22
|
+
|
23
|
+
def stub_interaction interaction
|
24
|
+
response = HTTParty.post(interactions_uri,
|
25
|
+
:body => interaction.to_hash.to_json,
|
26
|
+
:headers => { 'Content-Type' => 'application/json' }
|
27
|
+
)
|
28
|
+
server.assert_ok!
|
29
|
+
raise "Failed to stub interaction: #{response.inspect}" unless successful?(response.code)
|
30
|
+
end
|
31
|
+
|
32
|
+
def clear_interaction_stubs
|
33
|
+
response = HTTParty.delete interactions_uri
|
34
|
+
server.assert_ok!
|
35
|
+
raise "Failed to clear interaction stubs: #{response.inspect}" unless successful?(response.code)
|
36
|
+
end
|
37
|
+
|
38
|
+
def successful? response_code
|
39
|
+
(200 <= response_code) && (response_code < 300)
|
40
|
+
end
|
41
|
+
|
42
|
+
def session_started
|
43
|
+
# Find a port as late as possible to minimise the
|
44
|
+
# chance that it starts being used in between finding it
|
45
|
+
# and using it.
|
46
|
+
@port = FindAPort.available_port unless @port
|
47
|
+
|
48
|
+
@server = Server.new(
|
49
|
+
:app => StubServerMiddleware.new,
|
50
|
+
:host => @host,
|
51
|
+
:port => @port
|
52
|
+
)
|
53
|
+
@server.start
|
54
|
+
end
|
55
|
+
|
56
|
+
def session_closed
|
57
|
+
@server.shutdown
|
58
|
+
end
|
59
|
+
|
60
|
+
def unmatched_requests
|
61
|
+
response = HTTParty.get unmatched_requests_uri
|
62
|
+
server.assert_ok!
|
63
|
+
raise "Failed to find unmatched requests: #{response.inspect}" unless successful?(response.code)
|
64
|
+
JSON.parse response.body
|
65
|
+
end
|
66
|
+
|
67
|
+
def unused_interactions
|
68
|
+
response = HTTParty.get unused_interactions_uri
|
69
|
+
server.assert_ok!
|
70
|
+
raise "Failed to find unused interactions: #{response.inspect}" unless successful?(response.code)
|
71
|
+
JSON.parse response.body
|
72
|
+
end
|
73
|
+
|
74
|
+
def server_properties
|
75
|
+
{
|
76
|
+
:scheme => @scheme.to_s,
|
77
|
+
:host => @host.to_s,
|
78
|
+
:port => @port
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
def interactions_uri
|
83
|
+
URI::Generic.build(server_properties.merge(:path => @interactions_path.to_s)).to_s
|
84
|
+
end
|
85
|
+
|
86
|
+
def unmatched_requests_uri
|
87
|
+
URI::Generic.build(server_properties.merge(:path => @unmatched_requests_path.to_s)).to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
def unused_interactions_uri
|
91
|
+
URI::Generic.build(server_properties.merge(:path => @unused_interactions_path.to_s)).to_s
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|