返回 DeepSeek-Reasonix
secret_input_test.go
根目录 / internal / cli / secret_input_test.go
1 package cli
2
3 import (
4 "bufio"
5 "bytes"
6 "errors"
7 "strings"
8 "testing"
9 )
10
11 func TestAskSecretNonTTYReadsCompleteValueWithoutEcho(t *testing.T) {
12 const secret = "rk_test_ABCDEF1234567890"
13 var out bytes.Buffer
14 got := askSecretWith(bufio.NewScanner(strings.NewReader(secret+"\n")), &out, "API key", false, nil)
15 if got != secret {
16 t.Fatalf("secret = %q, want %q", got, secret)
17 }
18 if strings.Contains(out.String(), secret) {
19 t.Fatalf("prompt output leaked secret: %q", out.String())
20 }
21 }
22
23 func TestAskSecretTTYUsesHiddenReader(t *testing.T) {
24 const secret = "rk_test_ABCDEF1234567890"
25 called := false
26 var out bytes.Buffer
27 got := askSecretWith(bufio.NewScanner(strings.NewReader("wrong\n")), &out, "API key", true, func() ([]byte, error) {
28 called = true
29 return []byte(secret), nil
30 })
31 if !called || got != secret {
32 t.Fatalf("TTY read called=%v secret=%q", called, got)
33 }
34 if strings.Contains(out.String(), secret) {
35 t.Fatalf("prompt output leaked secret: %q", out.String())
36 }
37 }
38
39 func TestAskSecretTTYReadErrorReturnsEmpty(t *testing.T) {
40 var out bytes.Buffer
41 got := askSecretWith(bufio.NewScanner(strings.NewReader("ignored\n")), &out, "API key", true, func() ([]byte, error) {
42 return nil, errors.New("cancelled")
43 })
44 if got != "" {
45 t.Fatalf("secret = %q, want empty on read error", got)
46 }
47 }
48
48 lines GO