diff options
Diffstat (limited to 'internal/admin/middleware_test.go')
| -rw-r--r-- | internal/admin/middleware_test.go | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/internal/admin/middleware_test.go b/internal/admin/middleware_test.go new file mode 100644 index 0000000..a50d02d --- /dev/null +++ b/internal/admin/middleware_test.go @@ -0,0 +1,107 @@ +package admin + +import ( + "bytes" + "log" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + + "github.com/go-git/go-billy/v5/util" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing/object" + "sigs.k8s.io/yaml" +) + +func junkTestHandler() http.HandlerFunc { + return func(rw http.ResponseWriter, req *http.Request) { + rw.WriteHeader(http.StatusOK) + _, err := rw.Write([]byte("Im a body")) + if err != nil { + log.Fatalf("couldn't write http body %s", err) + } + } +} + +func TestHooks(t *testing.T) { + tempDir := t.TempDir() + tempRepoDir := filepath.Join(tempDir, "mgmt.git") + err := os.Mkdir(tempRepoDir, 0750) + if err != nil && !os.IsExist(err) { + log.Fatal(err) + } + + // setup server with repo for management + defaultConfigBytes, err := yaml.Marshal(defaultServerConfig) + if err != nil { + t.Fatal(err) + } + if err := configDefaultTestRepo(tempRepoDir, defaultConfigBytes); err != nil { + t.Fatal(err) + } + destModelFile, destPolicyFile, _ := tempModelPolicyConfig(t, tempDir, tempRepoDir) + // Load the server/config from the repo + adminService, err := NewService(destModelFile, + destPolicyFile, + "gitserver.yaml", + tempDir, + true) + if err != nil { + t.Fatal(err) + } + + repo, err := git.PlainOpen(tempRepoDir) + if err != nil { + t.Fatal(err) + } + worktree, err := repo.Worktree() + if err != nil { + t.Fatal("couldn't get working tree", err) + } + fileToCommit := "gitserver.yaml" + newTestConfigRepo := *defaultRepo + newTestConfigRepo.Name = "mymiddlewaretest" + newServerConfig := *defaultServerConfig + newServerConfig.Repos = append(newServerConfig.Repos, &newTestConfigRepo) + + newConfigBytes, err := yaml.Marshal(newServerConfig) + if err != nil { + t.Fatal("couldn't marshal new server config", err) + } + err = util.WriteFile(worktree.Filesystem, fileToCommit, newConfigBytes, os.FileMode(int(0644))) + if err != nil { + t.Fatal("couldn't write server config", err) + } + if _, err := worktree.Add(fileToCommit); err != nil { + t.Fatal("couldn't add server config to worktree", err) + } + _, err = worktree.Commit(fileToCommit, + &git.CommitOptions{ + Author: &object.Signature{ + Name: "go git server", + Email: "go-git-server@go-git-server", + }, + }, + ) + if err != nil { + t.Fatal("couldn't commit file", err) + } + req := httptest.NewRequest(http.MethodPost, "http://localhost:3456/mgmt.git/git-receive-pack", bytes.NewBuffer([]byte("stuff"))) + recorder := httptest.NewRecorder() + adminHandler := Hooks(adminService, junkTestHandler()) + adminHandler.ServeHTTP(recorder, req) + result := recorder.Result() + defer result.Body.Close() + found := false + for _, v := range adminService.Conf.Repos { + if v.Name == newTestConfigRepo.Name { + found = true + } + } + if !found { + t.Error("didn't find expected repo in config") + t.Fail() + } +} |