package admin import ( "bytes" "log" "net/http" "net/http/httptest" "os" "path/filepath" "testing" "time" "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-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 // wait for bg job to complete time.Sleep(1 * time.Second) 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() } }