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/test"
12	"github.com/charmbracelet/ssh"
13	"github.com/matryer/is"
14	gossh "golang.org/x/crypto/ssh"
15)
16
17func setupServer(tb testing.TB) (*Server, string) {
18	tb.Helper()
19	tb.Log("creating keypair")
20	pub, pkPath := createKeyPair(tb)
21	dp := tb.TempDir()
22	sshPort := fmt.Sprintf(":%d", test.RandomPort())
23	tb.Setenv("SOFT_SERVE_DATA_PATH", dp)
24	tb.Setenv("SOFT_SERVE_INITIAL_ADMIN_KEY", authorizedKey(pub))
25	tb.Setenv("SOFT_SERVE_SSH_LISTEN_ADDR", sshPort)
26	tb.Setenv("SOFT_SERVE_GIT_LISTEN_ADDR", fmt.Sprintf(":%d", test.RandomPort()))
27	ctx := context.TODO()
28	tb.Log("configuring server")
29	s, err := NewServer(ctx)
30	if err != nil {
31		tb.Fatal(err)
32	}
33	go func() {
34		tb.Log("starting server")
35		s.Start()
36	}()
37	tb.Cleanup(func() {
38		s.Close()
39	})
40	return s, pkPath
41}
42
43func createKeyPair(tb testing.TB) (ssh.PublicKey, string) {
44	tb.Helper()
45	is := is.New(tb)
46	keyDir := tb.TempDir()
47	fp := filepath.Join(keyDir, "id_ed25519")
48	kp, err := keygen.New(fp, keygen.WithKeyType(keygen.Ed25519), keygen.WithWrite())
49	is.NoErr(err)
50	return kp.PublicKey(), fp
51}
52
53func authorizedKey(pk ssh.PublicKey) string {
54	return strings.TrimSpace(string(gossh.MarshalAuthorizedKey(pk)))
55}