115 lines
2.6 KiB
Go
115 lines
2.6 KiB
Go
package shared
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"io"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/cli/cli/v2/pkg/iostreams"
|
|
"github.com/cli/cli/v2/test"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func Test_PreserveInput(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
state *IssueMetadataState
|
|
err bool
|
|
wantErrLine string
|
|
wantPreservation bool
|
|
}{
|
|
{
|
|
name: "err, no changes to state",
|
|
err: true,
|
|
},
|
|
{
|
|
name: "no err, no changes to state",
|
|
err: false,
|
|
},
|
|
{
|
|
name: "no err, changes to state",
|
|
state: &IssueMetadataState{
|
|
dirty: true,
|
|
},
|
|
},
|
|
{
|
|
name: "err, title/body input received",
|
|
state: &IssueMetadataState{
|
|
dirty: true,
|
|
Title: "almost a",
|
|
Body: "jill sandwich",
|
|
Reviewers: []string{"barry", "chris"},
|
|
Labels: []string{"sandwich"},
|
|
},
|
|
wantErrLine: `X operation failed. To restore: gh issue create --recover .*testfile.*`,
|
|
err: true,
|
|
wantPreservation: true,
|
|
},
|
|
{
|
|
name: "err, metadata received",
|
|
state: &IssueMetadataState{
|
|
Reviewers: []string{"barry", "chris"},
|
|
Labels: []string{"sandwich"},
|
|
},
|
|
wantErrLine: `X operation failed. To restore: gh issue create --recover .*testfile.*`,
|
|
err: true,
|
|
wantPreservation: true,
|
|
},
|
|
{
|
|
name: "err, dirty, pull request",
|
|
state: &IssueMetadataState{
|
|
dirty: true,
|
|
Title: "a pull request",
|
|
Type: PRMetadata,
|
|
},
|
|
wantErrLine: `X operation failed. To restore: gh pr create --recover .*testfile.*`,
|
|
err: true,
|
|
wantPreservation: true,
|
|
},
|
|
}
|
|
|
|
tempDir := t.TempDir()
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if tt.state == nil {
|
|
tt.state = &IssueMetadataState{}
|
|
}
|
|
|
|
ios, _, _, errOut := iostreams.Test()
|
|
|
|
tf, tferr := os.CreateTemp(tempDir, "testfile*")
|
|
assert.NoError(t, tferr)
|
|
defer tf.Close()
|
|
|
|
ios.TempFileOverride = tf
|
|
|
|
var err error
|
|
if tt.err {
|
|
err = errors.New("error during creation")
|
|
}
|
|
|
|
PreserveInput(ios, tt.state, &err)()
|
|
|
|
_, err = tf.Seek(0, 0)
|
|
assert.NoError(t, err)
|
|
|
|
data, err := io.ReadAll(tf)
|
|
assert.NoError(t, err)
|
|
|
|
if tt.wantPreservation {
|
|
//nolint:staticcheck // prefer exact matchers over ExpectLines
|
|
test.ExpectLines(t, errOut.String(), tt.wantErrLine)
|
|
preserved := &IssueMetadataState{}
|
|
assert.NoError(t, json.Unmarshal(data, preserved))
|
|
preserved.dirty = tt.state.dirty
|
|
assert.Equal(t, preserved, tt.state)
|
|
} else {
|
|
assert.Equal(t, errOut.String(), "")
|
|
assert.Equal(t, string(data), "")
|
|
}
|
|
})
|
|
}
|
|
}
|