rabl-rails/test/compiler_test.rb

144 lines
4.9 KiB
Ruby
Raw Normal View History

2012-02-22 18:14:00 +00:00
require 'test_helper'
class CompilerTest < ActiveSupport::TestCase
setup do
@context = Context.new
@user = User.new
@context.set_assign('user', @user)
@compiler = RablFastJson::Compiler.new(@context)
end
test "compiler return a compiled template" do
assert_instance_of RablFastJson::CompiledTemplate, @compiler.compile_source("")
end
test "simple attributes are compiled to hash" do
t = @compiler.compile_source(%{ attributes :id, :name })
assert_equal({ :id => :id, :name => :name}, t.source)
end
test "attributes appeared only once even if called mutiple times" do
t = @compiler.compile_source(%{ attribute :id ; attribute :id })
assert_equal({ :id => :id }, t.source)
end
test "attribute can be aliased" do
t = @compiler.compile_source(%{ attribute :foo => :bar })
assert_equal({ :bar => :foo }, t.source)
end
test "multiple attributes can be aliased" do
t = @compiler.compile_source(%{ attributes :foo => :bar, :id => :uid })
assert_equal({ :bar => :foo, :uid => :id }, t.source)
end
2012-02-23 11:04:55 +00:00
test "child with association use association name as data" do
t = @compiler.compile_source(%{ child :address do attributes :foo end})
assert_equal({ :address => { :_data => :address, :foo => :foo } }, t.source)
end
test "child with association can be aliased" do
t = @compiler.compile_source(%{ child :address => :bar do attributes :foo end})
assert_equal({ :bar => { :_data => :address, :foo => :foo } }, t.source)
end
2012-03-02 13:39:20 +00:00
test "child with root name defined as option" do
t = @compiler.compile_source(%{ child(:user, :root => :author) do attributes :foo end })
assert_equal({ :author => { :_data => :user, :foo => :foo } }, t.source)
end
2012-02-23 11:04:55 +00:00
test "child with arbitrary source store the data with the template" do
2012-02-27 13:49:34 +00:00
t = @compiler.compile_source(%{ child :@user => :author do attribute :name end })
assert_equal({ :author => { :_data => :@user, :name => :name } }, t.source)
2012-02-23 11:04:55 +00:00
end
2012-03-02 13:39:20 +00:00
test "child with succint partial notation" do
@view_renderer = mock()
@view_renderer.stub_chain(:lookup_context, :find_template).with('users/base', [], false).and_return(
mock(:source => %{ attribute :id }))
RablFastJson::Library.reset_instance
RablFastJson::Library.instance.view_renderer = @view_renderer
t = @compiler.compile_source(%{child(:user, :partial => 'users/base') })
assert_equal( {:user => { :_data => :user, :id => :id } }, t.source)
end
2012-02-23 11:56:45 +00:00
test "glue is compiled as a child but with anonymous name" do
2012-02-27 16:25:06 +00:00
t = @compiler.compile_source(%{ glue(:@user) do attribute :name end })
2012-02-27 13:49:34 +00:00
assert_equal({ :_glue0 => { :_data => :@user, :name => :name } }, t.source)
2012-02-23 11:56:45 +00:00
end
test "multiple glue don't come with name collisions" do
t = @compiler.compile_source(%{
2012-02-27 13:49:34 +00:00
glue :@user do attribute :name end
glue :@user do attribute :foo end
2012-02-23 11:56:45 +00:00
})
assert_equal({
2012-02-27 13:49:34 +00:00
:_glue0 => { :_data => :@user, :name => :name},
:_glue1 => { :_data => :@user, :foo => :foo}
2012-02-23 11:56:45 +00:00
}, t.source)
end
test "object set data for the template" do
2012-02-27 13:49:34 +00:00
t = @compiler.compile_source(%{ object :@user })
assert_equal :@user, t.data
2012-02-23 11:56:45 +00:00
end
test "object property can define root name" do
2012-02-27 13:49:34 +00:00
t = @compiler.compile_source(%{ object :@user => :author })
assert_equal :@user, t.data
2012-02-23 11:56:45 +00:00
assert_equal :author, t.root_name
end
2012-02-27 13:49:34 +00:00
test "collection set the data for the template" do
t = @compiler.compile_source(%{ collection :@user })
assert_equal :@user, t.data
end
test "collection property can define root name" do
t = @compiler.compile_source(%{ collection :@user => :users })
assert_equal :@user, t.data
assert_equal :users, t.root_name
end
2012-03-02 13:59:01 +00:00
test "collection property can define root name via options" do
t = @compiler.compile_source(%{ collection :@user, :root => :users })
assert_equal :@user, t.data
assert_equal :users, t.root_name
end
2012-03-02 10:32:11 +00:00
test "extends use other template source as itself" do
2012-02-27 13:49:34 +00:00
template = mock('template', :source => { :id => :id })
2012-03-02 13:39:20 +00:00
RablFastJson::Library.reset_instance
2012-03-02 10:32:11 +00:00
RablFastJson::Library.instance.stub(:get).with('users/base', @context).and_return(template)
2012-02-27 13:49:34 +00:00
t = @compiler.compile_source(%{ extends 'users/base' })
assert_equal({ :id => :id }, t.source)
end
2012-02-23 11:04:55 +00:00
test "node are compiled without evaluating the block" do
t = @compiler.compile_source(%{ node(:foo) { bar } })
assert_not_nil t.source[:foo]
assert_instance_of Proc, t.source[:foo]
end
test "node with condition are compiled as an array of procs" do
t = @compiler.compile_source(%{ node(:foo, :if => lambda { |m| m.foo.present? }) do |m| m.foo end })
assert_not_nil t.source[:foo]
assert_instance_of Array, t.source[:foo]
assert_equal 2, t.source[:foo].size
end
2012-03-15 14:12:52 +00:00
test "compile with no object" do
t = @compiler.compile_source(%{
object false
child(:@user => :user) do
attribute :id
end
})
assert_equal({ :user => { :_data => :@user, :id => :id } }, t.source)
assert_nil t.data
end
2012-02-22 18:14:00 +00:00
end