github.com/mistwind/reviewdog@v0.0.0-20230322024206-9cfa11856d58/cmd/reviewdog/main_test.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 "path/filepath" 8 "strings" 9 "testing" 10 11 "github.com/mistwind/reviewdog/commands" 12 "github.com/mistwind/reviewdog/filter" 13 ) 14 15 func TestRun_local(t *testing.T) { 16 const ( 17 before = `line1 18 line2 19 line3 20 ` 21 after = `line1 22 line2 changed 23 line3 24 ` 25 ) 26 27 beforef, err := os.CreateTemp("", "reviewdog-test") 28 if err != nil { 29 t.Fatal(err) 30 } 31 defer beforef.Close() 32 defer os.Remove(beforef.Name()) 33 afterf, err := os.CreateTemp("", "reviewdog-test") 34 if err != nil { 35 t.Fatal(err) 36 } 37 defer afterf.Close() 38 defer os.Remove(afterf.Name()) 39 40 beforef.WriteString(before) 41 afterf.WriteString(after) 42 43 fname := afterf.Name() 44 45 var ( 46 stdin = strings.Join([]string{ 47 fname + "(2,1): message1", 48 fname + "(2): message2", 49 fname + "(14,1): message3", 50 }, "\n") 51 want = fname + "(2,1): message1" 52 ) 53 54 diffCmd := fmt.Sprintf("diff -u %s %s", filepath.ToSlash(beforef.Name()), filepath.ToSlash(afterf.Name())) 55 56 opt := &option{ 57 diffCmd: diffCmd, 58 efms: strslice([]string{`%f(%l,%c): %m`}), 59 diffStrip: 0, 60 reporter: "local", 61 } 62 63 stdout := new(bytes.Buffer) 64 if err := run(strings.NewReader(stdin), stdout, opt); err != nil { 65 t.Error(err) 66 } 67 68 if got := strings.Trim(stdout.String(), "\n"); got != want { 69 t.Errorf("raw: got %v, want %v", got, want) 70 } 71 72 } 73 74 func TestRun_local_nofilter(t *testing.T) { 75 var ( 76 stdin = strings.Join([]string{ 77 "/path/to/file(2,1): message1", 78 "/path/to/file(2): message2", 79 "/path/to/file(14,1): message3", 80 }, "\n") 81 want = `/path/to/file(2,1): message1 82 /path/to/file(14,1): message3` 83 ) 84 85 opt := &option{ 86 diffCmd: "", // empty 87 efms: strslice([]string{`%f(%l,%c): %m`}), 88 diffStrip: 0, 89 reporter: "local", 90 } 91 92 stdout := new(bytes.Buffer) 93 if err := run(strings.NewReader(stdin), stdout, opt); err == nil { 94 t.Errorf("got no error, but want error") 95 } 96 97 opt.filterMode = filter.ModeNoFilter 98 if err := run(strings.NewReader(stdin), stdout, opt); err != nil { 99 t.Error(err) 100 } 101 102 if got := strings.Trim(stdout.String(), "\n"); got != want { 103 t.Errorf("got:\n%v\n want\n%v", got, want) 104 } 105 } 106 107 func TestRun_local_tee(t *testing.T) { 108 stdin := "tee test" 109 opt := &option{ 110 diffCmd: "git diff", 111 efms: strslice([]string{`%f(%l,%c): %m`}), 112 diffStrip: 0, 113 reporter: "local", 114 tee: true, 115 } 116 117 stdout := new(bytes.Buffer) 118 if err := run(strings.NewReader(stdin), stdout, opt); err != nil { 119 t.Error(err) 120 } 121 122 if got := strings.Trim(stdout.String(), "\n"); got != stdin { 123 t.Errorf("raw: got %v, want %v", got, stdin) 124 } 125 } 126 127 func TestRun_project(t *testing.T) { 128 t.Run("diff command is empty", func(t *testing.T) { 129 opt := &option{ 130 conf: "reviewdog.yml", 131 reporter: "local", 132 } 133 stdout := new(bytes.Buffer) 134 if err := run(nil, stdout, opt); err == nil { 135 t.Error("want err, got nil") 136 } else { 137 t.Log(err) 138 } 139 }) 140 141 t.Run("config not found", func(t *testing.T) { 142 opt := &option{ 143 conf: "reviewdog.notfound.yml", 144 diffCmd: "echo ''", 145 reporter: "local", 146 } 147 stdout := new(bytes.Buffer) 148 if err := run(nil, stdout, opt); err == nil { 149 t.Error("want err, got nil") 150 } else { 151 t.Log(err) 152 } 153 }) 154 155 t.Run("invalid config", func(t *testing.T) { 156 conffile, err := os.CreateTemp("", "reviewdog-test") 157 if err != nil { 158 t.Fatal(err) 159 } 160 defer conffile.Close() 161 defer os.Remove(conffile.Name()) 162 conffile.WriteString("invalid yaml") 163 opt := &option{ 164 conf: conffile.Name(), 165 diffCmd: "echo ''", 166 reporter: "local", 167 } 168 stdout := new(bytes.Buffer) 169 if err := run(nil, stdout, opt); err == nil { 170 t.Error("want err, got nil") 171 } else { 172 t.Log(err) 173 } 174 }) 175 176 t.Run("ok", func(t *testing.T) { 177 conffile, err := os.CreateTemp("", "reviewdog-test") 178 if err != nil { 179 t.Fatal(err) 180 } 181 defer conffile.Close() 182 defer os.Remove(conffile.Name()) 183 conffile.WriteString("") // empty 184 opt := &option{ 185 conf: conffile.Name(), 186 diffCmd: "echo ''", 187 reporter: "local", 188 } 189 stdout := new(bytes.Buffer) 190 if err := run(nil, stdout, opt); err != nil { 191 t.Errorf("got unexpected err: %v", err) 192 } 193 }) 194 195 t.Run("conffile allows to be prefixed with '.' and '.yaml' file extension", func(t *testing.T) { 196 for _, n := range []string{".reviewdog.yml", "reviewdog.yaml"} { 197 f, err := os.OpenFile(n, os.O_RDONLY|os.O_CREATE, 0666) 198 if err != nil { 199 t.Fatal(err) 200 } 201 defer f.Close() 202 defer os.Remove(n) 203 if _, err := readConf(n); err != nil { 204 t.Errorf("readConf(%q) got unexpected err: %v", n, err) 205 } 206 } 207 }) 208 } 209 210 func TestRun_version(t *testing.T) { 211 stdout := new(bytes.Buffer) 212 if err := run(nil, stdout, &option{version: true}); err != nil { 213 t.Error(err) 214 } 215 if got := strings.TrimRight(stdout.String(), "\n"); got != commands.Version { 216 t.Errorf("version = %v, want %v", got, commands.Version) 217 } 218 }