github.com/secman-team/gh-api@v1.8.2/pkg/cmd/alias/expand/expand_test.go (about)

     1  package expand
     2  
     3  import (
     4  	"errors"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/MakeNowJust/heredoc"
     9  	"github.com/secman-team/gh-api/core/config"
    10  )
    11  
    12  func TestExpandAlias(t *testing.T) {
    13  	findShFunc := func() (string, error) {
    14  		return "/usr/bin/sh", nil
    15  	}
    16  
    17  	cfg := config.NewFromString(heredoc.Doc(`
    18  		aliases:
    19  		  co: pr checkout
    20  		  il: issue list --author="$1" --label="$2"
    21  		  ia: issue list --author="$1" --assignee="$1"
    22  	`))
    23  
    24  	type args struct {
    25  		config config.Config
    26  		argv   []string
    27  	}
    28  	tests := []struct {
    29  		name         string
    30  		args         args
    31  		wantExpanded []string
    32  		wantIsShell  bool
    33  		wantErr      error
    34  	}{
    35  		{
    36  			name: "no arguments",
    37  			args: args{
    38  				config: cfg,
    39  				argv:   []string{},
    40  			},
    41  			wantExpanded: []string(nil),
    42  			wantIsShell:  false,
    43  			wantErr:      nil,
    44  		},
    45  		{
    46  			name: "too few arguments",
    47  			args: args{
    48  				config: cfg,
    49  				argv:   []string{"gh"},
    50  			},
    51  			wantExpanded: []string(nil),
    52  			wantIsShell:  false,
    53  			wantErr:      nil,
    54  		},
    55  		{
    56  			name: "no expansion",
    57  			args: args{
    58  				config: cfg,
    59  				argv:   []string{"gh", "pr", "status"},
    60  			},
    61  			wantExpanded: []string{"pr", "status"},
    62  			wantIsShell:  false,
    63  			wantErr:      nil,
    64  		},
    65  		{
    66  			name: "simple expansion",
    67  			args: args{
    68  				config: cfg,
    69  				argv:   []string{"gh", "co"},
    70  			},
    71  			wantExpanded: []string{"pr", "checkout"},
    72  			wantIsShell:  false,
    73  			wantErr:      nil,
    74  		},
    75  		{
    76  			name: "adding arguments after expansion",
    77  			args: args{
    78  				config: cfg,
    79  				argv:   []string{"gh", "co", "123"},
    80  			},
    81  			wantExpanded: []string{"pr", "checkout", "123"},
    82  			wantIsShell:  false,
    83  			wantErr:      nil,
    84  		},
    85  		{
    86  			name: "not enough arguments for expansion",
    87  			args: args{
    88  				config: cfg,
    89  				argv:   []string{"gh", "il"},
    90  			},
    91  			wantExpanded: []string{},
    92  			wantIsShell:  false,
    93  			wantErr:      errors.New(`not enough arguments for alias: issue list --author="$1" --label="$2"`),
    94  		},
    95  		{
    96  			name: "not enough arguments for expansion 2",
    97  			args: args{
    98  				config: cfg,
    99  				argv:   []string{"gh", "il", "vilmibm"},
   100  			},
   101  			wantExpanded: []string{},
   102  			wantIsShell:  false,
   103  			wantErr:      errors.New(`not enough arguments for alias: issue list --author="vilmibm" --label="$2"`),
   104  		},
   105  		{
   106  			name: "satisfy expansion arguments",
   107  			args: args{
   108  				config: cfg,
   109  				argv:   []string{"gh", "il", "vilmibm", "help wanted"},
   110  			},
   111  			wantExpanded: []string{"issue", "list", "--author=vilmibm", "--label=help wanted"},
   112  			wantIsShell:  false,
   113  			wantErr:      nil,
   114  		},
   115  		{
   116  			name: "mixed positional and non-positional arguments",
   117  			args: args{
   118  				config: cfg,
   119  				argv:   []string{"gh", "il", "vilmibm", "epic", "-R", "monalisa/testing"},
   120  			},
   121  			wantExpanded: []string{"issue", "list", "--author=vilmibm", "--label=epic", "-R", "monalisa/testing"},
   122  			wantIsShell:  false,
   123  			wantErr:      nil,
   124  		},
   125  		{
   126  			name: "dollar in expansion",
   127  			args: args{
   128  				config: cfg,
   129  				argv:   []string{"gh", "ia", "$coolmoney$"},
   130  			},
   131  			wantExpanded: []string{"issue", "list", "--author=$coolmoney$", "--assignee=$coolmoney$"},
   132  			wantIsShell:  false,
   133  			wantErr:      nil,
   134  		},
   135  	}
   136  	for _, tt := range tests {
   137  		t.Run(tt.name, func(t *testing.T) {
   138  			gotExpanded, gotIsShell, err := ExpandAlias(tt.args.config, tt.args.argv, findShFunc)
   139  			if tt.wantErr != nil {
   140  				if err == nil {
   141  					t.Fatal("expected error")
   142  				}
   143  				if tt.wantErr.Error() != err.Error() {
   144  					t.Fatalf("expected error %q, got %q", tt.wantErr, err)
   145  				}
   146  				return
   147  			}
   148  			if err != nil {
   149  				t.Fatalf("got error: %v", err)
   150  			}
   151  			if !reflect.DeepEqual(gotExpanded, tt.wantExpanded) {
   152  				t.Errorf("ExpandAlias() gotExpanded = %v, want %v", gotExpanded, tt.wantExpanded)
   153  			}
   154  			if gotIsShell != tt.wantIsShell {
   155  				t.Errorf("ExpandAlias() gotIsShell = %v, want %v", gotIsShell, tt.wantIsShell)
   156  			}
   157  		})
   158  	}
   159  }
   160  
   161  // cfg := `---
   162  // aliases:
   163  //   co: pr checkout
   164  //   il: issue list --author="$1" --label="$2"
   165  //   ia: issue list --author="$1" --assignee="$1"
   166  // `
   167  // 	initBlankContext(cfg, "OWNER/REPO", "trunk")
   168  // 	for _, c := range []struct {
   169  // 		Args         string
   170  // 		ExpectedArgs []string
   171  // 		Err          string
   172  // 	}{
   173  // 		{"gh co", []string{"pr", "checkout"}, ""},
   174  // 		{"gh il", nil, `not enough arguments for alias: issue list --author="$1" --label="$2"`},
   175  // 		{"gh il vilmibm", nil, `not enough arguments for alias: issue list --author="vilmibm" --label="$2"`},
   176  // 		{"gh co 123", []string{"pr", "checkout", "123"}, ""},
   177  // 		{"gh il vilmibm epic", []string{"issue", "list", `--author=vilmibm`, `--label=epic`}, ""},
   178  // 		{"gh ia vilmibm", []string{"issue", "list", `--author=vilmibm`, `--assignee=vilmibm`}, ""},
   179  // 		{"gh ia $coolmoney$", []string{"issue", "list", `--author=$coolmoney$`, `--assignee=$coolmoney$`}, ""},
   180  // 		{"gh pr status", []string{"pr", "status"}, ""},
   181  // 		{"gh il vilmibm epic -R vilmibm/testing", []string{"issue", "list", "--author=vilmibm", "--label=epic", "-R", "vilmibm/testing"}, ""},
   182  // 		{"gh dne", []string{"dne"}, ""},
   183  // 		{"gh", []string{}, ""},
   184  // 		{"", []string{}, ""},
   185  // 	} {