lib/pact/consumer/mock_service/app.rb in pact-mock_service-0.2.3 vs lib/pact/consumer/mock_service/app.rb in pact-mock_service-0.2.4
- old
+ new
@@ -1,86 +1,35 @@
require 'rack'
require 'uri'
require 'json'
require 'logger'
-require 'pact/consumer/request'
-require 'pact/consumer/mock_service/expected_interactions'
-require 'pact/consumer/mock_service/actual_interactions'
-require 'pact/consumer/mock_service/verified_interactions'
-require 'pact/consumer/mock_service/interaction_delete'
-require 'pact/consumer/mock_service/interaction_post'
-require 'pact/consumer/mock_service/interaction_replay'
-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'
+require 'pact/consumer/mock_service/request_handlers'
module Pact
module Consumer
-
class MockService
+ class App
- def initialize options = {}
- inner_app = InnerApp.new(options)
- @app = CorsOriginHeaderMiddleware.new(inner_app, options[:cors_enabled])
- end
-
- def call env
- @app.call env
- end
-
- def shutdown
- @app.shutdown
- end
-
- class InnerApp
-
def initialize options = {}
- log_description = configure_logger options
-
@name = options.fetch(:name, "MockService")
- pact_dir = options[:pact_dir]
+ @logger = options.fetch(:logger)
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])
- ]
+ @request_handlers = Pact::Consumer::MockService::RequestHandlers.new(@name, @logger, expected_interactions, actual_interactions, verified_interactions, options)
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
+ @request_handlers.call(env)
end
def shutdown
write_pact_if_configured
end
@@ -90,33 +39,20 @@
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
+ # Can't write to a file in a TRAP, might deadlock
+ class StdoutLogger
+ def info message
+ $stdout.puts "\n#{message}"
+ end
end
end
end
end