summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2023-06-30 11:57:34 +0200
committerxengineering <me@xengineering.eu>2023-06-30 11:57:34 +0200
commit91766058d76044fa7e07f75c586bc7f89b868328 (patch)
treed13dcd9d9190b008385912d86918fb70f08f83ad
parentc224e6ebc23d96929d9c3fee9b7987762f68f1dd (diff)
downloadlimox-91766058d76044fa7e07f75c586bc7f89b868328.tar
limox-91766058d76044fa7e07f75c586bc7f89b868328.tar.zst
limox-91766058d76044fa7e07f75c586bc7f89b868328.zip
Add unit test for routing function
-rw-r--r--xmpp/router_test.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/xmpp/router_test.go b/xmpp/router_test.go
new file mode 100644
index 0000000..ea13712
--- /dev/null
+++ b/xmpp/router_test.go
@@ -0,0 +1,69 @@
+package xmpp
+
+import (
+ "encoding/xml"
+ "testing"
+ "strings"
+)
+
+// routerTest contains a single test case for the xmpp.router. The XML element
+// is given as a string and the value int describes the expected value of a
+// test variable inside the corresponding unit test. See TestRouter for
+// details.
+type routerTest struct {
+ xml string
+ value int
+}
+
+// TestRouter tests the xmpp/router.go file. The central functionality is the
+// route() function. To test this a fake routing table is created inside this
+// test with XML element handler function produced by the factory function
+// defined below. each handler simply sets the value of the testpoint variable
+// to the value mentioned by the test point. That way the routing can be
+// validated.
+func TestRouter(t *testing.T) {
+ var testpoint int
+
+ factory := func(tp *int, i int) func([]xml.Token) {
+ return func([]xml.Token) {
+ *tp = i
+ }
+ }
+
+ tests := []routerTest{
+ routerTest{`<a></a>`, 1},
+ routerTest{`<b></b>`, 2},
+ routerTest{`<c></c>`, 3},
+ routerTest{`<b xmlns='https://xengineering.eu'></b>`, 4},
+ routerTest{`<a xmlns='https://xengineering.eu'></a>`, 5},
+ }
+
+ testRouting := routingTable{
+ {xml.Name{``, `a`}, factory(&testpoint, 1)},
+ {xml.Name{``, `b`}, factory(&testpoint, 2)},
+ {xml.Name{``, `c`}, factory(&testpoint, 3)},
+ {xml.Name{`https://xengineering.eu`, `b`}, factory(&testpoint, 4)},
+ {xml.Name{`https://xengineering.eu`, `a`}, factory(&testpoint, 5)},
+ }
+
+ for _, v := range tests {
+ testpoint = 0
+
+ r := strings.NewReader(v.xml)
+ d := xml.NewDecoder(r)
+ tokens := make([]xml.Token, 0)
+ for {
+ token, err := d.Token()
+ if err != nil {
+ break
+ }
+ tokens = append(tokens, xml.CopyToken(token))
+ }
+
+ route(tokens, testRouting)
+
+ if testpoint != v.value {
+ t.Fatalf("XML element was not routed correctly!\n")
+ }
+ }
+}