File

spec/util_xtemplate_spec.lua @ 13532:9970d333a63f

mod_pubsub: Use error registry This is what util.error was made for! This replaces the custom error stanza builder with common code in util.stanza that knows enough about util.error and namespaced errors. Some awkwardness remains in the way util.pubsub returns conflicting form fields.
author Kim Alvefur <zash@zash.se>
date Sun, 27 Oct 2024 15:18:24 +0100
parent 13499:1f93e4f78c53
child 13568:3615590fd9ed
line wrap: on
line source

local st = require "prosody.util.stanza";
local xtemplate = require "prosody.util.xtemplate";

describe("util.xtemplate", function ()
	describe("render()", function ()
		it("works", function ()
			assert.same("Hello", xtemplate.render("{greeting}", st.stanza("root"):text_tag("greeting", "Hello")), "regular text content")
			assert.same("Hello", xtemplate.render("{#}", st.stanza("root"):text("Hello")), "top tag text content")
			assert.same("Hello", xtemplate.render("{greeting/@en}", st.stanza("root"):tag("greeting", { en = "Hello" })), "attribute")
		end)
		it("supports conditionals", function ()
			local atom_tmpl = "{@pubsub:title|and{*{@pubsub:title}*\n\n}}{summary|or{{author/name|and{{author/name} posted }}{title}}}";
			local atom_data = st.stanza("entry", { xmlns = "http://www.w3.org/2005/Atom" });
			assert.same("", xtemplate.render(atom_tmpl, atom_data));

			atom_data:text_tag("title", "an Entry")
			assert.same("an Entry", xtemplate.render(atom_tmpl, atom_data));

			atom_data:tag("author"):text_tag("name","Juliet"):up();
			assert.same("Juliet posted an Entry", xtemplate.render(atom_tmpl, atom_data));

			atom_data:text_tag("summary", "Juliet just posted a new entry");
			assert.same("Juliet just posted a new entry", xtemplate.render(atom_tmpl, atom_data));

			atom_data.attr["xmlns:pubsub"] = "http://jabber.org/protocol/pubsub";
			atom_data.attr["pubsub:title"] = "Juliets musings";
			assert.same("*Juliets musings*\n\nJuliet just posted a new entry", xtemplate.render(atom_tmpl, atom_data));
		end)
		it("can strip surrounding whitespace", function ()
			assert.same("Hello ", xtemplate.render(" {-greeting} ", st.stanza("root"):text_tag("greeting", "Hello")))
			assert.same(" Hello", xtemplate.render(" {greeting-} ", st.stanza("root"):text_tag("greeting", "Hello")))
			assert.same("Hello", xtemplate.render(" {-greeting-} ", st.stanza("root"):text_tag("greeting", "Hello")))
		end)
		describe("each", function ()
			it("makes sense", function ()
				local x = st.stanza("root"):tag("foo"):tag("bar")
				for i = 1, 5 do x:text_tag("i", tostring(i)); end
				x:reset();
				assert.same("12345", xtemplate.render("{foo/bar|each(i){{#}}}", x));
			end)
			it("handles missing inputs", function ()
				local x = st.stanza("root");
				assert.same("", xtemplate.render("{foo/bar|each(i){{#}}}", x));
			end)
		end)
	end)
end)