tinyrelayfile
tinyrelay/tinyclient/remote_test.go/

tinyclient/remote_test.go raw
1package tinyclient
2
3import (
4 "net/http"
5 "net/http/httptest"
6 "strings"
7 "testing"
8)
9
10func TestBackendSnapshotHidesOwnerSettings(t *testing.T) {
11 p := DefaultPolicy(strings.Repeat("a", 64))
12 p.Name = "Visible relay"
13 p.PrivatePeers = []string{"https://secret-peer.example"}
14 p.PushCallbacks = []string{"https://secret-hook.example/token"}
15 p.BlockedWords = []string{"secret-moderation-rule"}
16 app, err := New(&fakeBackend{policy: p}, Options{Actor: func(r *http.Request) (string, error) {
17 c, err := r.Cookie("tiny_session")
18 if err == nil && c.Value == "valid-owner" {
19 return p.Owner, nil
20 }
21 return "", nil
22 }})
23 if err != nil {
24 t.Fatal(err)
25 }
26 for _, owner := range []bool{false, true} {
27 req := httptest.NewRequest("GET", BackendPath, nil)
28 if owner {
29 req.AddCookie(&http.Cookie{Name: "tiny_session", Value: "valid-owner"})
30 }
31 response := httptest.NewRecorder()
32 app.BackendHandler().ServeHTTP(response, req)
33 body := response.Body.String()
34 if response.Code != 200 || !strings.Contains(body, "Visible relay") {
35 t.Fatalf("snapshot: %d %s", response.Code, body)
36 }
37 for _, secret := range []string{"secret-peer", "secret-hook", "secret-moderation-rule"} {
38 if strings.Contains(body, secret) != owner {
39 t.Fatalf("owner=%v snapshot leaks or loses %s: %s", owner, secret, body)
40 }
41 }
42 }
43}
44
45func TestIntegratedAppMountsBackendContract(t *testing.T) {
46 app, err := New(&fakeBackend{policy: DefaultPolicy(strings.Repeat("a", 64))}, Options{})
47 if err != nil {
48 t.Fatal(err)
49 }
50 upstream := httptest.NewServer(app)
51 defer upstream.Close()
52 remote, err := NewRemote(RemoteOptions{BackendURL: upstream.URL, PublicURL: "http://relay.example"})
53 if err != nil {
54 t.Fatal(err)
55 }
56 got := httptest.NewRecorder()
57 remote.ServeHTTP(got, httptest.NewRequest("GET", "http://relay.example/", nil))
58 if got.Code != 200 || !strings.Contains(got.Body.String(), "<html") {
59 t.Fatalf("integrated backend: %d %s", got.Code, got.Body.String())
60 }
61}
62
63func TestRemoteRendersHomeLocally(t *testing.T) {
64 backend := &fakeBackend{policy: DefaultPolicy(strings.Repeat("a", 64))}
65 integrated, err := New(backend, Options{})
66 if err != nil {
67 t.Fatal(err)
68 }
69 upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
70 if r.URL.Path != BackendPath {
71 t.Errorf("remote asked upstream to render %s", r.URL.Path)
72 http.Error(w, "no renderer here", 418)
73 return
74 }
75 integrated.BackendHandler().ServeHTTP(w, r)
76 }))
77 defer upstream.Close()
78 remote, err := NewRemote(RemoteOptions{BackendURL: upstream.URL, PublicURL: backend.URL()})
79 if err != nil {
80 t.Fatal(err)
81 }
82 want, got := httptest.NewRecorder(), httptest.NewRecorder()
83 integrated.ServeHTTP(want, httptest.NewRequest("GET", "/", nil))
84 remote.ServeHTTP(got, httptest.NewRequest("GET", backend.URL()+"/", nil))
85 if got.Code != want.Code || got.Body.String() != want.Body.String() {
86 t.Fatalf("local rendering differs: status %d want %d\n%s", got.Code, want.Code, got.Body.String())
87 }
88}

About

ownerc01503e8035f
visibilitypublic
headd730679639bf

Maintainers

  • c01503e8035f owner
  • ba1b5beed5b5 agent hermes

Clone

  • https://012.run/npub1cq2s86qrtadf36eqq3epm38wmhdynrrcwxf84eldk3f94dkv7ttsrulrz5/tinyrelay.git

Refs