github.com/argoproj/argo-cd/v3@v3.2.1/cmd/argocd/commands/utils/prompt_test.go (about)

     1  package utils
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestNewPrompt_PromptsEnabled_True(t *testing.T) {
    12  	prompt := NewPrompt(true)
    13  	assert.True(t, prompt.enabled)
    14  }
    15  
    16  func TestNewPrompt_PromptsEnabled_False(t *testing.T) {
    17  	prompt := NewPrompt(false)
    18  	assert.False(t, prompt.enabled)
    19  }
    20  
    21  func TestConfirm_PromptsEnabled_False(t *testing.T) {
    22  	prompt := NewPrompt(false)
    23  	assert.True(t, prompt.Confirm("Are you sure you want to run this command? (y/n) "))
    24  }
    25  
    26  // Returns true, true when prompt is disabled
    27  func TestConfirmAllPromptDisabled(t *testing.T) {
    28  	p := &Prompt{enabled: false}
    29  	result1, result2 := p.ConfirmAll("Proceed?")
    30  	assert.True(t, result1)
    31  	assert.True(t, result2)
    32  }
    33  
    34  func TestConfirmBaseOnCountPromptDisabled(t *testing.T) {
    35  	p := &Prompt{enabled: false}
    36  	result1, result2 := p.ConfirmBaseOnCount("Proceed?", "Process all?", 2)
    37  	assert.True(t, result1)
    38  	assert.True(t, result2)
    39  }
    40  
    41  func TestConfirmBaseOnCount(t *testing.T) {
    42  	tests := []struct {
    43  		input  string
    44  		output bool
    45  		count  int
    46  	}{
    47  		{
    48  			input:  "y\n",
    49  			output: true,
    50  			count:  0,
    51  		},
    52  		{
    53  			input:  "y\n",
    54  			output: true,
    55  			count:  1,
    56  		},
    57  		{
    58  			input:  "n\n",
    59  			output: false,
    60  			count:  1,
    61  		},
    62  	}
    63  
    64  	origStdin := os.Stdin
    65  
    66  	for _, tt := range tests {
    67  		tmpFile, err := writeToStdin(tt.input)
    68  		require.NoError(t, err)
    69  		p := &Prompt{enabled: true}
    70  		result1, result2 := p.ConfirmBaseOnCount("Proceed?", "Proceed all?", tt.count)
    71  		assert.Equal(t, tt.output, result1)
    72  		if tt.count == 1 {
    73  			assert.False(t, result2)
    74  		} else {
    75  			assert.Equal(t, tt.output, result2)
    76  		}
    77  		_ = tmpFile.Close()
    78  		os.Remove(tmpFile.Name())
    79  	}
    80  
    81  	os.Stdin = origStdin
    82  }
    83  
    84  func TestConfirmPrompt(t *testing.T) {
    85  	cases := []struct {
    86  		input  string
    87  		output bool
    88  	}{
    89  		{"y\n", true},
    90  		{"n\n", false},
    91  	}
    92  
    93  	origStdin := os.Stdin
    94  
    95  	for _, c := range cases {
    96  		tmpFile, err := writeToStdin(c.input)
    97  		require.NoError(t, err)
    98  		p := &Prompt{enabled: true}
    99  		result := p.Confirm("Are you sure you want to run this command? (y/n) \n")
   100  		assert.Equal(t, c.output, result)
   101  		_ = tmpFile.Close()
   102  		os.Remove(tmpFile.Name())
   103  	}
   104  
   105  	os.Stdin = origStdin
   106  }
   107  
   108  func TestConfirmAllPrompt(t *testing.T) {
   109  	cases := []struct {
   110  		input      string
   111  		confirm    bool
   112  		confirmAll bool
   113  	}{
   114  		{"y\n", true, false},
   115  		{"n\n", false, false},
   116  		{"a\n", true, true},
   117  	}
   118  
   119  	origStdin := os.Stdin
   120  
   121  	for _, c := range cases {
   122  		tmpFile, err := writeToStdin(c.input)
   123  		require.NoError(t, err)
   124  		p := &Prompt{enabled: true}
   125  		confirm, confirmAll := p.ConfirmAll("Are you sure you want to run this command? (y/n) \n")
   126  		assert.Equal(t, c.confirm, confirm)
   127  		assert.Equal(t, c.confirmAll, confirmAll)
   128  		_ = tmpFile.Close()
   129  		os.Remove(tmpFile.Name())
   130  	}
   131  
   132  	os.Stdin = origStdin
   133  }
   134  
   135  func writeToStdin(msg string) (*os.File, error) {
   136  	tmpFile, err := os.CreateTemp("", "test-input")
   137  	if err != nil {
   138  		return nil, err
   139  	}
   140  
   141  	// Write the input to the temporary file
   142  	if _, err := tmpFile.WriteString(msg); err != nil {
   143  		return nil, err
   144  	}
   145  
   146  	// Seek to the beginning of the file so it can be read from the start
   147  	if _, err := tmpFile.Seek(0, 0); err != nil {
   148  		return nil, err
   149  	}
   150  
   151  	os.Stdin = tmpFile
   152  
   153  	return tmpFile, nil
   154  }