1package archesrv
2
3import (
4 "io"
5 "log/slog"
6 "net/http"
7 "net/http/httptest"
8 "path/filepath"
9 "testing"
10
11 "arche/internal/repo"
12
13 _ "github.com/mattn/go-sqlite3"
14)
15
16func newTestServerWith(t *testing.T, fn func(cfg *Config)) (*forgeServer, *httptest.Server) {
17 t.Helper()
18 dir := t.TempDir()
19 db, err := openDB(filepath.Join(dir, "server.db"))
20 if err != nil {
21 t.Fatalf("openDB: %v", err)
22 }
23 t.Cleanup(func() { db.Close() })
24
25 cfg := DefaultConfig()
26 cfg.Storage.DataDir = dir
27 if fn != nil {
28 fn(&cfg)
29 }
30 s := &forgeServer{
31 db: db,
32 cfg: cfg,
33 log: slog.New(slog.NewTextHandler(io.Discard, nil)),
34 }
35 ts := httptest.NewServer(s.routes())
36 t.Cleanup(ts.Close)
37 return s, ts
38}
39
40func loginAsAdmin(t *testing.T, s *forgeServer, ts *httptest.Server) (*User, *http.Client) {
41 t.Helper()
42 admin, err := s.db.CreateUser("admin", "adminpass", true)
43 if err != nil {
44 t.Fatalf("CreateUser admin: %v", err)
45 }
46 return admin, loginAs(t, ts, "admin", "adminpass")
47}
48
49func loginAs(t *testing.T, ts *httptest.Server, username, password string) *http.Client {
50 t.Helper()
51 jar := newCookieJar()
52 client := &http.Client{
53 Jar: jar,
54 CheckRedirect: func(_ *http.Request, _ []*http.Request) error {
55 return http.ErrUseLastResponse
56 },
57 }
58 resp, err := client.PostForm(ts.URL+"/login", map[string][]string{
59 "username": {username},
60 "password": {password},
61 })
62 if err != nil {
63 t.Fatalf("POST /login: %v", err)
64 }
65 resp.Body.Close()
66 if resp.StatusCode != http.StatusFound && resp.StatusCode != http.StatusSeeOther {
67 t.Fatalf("login %q: want redirect, got %d", username, resp.StatusCode)
68 }
69 return client
70}
71
72func setupRepoWithDisk(t *testing.T, s *forgeServer, name, vis string) *RepoRecord {
73 t.Helper()
74 rec, err := s.db.CreateRepo(name, "", vis)
75 if err != nil {
76 t.Fatalf("CreateRepo %q: %v", name, err)
77 }
78 if _, err := repo.Init(filepath.Join(s.dataDir(), name)); err != nil {
79 t.Fatalf("repo.Init %q: %v", name, err)
80 }
81 return rec
82}