gopass/pkg/termio/ask_test.go
Dominik Schulz 7281ca8ab4
[chore] Migrate to golangci-lint v2 (#3104)
* [chore] Migrate to golangci-lint v2

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Fix more lint issues

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Fix more lint issue

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Fix more lint issues

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Add more package comments.

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [chore] Fix golangci-lint config and the remaining checks

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Use Go 1.24

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Fix container builds

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* Fix more failing tests

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* Fix test failure

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* Fix another len assertion

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* Move location tests

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Fix most remaining lint issues

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Only run XDG specific tests on linux

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

* [fix] Attempt to address on source of flaky failures

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

---------

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>
2025-04-17 08:05:43 +02:00

275 lines
5.4 KiB
Go

package termio
import (
"bytes"
"context"
"os"
"strings"
"testing"
"github.com/gopasspw/gopass/internal/config"
"github.com/gopasspw/gopass/internal/out"
"github.com/gopasspw/gopass/pkg/ctxutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestAskForString(t *testing.T) {
buf := &bytes.Buffer{}
out.Stderr = buf
Stderr = buf
defer func() {
out.Stderr = os.Stderr
Stderr = os.Stderr
}()
ctx := config.NewContextInMemory()
ctx = ctxutil.WithAlwaysYes(ctx, true)
sv, err := AskForString(ctx, "test", "foobar")
require.NoError(t, err)
assert.Equal(t, "foobar", sv)
t.Logf("Stderr: %s", buf.String())
buf.Reset()
// provide value on redirected stdin
input := `foobaz
bar
`
Stdin = strings.NewReader(input)
ctx = ctxutil.WithAlwaysYes(ctx, false)
sv, err = AskForString(ctx, "test", "foobar")
require.NoError(t, err)
assert.Equal(t, "foobaz", sv)
sv, err = AskForString(ctx, "test", "foobar")
require.NoError(t, err)
assert.Equal(t, "bar", sv)
Stdin = os.Stdin
sv, err = AskForString(ctx, "test", "foobar")
require.NoError(t, err)
assert.Equal(t, "foobar", sv)
Stdin = os.Stdin
t.Logf("Stderr: %s", buf.String())
buf.Reset()
}
func TestAskForBool(t *testing.T) {
buf := &bytes.Buffer{}
out.Stderr = buf
Stderr = buf
defer func() {
out.Stderr = os.Stderr
Stderr = os.Stderr
}()
ctx := config.NewContextInMemory()
ctx = ctxutil.WithAlwaysYes(ctx, true)
bv, err := AskForBool(ctx, "test", false)
require.NoError(t, err)
assert.False(t, bv)
// provide value on redirected stdin
input := `n
y
N
Y
z
`
Stdin = strings.NewReader(input)
ctx = ctxutil.WithAlwaysYes(ctx, false)
bv, err = AskForBool(ctx, "test", true)
require.NoError(t, err)
assert.False(t, bv)
bv, err = AskForBool(ctx, "test", false)
require.NoError(t, err)
assert.True(t, bv)
bv, err = AskForBool(ctx, "test", true)
require.NoError(t, err)
assert.False(t, bv)
bv, err = AskForBool(ctx, "test", false)
require.NoError(t, err)
assert.True(t, bv)
bv, err = AskForBool(ctx, "test", true)
require.NoError(t, err)
assert.True(t, bv)
bv, err = AskForBool(ctx, "test", false)
require.NoError(t, err)
assert.False(t, bv)
bv, err = AskForBool(ctx, "test", false)
require.Error(t, err)
assert.False(t, bv)
}
func TestAskForInt(t *testing.T) {
buf := &bytes.Buffer{}
out.Stderr = buf
Stderr = buf
defer func() {
out.Stderr = os.Stderr
Stderr = os.Stderr
}()
ctx := config.NewContextInMemory()
ctx = ctxutil.WithAlwaysYes(ctx, true)
got, err := AskForInt(ctx, "test", 42)
require.NoError(t, err)
assert.Equal(t, 42, got)
// provide value on redirected stdin
input := `23
-1
0xDEADBEEF
0755
0.123
`
Stdin = strings.NewReader(input)
ctx = ctxutil.WithAlwaysYes(ctx, false)
iv, err := AskForInt(ctx, "test", 42)
require.NoError(t, err)
assert.Equal(t, 23, iv)
}
func TestAskForConfirmation(t *testing.T) {
buf := &bytes.Buffer{}
out.Stderr = buf
Stderr = buf
defer func() {
out.Stderr = os.Stderr
Stderr = os.Stderr
}()
ctx := config.NewContextInMemory()
ctx = ctxutil.WithAlwaysYes(ctx, true)
assert.True(t, AskForConfirmation(ctx, "test"))
// provide value on redirected stdin
input := `y
n
`
for range maxTries + 1 {
input += "z\n"
}
Stdin = strings.NewReader(input)
ctx = ctxutil.WithAlwaysYes(ctx, false)
assert.True(t, AskForConfirmation(ctx, "test"))
assert.False(t, AskForConfirmation(ctx, "test"))
assert.False(t, AskForConfirmation(ctx, "test"))
}
func TestAskForKeyImport(t *testing.T) {
buf := &bytes.Buffer{}
out.Stderr = buf
Stderr = buf
defer func() {
out.Stderr = os.Stderr
Stderr = os.Stderr
}()
ctx := config.NewContextInMemory()
ctx = ctxutil.WithAlwaysYes(ctx, true)
assert.True(t, AskForKeyImport(ctx, "test", []string{}))
// provide value on redirected stdin
input := `y
n
z
`
Stdin = strings.NewReader(input)
ctx = ctxutil.WithAlwaysYes(ctx, false)
assert.False(t, AskForKeyImport(ctxutil.WithInteractive(ctx, false), "", nil))
assert.True(t, AskForKeyImport(ctx, "", nil))
assert.False(t, AskForKeyImport(ctx, "", nil))
assert.False(t, AskForKeyImport(ctx, "", nil))
}
func TestAskForPasswordNonInteractive(t *testing.T) {
buf := &bytes.Buffer{}
out.Stderr = buf
Stderr = buf
defer func() {
out.Stderr = os.Stderr
Stderr = os.Stderr
}()
ctx := config.NewContextInMemory()
ctx = ctxutil.WithInteractive(ctx, false)
_, err := AskForPassword(ctx, "test", true)
require.Error(t, err)
// provide value on redirected stdin
input := `foo
foo
foobar
foobaz
foobat
`
Stdin = strings.NewReader(input)
ctx = ctxutil.WithAlwaysYes(ctx, false)
ctx = ctxutil.WithInteractive(ctx, true)
ctx = ctxutil.WithTerminal(ctx, false)
sv, err := AskForPassword(ctx, "test", true)
require.NoError(t, err)
assert.Equal(t, "foo", sv)
sv, err = AskForPassword(ctx, "test", false)
require.NoError(t, err)
assert.Equal(t, "foobar", sv)
sv, err = AskForPassword(ctx, "test", true)
require.NoError(t, err)
assert.Empty(t, sv)
}
func TestAskForPasswordInteractive(t *testing.T) {
buf := &bytes.Buffer{}
out.Stderr = buf
Stderr = buf
defer func() {
out.Stderr = os.Stderr
Stderr = os.Stderr
}()
ctx := config.NewContextInMemory()
askFn := func(ctx context.Context, prompt string) (string, error) {
return "test", nil
}
ctx = ctxutil.WithInteractive(ctx, true)
ctx = WithPassPromptFunc(ctx, askFn)
pw, err := AskForPassword(ctx, "test", true)
require.NoError(t, err)
assert.Equal(t, "test", pw)
}