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 | 18 | {normalize_key(node['key']) => rekey(node['__content__'])} |
19 | 19 | elsif node.has_key?('__content__') |
20 | 20 | rekey(node['__content__']) |
21 | + elsif node.has_key?('key') | |
22 | + {normalize_key(node['key']) => nil} | |
21 | 23 | else |
22 | 24 | node.inject({}) {|rekeyed, (key, val)| rekeyed.merge(normalize_key(key) => rekey(val))} |
23 | 25 | end | ... | ... |
spec/controllers/notices_controller_spec.rb
... | ... | @@ -24,6 +24,36 @@ describe NoticesController do |
24 | 24 | response.body.should match(%r{<url[^>]*>(.+)#{locate_path(@notice.id)}</url>}) |
25 | 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 | 57 | it "generates a notice from xml in a data param [POST]" do |
28 | 58 | App.should_receive(:report_error!).with(@xml).and_return(@notice) |
29 | 59 | post :create, :data => @xml, :format => :xml | ... | ... |