check / check (push) Successful in 52s
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
88 lines
2.5 KiB
Go
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)
|
|
}
|