1package server
 2
 3import (
 4	"errors"
 5	"fmt"
 6	"os"
 7	"testing"
 8	"time"
 9
10	"github.com/charmbracelet/soft-serve/server/config"
11	"github.com/charmbracelet/ssh"
12	bm "github.com/charmbracelet/wish/bubbletea"
13	"github.com/charmbracelet/wish/testsession"
14	"github.com/matryer/is"
15	"github.com/muesli/termenv"
16	gossh "golang.org/x/crypto/ssh"
17)
18
19func TestSession(t *testing.T) {
20	is := is.New(t)
21	t.Run("authorized repo access", func(t *testing.T) {
22		s := setup(t)
23		s.Stderr = os.Stderr
24		defer s.Close()
25		err := s.RequestPty("xterm", 80, 40, nil)
26		is.NoErr(err)
27		go func() {
28			time.Sleep(1 * time.Second)
29			s.Signal(gossh.SIGTERM)
30			// FIXME: exit with code 0 instead of forcibly closing the session
31			s.Close()
32		}()
33		err = s.Run("test")
34		var ee *gossh.ExitMissingError
35		is.True(errors.As(err, &ee))
36	})
37}
38
39func setup(tb testing.TB) *gossh.Session {
40	tb.Helper()
41	is := is.New(tb)
42	dp := tb.TempDir()
43	is.NoErr(os.Setenv("SOFT_SERVE_DATA_PATH", dp))
44	is.NoErr(os.Setenv("SOFT_SERVE_GIT_LISTEN_ADDR", ":9418"))
45	is.NoErr(os.Setenv("SOFT_SERVE_SSH_LISTEN_ADDR", fmt.Sprintf(":%d", randomPort())))
46	tb.Cleanup(func() {
47		is.NoErr(os.Unsetenv("SOFT_SERVE_DATA_PATH"))
48		is.NoErr(os.Unsetenv("SOFT_SERVE_GIT_LISTEN_ADDR"))
49		is.NoErr(os.Unsetenv("SOFT_SERVE_SSH_LISTEN_ADDR"))
50		is.NoErr(os.RemoveAll(dp))
51	})
52	cfg := config.DefaultConfig()
53	return testsession.New(tb, &ssh.Server{
54		Handler: bm.MiddlewareWithProgramHandler(SessionHandler(cfg), termenv.ANSI256)(func(s ssh.Session) {
55			_, _, active := s.Pty()
56			tb.Logf("PTY active %v", active)
57			tb.Log(s.Command())
58			s.Exit(0)
59		}),
60	}, nil)
61}