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
121 lines
2.7 KiB
Go
121 lines
2.7 KiB
Go
package clispinner
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestNewUsesSimpleSpinnerForNonTerminalWriter(t *testing.T) {
|
|
s := New(WithWriter(&bytes.Buffer{}))
|
|
_, ok := s.(*SimpleSpinner)
|
|
require.True(t, ok)
|
|
}
|
|
|
|
func TestIsRunningInTerminalFalseForNonFileWriter(t *testing.T) {
|
|
require.False(t, isRunningInTerminal(&bytes.Buffer{}))
|
|
}
|
|
|
|
func TestIsRunningInTerminalFalseForRegularFile(t *testing.T) {
|
|
f, err := os.CreateTemp(t.TempDir(), "spinner-writer-*")
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
require.NoError(t, f.Close())
|
|
})
|
|
|
|
require.False(t, isRunningInTerminal(f))
|
|
}
|
|
|
|
func TestNewSimpleSpinnerDefaults(t *testing.T) {
|
|
s := newSimpleSpinner(Options{})
|
|
|
|
require.Equal(t, DefaultText, s.text)
|
|
require.Equal(t, simpleCharset, s.charset)
|
|
require.Equal(t, os.Stdout, s.writer)
|
|
}
|
|
|
|
func TestSimpleSpinnerSetters(t *testing.T) {
|
|
s := newSimpleSpinner(Options{})
|
|
|
|
require.Same(t, s, s.SetText("text"))
|
|
require.Same(t, s, s.SetPrefix("prefix"))
|
|
require.Same(t, s, s.SetCharset([]string{"1", "2"}))
|
|
require.Same(t, s, s.SetColor("red"))
|
|
|
|
require.Equal(t, "text", s.text)
|
|
require.Equal(t, "prefix", s.prefix)
|
|
require.Equal(t, []string{"1", "2"}, s.charset)
|
|
require.Equal(t, "red", s.color)
|
|
}
|
|
|
|
func TestSimpleSpinnerStartAndStop(t *testing.T) {
|
|
oldRefreshRate := simpleRefreshRate
|
|
oldColor := simpleColor
|
|
simpleRefreshRate = time.Millisecond
|
|
simpleColor = func(i ...interface{}) string { return fmt.Sprint(i...) }
|
|
t.Cleanup(func() {
|
|
simpleRefreshRate = oldRefreshRate
|
|
simpleColor = oldColor
|
|
})
|
|
|
|
out := &safeBuffer{}
|
|
s := newSimpleSpinner(Options{
|
|
writer: out,
|
|
text: "working",
|
|
charset: []string{"."},
|
|
})
|
|
|
|
require.False(t, s.IsActive())
|
|
s.Start()
|
|
require.True(t, s.IsActive())
|
|
|
|
require.Eventually(t, func() bool {
|
|
return out.Len() > 0
|
|
}, 200*time.Millisecond, 5*time.Millisecond)
|
|
|
|
s.Stop()
|
|
require.False(t, s.IsActive())
|
|
}
|
|
|
|
func TestNewTermSpinnerDefaultsAndSetters(t *testing.T) {
|
|
var out bytes.Buffer
|
|
s := newTermSpinner(Options{
|
|
writer: &out,
|
|
text: "booting",
|
|
charset: []string{"A", "B"},
|
|
})
|
|
|
|
require.Equal(t, []string{"A", "B"}, s.charset)
|
|
require.Equal(t, &out, s.Writer())
|
|
require.Equal(t, " booting", s.sp.Suffix)
|
|
|
|
require.Same(t, s, s.SetText("running"))
|
|
require.Same(t, s, s.SetPrefix("ignite"))
|
|
require.Same(t, s, s.SetCharset([]string{"X"}))
|
|
require.Same(t, s, s.SetColor("green"))
|
|
|
|
require.Equal(t, "ignite ", s.sp.Prefix)
|
|
require.Equal(t, " running", s.sp.Suffix)
|
|
}
|
|
|
|
type safeBuffer struct {
|
|
mu sync.Mutex
|
|
buf bytes.Buffer
|
|
}
|
|
|
|
func (b *safeBuffer) Write(p []byte) (int, error) {
|
|
b.mu.Lock()
|
|
defer b.mu.Unlock()
|
|
return b.buf.Write(p)
|
|
}
|
|
|
|
func (b *safeBuffer) Len() int {
|
|
b.mu.Lock()
|
|
defer b.mu.Unlock()
|
|
return b.buf.Len()
|
|
}
|