/
root.go
115 lines (99 loc) · 3.16 KB
/
root.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package cmd
import (
"bufio"
"fmt"
"html/template"
"net/http"
"os"
"github.com/gobuffalo/packr/v2"
"github.com/pkg/errors"
"github.com/spf13/cobra"
_collector "github.com/tsovak/go-test-parser/collector"
"github.com/tsovak/go-test-parser/parser"
)
const ApplicationShortDescription string = "go-test-parser is a simple CLI tool for generating the UI report from go test output"
var (
reportDir string
httpServeAddress int32
includeSucceeded bool
startHttp bool
verbose bool
)
func parseInputParams(cmd *cobra.Command) {
flags := cmd.Flags()
flags.Int32Var(&httpServeAddress, "http", 8080, "HTTP address to serve")
flags.BoolVarP(&includeSucceeded, "includeSucceeded", "s", false, "Include the successful test results or not")
flags.BoolVarP(&startHttp, "web", "w", false, "Start only web serer for report displaying")
flags.StringVarP(&reportDir, "output", "o", "./report", "The report output directory")
flags.BoolVarP(&verbose, "verbose", "v", false, "Print verbose output")
flags.BoolP("help", "h", false, "Help for application")
}
func GetWebAppCommand() *cobra.Command {
retCmd := &cobra.Command{
Use: "./go-test-parser <go test -json -v output>",
Short: ApplicationShortDescription,
Long: "",
Example: "./go-test-parser ./test.log -v \n go test -json -v ./... | go-test-parser -o ./report_directory",
RunE: func(_ *cobra.Command, args []string) error {
var scanner *bufio.Scanner
if len(args) > 0 {
filePath := args[0]
ok := _collector.IsFileExists(filePath)
if !ok {
return errors.New("file does not exists")
}
file, err := os.Open(filePath)
if err != nil {
return err
}
scanner = bufio.NewScanner(file)
defer file.Close()
} else {
scanner = bufio.NewScanner(os.Stdin)
}
collector := _collector.NewResultCollector(includeSucceeded)
parser := parser.NewResultsParser(collector.CollectTestResult)
// save static assets to the package
box := packr.New("templates", "../../templates")
tmplFile, err := box.FindString("report.tmpl.html")
if err != nil {
return err
}
tmpl := template.Must(template.New("tmpl").Parse(tmplFile))
_collector.ReadFromScanner(parser, scanner, false, verbose)
if startHttp {
http.HandleFunc("/report", func(w http.ResponseWriter, r *http.Request) {
err := tmpl.Execute(w, collector.TestResult)
if err != nil {
panic(err)
}
})
http.Handle("/", http.StripPrefix("/", http.FileServer(box)))
return http.ListenAndServe(fmt.Sprintf(":%d", httpServeAddress), nil)
} else {
err = _collector.DumpStaticPageToDir(box, reportDir)
if err != nil {
return errors.Wrapf(err, "cannot dump static page")
}
f, err := _collector.CreateFile(reportDir + "/index.html")
if err != nil {
return errors.Wrapf(err, "error creating file")
}
err = tmpl.Execute(f, collector.TestResult)
if err != nil {
return err
}
}
// fail if test weren't found
if !collector.HasAnyTest() {
return errors.New("no tests were found/logged!")
}
return nil
},
}
parseInputParams(retCmd)
return retCmd
}
func Execute() error {
return GetWebAppCommand().Execute()
}