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

     1  package issues
     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 TestNewCmdIssues(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: "issue"},
    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: "issue"},
    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: "issue"},
    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: "issue"},
    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:  "include-prs flag",
    94  			input: "--include-prs",
    95  			output: shared.IssuesOptions{
    96  				Query: search.Query{
    97  					Keywords:   []string{},
    98  					Kind:       "issues",
    99  					Limit:      30,
   100  					Qualifiers: search.Qualifiers{Type: ""},
   101  				},
   102  			},
   103  		},
   104  		{
   105  			name:  "app flag",
   106  			input: "--app dependabot",
   107  			output: shared.IssuesOptions{
   108  				Query: search.Query{
   109  					Keywords:   []string{},
   110  					Kind:       "issues",
   111  					Limit:      30,
   112  					Qualifiers: search.Qualifiers{Type: "issue", Author: "app/dependabot"},
   113  				},
   114  			},
   115  		},
   116  		{
   117  			name:    "invalid author and app flags",
   118  			input:   "--author test --app dependabot",
   119  			wantErr: true,
   120  			errMsg:  "specify only `--author` or `--app`",
   121  		},
   122  		{
   123  			name: "qualifier flags",
   124  			input: `
   125        --archived
   126        --assignee=assignee
   127        --author=author
   128        --closed=closed
   129        --commenter=commenter
   130        --created=created
   131        --match=title,body
   132        --language=language
   133        --locked
   134        --mentions=mentions
   135        --no-label
   136        --repo=owner/repo
   137        --updated=updated
   138        --visibility=public
   139        `,
   140  			output: shared.IssuesOptions{
   141  				Query: search.Query{
   142  					Keywords: []string{},
   143  					Kind:     "issues",
   144  					Limit:    30,
   145  					Qualifiers: search.Qualifiers{
   146  						Archived:  &trueBool,
   147  						Assignee:  "assignee",
   148  						Author:    "author",
   149  						Closed:    "closed",
   150  						Commenter: "commenter",
   151  						Created:   "created",
   152  						In:        []string{"title", "body"},
   153  						Is:        []string{"public", "locked"},
   154  						Language:  "language",
   155  						Mentions:  "mentions",
   156  						No:        []string{"label"},
   157  						Repo:      []string{"owner/repo"},
   158  						Type:      "issue",
   159  						Updated:   "updated",
   160  					},
   161  				},
   162  			},
   163  		},
   164  	}
   165  	for _, tt := range tests {
   166  		t.Run(tt.name, func(t *testing.T) {
   167  			ios, _, _, _ := iostreams.Test()
   168  			f := &cmdutil.Factory{
   169  				IOStreams: ios,
   170  			}
   171  			argv, err := shlex.Split(tt.input)
   172  			assert.NoError(t, err)
   173  			var gotOpts *shared.IssuesOptions
   174  			cmd := NewCmdIssues(f, func(opts *shared.IssuesOptions) error {
   175  				gotOpts = opts
   176  				return nil
   177  			})
   178  			cmd.SetArgs(argv)
   179  			cmd.SetIn(&bytes.Buffer{})
   180  			cmd.SetOut(&bytes.Buffer{})
   181  			cmd.SetErr(&bytes.Buffer{})
   182  
   183  			_, err = cmd.ExecuteC()
   184  			if tt.wantErr {
   185  				assert.EqualError(t, err, tt.errMsg)
   186  				return
   187  			}
   188  
   189  			assert.NoError(t, err)
   190  			assert.Equal(t, tt.output.Query, gotOpts.Query)
   191  			assert.Equal(t, tt.output.WebMode, gotOpts.WebMode)
   192  		})
   193  	}
   194  }