From 8c7eed073c7afa8f432da84b4cf96bffd3ba2656 Mon Sep 17 00:00:00 2001 From: Gibheer Date: Thu, 29 Nov 2012 19:44:12 +0100 Subject: added custom parameter --- lib/zero/request/parameter.rb | 29 ++++++++++++++++ spec/unit/request/parameter/[]_spec.rb | 56 ++++++++++++++++++++++++++++++ spec/unit/request/parameter/custom_spec.rb | 18 ++++++++++ 3 files changed, 103 insertions(+) create mode 100644 spec/unit/request/parameter/[]_spec.rb create mode 100644 spec/unit/request/parameter/custom_spec.rb diff --git a/lib/zero/request/parameter.rb b/lib/zero/request/parameter.rb index 13e92ea..cac9915 100644 --- a/lib/zero/request/parameter.rb +++ b/lib/zero/request/parameter.rb @@ -28,6 +28,9 @@ module Zero attr_reader :payload alias_method(:post, :payload) + # get all custom parameters + attr_reader :custom + # creates a new parameter instance # # This should never be called directly, as it will be generated for you. @@ -37,6 +40,32 @@ module Zero def initialize(environment) @query = extract_query_params(environment) @payload = extract_payload_params(environment) + @custom = {} + environment['zero.params.custom'] = @custom + end + + # get a parameter + # + # With this method you can get the value of a parameter. First the + # custom parameters are checked, then payload and after that the query + # ones. + # + # *Beware, that this may lead to security holes!* + # + # @param key [String] a key to look for + # @returns [String] the value of the key + def [](key) + @custom[key] || @payload[key] || @query[key] + end + + # set a custom key/value pair + # + # Use this method if you want to set a custom parameter for later use. If + # the key was already set it will be overwritten. + # @param key [String] the key to use for saving the parameter + # @param value [Object] the value for the key + def []=(key, value) + @custom[key] = value end private diff --git a/spec/unit/request/parameter/[]_spec.rb b/spec/unit/request/parameter/[]_spec.rb new file mode 100644 index 0000000..1136eae --- /dev/null +++ b/spec/unit/request/parameter/[]_spec.rb @@ -0,0 +1,56 @@ +require 'spec_helper' + +describe Zero::Request::Parameter, '#[]' do + subject { Zero::Request::Parameter.new(env) } + + context 'without parameters' do + let(:env) { EnvGenerator.get('/foo') } + + it 'returns the custom parameter' do + subject['foo'] = 'bar' + expect(subject['foo']).to eq('bar') + end + end + + context 'with query parameters' do + let(:env) { EnvGenerator.get('/foo?foo=bar') } + + it 'returns the query parameter' do + expect(subject['foo']).to eq('bar') + end + + it 'returns the custom parameter' do + subject['foo'] = 'baz' + expect(subject['foo']).to eq('baz') + end + end + + context 'with payload parameters' do + let(:env) do + EnvGenerator.post('/foo', { + :input => 'foo=bar', 'CONTENT_TYPE' => 'multipart/form-data' + }) + end + + it 'returns the payload value' do + expect(subject['foo']).to eq('bar') + end + + it 'returns the custom parameter' do + subject['foo'] = 'baz' + expect(subject['foo']).to eq('baz') + end + end + + context 'with query and payload parameters' do + let(:env) do + EnvGenerator.post('/foo?foo=baz', { + :input => 'foo=bar', 'CONTENT_TYPE' => 'multipart/form-data' + }) + end + + it 'returns the payload parameter' do + expect(subject['foo']).to eq('bar') + end + end +end diff --git a/spec/unit/request/parameter/custom_spec.rb b/spec/unit/request/parameter/custom_spec.rb new file mode 100644 index 0000000..9c720d2 --- /dev/null +++ b/spec/unit/request/parameter/custom_spec.rb @@ -0,0 +1,18 @@ +require 'spec_helper' + +describe Zero::Request::Parameter, '#custom' do + subject { Zero::Request::Parameter.new(env) } + let(:env) { EnvGenerator.get('/foo') } + + it 'returns a set custom parameter' do + subject['foo'] = 'bar' + expect(subject.custom['foo']).to eq('bar') + end + + it 'returns the latest set value' do + subject['foo'] = 'first' + subject['foo'] = 'latest' + + expect(subject.custom['foo']).to eq('latest') + end +end -- cgit v1.2.3-70-g09d2