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  }