session_test.go

 1package server
 2
 3import (
 4	"bytes"
 5	"errors"
 6	"os"
 7	"strings"
 8	"testing"
 9	"time"
10
11	appCfg "github.com/charmbracelet/soft-serve/config"
12	cm "github.com/charmbracelet/soft-serve/server/cmd"
13	"github.com/charmbracelet/soft-serve/server/config"
14	bm "github.com/charmbracelet/wish/bubbletea"
15	"github.com/charmbracelet/wish/testsession"
16	"github.com/gliderlabs/ssh"
17	"github.com/matryer/is"
18	"github.com/muesli/termenv"
19	gossh "golang.org/x/crypto/ssh"
20)
21
22func TestSession(t *testing.T) {
23	is := is.New(t)
24	t.Run("unauthorized repo access", func(t *testing.T) {
25		var out bytes.Buffer
26		s := setup(t)
27		s.Stderr = &out
28		defer s.Close()
29		err := s.RequestPty("xterm", 80, 40, nil)
30		is.NoErr(err)
31		err = s.Run("config")
32		// Session writes error and exits
33		is.True(strings.Contains(out.String(), cm.ErrUnauthorized.Error()))
34		var ee *gossh.ExitError
35		is.True(errors.As(err, &ee) && ee.ExitStatus() == 1)
36	})
37	t.Run("authorized repo access", func(t *testing.T) {
38		s := setup(t)
39		s.Stderr = os.Stderr
40		defer s.Close()
41		err := s.RequestPty("xterm", 80, 40, nil)
42		is.NoErr(err)
43		go func() {
44			time.Sleep(1 * time.Second)
45			s.Signal(gossh.SIGTERM)
46			// FIXME: exit with code 0 instead of forcibly closing the session
47			s.Close()
48		}()
49		err = s.Run("test")
50		var ee *gossh.ExitMissingError
51		is.True(errors.As(err, &ee))
52	})
53}
54
55func setup(tb testing.TB) *gossh.Session {
56	is := is.New(tb)
57	tb.Helper()
58	cfg.DataPath = tb.TempDir()
59	ac, err := appCfg.NewConfig(&config.Config{
60		SSH:      config.SSHConfig{Port: 22226},
61		DataPath: tb.TempDir(),
62		InitialAdminKeys: []string{
63			"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMJlb/qf2B2kMNdBxfpCQqI2ctPcsOkdZGVh5zTRhKtH",
64		},
65	})
66	ac.AnonAccess = "read-only"
67	is.NoErr(err)
68	return testsession.New(tb, &ssh.Server{
69		Handler: bm.MiddlewareWithProgramHandler(SessionHandler(ac), termenv.ANSI256)(func(s ssh.Session) {
70			_, _, active := s.Pty()
71			tb.Logf("PTY active %v", active)
72			tb.Log(s.Command())
73			s.Exit(0)
74		}),
75	}, nil)
76}