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  }