1
0
mirror of https://github.com/juanfont/headscale.git synced 2025-09-16 17:50:44 +02:00
juanfont.headscale/hscontrol/util/prompt_test.go

210 lines
3.9 KiB
Go

package util
import (
"bytes"
"io"
"os"
"strings"
"testing"
)
func TestYesNo(t *testing.T) {
tests := []struct {
name string
input string
expected bool
}{
{
name: "y answer",
input: "y\n",
expected: true,
},
{
name: "Y answer",
input: "Y\n",
expected: true,
},
{
name: "yes answer",
input: "yes\n",
expected: true,
},
{
name: "YES answer",
input: "YES\n",
expected: true,
},
{
name: "sure answer",
input: "sure\n",
expected: true,
},
{
name: "SURE answer",
input: "SURE\n",
expected: true,
},
{
name: "n answer",
input: "n\n",
expected: false,
},
{
name: "no answer",
input: "no\n",
expected: false,
},
{
name: "empty answer",
input: "\n",
expected: false,
},
{
name: "invalid answer",
input: "maybe\n",
expected: false,
},
{
name: "random text",
input: "foobar\n",
expected: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Capture stdin
oldStdin := os.Stdin
r, w, _ := os.Pipe()
os.Stdin = r
// Capture stderr
oldStderr := os.Stderr
stderrR, stderrW, _ := os.Pipe()
os.Stderr = stderrW
// Write test input
go func() {
defer w.Close()
w.WriteString(tt.input)
}()
// Call the function
result := YesNo("Test question")
// Restore stdin and stderr
os.Stdin = oldStdin
os.Stderr = oldStderr
stderrW.Close()
// Check the result
if result != tt.expected {
t.Errorf("YesNo() = %v, want %v", result, tt.expected)
}
// Check that the prompt was written to stderr
var stderrBuf bytes.Buffer
io.Copy(&stderrBuf, stderrR)
stderrR.Close()
expectedPrompt := "Test question [y/n] "
actualPrompt := stderrBuf.String()
if actualPrompt != expectedPrompt {
t.Errorf("Expected prompt %q, got %q", expectedPrompt, actualPrompt)
}
})
}
}
func TestYesNoPromptMessage(t *testing.T) {
// Capture stdin
oldStdin := os.Stdin
r, w, _ := os.Pipe()
os.Stdin = r
// Capture stderr
oldStderr := os.Stderr
stderrR, stderrW, _ := os.Pipe()
os.Stderr = stderrW
// Write test input
go func() {
defer w.Close()
w.WriteString("n\n")
}()
// Call the function with a custom message
customMessage := "Do you want to continue with this dangerous operation?"
YesNo(customMessage)
// Restore stdin and stderr
os.Stdin = oldStdin
os.Stderr = oldStderr
stderrW.Close()
// Check that the custom message was included in the prompt
var stderrBuf bytes.Buffer
io.Copy(&stderrBuf, stderrR)
stderrR.Close()
expectedPrompt := customMessage + " [y/n] "
actualPrompt := stderrBuf.String()
if actualPrompt != expectedPrompt {
t.Errorf("Expected prompt %q, got %q", expectedPrompt, actualPrompt)
}
}
func TestYesNoCaseInsensitive(t *testing.T) {
testCases := []struct {
input string
expected bool
}{
{"y\n", true},
{"Y\n", true},
{"yes\n", true},
{"Yes\n", true},
{"YES\n", true},
{"yEs\n", true},
{"sure\n", true},
{"Sure\n", true},
{"SURE\n", true},
{"SuRe\n", true},
}
for _, tc := range testCases {
t.Run("input_"+strings.TrimSpace(tc.input), func(t *testing.T) {
// Capture stdin
oldStdin := os.Stdin
r, w, _ := os.Pipe()
os.Stdin = r
// Capture stderr to avoid output during tests
oldStderr := os.Stderr
stderrR, stderrW, _ := os.Pipe()
os.Stderr = stderrW
// Write test input
go func() {
defer w.Close()
w.WriteString(tc.input)
}()
// Call the function
result := YesNo("Test")
// Restore stdin and stderr
os.Stdin = oldStdin
os.Stderr = oldStderr
stderrW.Close()
// Drain stderr
io.Copy(io.Discard, stderrR)
stderrR.Close()
if result != tc.expected {
t.Errorf("Input %q: expected %v, got %v", strings.TrimSpace(tc.input), tc.expected, result)
}
})
}
}