server/mock_response.rb in mirage-2.0.7 vs server/mock_response.rb in mirage-2.0.8

- old
+ new

@@ -1,25 +1,127 @@ module Mirage class MockResponse - @@id_count = 0 + class << self + + def add response + stored_response_sets = responses[response.name]||={} + stored_response_set = (stored_response_sets[response.pattern] ||= {}) + + old_response = stored_response_set.delete(response.http_method) + stored_response_set[response.http_method] = response + + response.response_id = old_response ? old_response.response_id : next_id + end + + + def get_response name, http_method, body, query_string + find_response(body, query_string, responses[name], http_method) || default_response(body, http_method, name, query_string) + end + + def find id + responses.values.each do |response_sets| + response_sets.values.each do |response_set| + response_set.values.each do |response| + return response if response.response_id == id + end + end + end + end + + def delete(response_id) + responses.values.each do |response_sets| + response_sets.values.each do |response_set| + response_set.each do |method, response| + response_set.delete(method) if response.response_id == response_id + end + end + end + end + + def clear + responses.clear + @next_id = 0 + end + + def backup + snapshot.clear and snapshot.replace(responses.deep_clone) + end + + def revert + responses.clear and responses.replace(snapshot.deep_clone) + end + + def all + all_responses = [] + responses.values.each do |response_sets| + response_sets.values.each do |response_set| + response_set.values.each do |response| + all_responses << response + end + end + end + all_responses + end + + def default_response(body, http_method, name, query_string) + default_response_sets = find_default_responses(name) + + until default_response_sets.empty? + record = find_response(body, query_string, default_response_sets.delete_at(0), http_method) + return record if record && record.default? + end + end + + private + def find_response(body, query_string, response_set, http_method) + return unless response_set + http_method = http_method.upcase + pattern_match = response_set.keys.find_all { |pattern| pattern != :basic }.find { |pattern| (body =~ pattern || query_string =~ pattern) } + + if pattern_match + record = response_set[pattern_match][http_method] + else + record = response_set[:basic] + record = record[http_method] if record + end + record + end + + def find_default_responses(name) + matches = responses.keys.find_all { |key| name.index(key) == 0 }.sort { |a, b| b.length <=> a.length } + matches.collect { |key| responses[key] } + end + + def responses + @responses ||={} + end + + def snapshot + @snapshot ||={} + end + + def next_id + @next_id||= 0 + @next_id+=1 + end + + end + attr_reader :response_id, :delay, :name, :pattern, :http_method, :content_type attr_accessor :response_id def initialize name, value, content_type, http_method, pattern=nil, delay=0, default=false, file=false - @name, @value,@content_type, @http_method, @pattern, @response_id, @delay, @default, @file = name, value, content_type, http_method, pattern, @@id_count+=1, delay, default, file + @name, @value, @content_type, @http_method, @pattern, @delay, @default, @file = name, value, content_type, http_method.to_s.upcase, pattern, delay, default, file + MockResponse.add self end - def self.reset_count - @@id_count = 0 - end - def default? 'true' == @default end def file? - @file == 'true' + 'true' == @file end def value(body='', request_parameters={}, query_string='') return @value if file? @@ -44,6 +146,6 @@ private def find_match(string, regex) string.scan(/#{regex}/).flatten.first end end -end \ No newline at end of file +end