test(markdown,guildstree,qr,root): use identifier-based names and subtests
This commit is contained in:
parent
9d38982a8f
commit
8b9c28ce56
5 changed files with 102 additions and 94 deletions
|
|
@ -9,26 +9,28 @@ import (
|
|||
"github.com/gdamore/tcell/v3"
|
||||
)
|
||||
|
||||
func TestRendererMasksSpoilers(t *testing.T) {
|
||||
source := []byte("before ||secret|| after")
|
||||
node := md.Parse(source)
|
||||
func TestRendererRenderText(t *testing.T) {
|
||||
t.Run("masks spoilers", func(t *testing.T) {
|
||||
source := []byte("before ||secret|| after")
|
||||
node := md.Parse(source)
|
||||
|
||||
for _, test := range []struct {
|
||||
mask bool
|
||||
want string
|
||||
}{
|
||||
{true, "before [spoiler] after"},
|
||||
{false, "before secret after"},
|
||||
} {
|
||||
rendered := NewRenderer(&config.Config{Markdown: config.MarkdownConfig{MaskSpoilers: test.mask}}).RenderText(source, node, tcell.StyleDefault)
|
||||
var got strings.Builder
|
||||
for _, line := range rendered {
|
||||
for _, segment := range line {
|
||||
got.WriteString(segment.Text)
|
||||
for _, test := range []struct {
|
||||
mask bool
|
||||
want string
|
||||
}{
|
||||
{true, "before [spoiler] after"},
|
||||
{false, "before secret after"},
|
||||
} {
|
||||
rendered := NewRenderer(&config.Config{Markdown: config.MarkdownConfig{MaskSpoilers: test.mask}}).RenderText(source, node, tcell.StyleDefault)
|
||||
var got strings.Builder
|
||||
for _, line := range rendered {
|
||||
for _, segment := range line {
|
||||
got.WriteString(segment.Text)
|
||||
}
|
||||
}
|
||||
if got.String() != test.want {
|
||||
t.Fatalf("mask=%t: got %q, want %q", test.mask, got.String(), test.want)
|
||||
}
|
||||
}
|
||||
if got.String() != test.want {
|
||||
t.Fatalf("mask=%t: got %q, want %q", test.mask, got.String(), test.want)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,45 +8,47 @@ import (
|
|||
"github.com/ayn2op/tview/tree"
|
||||
)
|
||||
|
||||
func TestMoveDMToFront(t *testing.T) {
|
||||
firstID := discord.ChannelID(1)
|
||||
secondID := discord.ChannelID(2)
|
||||
thirdID := discord.ChannelID(3)
|
||||
func TestModelMoveDMToFront(t *testing.T) {
|
||||
t.Run("moves rendered channel to front", func(t *testing.T) {
|
||||
firstID := discord.ChannelID(1)
|
||||
secondID := discord.ChannelID(2)
|
||||
thirdID := discord.ChannelID(3)
|
||||
|
||||
first := tree.NewNode("first").SetReference(firstID)
|
||||
second := tree.NewNode("second").SetReference(secondID)
|
||||
third := tree.NewNode("third").SetReference(thirdID)
|
||||
dmRoot := tree.NewNode("Direct Messages").SetChildren([]*tree.Node{first, second, third})
|
||||
m := Model{
|
||||
dmRootNode: dmRoot,
|
||||
channelNodeByID: map[discord.ChannelID]*tree.Node{
|
||||
firstID: first,
|
||||
secondID: second,
|
||||
thirdID: third,
|
||||
},
|
||||
}
|
||||
first := tree.NewNode("first").SetReference(firstID)
|
||||
second := tree.NewNode("second").SetReference(secondID)
|
||||
third := tree.NewNode("third").SetReference(thirdID)
|
||||
dmRoot := tree.NewNode("Direct Messages").SetChildren([]*tree.Node{first, second, third})
|
||||
m := Model{
|
||||
dmRootNode: dmRoot,
|
||||
channelNodeByID: map[discord.ChannelID]*tree.Node{
|
||||
firstID: first,
|
||||
secondID: second,
|
||||
thirdID: third,
|
||||
},
|
||||
}
|
||||
|
||||
m.moveDMToFront(thirdID)
|
||||
m.moveDMToFront(thirdID)
|
||||
|
||||
want := []*tree.Node{third, first, second}
|
||||
if !slices.Equal(dmRoot.Children(), want) {
|
||||
t.Fatalf("children = %v, want %v", dmRoot.Children(), want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMoveDMToFrontIgnoresUnrenderedChannel(t *testing.T) {
|
||||
firstID := discord.ChannelID(1)
|
||||
first := tree.NewNode("first").SetReference(firstID)
|
||||
dmRoot := tree.NewNode("Direct Messages").SetChildren([]*tree.Node{first})
|
||||
m := Model{
|
||||
dmRootNode: dmRoot,
|
||||
channelNodeByID: map[discord.ChannelID]*tree.Node{},
|
||||
}
|
||||
|
||||
m.moveDMToFront(discord.ChannelID(2))
|
||||
|
||||
children := dmRoot.Children()
|
||||
if len(children) != 1 || children[0] != first {
|
||||
t.Fatalf("children = %v, want the original DM node", children)
|
||||
}
|
||||
want := []*tree.Node{third, first, second}
|
||||
if !slices.Equal(dmRoot.Children(), want) {
|
||||
t.Fatalf("children = %v, want %v", dmRoot.Children(), want)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("ignores unrendered channel", func(t *testing.T) {
|
||||
firstID := discord.ChannelID(1)
|
||||
first := tree.NewNode("first").SetReference(firstID)
|
||||
dmRoot := tree.NewNode("Direct Messages").SetChildren([]*tree.Node{first})
|
||||
m := Model{
|
||||
dmRootNode: dmRoot,
|
||||
channelNodeByID: map[discord.ChannelID]*tree.Node{},
|
||||
}
|
||||
|
||||
m.moveDMToFront(discord.ChannelID(2))
|
||||
|
||||
children := dmRoot.Children()
|
||||
if len(children) != 1 || children[0] != first {
|
||||
t.Fatalf("children = %v, want the original DM node", children)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,16 +7,18 @@ import (
|
|||
"github.com/skip2/go-qrcode"
|
||||
)
|
||||
|
||||
func TestSetRectRendersContent(t *testing.T) {
|
||||
m := NewModel()
|
||||
code, err := qrcode.New("test", qrcode.Low)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
m.qrCode = code
|
||||
m.SetRect(0, 0, 80, 24)
|
||||
text := m.Text()
|
||||
if !strings.Contains(text, m.status) || !strings.ContainsAny(text, "█▀▄") {
|
||||
t.Fatal("missing content")
|
||||
}
|
||||
func TestModelSetRect(t *testing.T) {
|
||||
t.Run("renders content", func(t *testing.T) {
|
||||
m := NewModel()
|
||||
code, err := qrcode.New("test", qrcode.Low)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
m.qrCode = code
|
||||
m.SetRect(0, 0, 80, 24)
|
||||
text := m.Text()
|
||||
if !strings.Contains(text, m.status) || !strings.ContainsAny(text, "█▀▄") {
|
||||
t.Fatal("missing content")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,28 +3,30 @@ package qr
|
|||
import "testing"
|
||||
|
||||
func TestDecodeMessage(t *testing.T) {
|
||||
tests := []struct {
|
||||
data string
|
||||
want any
|
||||
}{
|
||||
{`{"op":"hello","heartbeat_interval":100,"timeout_ms":200}`, helloMsg{heartbeatInterval: 100, timeoutMS: 200}},
|
||||
{`{"op":"nonce_proof","encrypted_nonce":"nonce"}`, nonceProofMsg{encryptedNonce: "nonce"}},
|
||||
{`{"op":"pending_remote_init","fingerprint":"fingerprint"}`, pendingRemoteInitMsg{fingerprint: "fingerprint"}},
|
||||
{`{"op":"pending_ticket","encrypted_user_payload":"payload"}`, pendingTicketMsg{encryptedUserPayload: "payload"}},
|
||||
{`{"op":"cancel"}`, cancelMsg{}},
|
||||
{`{"op":"pending_login","ticket":"ticket"}`, pendingLoginMsg{ticket: "ticket"}},
|
||||
{`{"op":"unknown"}`, nil},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
if got := decodeMessage([]byte(test.data)); got != test.want {
|
||||
t.Errorf("decodeMessage(%s) = %#v, want %#v", test.data, got, test.want)
|
||||
t.Run("decodes messages", func(t *testing.T) {
|
||||
tests := []struct {
|
||||
data string
|
||||
want any
|
||||
}{
|
||||
{`{"op":"hello","heartbeat_interval":100,"timeout_ms":200}`, helloMsg{heartbeatInterval: 100, timeoutMS: 200}},
|
||||
{`{"op":"nonce_proof","encrypted_nonce":"nonce"}`, nonceProofMsg{encryptedNonce: "nonce"}},
|
||||
{`{"op":"pending_remote_init","fingerprint":"fingerprint"}`, pendingRemoteInitMsg{fingerprint: "fingerprint"}},
|
||||
{`{"op":"pending_ticket","encrypted_user_payload":"payload"}`, pendingTicketMsg{encryptedUserPayload: "payload"}},
|
||||
{`{"op":"cancel"}`, cancelMsg{}},
|
||||
{`{"op":"pending_login","ticket":"ticket"}`, pendingLoginMsg{ticket: "ticket"}},
|
||||
{`{"op":"unknown"}`, nil},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeMessageRejectsDuplicateNames(t *testing.T) {
|
||||
if _, ok := decodeMessage([]byte(`{"op":"cancel","op":"hello"}`)).(errMsg); !ok {
|
||||
t.Fatal("duplicate name was accepted")
|
||||
}
|
||||
for _, test := range tests {
|
||||
if got := decodeMessage([]byte(test.data)); got != test.want {
|
||||
t.Errorf("decodeMessage(%s) = %#v, want %#v", test.data, got, test.want)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("rejects duplicate names", func(t *testing.T) {
|
||||
if _, ok := decodeMessage([]byte(`{"op":"cancel","op":"hello"}`)).(errMsg); !ok {
|
||||
t.Fatal("duplicate name was accepted")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,13 +8,13 @@ import (
|
|||
"github.com/gdamore/tcell/v3"
|
||||
)
|
||||
|
||||
func TestHelpEnabled(t *testing.T) {
|
||||
func TestNewModel(t *testing.T) {
|
||||
cfg, err := config.Load(filepath.Join(t.TempDir(), "missing.toml"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Run("enabled", func(t *testing.T) {
|
||||
t.Run("help enabled", func(t *testing.T) {
|
||||
cfg := *cfg
|
||||
cfg.Help.Enabled = true
|
||||
m := NewModel(&cfg)
|
||||
|
|
@ -51,7 +51,7 @@ func TestHelpEnabled(t *testing.T) {
|
|||
}
|
||||
})
|
||||
|
||||
t.Run("disabled", func(t *testing.T) {
|
||||
t.Run("help disabled", func(t *testing.T) {
|
||||
cfg := *cfg
|
||||
cfg.Help.Enabled = false
|
||||
m := NewModel(&cfg)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue