From 8b50c9fd06c319375236d9b5f14c3582f17482b9 Mon Sep 17 00:00:00 2001 From: Theis Date: Fri, 1 Mar 2024 18:37:01 +0100 Subject: [PATCH] test: added tests to the cocommit program and also added a helper function in main to test --- src/author.txt | 2 +- src/cocommit.go | 111 +++++++++++++++++++++++++++++++++++++++++++ src/cocommit_test.go | 43 +++++++++++++++++ 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 src/cocommit.go create mode 100644 src/cocommit_test.go diff --git a/src/author.txt b/src/author.txt index 9010ac5..8cd7b5b 100644 --- a/src/author.txt +++ b/src/author.txt @@ -1 +1 @@ -Syntax: name_short|Name|Username|email \ No newline at end of file +Syntax: name_short|Name|Username|email !!Remember to set the env var authors_file!! \ No newline at end of file diff --git a/src/cocommit.go b/src/cocommit.go new file mode 100644 index 0000000..33dd0b2 --- /dev/null +++ b/src/cocommit.go @@ -0,0 +1,111 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "os/exec" + "regexp" + "strings" +) + +type user struct { + username string + email string +} + +func main() { + users := make(map[string]user) + + // Reads a shell env variable :: author_file + authors := os.Getenv("author_file") + + file, err := os.Open(authors) + if err != nil { + print("File not found") + os.Exit(2) + } + defer file.Close() + + scanner := bufio.NewScanner(file) + + // eat a single input + scanner.Scan() + + // reads the input of authors file and formats accordingly + for scanner.Scan() { + info := strings.Split(scanner.Text(), "|") + usr := user{username: info[2], email: info[3]} + users[info[0]] = usr + users[info[1]] = usr + } + + if err := scanner.Err(); err != nil { + os.Exit(2) + } + + args := os.Args[1:] + + NoInput(args, users) + + + // builds the commit message with the selected authors + var sb strings.Builder + sb.WriteString(string(args[0])+"\n") + reg, _ := regexp.Compile("([^:]+):(.+)") + + for _, commiter := range args[1:] { + if _, ok := users[commiter]; ok { + sb.WriteString("\nCo-authored-by: ") + sb.WriteString(users[commiter].username) + sb.WriteString(" <") + sb.WriteString(users[commiter].email) + sb.WriteRune('>') + } else if match := reg.MatchString(commiter); match { + str := strings.Split(commiter, ":") + + sb.WriteString("\nCo-authored-by: ") + sb.WriteString(str[0]) + sb.WriteString(" <") + sb.WriteString(str[1]) + sb.WriteRune('>') + + } else { + println(commiter, " was unknown. User either not defined or name typed wrong") + } + } + // commit msg built + commit := sb.String() + + // commit shell command + cmd := exec.Command("git", "commit", "-m", commit) + + // https://stackoverflow.com/questions/18159704/how-to-debug-exit-status-1-error-when-running-exec-command-in-golang + + cmd_output, err := cmd.CombinedOutput() + + if err != nil { + println(fmt.Sprint(err) + " : " + string(cmd_output)) + } else { + println(string(cmd_output)) + } + +} + +//TODO: move half this into another function and call before building users to improve performance +func NoInput(args []string, users map[string]user) { + if len(args) < 2 { + // If you call binary with users prints users + if len(args) == 1 && args[0] == "users" { + println("List of users:") + for name, usr := range users { + println(name, " ->", " Username:", usr.username, " Email:", usr.email) + } + os.Exit(1) + } + // if calling binary with nothing or only string + print("Usage: cocommit [co-author2] [co-author3] || \n cocommit [co-author2:email] [co-author3:email] || Mixes of both") + + os.Exit(1) + } +} diff --git a/src/cocommit_test.go b/src/cocommit_test.go new file mode 100644 index 0000000..2cc4bb7 --- /dev/null +++ b/src/cocommit_test.go @@ -0,0 +1,43 @@ +package main + +import ( + "os" + "os/exec" + "testing" +) + +func Test_emptyInput(t *testing.T) { + authors := make(map[string]user) + authors["test"] = user{username: "test", email: "test"} + if os.Getenv("BE_CRASHER") == "1" { + NoInput([]string{}, authors) + return + } + cmd := exec.Command(os.Args[0], "-test.run=Test_emptyInput") + cmd.Env = append(os.Environ(), "BE_CRASHER=1") + err := cmd.Run() + if e, ok := err.(*exec.ExitError); ok && !e.Success() { + return + } + t.Fatalf("process ran with err %v, want exit status 1", err) +} + +func Test_usersInput(t *testing.T) { + authors := make(map[string]user) + authors["test"] = user{username: "test", email: "test"} + if os.Getenv("BE_CRASHER") == "1" { + NoInput([]string{"users"}, authors) + return + } + cmd := exec.Command(os.Args[0], "-test.run=Test_usersInput") + cmd.Env = append(os.Environ(), "BE_CRASHER=1") + err := cmd.Run() + if e, ok := err.(*exec.ExitError); ok && !e.Success() { + return + } + t.Fatalf("process ran with err %v, want exit status 1", err) +} + + + +