github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/pkg/cmd/issue/transfer/transfer_test.go (about)

     1  package transfer
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"net/http"
     7  	"testing"
     8  
     9  	"github.com/ungtb10d/cli/v2/internal/config"
    10  	"github.com/ungtb10d/cli/v2/internal/ghrepo"
    11  	"github.com/ungtb10d/cli/v2/pkg/cmdutil"
    12  	"github.com/ungtb10d/cli/v2/pkg/httpmock"
    13  	"github.com/ungtb10d/cli/v2/pkg/iostreams"
    14  	"github.com/ungtb10d/cli/v2/test"
    15  	"github.com/google/shlex"
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func runCommand(rt http.RoundTripper, cli string) (*test.CmdOut, error) {
    20  	ios, _, stdout, stderr := iostreams.Test()
    21  
    22  	factory := &cmdutil.Factory{
    23  		IOStreams: ios,
    24  		HttpClient: func() (*http.Client, error) {
    25  			return &http.Client{Transport: rt}, nil
    26  		},
    27  		Config: func() (config.Config, error) {
    28  			return config.NewBlankConfig(), nil
    29  		},
    30  		BaseRepo: func() (ghrepo.Interface, error) {
    31  			return ghrepo.New("OWNER", "REPO"), nil
    32  		},
    33  	}
    34  
    35  	ios.SetStdoutTTY(true)
    36  
    37  	cmd := NewCmdTransfer(factory, nil)
    38  
    39  	argv, err := shlex.Split(cli)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  	cmd.SetArgs(argv)
    44  
    45  	cmd.SetIn(&bytes.Buffer{})
    46  	cmd.SetOut(io.Discard)
    47  	cmd.SetErr(io.Discard)
    48  
    49  	_, err = cmd.ExecuteC()
    50  
    51  	return &test.CmdOut{
    52  		OutBuf: stdout,
    53  		ErrBuf: stderr,
    54  	}, err
    55  }
    56  
    57  func TestNewCmdTransfer(t *testing.T) {
    58  	tests := []struct {
    59  		name    string
    60  		cli     string
    61  		wants   TransferOptions
    62  		wantErr string
    63  	}{
    64  		{
    65  			name: "issue name",
    66  			cli:  "3252 OWNER/REPO",
    67  			wants: TransferOptions{
    68  				IssueSelector:    "3252",
    69  				DestRepoSelector: "OWNER/REPO",
    70  			},
    71  		},
    72  	}
    73  
    74  	for _, tt := range tests {
    75  		t.Run(tt.name, func(t *testing.T) {
    76  			f := &cmdutil.Factory{}
    77  
    78  			argv, err := shlex.Split(tt.cli)
    79  			assert.NoError(t, err)
    80  
    81  			var gotOpts *TransferOptions
    82  			cmd := NewCmdTransfer(f, func(opts *TransferOptions) error {
    83  				gotOpts = opts
    84  				return nil
    85  			})
    86  			cmd.SetArgs(argv)
    87  			cmd.SetIn(&bytes.Buffer{})
    88  			cmd.SetOut(&bytes.Buffer{})
    89  			cmd.SetErr(&bytes.Buffer{})
    90  
    91  			_, cErr := cmd.ExecuteC()
    92  			assert.NoError(t, cErr)
    93  			assert.Equal(t, tt.wants.IssueSelector, gotOpts.IssueSelector)
    94  			assert.Equal(t, tt.wants.DestRepoSelector, gotOpts.DestRepoSelector)
    95  		})
    96  	}
    97  }
    98  
    99  func Test_transferRun_noflags(t *testing.T) {
   100  	http := &httpmock.Registry{}
   101  	defer http.Verify(t)
   102  
   103  	output, err := runCommand(http, "")
   104  
   105  	if err != nil {
   106  		assert.Equal(t, "issue and destination repository are required", err.Error())
   107  	}
   108  
   109  	assert.Equal(t, "", output.String())
   110  }
   111  
   112  func Test_transferRunSuccessfulIssueTransfer(t *testing.T) {
   113  	http := &httpmock.Registry{}
   114  	defer http.Verify(t)
   115  
   116  	http.Register(
   117  		httpmock.GraphQL(`query IssueByNumber\b`),
   118  		httpmock.StringResponse(`
   119  			{ "data": { "repository": {
   120  				"hasIssuesEnabled": true,
   121  				"issue": { "id": "THE-ID", "number": 1234, "title": "The title of the issue"}
   122  			} } }`))
   123  
   124  	http.Register(
   125  		httpmock.GraphQL(`query RepositoryInfo\b`),
   126  		httpmock.StringResponse(`
   127  				{ "data": { "repository": {
   128  						"id": "dest-id",
   129  						"name": "REPO1",
   130  						"owner": { "login": "OWNER1" },
   131  						"viewerPermission": "WRITE",
   132  						"hasIssuesEnabled": true
   133  				}}}`))
   134  
   135  	http.Register(
   136  		httpmock.GraphQL(`mutation IssueTransfer\b`),
   137  		httpmock.GraphQLMutation(`{"data":{"transferIssue":{"issue":{"url":"https://github.com/OWNER1/REPO1/issues/1"}}}}`, func(input map[string]interface{}) {
   138  			assert.Equal(t, input["issueId"], "THE-ID")
   139  			assert.Equal(t, input["repositoryId"], "dest-id")
   140  		}))
   141  
   142  	output, err := runCommand(http, "1234 OWNER1/REPO1")
   143  	if err != nil {
   144  		t.Errorf("error running command `issue transfer`: %v", err)
   145  	}
   146  	assert.Equal(t, "https://github.com/OWNER1/REPO1/issues/1\n", output.String())
   147  }