diff options
context:
space:
mode:
Diffstat (limited to 'tests/extensions/test-link-commits.lua')
-rw-r--r--tests/extensions/test-link-commits.lua77
1 file changed, 77 insertions, 0 deletions
diff --git a/tests/extensions/test-link-commits.lua b/tests/extensions/test-link-commits.lua
new file mode 100644
index 0000000..6c6d28d
--- /dev/null
+++ b/tests/extensions/test-link-commits.lua
@@ -0,0 +1,77 @@
+-- Unit checks for custom/extensions/link-commits.lua, run under a standalone
+-- Lua by t0503-link-commits.sh with the script path as the argument. The
+-- shipped configuration links bare object names to ./?id= and issue marks
+-- like #123 to bugs.example.com, and everything here checks that shape, the
+-- length bounds and frontier on hash recognition, and the rule that no run
+-- of text is ever wrapped twice.
+
+local test_directory = arg[0]:match("^(.*)/") or "."
+local h = dofile(test_directory .. "/harness.lua")
+
+h.load(arg[1])
+
+local function render(text)
+ return h.run({}, { text })
+end
+
+local out, ret = render("see #123 for details")
+h.contains("issue mark becomes a link", out,
+ "<a href='https://bugs.example.com/?bug=123'>#123</a>")
+h.contains("text around the link survives", out, "see ")
+h.contains("text after the link survives", out, " for details")
+h.equals("close answers zero", ret, 0)
+
+out = render("fixed in deadbee")
+h.contains("seven hex characters link", out,
+ "<a href='./?id=deadbee'>deadbee</a>")
+
+out = render("fixed in deadbe")
+h.excludes("six hex characters stay text", out, "<a")
+
+out = render("fixed in 1234567")
+h.contains("an all digit run still links", out,
+ "<a href='./?id=1234567'>1234567</a>")
+
+local sha1 = string.rep("0123456789abcdef", 2) .. "01234567"
+out = render("commit " .. sha1)
+h.contains("a full sha1 name links", out, "'./?id=" .. sha1 .. "'")
+
+local sha256 = string.rep("0123456789abcdef", 4)
+out = render("commit " .. sha256)
+h.contains("a full sha256 name links", out, "'./?id=" .. sha256 .. "'")
+
+out = render("commit " .. sha256 .. "0")
+h.excludes("sixty five hex characters stay text", out, "<a")
+
+out = render("prefixdeadbeef")
+h.excludes("a hex run inside a word stays text", out, "<a")
+
+out = render("deadbeefy")
+h.excludes("a hex run ending inside a word stays text", out, "<a")
+
+-- The issue rule wins the overlap because it starts first, and the digit run
+-- inside it must not be wrapped a second time.
+out = render("see #1234567 for details")
+h.contains("the issue rule wins an overlap", out,
+ "<a href='https://bugs.example.com/?bug=1234567'>#1234567</a>")
+h.excludes("the overlapped hash is dropped", out, "./?id=")
+
+out = render("#12 and cafebabe12")
+h.contains("both rules fire on one message", out, "?bug=12'>#12</a>")
+h.contains("the object link also fires", out,
+ "<a href='./?id=cafebabe12'>cafebabe12</a>")
+
+-- One request is delivered as several writes, and a match split across two of
+-- them has to be seen whole.
+out = h.run({}, { "see #45", "6 and be done" })
+h.contains("a match split across writes still links", out,
+ "?bug=456'>#456</a>")
+
+out, ret = render("")
+h.equals("an empty message stays empty", out, "")
+h.equals("an empty message still answers zero", ret, 0)
+
+out = render("plain words only")
+h.equals("a message with no matches passes through", out, "plain words only")
+
+h.finish()