arche / internal/archesrv/testhelpers_test.go

commit 154431fd
 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}