server_test.go
2681 bytes
1package web
2
3import (
4 "net/http"
5 "net/http/httptest"
6 "strings"
7 "testing"
8
9 "github.com/charmbracelet/soft-serve/pkg/access"
10 "github.com/charmbracelet/soft-serve/pkg/config"
11 "github.com/charmbracelet/soft-serve/pkg/proto"
12 "github.com/matryer/is"
13)
14
15func TestRouterWebUIShellIsOptIn(t *testing.T) {
16 is := is.New(t)
17 ctx, _, _ := newLFSTestContext(t)
18 cfg := config.FromContext(ctx)
19
20 w := httptest.NewRecorder()
21 NewRouter(ctx).ServeHTTP(w, httptest.NewRequest(http.MethodGet, "/", nil))
22 is.Equal(w.Code, http.StatusNotFound)
23
24 cfg.HTTP.WebUI.Enabled = true
25 router := NewRouter(ctx)
26
27 w = httptest.NewRecorder()
28 router.ServeHTTP(w, httptest.NewRequest(http.MethodGet, "/", nil))
29 is.Equal(w.Code, http.StatusOK)
30 is.True(strings.Contains(w.Body.String(), cfg.Name))
31 is.Equal(w.Header().Get("Content-Type"), "text/html; charset=utf-8")
32
33 w = httptest.NewRecorder()
34 router.ServeHTTP(w, httptest.NewRequest(http.MethodGet, "/@/assets/site.css", nil))
35 is.Equal(w.Code, http.StatusOK)
36 is.Equal(w.Header().Get("Content-Type"), "text/css; charset=utf-8")
37 is.Equal(w.Header().Get("Cache-Control"), "public, max-age=31536000")
38 is.Equal(w.Header().Get("X-Content-Type-Options"), "nosniff")
39 is.Equal(w.Header().Get("Referrer-Policy"), "same-origin")
40 is.True(strings.Contains(w.Body.String(), "font-family"))
41
42 w = httptest.NewRecorder()
43 router.ServeHTTP(w, httptest.NewRequest(http.MethodGet, "/@/assets/site.js", nil))
44 is.Equal(w.Code, http.StatusOK)
45 is.Equal(w.Header().Get("Content-Type"), "text/javascript; charset=utf-8")
46 is.Equal(w.Header().Get("Cache-Control"), "public, max-age=31536000")
47 is.Equal(w.Header().Get("X-Content-Type-Options"), "nosniff")
48 is.Equal(w.Header().Get("Referrer-Policy"), "same-origin")
49 is.True(strings.Contains(w.Body.String(), "navigator.clipboard"))
50}
51
52func TestRouterGoGetAndGitRoutesPrecedePages(t *testing.T) {
53 is := is.New(t)
54 ctx, be, _ := newLFSTestContext(t)
55 cfg := config.FromContext(ctx)
56 cfg.HTTP.WebUI.Enabled = true
57 allowKeyless := true
58 cfg.AllowKeyless = &allowKeyless
59 anonAccess := access.ReadOnlyAccess
60 cfg.AnonAccess = &anonAccess
61
62 owner, err := be.CreateUser(ctx, "owner", proto.UserOptions{})
63 is.NoErr(err)
64 _, err = be.CreateRepository(ctx, "example", owner, proto.RepositoryOptions{})
65 is.NoErr(err)
66
67 router := NewRouter(ctx)
68
69 w := httptest.NewRecorder()
70 router.ServeHTTP(w, httptest.NewRequest(http.MethodGet, "/example?go-get=1", nil))
71 is.Equal(w.Code, http.StatusOK)
72 is.True(strings.Contains(w.Body.String(), `name="go-import"`))
73
74 w = httptest.NewRecorder()
75 router.ServeHTTP(w, httptest.NewRequest(http.MethodPost, "/example.git/info/refs", nil))
76 is.Equal(w.Code, http.StatusMethodNotAllowed)
77}