Monorepo for Tangled
tangled.org
1package xrpc
2
3import (
4 "context"
5 "encoding/json"
6 "io"
7 "log/slog"
8 "net/http"
9 "net/http/httptest"
10 "net/url"
11 "path/filepath"
12 "testing"
13
14 "tangled.org/core/api/tangled"
15 "tangled.org/core/knotserver/config"
16 "tangled.org/core/knotserver/db"
17)
18
19func newTestXrpc(t *testing.T) *Xrpc {
20 t.Helper()
21 d, err := db.Setup(context.Background(), filepath.Join(t.TempDir(), "test.db"))
22 if err != nil {
23 t.Fatalf("db.Setup: %v", err)
24 }
25 return &Xrpc{
26 Db: d,
27 Config: &config.Config{Server: config.Server{Hostname: "knot.example", MaxResponseKB: 5120}},
28 Logger: slog.New(slog.NewTextHandler(io.Discard, nil)),
29 }
30}
31
32func TestRepoDescribeRepo_ReturnsOwner(t *testing.T) {
33 x := newTestXrpc(t)
34 if err := x.Db.StoreRepoKey("did:plc:repo1", []byte("dummy"), "did:plc:akshay", "myrepo"); err != nil {
35 t.Fatalf("StoreRepoKey: %v", err)
36 }
37
38 req := httptest.NewRequest(http.MethodGet, "/xrpc/sh.tangled.repo.describeRepo?repoDid=did:plc:repo1", nil)
39 rec := httptest.NewRecorder()
40 x.RepoDescribeRepo(rec, req)
41
42 if rec.Code != http.StatusOK {
43 t.Fatalf("status = %d, want 200; body=%s", rec.Code, rec.Body.String())
44 }
45
46 var out tangled.RepoDescribeRepo_Output
47 if err := json.Unmarshal(rec.Body.Bytes(), &out); err != nil {
48 t.Fatalf("decode: %v", err)
49 }
50 if out.RepoDid != "did:plc:repo1" {
51 t.Errorf("RepoDid = %q", out.RepoDid)
52 }
53 if out.OwnerDid != "did:plc:akshay" {
54 t.Errorf("OwnerDid = %q, want did:plc:akshay", out.OwnerDid)
55 }
56 if out.Rkey != "myrepo" {
57 t.Errorf("Rkey = %q, want myrepo", out.Rkey)
58 }
59}
60
61func TestRepoDescribeRepo_UnknownRepoDidReturns404(t *testing.T) {
62 x := newTestXrpc(t)
63
64 req := httptest.NewRequest(http.MethodGet, "/xrpc/sh.tangled.repo.describeRepo?repoDid=did:plc:unknown", nil)
65 rec := httptest.NewRecorder()
66 x.RepoDescribeRepo(rec, req)
67
68 if rec.Code != http.StatusNotFound {
69 t.Errorf("status = %d, want 404", rec.Code)
70 }
71}
72
73func TestRepoDescribeRepo_MissingParamReturns400(t *testing.T) {
74 x := newTestXrpc(t)
75
76 req := httptest.NewRequest(http.MethodGet, "/xrpc/sh.tangled.repo.describeRepo", nil)
77 rec := httptest.NewRecorder()
78 x.RepoDescribeRepo(rec, req)
79
80 if rec.Code != http.StatusBadRequest {
81 t.Errorf("status = %d, want 400", rec.Code)
82 }
83}
84
85func TestRepoDescribeRepo_MalformedDidParamReturns400(t *testing.T) {
86 x := newTestXrpc(t)
87 u := "/xrpc/sh.tangled.repo.describeRepo?repoDid=" + url.QueryEscape("notadid")
88 req := httptest.NewRequest(http.MethodGet, u, nil)
89 rec := httptest.NewRecorder()
90 x.RepoDescribeRepo(rec, req)
91 if rec.Code != http.StatusBadRequest {
92 t.Errorf("status = %d, want 400", rec.Code)
93 }
94}