github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/pkg/cmd/search/prs/prs_test.go (about)

     1  package prs
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  
     7  	"github.com/ungtb10d/cli/v2/pkg/cmd/search/shared"
     8  	"github.com/ungtb10d/cli/v2/pkg/cmdutil"
     9  	"github.com/ungtb10d/cli/v2/pkg/iostreams"
    10  	"github.com/ungtb10d/cli/v2/pkg/search"
    11  	"github.com/google/shlex"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func TestNewCmdPrs(t *testing.T) {
    16  	var trueBool = true
    17  	tests := []struct {
    18  		name    string
    19  		input   string
    20  		output  shared.IssuesOptions
    21  		wantErr bool
    22  		errMsg  string
    23  	}{
    24  		{
    25  			name:    "no arguments",
    26  			input:   "",
    27  			wantErr: true,
    28  			errMsg:  "specify search keywords or flags",
    29  		},
    30  		{
    31  			name:  "keyword arguments",
    32  			input: "some search terms",
    33  			output: shared.IssuesOptions{
    34  				Query: search.Query{
    35  					Keywords:   []string{"some", "search", "terms"},
    36  					Kind:       "issues",
    37  					Limit:      30,
    38  					Qualifiers: search.Qualifiers{Type: "pr"},
    39  				},
    40  			},
    41  		},
    42  		{
    43  			name:  "web flag",
    44  			input: "--web",
    45  			output: shared.IssuesOptions{
    46  				Query: search.Query{
    47  					Keywords:   []string{},
    48  					Kind:       "issues",
    49  					Limit:      30,
    50  					Qualifiers: search.Qualifiers{Type: "pr"},
    51  				},
    52  				WebMode: true,
    53  			},
    54  		},
    55  		{
    56  			name:  "limit flag",
    57  			input: "--limit 10",
    58  			output: shared.IssuesOptions{
    59  				Query: search.Query{
    60  					Keywords:   []string{},
    61  					Kind:       "issues",
    62  					Limit:      10,
    63  					Qualifiers: search.Qualifiers{Type: "pr"},
    64  				},
    65  			},
    66  		},
    67  		{
    68  			name:    "invalid limit flag",
    69  			input:   "--limit 1001",
    70  			wantErr: true,
    71  			errMsg:  "`--limit` must be between 1 and 1000",
    72  		},
    73  		{
    74  			name:  "order flag",
    75  			input: "--order asc",
    76  			output: shared.IssuesOptions{
    77  				Query: search.Query{
    78  					Keywords:   []string{},
    79  					Kind:       "issues",
    80  					Limit:      30,
    81  					Order:      "asc",
    82  					Qualifiers: search.Qualifiers{Type: "pr"},
    83  				},
    84  			},
    85  		},
    86  		{
    87  			name:    "invalid order flag",
    88  			input:   "--order invalid",
    89  			wantErr: true,
    90  			errMsg:  "invalid argument \"invalid\" for \"--order\" flag: valid values are {asc|desc}",
    91  		},
    92  		{
    93  			name:  "app flag",
    94  			input: "--app dependabot",
    95  			output: shared.IssuesOptions{
    96  				Query: search.Query{
    97  					Keywords:   []string{},
    98  					Kind:       "issues",
    99  					Limit:      30,
   100  					Qualifiers: search.Qualifiers{Type: "pr", Author: "app/dependabot"},
   101  				},
   102  			},
   103  		},
   104  		{
   105  			name:    "invalid author and app flags",
   106  			input:   "--author test --app dependabot",
   107  			wantErr: true,
   108  			errMsg:  "specify only `--author` or `--app`",
   109  		},
   110  		{
   111  			name: "qualifier flags",
   112  			input: `
   113        --archived
   114        --assignee=assignee
   115        --author=author
   116        --closed=closed
   117        --commenter=commenter
   118        --created=created
   119        --match=title,body
   120        --language=language
   121        --locked
   122        --merged
   123        --no-milestone
   124        --updated=updated
   125        --visibility=public
   126        `,
   127  			output: shared.IssuesOptions{
   128  				Query: search.Query{
   129  					Keywords: []string{},
   130  					Kind:     "issues",
   131  					Limit:    30,
   132  					Qualifiers: search.Qualifiers{
   133  						Archived:  &trueBool,
   134  						Assignee:  "assignee",
   135  						Author:    "author",
   136  						Closed:    "closed",
   137  						Commenter: "commenter",
   138  						Created:   "created",
   139  						In:        []string{"title", "body"},
   140  						Is:        []string{"public", "locked", "merged"},
   141  						Language:  "language",
   142  						No:        []string{"milestone"},
   143  						Type:      "pr",
   144  						Updated:   "updated",
   145  					},
   146  				},
   147  			},
   148  		},
   149  		{
   150  			name:  "review requested flag with user",
   151  			input: "--review-requested user",
   152  			output: shared.IssuesOptions{
   153  				Query: search.Query{
   154  					Keywords:   []string{},
   155  					Kind:       "issues",
   156  					Limit:      30,
   157  					Qualifiers: search.Qualifiers{Type: "pr", ReviewRequested: "user"},
   158  				},
   159  			},
   160  		},
   161  		{
   162  			name:  "review requested flag with team",
   163  			input: "--review-requested org/team",
   164  			output: shared.IssuesOptions{
   165  				Query: search.Query{
   166  					Keywords:   []string{},
   167  					Kind:       "issues",
   168  					Limit:      30,
   169  					Qualifiers: search.Qualifiers{Type: "pr", TeamReviewRequested: "org/team"},
   170  				},
   171  			},
   172  		},
   173  	}
   174  	for _, tt := range tests {
   175  		t.Run(tt.name, func(t *testing.T) {
   176  			ios, _, _, _ := iostreams.Test()
   177  			f := &cmdutil.Factory{
   178  				IOStreams: ios,
   179  			}
   180  			argv, err := shlex.Split(tt.input)
   181  			assert.NoError(t, err)
   182  			var gotOpts *shared.IssuesOptions
   183  			cmd := NewCmdPrs(f, func(opts *shared.IssuesOptions) error {
   184  				gotOpts = opts
   185  				return nil
   186  			})
   187  			cmd.SetArgs(argv)
   188  			cmd.SetIn(&bytes.Buffer{})
   189  			cmd.SetOut(&bytes.Buffer{})
   190  			cmd.SetErr(&bytes.Buffer{})
   191  
   192  			_, err = cmd.ExecuteC()
   193  			if tt.wantErr {
   194  				assert.EqualError(t, err, tt.errMsg)
   195  				return
   196  			}
   197  
   198  			assert.NoError(t, err)
   199  			assert.Equal(t, tt.output.Query, gotOpts.Query)
   200  			assert.Equal(t, tt.output.WebMode, gotOpts.WebMode)
   201  		})
   202  	}
   203  }