github.com/cli/cli@v1.14.1-0.20210902173923-1af6a669e342/pkg/cmd/pr/shared/preserve_test.go (about) 1 package shared 2 3 import ( 4 "encoding/json" 5 "errors" 6 "io/ioutil" 7 "testing" 8 9 "github.com/cli/cli/pkg/iostreams" 10 "github.com/cli/cli/test" 11 "github.com/stretchr/testify/assert" 12 ) 13 14 func Test_PreserveInput(t *testing.T) { 15 tests := []struct { 16 name string 17 state *IssueMetadataState 18 err bool 19 wantErrLine string 20 wantPreservation bool 21 }{ 22 { 23 name: "err, no changes to state", 24 err: true, 25 }, 26 { 27 name: "no err, no changes to state", 28 err: false, 29 }, 30 { 31 name: "no err, changes to state", 32 state: &IssueMetadataState{ 33 dirty: true, 34 }, 35 }, 36 { 37 name: "err, title/body input received", 38 state: &IssueMetadataState{ 39 dirty: true, 40 Title: "almost a", 41 Body: "jill sandwich", 42 Reviewers: []string{"barry", "chris"}, 43 Labels: []string{"sandwich"}, 44 }, 45 wantErrLine: `X operation failed. To restore: gh issue create --recover .*testfile.*`, 46 err: true, 47 wantPreservation: true, 48 }, 49 { 50 name: "err, metadata received", 51 state: &IssueMetadataState{ 52 Reviewers: []string{"barry", "chris"}, 53 Labels: []string{"sandwich"}, 54 }, 55 wantErrLine: `X operation failed. To restore: gh issue create --recover .*testfile.*`, 56 err: true, 57 wantPreservation: true, 58 }, 59 { 60 name: "err, dirty, pull request", 61 state: &IssueMetadataState{ 62 dirty: true, 63 Title: "a pull request", 64 Type: PRMetadata, 65 }, 66 wantErrLine: `X operation failed. To restore: gh pr create --recover .*testfile.*`, 67 err: true, 68 wantPreservation: true, 69 }, 70 } 71 72 tempDir := t.TempDir() 73 74 for _, tt := range tests { 75 t.Run(tt.name, func(t *testing.T) { 76 if tt.state == nil { 77 tt.state = &IssueMetadataState{} 78 } 79 80 io, _, _, errOut := iostreams.Test() 81 82 tf, tferr := ioutil.TempFile(tempDir, "testfile*") 83 assert.NoError(t, tferr) 84 defer tf.Close() 85 86 io.TempFileOverride = tf 87 88 var err error 89 if tt.err { 90 err = errors.New("error during creation") 91 } 92 93 PreserveInput(io, tt.state, &err)() 94 95 _, err = tf.Seek(0, 0) 96 assert.NoError(t, err) 97 98 data, err := ioutil.ReadAll(tf) 99 assert.NoError(t, err) 100 101 if tt.wantPreservation { 102 //nolint:staticcheck // prefer exact matchers over ExpectLines 103 test.ExpectLines(t, errOut.String(), tt.wantErrLine) 104 preserved := &IssueMetadataState{} 105 assert.NoError(t, json.Unmarshal(data, preserved)) 106 preserved.dirty = tt.state.dirty 107 assert.Equal(t, preserved, tt.state) 108 } else { 109 assert.Equal(t, errOut.String(), "") 110 assert.Equal(t, string(data), "") 111 } 112 }) 113 } 114 }