server_test.go

 1package server
 2
 3import (
 4	"context"
 5	"fmt"
 6	"path/filepath"
 7	"strings"
 8	"testing"
 9
10	"github.com/charmbracelet/keygen"
11	"github.com/charmbracelet/soft-serve/server/config"
12	"github.com/charmbracelet/soft-serve/server/test"
13	"github.com/charmbracelet/ssh"
14	"github.com/matryer/is"
15	gossh "golang.org/x/crypto/ssh"
16)
17
18func setupServer(tb testing.TB) (*Server, *config.Config, string) {
19	tb.Helper()
20	tb.Log("creating keypair")
21	pub, pkPath := createKeyPair(tb)
22	dp := tb.TempDir()
23	sshPort := fmt.Sprintf(":%d", test.RandomPort())
24	tb.Setenv("SOFT_SERVE_DATA_PATH", dp)
25	tb.Setenv("SOFT_SERVE_INITIAL_ADMIN_KEY", authorizedKey(pub))
26	tb.Setenv("SOFT_SERVE_SSH_LISTEN_ADDR", sshPort)
27	tb.Setenv("SOFT_SERVE_GIT_LISTEN_ADDR", fmt.Sprintf(":%d", test.RandomPort()))
28	ctx := context.TODO()
29	cfg := config.DefaultConfig()
30	if err := cfg.WriteConfig(); err != nil {
31		tb.Fatal("failed to write default config: %w", err)
32	}
33	ctx = config.WithContext(ctx, cfg)
34	tb.Log("configuring server")
35	s, err := NewServer(ctx)
36	if err != nil {
37		tb.Fatal(err)
38	}
39	go func() {
40		tb.Log("starting server")
41		s.Start()
42	}()
43	tb.Cleanup(func() {
44		s.Close()
45	})
46	return s, cfg, pkPath
47}
48
49func createKeyPair(tb testing.TB) (ssh.PublicKey, string) {
50	tb.Helper()
51	is := is.New(tb)
52	keyDir := tb.TempDir()
53	fp := filepath.Join(keyDir, "id_ed25519")
54	kp, err := keygen.New(fp, keygen.WithKeyType(keygen.Ed25519), keygen.WithWrite())
55	is.NoErr(err)
56	return kp.PublicKey(), fp
57}
58
59func authorizedKey(pk ssh.PublicKey) string {
60	return strings.TrimSpace(string(gossh.MarshalAuthorizedKey(pk)))
61}