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