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