Parent directory

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}