github.com/androidjp/reviewdog@v0.0.0-20220826111045-b4abb51cf85a/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/androidjp/reviewdog/commands"
    12  	"github.com/androidjp/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  }