1# frozen_string_literal: true
  2
  3require "test_helper"
  4require "form_template"
  5
  6class FormTemplateTest < Minitest::Test
  7	def test_form_one_field
  8		template = FormTemplate.new(<<~TEMPLATE)
  9			form!
 10			title "TITLE"
 11			instructions "INSTRUCTIONS"
 12			field(var: "thevar", label: "thelabel")
 13		TEMPLATE
 14		form = template.render
 15		assert_equal :form, form.type
 16		assert_equal "TITLE", form.title
 17		assert_equal "INSTRUCTIONS", form.instructions
 18		assert_equal 1, form.fields.length
 19		assert_equal "thevar", form.fields[0].var
 20		assert_equal "thelabel", form.fields[0].label
 21	end
 22
 23	def test_form_two_fields
 24		template = FormTemplate.new(<<~TEMPLATE)
 25			form!
 26			field(var: "thevar", label: "thelabel")
 27			field(var: "thevar2", label: "thelabel2")
 28		TEMPLATE
 29		form = template.render
 30		assert_equal 2, form.fields.length
 31		assert_equal "thevar", form.fields[0].var
 32		assert_equal "thelabel", form.fields[0].label
 33		assert_equal "thevar2", form.fields[1].var
 34		assert_equal "thelabel2", form.fields[1].label
 35	end
 36
 37	def test_result_no_fields
 38		template = FormTemplate.new(<<~TEMPLATE)
 39			result!
 40			title "TITLE"
 41			instructions "INSTRUCTIONS"
 42		TEMPLATE
 43		form = template.render
 44		assert_equal :result, form.type
 45		assert_equal "TITLE", form.title
 46		assert_equal "INSTRUCTIONS", form.instructions
 47	end
 48
 49	def test_form_validate_basic
 50		template = FormTemplate.new(<<~TEMPLATE)
 51			form!
 52			field(var: "thevar", label: "thelabel", datatype: "xs:integer")
 53		TEMPLATE
 54		form = template.render
 55		assert_equal 1, form.fields.length
 56		assert_equal "thevar", form.fields[0].var
 57		assert_equal "thelabel", form.fields[0].label
 58		validate = form.fields[0].find(
 59			"ns:validate",
 60			ns: "http://jabber.org/protocol/xdata-validate"
 61		).first
 62		assert_equal "xs:integer", validate[:datatype]
 63		assert_equal "basic", validate.children.first.name
 64	end
 65
 66	def test_form_validate_open
 67		template = FormTemplate.new(<<~TEMPLATE)
 68			form!
 69			field(var: "thevar", label: "thelabel", open: true)
 70		TEMPLATE
 71		form = template.render
 72		assert_equal 1, form.fields.length
 73		assert_equal "thevar", form.fields[0].var
 74		assert_equal "thelabel", form.fields[0].label
 75		validate = form.fields[0].find(
 76			"ns:validate",
 77			ns: "http://jabber.org/protocol/xdata-validate"
 78		).first
 79		assert_equal ["open"], validate.children.map(&:name)
 80	end
 81
 82	def test_form_validate_regex
 83		template = FormTemplate.new(<<~TEMPLATE)
 84			form!
 85			field(var: "thevar", label: "thelabel", regex: /[A-Z]/)
 86		TEMPLATE
 87		form = template.render
 88		assert_equal 1, form.fields.length
 89		assert_equal "thevar", form.fields[0].var
 90		assert_equal "thelabel", form.fields[0].label
 91		validate = form.fields[0].find(
 92			"ns:validate",
 93			ns: "http://jabber.org/protocol/xdata-validate"
 94		).first
 95		assert_equal ["regex"], validate.children.map(&:name)
 96		assert_equal "[A-Z]", validate.children.first.content
 97	end
 98
 99	def test_form_validate_range
100		template = FormTemplate.new(<<~TEMPLATE)
101			form!
102			field(var: "thevar", label: "thelabel", range: (10..22))
103		TEMPLATE
104		form = template.render
105		assert_equal 1, form.fields.length
106		assert_equal "thevar", form.fields[0].var
107		assert_equal "thelabel", form.fields[0].label
108		validate = form.fields[0].find(
109			"ns:validate",
110			ns: "http://jabber.org/protocol/xdata-validate"
111		).first
112		assert_equal ["range"], validate.children.map(&:name)
113		assert_equal "10", validate.children.first[:min]
114		assert_equal "22", validate.children.first[:max]
115	end
116
117	def test_no_type
118		template = FormTemplate.new(<<~TEMPLATE)
119			title "TITLE"
120			instructions "INSTRUCTIONS"
121		TEMPLATE
122		assert_raises { template.render }
123	end
124
125	def test_custom_xml
126		template = FormTemplate.new(<<~TEMPLATE)
127			form!
128			xml.whoever @arg
129		TEMPLATE
130		form = template.render(arg: "abc")
131		assert_equal "abc", form.at("whoever").content
132	end
133
134	def test_table
135		template = FormTemplate.new(<<~TEMPLATE)
136			form!
137			table(
138				@arg,
139				one: "One",
140				two: { label: "Two", datatype: "xs:integer" },
141				three: { label: "Three", type: "jid-single" }
142			)
143		TEMPLATE
144		form = template.render(arg: [OpenStruct.new(one: 1, two: 2, three: 3)])
145		assert_equal 3, form.at("reported").children.length
146		assert_equal "one", form.at("reported").children[0][:var]
147		assert_equal "two", form.at("reported").children[1][:var]
148		assert_equal(
149			"xs:integer",
150			form.at("reported").children[1].at_xpath(
151				"./ns:validate", ns: "http://jabber.org/protocol/xdata-validate"
152			)[:datatype]
153		)
154		assert_equal "three", form.at("reported").children[2][:var]
155		assert_equal "jid-single", form.at("reported").children[2][:type]
156	end
157end