Skip to content

Commit

Permalink
Added assert_data_element_json test helper for data element helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
foobarfighter authored and stefanpenner committed Jan 27, 2010
1 parent 6fa8f81 commit 0955f57
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 20 deletions.
10 changes: 6 additions & 4 deletions actionpack/lib/action_view/helpers/ajax_helper.rb
Expand Up @@ -48,10 +48,12 @@ def observe_field(name, options = {})
end
end

if options[:with] && (options[:with] !~ /[\{=(.]/)
options[:with] = "'#{options[:with]}=' + encodeURIComponent(value)"
else
options[:with] ||= 'value' unless options[:function]
if options[:with]
if options[:with] !~ /[\{=(.]/
options[:with] = "'#{options[:with]}=' + encodeURIComponent(value)"
else
options[:with] ||= 'value' unless options[:function]
end
end

if options[:function]
Expand Down
44 changes: 28 additions & 16 deletions actionpack/test/javascript/ajax_test.rb
Expand Up @@ -10,6 +10,20 @@ def assert_html(html, matches)
end
end

def extract_json_from_data_element(data_element)
root = HTML::Document.new(data_element).root
script = root.find(:tag => "script")
cdata = script.children.detect {|child| child.to_s =~ /<!\[CDATA\[/ }
js = cdata.content.split("\n").map {|line| line.gsub(Regexp.new("//.*"), "")}.join("\n").strip!

ActiveSupport::JSON.decode(js)
end

def assert_data_element_json(actual, expected)
json = extract_json_from_data_element(actual)
assert_equal expected, json
end

def self.assert_callbacks_work(&blk)
define_method(:assert_callbacks_work, &blk)

Expand Down Expand Up @@ -112,8 +126,6 @@ class LegacyButtonToRemoteTest < ButtonToRemoteTest
end
end

# TODO: We need a better way to test JSON being returned from data only helpers - BR
# TODO: We might also need a lower level data only helper method??? - BR
class ObserveFieldTest < AjaxTestCase
def protect_against_forgery?
false
Expand All @@ -129,18 +141,18 @@ def field(options = {})
end

test "using a url string" do
assert_html field(:url => "/some/other/url"),
%w("url":"/some/other/url")
assert_data_element_json field(:url => "/some/other/url"),
"url" => "/some/other/url", "name" => "title"
end

test "using a url hash" do
assert_html field(:url => {:controller => :blog, :action => :update}),
%w("url":"/url/hash")
assert_data_element_json field(:url => {:controller => :blog, :action => :update}),
"url" => "/url/hash", "name" => "title"
end

test "using a :frequency option" do
assert_html field(:frequency => 5.minutes),
%w("frequency":300)
assert_data_element_json field(:url => { :controller => :blog }, :frequency => 5.minutes),
"url" => "/url/hash", "name" => "title", "frequency" => 300
end

test "using a :frequency option of 0" do
Expand All @@ -155,19 +167,19 @@ def field(options = {})

# TODO: Consider using JSON instead of strings. Is using 'value' as a magical reference to the value of the observed field weird? (Rails2 does this) - BR
test "using a :with option" do
assert_html field(:with => "foo"),
%w("with":"'foo=' + encodeURIComponent(value)")
assert_html field(:with => "'foo=' + encodeURIComponent(value)"),
%w("with":"'foo=' + encodeURIComponent(value)")
assert_data_element_json field(:with => "foo"),
"name" => "title", "with" => "'foo=' + encodeURIComponent(value)"
assert_data_element_json field(:with => "'foo=' + encodeURIComponent(value)"),
"name" => "title", "with" => "'foo=' + encodeURIComponent(value)"
end

test "using json in a :with option" do
assert_html field(:with => "{'id':value}"),
%w("with":"{'id':value}")
assert_data_element_json field(:with => "{'id':value}"),
"name" => "title", "with" => "{'id':value}"
end

test "using :function for callback" do
assert_html field(:function => "alert('Element changed')"),
%w("function":"function(element, value) {alert('Element changed')}")
assert_data_element_json field(:function => "alert('Element changed')"),
"name" => "title", "function" => "function(element, value) {alert('Element changed')}"
end
end

0 comments on commit 0955f57

Please sign in to comment.