Commit f25259a8f75adcb357ab16a55167a04633da6176
1 parent
98963feb
Exists in
master
and in
1 other branch
Notice API: properly transform <var> tags
<var> tags with blank values were ending up completely wrong in the
resulting hash.
This: (a user with a blank name)
<var key="user">
<var key="id">123</var>
<var key="name"/>
</var>
Gets parsed by hoptoad_notifier into this:
{
'key' => 'user',
'var' => [{
'key' => 'id',
'__content__' => '123'
},{
'key' => 'name'
}]
}
Which when passed through the "rekey" method, ended up like this:
{
'user' => {
'id' => '123',
'key' => 'name' # bad and wrong
}
}
Now, after these changes, it correctly comes through as:
{
'user' => {
'id' => '123',
'name' => nil # much better!
}
}
Showing
2 changed files
with
32 additions
and
0 deletions
Show diff stats
lib/hoptoad/v2.rb
| @@ -18,6 +18,8 @@ module Hoptoad | @@ -18,6 +18,8 @@ module Hoptoad | ||
| 18 | {normalize_key(node['key']) => rekey(node['__content__'])} | 18 | {normalize_key(node['key']) => rekey(node['__content__'])} |
| 19 | elsif node.has_key?('__content__') | 19 | elsif node.has_key?('__content__') |
| 20 | rekey(node['__content__']) | 20 | rekey(node['__content__']) |
| 21 | + elsif node.has_key?('key') | ||
| 22 | + {normalize_key(node['key']) => nil} | ||
| 21 | else | 23 | else |
| 22 | node.inject({}) {|rekeyed, (key, val)| rekeyed.merge(normalize_key(key) => rekey(val))} | 24 | node.inject({}) {|rekeyed, (key, val)| rekeyed.merge(normalize_key(key) => rekey(val))} |
| 23 | end | 25 | end |
spec/controllers/notices_controller_spec.rb
| @@ -24,6 +24,36 @@ describe NoticesController do | @@ -24,6 +24,36 @@ describe NoticesController do | ||
| 24 | response.body.should match(%r{<url[^>]*>(.+)#{locate_path(@notice.id)}</url>}) | 24 | response.body.should match(%r{<url[^>]*>(.+)#{locate_path(@notice.id)}</url>}) |
| 25 | end | 25 | end |
| 26 | 26 | ||
| 27 | + it "should trnasform xml <va> tags to hashes correctly" do | ||
| 28 | + App.should_receive(:report_error!).with(@xml).and_return(@notice) | ||
| 29 | + request.should_receive(:raw_post).and_return(@xml) | ||
| 30 | + post :create, :format => :xml | ||
| 31 | + | ||
| 32 | + # XML: <var key="SCRIPT_NAME"/> | ||
| 33 | + @notice.env_vars.should have_key('SCRIPT_NAME') | ||
| 34 | + @notice.env_vars['SCRIPT_NAME'].should be_nil # blank ends up nil | ||
| 35 | + | ||
| 36 | + # XML representation: | ||
| 37 | + # <var key="rack.session.options"> | ||
| 38 | + # <var key="secure">false</var> | ||
| 39 | + # <var key="httponly">true</var> | ||
| 40 | + # <var key="path">/</var> | ||
| 41 | + # <var key="expire_after"/> | ||
| 42 | + # <var key="domain"/> | ||
| 43 | + # <var key="id"/> | ||
| 44 | + # </var> | ||
| 45 | + expected = { | ||
| 46 | + 'secure' => 'false', | ||
| 47 | + 'httponly' => 'true', | ||
| 48 | + 'path' => '/', | ||
| 49 | + 'expire_after' => nil, | ||
| 50 | + 'domain' => nil, | ||
| 51 | + 'id' => nil | ||
| 52 | + } | ||
| 53 | + @notice.env_vars.should have_key('rack_session_options') | ||
| 54 | + @notice.env_vars['rack_session_options'].should eql(expected) | ||
| 55 | + end | ||
| 56 | + | ||
| 27 | it "generates a notice from xml in a data param [POST]" do | 57 | it "generates a notice from xml in a data param [POST]" do |
| 28 | App.should_receive(:report_error!).with(@xml).and_return(@notice) | 58 | App.should_receive(:report_error!).with(@xml).and_return(@notice) |
| 29 | post :create, :data => @xml, :format => :xml | 59 | post :create, :data => @xml, :format => :xml |