# frozen_string_literal: true require "test_helper" require "form_template" class FormTemplateTest < Minitest::Test def test_form_one_field template = FormTemplate.new(<<~TEMPLATE) form! title "TITLE" instructions "INSTRUCTIONS" field(var: "thevar", label: "thelabel") TEMPLATE form = template.render assert_equal :form, form.type assert_equal "TITLE", form.title assert_equal "INSTRUCTIONS", form.instructions assert_equal 1, form.fields.length assert_equal "thevar", form.fields[0].var assert_equal "thelabel", form.fields[0].label end def test_form_two_fields template = FormTemplate.new(<<~TEMPLATE) form! field(var: "thevar", label: "thelabel") field(var: "thevar2", label: "thelabel2") TEMPLATE form = template.render assert_equal 2, form.fields.length assert_equal "thevar", form.fields[0].var assert_equal "thelabel", form.fields[0].label assert_equal "thevar2", form.fields[1].var assert_equal "thelabel2", form.fields[1].label end def test_result_no_fields template = FormTemplate.new(<<~TEMPLATE) result! title "TITLE" instructions "INSTRUCTIONS" TEMPLATE form = template.render assert_equal :result, form.type assert_equal "TITLE", form.title assert_equal "INSTRUCTIONS", form.instructions end def test_form_validate_basic template = FormTemplate.new(<<~TEMPLATE) form! field(var: "thevar", label: "thelabel", datatype: "xs:integer") TEMPLATE form = template.render assert_equal 1, form.fields.length assert_equal "thevar", form.fields[0].var assert_equal "thelabel", form.fields[0].label validate = form.fields[0].find( "ns:validate", ns: "http://jabber.org/protocol/xdata-validate" ).first assert_equal "xs:integer", validate[:datatype] assert_equal "basic", validate.children.first.name end def test_form_validate_open template = FormTemplate.new(<<~TEMPLATE) form! field(var: "thevar", label: "thelabel", open: true) TEMPLATE form = template.render assert_equal 1, form.fields.length assert_equal "thevar", form.fields[0].var assert_equal "thelabel", form.fields[0].label validate = form.fields[0].find( "ns:validate", ns: "http://jabber.org/protocol/xdata-validate" ).first assert_equal ["open"], validate.children.map(&:name) end def test_form_validate_regex template = FormTemplate.new(<<~TEMPLATE) form! field(var: "thevar", label: "thelabel", regex: /[A-Z]/) TEMPLATE form = template.render assert_equal 1, form.fields.length assert_equal "thevar", form.fields[0].var assert_equal "thelabel", form.fields[0].label validate = form.fields[0].find( "ns:validate", ns: "http://jabber.org/protocol/xdata-validate" ).first assert_equal ["regex"], validate.children.map(&:name) assert_equal "[A-Z]", validate.children.first.content end def test_form_validate_range template = FormTemplate.new(<<~TEMPLATE) form! field(var: "thevar", label: "thelabel", range: (10..22)) TEMPLATE form = template.render assert_equal 1, form.fields.length assert_equal "thevar", form.fields[0].var assert_equal "thelabel", form.fields[0].label validate = form.fields[0].find( "ns:validate", ns: "http://jabber.org/protocol/xdata-validate" ).first assert_equal ["range"], validate.children.map(&:name) assert_equal "10", validate.children.first[:min] assert_equal "22", validate.children.first[:max] end def test_no_type template = FormTemplate.new(<<~TEMPLATE) title "TITLE" instructions "INSTRUCTIONS" TEMPLATE assert_raises { template.render } end def test_custom_xml template = FormTemplate.new(<<~TEMPLATE) form! xml.whoever @arg TEMPLATE form = template.render(arg: "abc") assert_equal "abc", form.at("whoever").content end end