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 }