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}