From 37d557202f9a3c19d93f4e186c1dddf8ade6c160 Mon Sep 17 00:00:00 2001 From: Till Faelligen <2353100+S7evinK@users.noreply.github.com> Date: Thu, 26 Jan 2023 15:17:47 +0100 Subject: [PATCH] Embed the template, add test --- setup/base/base.go | 15 ++++- setup/base/base_test.go | 57 +++++++++++++++++++ .../base/static/index.gotmpl | 2 +- 3 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 setup/base/base_test.go rename static/index.html => setup/base/static/index.gotmpl (99%) diff --git a/setup/base/base.go b/setup/base/base.go index a0609d42c..6eeb10c37 100644 --- a/setup/base/base.go +++ b/setup/base/base.go @@ -18,8 +18,10 @@ import ( "context" "crypto/tls" "database/sql" + "embed" "encoding/json" "fmt" + "html/template" "io" "net" "net/http" @@ -65,6 +67,9 @@ import ( userapiinthttp "github.com/matrix-org/dendrite/userapi/inthttp" ) +//go:embed static/*.gotmpl +var staticContent embed.FS + // BaseDendrite is a base for creating new instances of dendrite. It parses // command line flags and config, and exposes methods for creating various // resources. All errors are handled by logging then exiting, so all methods @@ -493,8 +498,16 @@ func (b *BaseDendrite) SetupAndServeHTTP( b.ConfigureAdminEndpoints() + tmpl := template.Must(template.ParseFS(staticContent, "static/*.gotmpl")) + b.PublicStaticMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - http.ServeFile(w, r, "static/index.html") + if err := tmpl.ExecuteTemplate(w, "index.gotmpl", map[string]string{ + "Version": internal.VersionString(), + }); err != nil { + logrus.WithError(err).Error("failed to execute landing page template") + w.WriteHeader(http.StatusInternalServerError) + _, _ = w.Write([]byte("failed to execute template")) + } }) var clientHandler http.Handler diff --git a/setup/base/base_test.go b/setup/base/base_test.go new file mode 100644 index 000000000..61cb530a9 --- /dev/null +++ b/setup/base/base_test.go @@ -0,0 +1,57 @@ +package base_test + +import ( + "bytes" + "embed" + "html/template" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/matrix-org/dendrite/internal" + "github.com/matrix-org/dendrite/setup/config" + "github.com/matrix-org/dendrite/test/testrig" + "github.com/stretchr/testify/assert" +) + +//go:embed static/*.gotmpl +var staticContent embed.FS + +func TestLandingPage(t *testing.T) { + // generate the expected result + tmpl := template.Must(template.ParseFS(staticContent, "static/*.gotmpl")) + expectedRes := &bytes.Buffer{} + err := tmpl.ExecuteTemplate(expectedRes, "index.gotmpl", map[string]string{ + "Version": internal.VersionString(), + }) + assert.NoError(t, err) + + b, _, _ := testrig.Base(nil) + defer b.Close() + + // hack: create a server and close it immediately, just to get a random port assigned + s := httptest.NewServer(nil) + s.Close() + + // start base with the listener and wait for it to be started + go b.SetupAndServeHTTP("", config.HTTPAddress(s.URL), nil, nil) + time.Sleep(time.Millisecond * 10) + + // When hitting /, we should be redirected to /_matrix/static, which should contain the landing page + req, err := http.NewRequest(http.MethodGet, s.URL, nil) + assert.NoError(t, err) + + // do the request + resp, err := s.Client().Do(req) + assert.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + + // read the response + buf := &bytes.Buffer{} + _, err = buf.ReadFrom(resp.Body) + assert.NoError(t, err) + + // Using .String() for user friendly output + assert.Equal(t, expectedRes.String(), buf.String(), "response mismatch") +} diff --git a/static/index.html b/setup/base/static/index.gotmpl similarity index 99% rename from static/index.html rename to setup/base/static/index.gotmpl index 913732c46..b3c5576eb 100644 --- a/static/index.html +++ b/setup/base/static/index.gotmpl @@ -46,7 +46,7 @@ -

It works! Dendrite is running

+

It works! Dendrite {{ .Version }} is running

Your Dendrite server is listening on this port and is ready for messages.

To use this server you'll need a Matrix client.