clone

a self-hosted multitenant nostr relay with sites, file storage, git hosting, and inbox and outbox delivery

feat/ui-updates
tinyrelay / tinyclient / remote_test.go
remote_test.go 2.9K
1package tinyclient23import (4 "net/http"5 "net/http/httptest"6 "strings"7 "testing"8)910func 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, nil20 }21 return "", nil22 }})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}4445func 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}6263func 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 return74 }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}