diff options
author | Kasper Timm Hansen <kaspth@gmail.com> | 2016-07-13 21:22:19 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-13 21:22:19 +0200 |
commit | 85925931fb3b5dddc8163a5c7c98a752b962beb5 (patch) | |
tree | 1eb24a3e8d4a3259fec33d37edccb304a3c250c4 /actionpack/lib/action_dispatch/testing/request_encoder.rb | |
parent | 2bf36970a015f0a4a14ed49ba0be1fd955ddee5d (diff) | |
parent | 333670ceb96e74399645fca3201969e63c3c403b (diff) | |
download | rails-85925931fb3b5dddc8163a5c7c98a752b962beb5.tar.gz rails-85925931fb3b5dddc8163a5c7c98a752b962beb5.tar.bz2 rails-85925931fb3b5dddc8163a5c7c98a752b962beb5.zip |
Merge pull request #25771 from kaspth/make-test-response-assign-response-parser
Let TestResponse assign a parser.
Diffstat (limited to 'actionpack/lib/action_dispatch/testing/request_encoder.rb')
-rw-r--r-- | actionpack/lib/action_dispatch/testing/request_encoder.rb | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/actionpack/lib/action_dispatch/testing/request_encoder.rb b/actionpack/lib/action_dispatch/testing/request_encoder.rb new file mode 100644 index 0000000000..b0b994b2d0 --- /dev/null +++ b/actionpack/lib/action_dispatch/testing/request_encoder.rb @@ -0,0 +1,54 @@ +module ActionDispatch + class RequestEncoder # :nodoc: + @encoders = {} + + attr_reader :response_parser + + def initialize(mime_name, param_encoder, response_parser, url_encoded_form = false) + @mime = Mime[mime_name] + + unless @mime + raise ArgumentError, "Can't register a request encoder for " \ + "unregistered MIME Type: #{mime_name}. See `Mime::Type.register`." + end + + @url_encoded_form = url_encoded_form + @path_format = ".#{@mime.symbol}" unless @url_encoded_form + @response_parser = response_parser || -> body { body } + @param_encoder = param_encoder || :"to_#{@mime.symbol}".to_proc + end + + def append_format_to(path) + if @url_encoded_form + path + else + path + @path_format + end + end + + def content_type + @mime.to_s + end + + def encode_params(params) + @param_encoder.call(params) + end + + def self.parser(content_type) + mime = Mime::Type.lookup(content_type) + encoder(mime ? mime.ref : nil).response_parser + end + + def self.encoder(name) + @encoders[name] || WWWFormEncoder + end + + def self.register_encoder(mime_name, param_encoder: nil, response_parser: nil) + @encoders[mime_name] = new(mime_name, param_encoder, response_parser) + end + + register_encoder :json, response_parser: -> body { JSON.parse(body) } + + WWWFormEncoder = new(:url_encoded_form, -> params { params }, nil, true) + end +end |