github.com/ninadingole/gotest-ls@v0.0.3/main_test.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"os/exec"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestListAllTestsForGivenFile(t *testing.T) {
    15  	t.Parallel()
    16  
    17  	var buffer bytes.Buffer
    18  
    19  	err := Process(&args{
    20  		dirs: []string{"./tests"},
    21  	}, &buffer)
    22  	require.NoError(t, err)
    23  
    24  	// This is to make it work on any OS and any folder
    25  	pwd, err := os.Getwd()
    26  	require.NoError(t, err)
    27  
    28  	fmt.Println(buffer.String())
    29  
    30  	require.JSONEq(t,
    31  		strings.ReplaceAll(`[{"name":"BenchmarkSomething","fileName":"benchmark_test.go","relativePath":"tests/benchmark_test.go","absolutePath":"##PATH##/tests/benchmark_test.go","line":5,"pos":44},{"name":"Example_something","fileName":"example_test.go","relativePath":"tests/example_test.go","absolutePath":"##PATH##/tests/example_test.go","line":5,"pos":40},{"name":"Test/5_+_5_=_10","fileName":"table_test.go","relativePath":"tests/table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":23,"pos":265},{"name":"Test/5_-_5_=_0","fileName":"table_test.go","relativePath":"tests/table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":30,"pos":355},{"name":"Test/mixed_subtest_1","fileName":"table_test.go","relativePath":"tests/table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":12,"pos":111},{"name":"Test/mixed_test_2","fileName":"table_test.go","relativePath":"tests/table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":48,"pos":635},{"name":"TestSomething","fileName":"sample_test.go","relativePath":"tests/sample_test.go","absolutePath":"##PATH##/tests/sample_test.go","line":7,"pos":49},{"name":"Test_subTestPattern/subtest","fileName":"subtest_test.go","relativePath":"tests/subtest_test.go","absolutePath":"##PATH##/tests/subtest_test.go","line":10,"pos":121},{"name":"Test_subTestPattern/subtest_2","fileName":"subtest_test.go","relativePath":"tests/subtest_test.go","absolutePath":"##PATH##/tests/subtest_test.go","line":15,"pos":193}]`,
    32  			"##PATH##", pwd),
    33  		buffer.String())
    34  }
    35  
    36  func Example_errorIfFileAndDirectoryBothAreProvided() {
    37  	cmd := exec.Command("go", "run", "main.go", "-p", "-f", "./tests/sample_test.go", "./tests")
    38  	cmd.Stdout = os.Stdout
    39  	cmd.Stderr = os.Stderr
    40  
    41  	if err := cmd.Run(); err == nil {
    42  		panic("expected error")
    43  	}
    44  
    45  	// Output: ERROR: cannot specify both a file and a directory
    46  }
    47  
    48  func Example_errorIfFileProvidedIsDirectory() {
    49  	cmd := exec.Command("go", "run", "main.go", "-p", "-f", "./tests")
    50  	cmd.Stdout = os.Stdout
    51  	cmd.Stderr = os.Stderr
    52  
    53  	if err := cmd.Run(); err == nil {
    54  		panic("expected error")
    55  	}
    56  
    57  	// Output: ERROR: required file, provided directory
    58  }
    59  
    60  func Test_process(t *testing.T) {
    61  	t.Parallel()
    62  
    63  	pwd, err := os.Getwd()
    64  	require.NoError(t, err)
    65  
    66  	tests := []struct {
    67  		name        string
    68  		args        args
    69  		wantErr     bool
    70  		errExpected string
    71  		checks      func(t *testing.T, got string)
    72  	}{
    73  		{
    74  			name: "should return error if file and directory both are provided",
    75  			args: args{
    76  				pretty: false,
    77  				file:   "./tests/sample_test.go",
    78  				dirs:   []string{"./tests"},
    79  			},
    80  			wantErr:     true,
    81  			errExpected: errPathIssue.Error(),
    82  		},
    83  		{
    84  			name: "should return error if file provided is directory",
    85  			args: args{
    86  				pretty: false,
    87  				file:   "./tests",
    88  			},
    89  			wantErr:     true,
    90  			errExpected: errNotAFile.Error(),
    91  		},
    92  		{
    93  			name: "should return the test details in a file",
    94  			args: args{
    95  				pretty: false,
    96  				file:   "./tests/sample_test.go",
    97  			},
    98  			checks: func(t *testing.T, got string) {
    99  				t.Helper()
   100  
   101  				require.JSONEq(t, fmt.Sprintf(`[{"name":"TestSomething","fileName":"sample_test.go","relativePath":"sample_test.go","absolutePath":"%s/tests/sample_test.go","line":7,"pos":49}]`, pwd),
   102  					got)
   103  			},
   104  		},
   105  		{
   106  			name: "should return the test details in a file with pretty flag",
   107  			args: args{
   108  				pretty: true,
   109  				file:   "./tests/sample_test.go",
   110  			},
   111  			checks: func(t *testing.T, got string) {
   112  				t.Helper()
   113  
   114  				require.JSONEq(t, fmt.Sprintf(`[
   115  	{
   116  		"name": "TestSomething",
   117  		"fileName": "sample_test.go",
   118  		"relativePath": "sample_test.go",
   119  		"absolutePath": "%s/tests/sample_test.go",
   120  		"line": 7,
   121  		"pos": 49
   122  	}
   123  ]`, pwd), got)
   124  			},
   125  		},
   126  		{
   127  			name: "should also return subtests and table tests",
   128  			args: args{
   129  				pretty: false,
   130  				file:   "./tests/table_test.go",
   131  			},
   132  			checks: func(t *testing.T, got string) {
   133  				t.Helper()
   134  
   135  				require.JSONEq(t, strings.ReplaceAll(`[{"name":"Test/5_+_5_=_10","fileName":"table_test.go","relativePath":"table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":23,"pos":265},{"name":"Test/5_-_5_=_0","fileName":"table_test.go","relativePath":"table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":30,"pos":355},{"name":"Test/mixed_subtest_1","fileName":"table_test.go","relativePath":"table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":12,"pos":111},{"name":"Test/mixed_test_2","fileName":"table_test.go","relativePath":"table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":48,"pos":635}]`, "##PATH##", pwd), got)
   136  			},
   137  		},
   138  		{
   139  			name: "should show help if no arguments are provided",
   140  			args: args{},
   141  			checks: func(t *testing.T, got string) {
   142  				t.Helper()
   143  
   144  				require.Equal(t, `gotest-ls provides a list of all tests in a package or a file in JSON format.
   145  
   146  Usage:
   147    gotest-ls [flags] [directories]
   148  
   149  Examples:
   150  	gotest-ls .
   151   	gotest-ls -p ./cmd
   152   	gotest-ls -p ./cmd ./pkg
   153   	gotest-ls -f ./pkg/random_test.go
   154   	gotest-ls -p -f ./pkg/random_test.go
   155  
   156  Flags:
   157    -f, --file string   Path to a file, cannot be used with directories
   158    -h, --help          help for gotest-ls
   159    -p, --pretty        Pretty print the output in JSON format
   160  `, got)
   161  			},
   162  		},
   163  		{
   164  			name: "return error if directory does not exist",
   165  			args: args{
   166  				dirs: []string{"./false-directory"},
   167  			},
   168  			wantErr:     true,
   169  			errExpected: errUnknown.Error() + ": lstat ./false-directory: no such file or directory",
   170  		},
   171  		{
   172  			name: "return error if there is no test in the directory",
   173  			args: args{
   174  				dirs: []string{"./dead-tests"},
   175  			},
   176  			checks: func(t *testing.T, got string) {
   177  				t.Helper()
   178  
   179  				require.Equal(t, "No tests found\n", got)
   180  			},
   181  		},
   182  	}
   183  	for _, tt := range tests {
   184  		tt := tt
   185  
   186  		t.Run(tt.name, func(t *testing.T) {
   187  			t.Parallel()
   188  			writer := &bytes.Buffer{}
   189  
   190  			err := Process(&tt.args, writer)
   191  
   192  			if tt.wantErr {
   193  				require.Error(t, err)
   194  				require.Equal(t, tt.errExpected, err.Error())
   195  			} else {
   196  				require.NoError(t, err)
   197  			}
   198  
   199  			if tt.checks != nil {
   200  				tt.checks(t, writer.String())
   201  			}
   202  		})
   203  	}
   204  }