Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
119 lines
2.8 KiB
Go
119 lines
2.8 KiB
Go
package bubbleconfirm
|
|
|
|
import (
|
|
"testing"
|
|
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
"github.com/spf13/pflag"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestNewModel(t *testing.T) {
|
|
m := NewModel("Continue?")
|
|
|
|
require.Equal(t, "Continue?", m.Question)
|
|
require.Equal(t, 0, m.cursor)
|
|
require.Equal(t, Undecided, m.Choice())
|
|
}
|
|
|
|
func TestModelUpdateNavigationAndSelect(t *testing.T) {
|
|
m := NewModel("Question")
|
|
|
|
next, _ := m.Update(tea.KeyMsg{Type: tea.KeyRight})
|
|
m = next.(Model)
|
|
require.Equal(t, 1, m.cursor)
|
|
|
|
next, cmd := m.Update(tea.KeyMsg{Type: tea.KeyEnter})
|
|
m = next.(Model)
|
|
require.Equal(t, No, m.Choice())
|
|
require.NotNil(t, cmd)
|
|
}
|
|
|
|
func TestModelUpdateDirectYesNoChoices(t *testing.T) {
|
|
m := NewModel("Question")
|
|
|
|
next, cmd := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'y'}})
|
|
m = next.(Model)
|
|
require.Equal(t, Yes, m.Choice())
|
|
require.NotNil(t, cmd)
|
|
|
|
m = NewModel("Question")
|
|
next, cmd = m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'n'}})
|
|
m = next.(Model)
|
|
require.Equal(t, No, m.Choice())
|
|
require.NotNil(t, cmd)
|
|
}
|
|
|
|
func TestNewQuestionOptions(t *testing.T) {
|
|
var answer string
|
|
|
|
q := NewQuestion(
|
|
"Name",
|
|
&answer,
|
|
DefaultAnswer("alice"),
|
|
Required(),
|
|
HideAnswer(),
|
|
GetConfirmation(),
|
|
)
|
|
|
|
require.Equal(t, "Name", q.question)
|
|
require.Equal(t, "alice", q.defaultAnswer)
|
|
require.True(t, q.required)
|
|
require.True(t, q.hidden)
|
|
require.True(t, q.shouldConfirm)
|
|
require.Equal(t, &answer, q.answer)
|
|
}
|
|
|
|
func TestInputModelUpdateRequiredValidation(t *testing.T) {
|
|
m := inputModel{
|
|
Question: "Name",
|
|
Required: true,
|
|
}
|
|
|
|
next, _ := m.Update(tea.KeyMsg{Type: tea.KeyEnter})
|
|
m = next.(inputModel)
|
|
|
|
require.False(t, m.done)
|
|
require.Equal(t, "this information is required", m.Error)
|
|
}
|
|
|
|
func TestInputModelUpdateTypingAndBackspace(t *testing.T) {
|
|
m := inputModel{
|
|
Question: "Name",
|
|
}
|
|
|
|
next, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'a'}})
|
|
m = next.(inputModel)
|
|
require.Equal(t, "a", m.Value)
|
|
require.Equal(t, 1, m.cursorPos)
|
|
|
|
next, _ = m.Update(tea.KeyMsg{Type: tea.KeyBackspace})
|
|
m = next.(inputModel)
|
|
require.Equal(t, "", m.Value)
|
|
require.Equal(t, 0, m.cursorPos)
|
|
}
|
|
|
|
func TestValuesFromFlagsOrAskUsesProvidedFlagValues(t *testing.T) {
|
|
fs := pflag.NewFlagSet("test", pflag.ContinueOnError)
|
|
fs.String("username", "", "username")
|
|
fs.String("region", "", "region")
|
|
require.NoError(t, fs.Set("username", "alice"))
|
|
require.NoError(t, fs.Set("region", "earth"))
|
|
|
|
values, err := ValuesFromFlagsOrAsk(
|
|
fs,
|
|
"",
|
|
NewFlag("username", true),
|
|
NewFlag("region", false),
|
|
)
|
|
require.NoError(t, err)
|
|
require.Equal(t, "alice", values["username"])
|
|
require.Equal(t, "earth", values["region"])
|
|
}
|
|
|
|
func TestValuesFromFlagsOrAskReturnsErrorForUndefinedFlag(t *testing.T) {
|
|
fs := pflag.NewFlagSet("test", pflag.ContinueOnError)
|
|
|
|
_, err := ValuesFromFlagsOrAsk(fs, "", NewFlag("missing", true))
|
|
require.Error(t, err)
|
|
}
|