1 local dataforms
= require
"util.dataforms";
2 local st
= require
"util.stanza";
3 local jid
= require
"util.jid";
4 local iter
= require
"util.iterators";
6 describe("util.dataforms", function ()
7 local some_form
, xform
;
9 some_form
= dataforms
.new({
11 instructions
= "form-instructions",
15 value
= "xmpp:prosody.im/spec/util.dataforms#1",
19 value
= "Fixed field";
23 label
= "boolean-label",
24 name
= "boolean-field",
29 label
= "fixed-label",
31 value
= "fixed-value",
35 label
= "hidden-label",
36 name
= "hidden-field",
37 value
= "hidden-value",
41 label
= "jid-multi-label",
42 name
= "jid-multi-field",
50 label
= "jid-single-label",
51 name
= "jid-single-field",
52 value
= "jid@single/value",
56 label
= "list-multi-label",
57 name
= "list-multi-field",
59 "list-multi-option-value#1",
60 "list-multi-option-value#3",
64 label
= "list-multi-option-label#1",
65 value
= "list-multi-option-value#1",
69 label
= "list-multi-option-label#2",
70 value
= "list-multi-option-value#2",
74 label
= "list-multi-option-label#3",
75 value
= "list-multi-option-value#3",
82 label
= "list-single-label",
83 name
= "list-single-field",
84 value
= "list-single-value",
87 "list-single-value#2",
88 "list-single-value#3",
93 label
= "text-multi-label",
94 name
= "text-multi-field",
95 value
= "text\nmulti\nvalue",
98 type = "text-private",
99 label
= "text-private-label",
100 name
= "text-private-field",
101 value
= "text-private-value",
104 type = "text-single",
105 label
= "text-single-label",
106 name
= "text-single-field",
107 value
= "text-single-value",
110 xform
= some_form
:form();
113 it("works", function ()
114 assert.truthy(xform
);
115 assert.truthy(st
.is_stanza(xform
));
116 assert.equal("x", xform
.name
);
117 assert.equal("jabber:x:data", xform
.attr
.xmlns
);
118 assert.equal("FORM_TYPE", xform
:find("field@var"));
119 assert.equal("xmpp:prosody.im/spec/util.dataforms#1", xform
:find("field/value#"));
120 local allowed_direct_children
= {
125 for tag in xform
:childtags() do
126 assert.truthy(allowed_direct_children
[tag.name
], "unknown direct child");
130 it("produced boolean field correctly", function ()
132 for field
in xform
:childtags("field") do
133 if field
.attr
.var
== "boolean-field" then
139 assert.truthy(st
.is_stanza(f
));
140 assert.equal("boolean-field", f
.attr
.var
);
141 assert.equal("boolean", f
.attr
.type);
142 assert.equal("boolean-label", f
.attr
.label
);
143 assert.equal(1, iter
.count(f
:childtags("value")));
144 local val
= f
:get_child_text("value");
145 assert.truthy(val
== "true" or val
== "1");
148 it("produced fixed field correctly", function ()
150 for field
in xform
:childtags("field") do
151 if field
.attr
.var
== "fixed-field" then
157 assert.truthy(st
.is_stanza(f
));
158 assert.equal("fixed-field", f
.attr
.var
);
159 assert.equal("fixed", f
.attr
.type);
160 assert.equal("fixed-label", f
.attr
.label
);
161 assert.equal(1, iter
.count(f
:childtags("value")));
162 assert.equal("fixed-value", f
:get_child_text("value"));
165 it("produced hidden field correctly", function ()
167 for field
in xform
:childtags("field") do
168 if field
.attr
.var
== "hidden-field" then
174 assert.truthy(st
.is_stanza(f
));
175 assert.equal("hidden-field", f
.attr
.var
);
176 assert.equal("hidden", f
.attr
.type);
177 assert.equal("hidden-label", f
.attr
.label
);
178 assert.equal(1, iter
.count(f
:childtags("value")));
179 assert.equal("hidden-value", f
:get_child_text("value"));
182 it("produced jid-multi field correctly", function ()
184 for field
in xform
:childtags("field") do
185 if field
.attr
.var
== "jid-multi-field" then
191 assert.truthy(st
.is_stanza(f
));
192 assert.equal("jid-multi-field", f
.attr
.var
);
193 assert.equal("jid-multi", f
.attr
.type);
194 assert.equal("jid-multi-label", f
.attr
.label
);
195 assert.equal(2, iter
.count(f
:childtags("value")));
198 for value
in f
:childtags("value") do
200 assert.equal(("jid@multi/value#%d"):format(i
), value
:get_text());
204 it("produced jid-single field correctly", function ()
206 for field
in xform
:childtags("field") do
207 if field
.attr
.var
== "jid-single-field" then
213 assert.truthy(st
.is_stanza(f
));
214 assert.equal("jid-single-field", f
.attr
.var
);
215 assert.equal("jid-single", f
.attr
.type);
216 assert.equal("jid-single-label", f
.attr
.label
);
217 assert.equal(1, iter
.count(f
:childtags("value")));
218 assert.equal("jid@single/value", f
:get_child_text("value"));
219 assert.truthy(jid
.prep(f
:get_child_text("value")));
222 it("produced list-multi field correctly", function ()
224 for field
in xform
:childtags("field") do
225 if field
.attr
.var
== "list-multi-field" then
231 assert.truthy(st
.is_stanza(f
));
232 assert.equal("list-multi-field", f
.attr
.var
);
233 assert.equal("list-multi", f
.attr
.type);
234 assert.equal("list-multi-label", f
.attr
.label
);
235 assert.equal(2, iter
.count(f
:childtags("value")));
236 assert.equal("list-multi-option-value#1", f
:get_child_text("value"));
237 assert.equal(3, iter
.count(f
:childtags("option")));
240 it("produced list-single field correctly", function ()
242 for field
in xform
:childtags("field") do
243 if field
.attr
.var
== "list-single-field" then
249 assert.truthy(st
.is_stanza(f
));
250 assert.equal("list-single-field", f
.attr
.var
);
251 assert.equal("list-single", f
.attr
.type);
252 assert.equal("list-single-label", f
.attr
.label
);
253 assert.equal(1, iter
.count(f
:childtags("value")));
254 assert.equal("list-single-value", f
:get_child_text("value"));
255 assert.equal(3, iter
.count(f
:childtags("option")));
258 it("produced text-multi field correctly", function ()
260 for field
in xform
:childtags("field") do
261 if field
.attr
.var
== "text-multi-field" then
267 assert.truthy(st
.is_stanza(f
));
268 assert.equal("text-multi-field", f
.attr
.var
);
269 assert.equal("text-multi", f
.attr
.type);
270 assert.equal("text-multi-label", f
.attr
.label
);
271 assert.equal(3, iter
.count(f
:childtags("value")));
274 it("produced text-private field correctly", function ()
276 for field
in xform
:childtags("field") do
277 if field
.attr
.var
== "text-private-field" then
283 assert.truthy(st
.is_stanza(f
));
284 assert.equal("text-private-field", f
.attr
.var
);
285 assert.equal("text-private", f
.attr
.type);
286 assert.equal("text-private-label", f
.attr
.label
);
287 assert.equal(1, iter
.count(f
:childtags("value")));
288 assert.equal("text-private-value", f
:get_child_text("value"));
291 it("produced text-single field correctly", function ()
293 for field
in xform
:childtags("field") do
294 if field
.attr
.var
== "text-single-field" then
300 assert.truthy(st
.is_stanza(f
));
301 assert.equal("text-single-field", f
.attr
.var
);
302 assert.equal("text-single", f
.attr
.type);
303 assert.equal("text-single-label", f
.attr
.label
);
304 assert.equal(1, iter
.count(f
:childtags("value")));
305 assert.equal("text-single-value", f
:get_child_text("value"));
308 describe("get_type()", function ()
309 it("identifes dataforms", function ()
310 assert.equal(nil, dataforms
.get_type(nil));
311 assert.equal(nil, dataforms
.get_type(""));
312 assert.equal(nil, dataforms
.get_type({}));
313 assert.equal(nil, dataforms
.get_type(st
.stanza("no-a-form")));
314 assert.equal("xmpp:prosody.im/spec/util.dataforms#1", dataforms
.get_type(xform
));
318 describe(":data", function ()
319 it("works", function ()
320 assert.truthy(some_form
:data(xform
));
324 describe("issue1177", function ()
325 local form_with_stuff
;
327 form_with_stuff
= dataforms
.new({
329 type = "list-single";
333 { label
= "A", value
= "a", default
= true },
334 { label
= "B", value
= "b" },
340 it("includes options when value is included", function ()
341 local f
= form_with_stuff
:form({ abtest
= "a" });
342 assert.truthy(f
:find("field/option"));
345 it("includes options when value is excluded", function ()
346 local f
= form_with_stuff
:form({});
347 assert.truthy(f
:find("field/option"));
351 describe("using current values in place of missing fields", function ()
352 it("gets back the previous values when given an empty form", function ()
354 ["list-multi-field"] = {
355 "list-multi-option-value#2";
357 ["list-single-field"] = "list-single-value#2";
358 ["hidden-field"] = "hidden-value";
359 ["boolean-field"] = false;
360 ["text-multi-field"] = "words\ngo\nhere";
361 ["jid-single-field"] = "alice@example.com";
362 ["text-private-field"] = "hunter2";
363 ["text-single-field"] = "text-single-value";
364 ["jid-multi-field"] = {
369 -- FORM_TYPE = "xmpp:prosody.im/spec/util.dataforms#1"; -- does this need to be included?
370 ["list-multi-field"] = {
371 "list-multi-option-value#2";
373 ["list-single-field"] = "list-single-value#2";
374 ["hidden-field"] = "hidden-value";
375 ["boolean-field"] = false;
376 ["text-multi-field"] = "words\ngo\nhere";
377 ["jid-single-field"] = "alice@example.com";
378 ["text-private-field"] = "hunter2";
379 ["text-single-field"] = "text-single-value";
380 ["jid-multi-field"] = {
384 local data
, err
= some_form
:data(st
.stanza("x", {xmlns
="jabber:x:data"}), current
);
385 assert.is
.table(data
, err
);
386 assert.same(expect
, data
, "got back the same data");
390 describe("field 'var' property", function ()
391 it("works as expected", function ()
392 local f
= dataforms
.new
{
394 var
= "someprefix#the-field",
396 type = "text-single",
399 local x
= f
:form({the_field
= "hello"});
400 assert.equal("someprefix#the-field", x
:find
"field@var");
401 assert.equal("hello", x
:find
"field/value#");
405 describe("validation", function ()
406 local f
= dataforms
.new
{
409 type = "text-single",
410 datatype
= "xs:integer",
414 it("works", function ()
415 local d
= f
:data(f
:form({number = 1}));
416 assert.equal(1, d
.number);
419 it("works", function ()
420 local d
,e
= f
:data(f
:form({number = "nan"}));
421 assert.not_equal(1, d
.number);
423 assert.string(e
.number);