aa1c74437b6e31b2bbdc8606000e3728b6651498

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

chore: add server tests

Diff

This diff is truncated to protect this page.

  1diff --git a/.gitignore b/.gitignore
  2index cceafdf5269fe20087e54962ac504d48e51af84e..0a3b2a832f5f4c6d68c447602ad9db763249c3d1 100644
  3--- a/.gitignore
  4+++ b/.gitignore
  5@@ -2,3 +2,4 @@ cmd/soft/soft
  6 .ssh
  7 .repos
  8 dist
  9+testdata
 10diff --git a/server/middleware.go b/server/middleware.go
 11index a87ae492deaebd1b22e8152109fb5275aae4dbe7..9f3f230090ba2fe5f1d4dea30e7de08def307e52 100644
 12--- a/server/middleware.go
 13+++ b/server/middleware.go
 14@@ -47,6 +47,7 @@ func softServeMiddleware(ac *appCfg.Config) wish.Middleware {
 15 					for _, rp := range ac.Source.AllRepos() {
 16 						if rp.Name() == repo {
 17 							repoExists = true
 18+							break
 19 						}
 20 					}
 21 					if !repoExists {
 22diff --git a/server/middleware_test.go b/server/middleware_test.go
 23new file mode 100644
 24index 0000000000000000000000000000000000000000..9b8fe2661ad16c5c42995755c8415b122d655691
 25--- /dev/null
 26+++ b/server/middleware_test.go
 27@@ -0,0 +1,28 @@
 28+package server
 29+
 30+import (
 31+	"testing"
 32+
 33+	"github.com/charmbracelet/soft-serve/internal/config"
 34+	"github.com/charmbracelet/wish/testsession"
 35+	"github.com/gliderlabs/ssh"
 36+	"github.com/matryer/is"
 37+)
 38+
 39+var ()
 40+
 41+func TestMiddleware(t *testing.T) {
 42+	is := is.New(t)
 43+	appCfg, err := config.NewConfig(cfg)
 44+	is.NoErr(err)
 45+	_ = testsession.New(t, &ssh.Server{
 46+		Handler: softServeMiddleware(appCfg)(func(s ssh.Session) {
 47+			t.Run("TestCatConfig", func(t *testing.T) {
 48+				_, err := s.Write([]byte("config/config.json"))
 49+				if err == nil {
 50+					t.Errorf("Expected error, got nil")
 51+				}
 52+			})
 53+		}),
 54+	}, nil)
 55+}
 56diff --git a/server/server.go b/server/server.go
 57index 3f6a56ccbfe198da90c8985c25c6c3938729465c..87bc4755118f52ec809b9f9fa4084bb5ae24a2a5 100644
 58--- a/server/server.go
 59+++ b/server/server.go
 60@@ -73,3 +73,8 @@ func (srv *Server) Start() error {
 61 func (srv *Server) Shutdown(ctx context.Context) error {
 62 	return srv.SSHServer.Shutdown(ctx)
 63 }
 64+
 65+// Close closes the SSH server.
 66+func (srv *Server) Close() error {
 67+	return srv.SSHServer.Close()
 68+}
 69diff --git a/server/server_test.go b/server/server_test.go
 70new file mode 100644
 71index 0000000000000000000000000000000000000000..1eb3673c3c0ce6d39c77113360b2cc60f5d3594e
 72--- /dev/null
 73+++ b/server/server_test.go
 74@@ -0,0 +1,115 @@
 75+package server
 76+
 77+import (
 78+	"fmt"
 79+	"os"
 80+	"path/filepath"
 81+	"testing"
 82+
 83+	"github.com/charmbracelet/keygen"
 84+	"github.com/charmbracelet/soft-serve/config"
 85+	"github.com/gliderlabs/ssh"
 86+	"github.com/go-git/go-git/v5"
 87+	gconfig "github.com/go-git/go-git/v5/config"
 88+	"github.com/go-git/go-git/v5/plumbing/object"
 89+	gssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
 90+	"github.com/matryer/is"
 91+	cssh "golang.org/x/crypto/ssh"
 92+)
 93+
 94+var (
 95+	testdata = "testdata"
 96+	cfg      = &config.Config{
 97+		BindAddr: "",
 98+		Host:     "localhost",
 99+		Port:     22222,
100+		RepoPath: fmt.Sprintf("%s/repos", testdata),
101+		KeyPath:  fmt.Sprintf("%s/key", testdata),
102+	}
103+	pkPath = ""
104+)
105+
106+func TestServer(t *testing.T) {
107+	t.Cleanup(func() {
108+		os.RemoveAll(testdata)
109+	})
110+	is := is.New(t)
111+	_, pkPath = createKeyPair(t)
112+	s := setupServer(t)
113+	err := s.Reload()
114+	is.NoErr(err)
115+	t.Run("TestPushRepo", testPushRepo)
116+	t.Run("TestCloneRepo", testCloneRepo)
117+}
118+
119+func testPushRepo(t *testing.T) {
120+	is := is.New(t)
121+	rp := t.TempDir()
122+	r, err := git.PlainInit(rp, false)
123+	is.NoErr(err)
124+	wt, err := r.Worktree()
125+	is.NoErr(err)
126+	_, err = wt.Filesystem.Create("testfile")
127+	is.NoErr(err)
128+	_, err = wt.Add("testfile")
129+	is.NoErr(err)
130+	author := &object.Signature{
131+		Name:  "test",
132+		Email: "",
133+	}
134+	_, err = wt.Commit("test commit", &git.CommitOptions{
135+		All:       true,
136+		Author:    author,
137+		Committer: author,
138+	})
139+	is.NoErr(err)
140+	_, err = r.CreateRemote(&gconfig.RemoteConfig{
141+		Name: "origin",
142+		URLs: []string{fmt.Sprintf("ssh://%s:%d/%s", cfg.Host, cfg.Port, "testrepo")},
143+	})
144+	auth, err := gssh.NewPublicKeysFromFile("git", pkPath, "")
145+	is.NoErr(err)
146+	auth.HostKeyCallbackHelper = gssh.HostKeyCallbackHelper{
147+		HostKeyCallback: cssh.InsecureIgnoreHostKey(),
148+	}
149+	err = r.Push(&git.PushOptions{
150+		RemoteName: "origin",
151+		Auth:       auth,
152+	})
153+	is.NoErr(err)
154+}
155+
156+func testCloneRepo(t *testing.T) {
157+	is := is.New(t)
158+	auth, err := gssh.NewPublicKeysFromFile("git", pkPath, "")
159+	is.NoErr(err)
160+	auth.HostKeyCallbackHelper = gssh.HostKeyCallbackHelper{
161+		HostKeyCallback: cssh.InsecureIgnoreHostKey(),
162+	}
163+	dst := t.TempDir()
164+	_, err = git.PlainClone(dst, false, &git.CloneOptions{
165+		URL:  fmt.Sprintf("ssh://%s:%d/config", cfg.Host, cfg.Port),
166+		Auth: auth,
167+	})
168+	is.NoErr(err)
169+}
170+
171+func setupServer(t *testing.T) *Server {
172+	s := NewServer(cfg)
173+	go func() {