aa1c74437b6e31b2bbdc8606000e3728b6651498
- Author
- Ayman Bagabas <ayman.bagabas@gmail.com>
- Committer
- Ayman Bagabas <ayman.bagabas@gmail.com>
- Date
Message
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() {