require 'test_helper' require 'ostruct' class TreeForTest < ActiveSupport::TestCase class Context def initialize(roles) @roles = roles end end class Role attr :name, :children def initialize(name, children: []) @name = name @children = children end end def roles [Role.new('SuperAdmin', children: [Role.new('Admin', children: [Role.new('Publisher', children: [Role.new('Author')]), Role.new('Auditor')])])] end EXAMPLE_COMPILED = -> { ExpressTemplates::Components::TreeFor.render_in(self) { node_renderer = -> (role, renderer) { ExpressTemplates::Indenter.for(:tree) do |ws, wsnl| "#{wsnl}
  • "+ "#{role.name}"+ if role.children.any? ExpressTemplates::Indenter.for(:tree) do |ws, wsnl| "#{wsnl}" end + "#{wsnl}
  • " else "" end end } ExpressTemplates::Indenter.for(:tree) do |ws, wsnl| "#{ws}\n" end } } EXAMPLE_MARKUP = <<-HTML HTML def simple_tree_for(roles) ctx = Context.new(roles) fragment = -> { tree_for(:roles) { "{{role.name}}" } } return ctx, fragment end test "example view code renders example markup" do assert_equal EXAMPLE_MARKUP, Context.new(roles).instance_eval(EXAMPLE_COMPILED.source_body) end test "compiled source is legible and transparent" do ctx, fragment = simple_tree_for(roles) assert_equal EXAMPLE_COMPILED.source_body, ExpressTemplates.compile(&fragment) end test "rendered component matches desired markup" do ExpressTemplates::Markup::Tag.formatted do ctx, fragment = simple_tree_for(roles) assert_equal EXAMPLE_MARKUP, ExpressTemplates.render(ctx, &fragment) end end end