From 283b957666a066ee616eb751f8253174596ea3d0 Mon Sep 17 00:00:00 2001 From: ccocchi Date: Mon, 17 Sep 2012 15:08:28 +0200 Subject: [PATCH] Add tests for XML renderers --- lib/rabl-rails/renderer.rb | 1 + lib/rabl-rails/renderers/xml.rb | 7 +- test/renderers/xml_renderer_test.rb | 131 ++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 test/renderers/xml_renderer_test.rb diff --git a/lib/rabl-rails/renderer.rb b/lib/rabl-rails/renderer.rb index b74d3d0..ad53d88 100644 --- a/lib/rabl-rails/renderer.rb +++ b/lib/rabl-rails/renderer.rb @@ -1,5 +1,6 @@ require 'rabl-rails/renderers/base' require 'rabl-rails/renderers/json' +require 'rabl-rails/renderers/xml' module RablRails module Renderer diff --git a/lib/rabl-rails/renderers/xml.rb b/lib/rabl-rails/renderers/xml.rb index 289dae5..225a732 100644 --- a/lib/rabl-rails/renderers/xml.rb +++ b/lib/rabl-rails/renderers/xml.rb @@ -1,11 +1,12 @@ +require 'active_support/core_ext/hash/conversions' + module RablRails module Renderers class XML < Base - DEFAULT_OPTIONS = { dasherize: true, skip_types: false } + DEFAULT_OPTIONS = { dasherize: true, skip_types: false } def format_output(hash) - # hash = hash[options[:root_name]] if options[:root_name] - xml_options = { root: options[:root_name] }.merge!(DEFAULT_OPTIONS) + xml_options = { root: _options[:root_name] }.merge!(DEFAULT_OPTIONS) hash.to_xml(xml_options) end end diff --git a/test/renderers/xml_renderer_test.rb b/test/renderers/xml_renderer_test.rb new file mode 100644 index 0000000..e46a8e7 --- /dev/null +++ b/test/renderers/xml_renderer_test.rb @@ -0,0 +1,131 @@ +require 'test_helper' + +class TestXmlRenderer < ActiveSupport::TestCase + INDENT_REGEXP = /\n(\s)*/ + HEADER_REGEXP = /<[^>]+>/ + + setup do + @data = User.new(1, 'foobar', 'male') + + @context = Context.new + @context.assigns['data'] = @data + + @template = RablRails::CompiledTemplate.new + @template.data = :@data + @template.root_name = :user + end + + def render_xml_output + RablRails::Renderers::XML.new(@context).render(@template).to_s.gsub!(INDENT_REGEXP, '').sub!(HEADER_REGEXP, '') + end + + test "render object simple object" do + @template.source = {} + assert_equal %q(), render_xml_output + end + + test "render collection with empty template" do + @context.assigns['data'] = [@data] + @template.source = {} + @template.root_name = :users + assert_equal %q(), render_xml_output + end + + test "render object with local methods (used by decent_exposure)" do + @context.stub(:user).and_return(@data) + @template.source = { :id => :id } + assert_equal %q(1), render_xml_output + end + + test "render single object attributes" do + @template.source = { :name => :name } + assert_equal %q(foobar), render_xml_output + end + + test "render child with arbitrary data source" do + @template.source = { :author => { :_data => :@data, :name => :name } } + @template.root_name = :post + assert_equal %q(foobar), render_xml_output + end + + test "render child with local methods (used by decent_exposure)" do + @context.stub(:user).and_return(@data) + @template.source = { :author => { :_data => :user, :name => :name } } + @template.root_name = :post + assert_equal %q(foobar), render_xml_output + end + + test "render glued attributes from single object" do + @template.source = { :_glue0 => { :_data => :@data, :name => :name } } + assert_equal %q(foobar), render_xml_output + end + + test "render collection with attributes" do + @data = [User.new(1, 'foo', 'male'), User.new(2, 'bar', 'female')] + @context.assigns['data'] = @data + @template.root_name = :users + @template.source = { :uid => :id, :name => :name } + assert_equal %q(1foo2bar), render_xml_output + end + + test "render node property" do + proc = lambda { |object| object.name } + @template.source = { :name => proc } + assert_equal %q(foobar), render_xml_output + end + + test "render node property with true condition" do + condition = lambda { |u| true } + proc = lambda { |object| object.name } + @template.source = { :name => [condition, proc] } + assert_equal %q(foobar), render_xml_output + end + + test "render node property with false condition" do + condition = lambda { |u| false } + proc = lambda { |object| object.name } + @template.source = { :name => [condition, proc] } + assert_equal %q(), render_xml_output + end + + test "node with context method call" do + @context.stub(:respond_to?).with(:@data).and_return(false) + @context.stub(:respond_to?).with(:context_method).and_return(true) + @context.stub(:context_method).and_return('marty') + proc = lambda { |object| context_method } + @template.source = { :name => proc } + assert_equal %q(marty), render_xml_output + end + + test "partial should be evaluated at rendering time" do + # Set assigns + @context.assigns['user'] = @data + + # Stub Library#get + t = RablRails::CompiledTemplate.new + t.source = { :name => :name } + RablRails::Library.reset_instance + RablRails::Library.instance.should_receive(:compile_template_from_path).with('users/base').and_return(t) + + @template.data = false + @template.root_name = :post + @template.source = { :user => ->(s) { partial('users/base', :object => @user) } } + + assert_equal %q(foobar), render_xml_output + end + + test "partial with no values should raise an error" do + @template.data = false + @template.source = { :user => ->(s) { partial('users/base') } } + + assert_raises(RablRails::Renderers::PartialError) { render_xml_output } + end + + test "partial with empty values should not raise an error" do + @template.data = false + @template.root_name = :list + @template.source = { :users => ->(s) { partial('users/base', :object => []) } } + + assert_equal %q(), render_xml_output + end +end \ No newline at end of file