lib/soaspec/baseline.rb in soaspec-0.2.33 vs lib/soaspec/baseline.rb in soaspec-0.3.1
- old
+ new
@@ -1,23 +1,83 @@
-require_relative 'exe_helpers'
-
-module Soaspec
- # Used for defining parameters for recording and asserting against
- # a baseline
- module Baseline
- @folder = File.join('config', 'baseline')
- class << self
- # @return [String] Folder where baselines are recorded and retrieved
- attr_accessor :folder
-
- # @param [Exchange] exchange Exchange object to baseline response for
- # @return [String] File where baseline is stored
- def file(exchange)
- File.join(folder,
- exchange.exchange_handler.to_s.snakecase,
- "#{exchange.request_parameters.flatten.join('_')}.yml")
- end
-
- include Soaspec::ExeHelpers
- end
- end
+require_relative 'exe_helpers'
+
+module Soaspec
+ # Used for defining parameters for recording and asserting against
+ # a baseline
+ class Baseline
+ include Soaspec::ExeHelpers
+ @folder = File.join('config', 'baseline')
+
+ # @return [Array] List of allowed formats
+ ALLOWED_FORMATS = [:raw, :hash]
+
+ # @return [Exchange] Exchange object to save/assert baseline for
+ attr_accessor :exchange
+ # @return [Symbol] Format in which baseline is stored. Either :raw or :hash
+ attr_accessor :format
+ # @return [String] Name of file including folders describing baseline
+ attr_writer :description
+
+ # @param [Exchange] exchange Exchange object to baseline response for
+ # @param [Symbol] format Format of baseline
+ def initialize(exchange, format)
+ self.exchange = exchange
+ self.format = format
+ unless ALLOWED_FORMATS.include? format
+ raise ArgumentError, "Expected format #{format} to be " \
+ "either #{ALLOWED_FORMATS}"
+ end
+ end
+
+ # Compare baseline with expected result. This will create baseline
+ # if not created
+ # @return [Boolean] Whether response matches baseline
+ def matches?
+ if File.exist?(file)
+ actual_content == read_baseline
+ else
+ create_file filename: file, content: content_to_save
+ raise Soaspec::BaselineError,
+ "Created baseline at #{file}. Inspect file to ensure it is
+ correct and rerun to ensure baseline is stable"
+ end
+ end
+
+ # Content to save as a baseline
+ def content_to_save
+ format == :raw ? exchange.pretty_response_body : YAML.dump(exchange.to_hash)
+ end
+
+ # @return [String, Hash] Actual response from API
+ def actual_content
+ if format == :hash
+ exchange.to_hash
+ elsif format == :raw
+ exchange.pretty_response_body.strip
+ else
+ raise NotImplementedError, "Format #{format} is not #{ALLOWED_FORMATS}"
+ end
+ end
+
+ # @return [String] Result of reading baseline
+ def read_baseline
+ format == :raw ? File.read(file).strip : YAML.load_file(file)
+ end
+
+ # @return [String] File where baseline is stored
+ def file
+ File.join(self.class.folder,
+ exchange.exchange_handler.to_s.snakecase,
+ "#{description}.#{format == :raw ? exchange.format : 'yml'}")
+ end
+
+ # @return [String] Name of file including folders describing baseline
+ def description
+ @description || exchange.request_parameters.description
+ end
+
+ class << self
+ # @return [String] Folder where baselines are recorded and retrieved
+ attr_accessor :folder
+ end
+ end
end
\ No newline at end of file