Files
keyfunc/internal/mnemonic/mnemonic_test.go
T
sneak 4e1258302f
check / check (push) Successful in 52s
Move the Go module to sneak.berlin/go/keyfunc (closes #15)
REPO_POLICIES.md sets the Go module root to sneak.berlin/go/<name>.
go.mod, every import of the old path and the -X path in the Makefile
LDFLAGS now use sneak.berlin/go/keyfunc; make fmt moved those imports
to their new place in the sort order. The old path keeps no alias. The
README gives the go install line next to the build from a clone and
drops this issue from its TODO list, which now names the open 1.0
issues.

Model: opus-5-5
2026-10-03 13:10:29 +00:00

88 lines
2.5 KiB
Go

package mnemonic_test
import (
"strings"
"testing"
"github.com/stretchr/testify/require"
"sneak.berlin/go/keyfunc/internal/mnemonic"
)
// Two more mnemonics that pass the checksum, so a test can tell which
// source an answer came from.
const (
fromCommandVariable = "legal winner thank year wave sausage worth " +
"useful legal winner thank yellow"
fromVariable = "letter advice cage absurd amount doctor acoustic " +
"avoid letter advice cage above"
)
// example returns the mnemonic every BIP-39 document uses to show its
// test vectors: eleven abandons and about.
func example() string {
return strings.Repeat("abandon ", 11) + "about"
}
// broken returns a mnemonic whose last word does not match the rest.
func broken() string {
return strings.TrimSpace(strings.Repeat("abandon ", 12))
}
// prints builds a shell command that writes the given words padded
// with spaces, so the test also shows that the padding is dropped.
func prints(words string) string {
return "printf ' %s \\n' '" + words + "'"
}
func TestTheCommandOnTheCommandLineWins(t *testing.T) {
t.Setenv(mnemonic.CommandVariable, prints(fromCommandVariable))
t.Setenv(mnemonic.Variable, fromVariable)
words, err := mnemonic.Read(t.Context(), prints(example()))
require.NoError(t, err)
require.Equal(t, example(), words)
}
func TestTheCommandInTheEnvironmentComesNext(t *testing.T) {
t.Setenv(mnemonic.CommandVariable, prints(fromCommandVariable))
t.Setenv(mnemonic.Variable, fromVariable)
words, err := mnemonic.Read(t.Context(), "")
require.NoError(t, err)
require.Equal(t, fromCommandVariable, words)
}
func TestTheMnemonicInTheEnvironmentComesLast(t *testing.T) {
t.Setenv(mnemonic.CommandVariable, "")
t.Setenv(mnemonic.Variable, " "+fromVariable+" ")
words, err := mnemonic.Read(t.Context(), "")
require.NoError(t, err)
require.Equal(t, fromVariable, words)
}
func TestAFailingCommandSaysWhatWentWrong(t *testing.T) {
t.Setenv(mnemonic.CommandVariable, "")
t.Setenv(mnemonic.Variable, "")
_, err := mnemonic.Read(t.Context(), "echo nothing here >&2; exit 3")
require.Error(t, err)
require.Contains(t, err.Error(), "nothing here")
}
func TestABadChecksumIsRefused(t *testing.T) {
t.Setenv(mnemonic.CommandVariable, "")
t.Setenv(mnemonic.Variable, broken())
_, err := mnemonic.Read(t.Context(), "")
require.ErrorIs(t, err, mnemonic.ErrChecksum)
}
func TestNothingToReadAndNobodyToAsk(t *testing.T) {
t.Setenv(mnemonic.CommandVariable, "")
t.Setenv(mnemonic.Variable, "")
_, err := mnemonic.Read(t.Context(), "")
require.ErrorIs(t, err, mnemonic.ErrMissing)
}