lib/pact/consumer/mock_service/app.rb in pact-mock_service-0.2.3.pre.rc2 vs lib/pact/consumer/mock_service/app.rb in pact-mock_service-0.2.3
- old
+ new
@@ -12,95 +12,111 @@
require 'pact/consumer/mock_service/missing_interactions_get'
require 'pact/consumer/mock_service/verification_get'
require 'pact/consumer/mock_service/log_get'
require 'pact/consumer/mock_service/pact_post'
require 'pact/consumer/mock_service/options'
+require 'pact/consumer/mock_service/cors_origin_header_middleware'
require 'pact/support'
module Pact
module Consumer
class MockService
def initialize options = {}
- log_description = configure_logger options
-
- @name = options.fetch(:name, "MockService")
- pact_dir = options[:pact_dir]
- expected_interactions = ExpectedInteractions.new
- actual_interactions = ActualInteractions.new
- verified_interactions = VerifiedInteractions.new
- @consumer_contact_details = {
- pact_dir: options[:pact_dir],
- consumer: {name: options[:consumer]},
- provider: {name: options[:provider]},
- interactions: verified_interactions
- }
-
- @handlers = [
- Options.new(@name, @logger, options[:cors_enabled]),
- MissingInteractionsGet.new(@name, @logger, expected_interactions, actual_interactions),
- VerificationGet.new(@name, @logger, expected_interactions, actual_interactions, log_description),
- InteractionPost.new(@name, @logger, expected_interactions, verified_interactions),
- InteractionDelete.new(@name, @logger, expected_interactions, actual_interactions),
- LogGet.new(@name, @logger),
- PactPost.new(@name, @logger, verified_interactions, pact_dir, options[:consumer_contract_details]),
- InteractionReplay.new(@name, @logger, expected_interactions, actual_interactions, verified_interactions, options[:cors_enabled])
- ]
+ inner_app = InnerApp.new(options)
+ @app = CorsOriginHeaderMiddleware.new(inner_app, options[:cors_enabled])
end
def call env
- response = []
- begin
- relevant_handler = @handlers.detect { |handler| handler.match? env }
- res = relevant_handler.respond(env)
- response = relevant_handler.enable_cors? ? add_cors_header(res) : res
- rescue StandardError => e
- @logger.error "Error ocurred in mock service: #{e.class} - #{e.message}"
- @logger.error e.backtrace.join("\n")
- response = [500, {'Content-Type' => 'application/json'}, [{message: e.message, backtrace: e.backtrace}.to_json]]
- rescue Exception => e
- @logger.error "Exception ocurred in mock service: #{e.class} - #{e.message}"
- @logger.error e.backtrace.join("\n")
- raise e
- end
- response
+ @app.call env
end
- def write_pact_if_configured
- consumer_contract_writer = ConsumerContractWriter.new(@consumer_contact_details, StdoutLogger.new)
- consumer_contract_writer.write if consumer_contract_writer.can_write?
+ def shutdown
+ @app.shutdown
end
- private
+ class InnerApp
- def configure_logger options
- options = {log_file: $stdout}.merge options
- log_stream = options[:log_file]
- @logger = Logger.new log_stream
- @logger.formatter = options[:log_formatter] if options[:log_formatter]
- @logger.level = Pact.configuration.logger.level
+ def initialize options = {}
+ log_description = configure_logger options
- if log_stream.is_a? File
- File.absolute_path(log_stream).gsub(Dir.pwd + "/", '')
- else
- "standard out/err"
+ @name = options.fetch(:name, "MockService")
+ pact_dir = options[:pact_dir]
+ expected_interactions = ExpectedInteractions.new
+ actual_interactions = ActualInteractions.new
+ verified_interactions = VerifiedInteractions.new
+ @consumer_contact_details = {
+ pact_dir: options[:pact_dir],
+ consumer: {name: options[:consumer]},
+ provider: {name: options[:provider]},
+ interactions: verified_interactions
+ }
+
+ @handlers = [
+ Options.new(@name, @logger, options[:cors_enabled]),
+ MissingInteractionsGet.new(@name, @logger, expected_interactions, actual_interactions),
+ VerificationGet.new(@name, @logger, expected_interactions, actual_interactions, log_description),
+ InteractionPost.new(@name, @logger, expected_interactions, verified_interactions),
+ InteractionDelete.new(@name, @logger, expected_interactions, actual_interactions),
+ LogGet.new(@name, @logger),
+ PactPost.new(@name, @logger, verified_interactions, pact_dir, options[:consumer_contract_details]),
+ InteractionReplay.new(@name, @logger, expected_interactions, actual_interactions, verified_interactions, options[:cors_enabled])
+ ]
end
- end
- def to_s
- "#{@name} #{super.to_s}"
- end
+ def call env
+ response = []
+ begin
+ relevant_handler = @handlers.detect { |handler| handler.match? env }
+ response = relevant_handler.respond(env)
+ rescue StandardError => e
+ @logger.error "Error ocurred in mock service: #{e.class} - #{e.message}"
+ @logger.error e.backtrace.join("\n")
+ response = [500, {'Content-Type' => 'application/json'}, [{message: e.message, backtrace: e.backtrace}.to_json]]
+ rescue Exception => e
+ @logger.error "Exception ocurred in mock service: #{e.class} - #{e.message}"
+ @logger.error e.backtrace.join("\n")
+ raise e
+ end
+ response
+ end
- class StdoutLogger
- def info message
- $stdout.puts "\n#{message}"
+ def shutdown
+ write_pact_if_configured
end
- end
- def add_cors_header response
- [response[0], response[1].merge('Access-Control-Allow-Origin' => '*'), response[2]]
- end
+ private
+ def write_pact_if_configured
+ consumer_contract_writer = ConsumerContractWriter.new(@consumer_contact_details, StdoutLogger.new)
+ consumer_contract_writer.write if consumer_contract_writer.can_write?
+ end
+
+ def configure_logger options
+ options = {log_file: $stdout}.merge options
+ log_stream = options[:log_file]
+ @logger = Logger.new log_stream
+ @logger.formatter = options[:log_formatter] if options[:log_formatter]
+ @logger.level = Pact.configuration.logger.level
+
+ if log_stream.is_a? File
+ File.absolute_path(log_stream).gsub(Dir.pwd + "/", '')
+ else
+ "standard out/err"
+ end
+ end
+
+ def to_s
+ "#{@name} #{super.to_s}"
+ end
+
+ class StdoutLogger
+ def info message
+ $stdout.puts "\n#{message}"
+ end
+ end
+
+ end
end
end
end