diff --git a/internal/markdown/renderer_test.go b/internal/markdown/renderer_test.go index a8ef0bd..128ab95 100644 --- a/internal/markdown/renderer_test.go +++ b/internal/markdown/renderer_test.go @@ -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) - } - } + }) } diff --git a/internal/ui/chat/guildstree/model_test.go b/internal/ui/chat/guildstree/model_test.go index 21ff5a3..584d61f 100644 --- a/internal/ui/chat/guildstree/model_test.go +++ b/internal/ui/chat/guildstree/model_test.go @@ -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) + } + }) } diff --git a/internal/ui/login/qr/model_test.go b/internal/ui/login/qr/model_test.go index c6c6d4d..2aad336 100644 --- a/internal/ui/login/qr/model_test.go +++ b/internal/ui/login/qr/model_test.go @@ -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") + } + }) } diff --git a/internal/ui/login/qr/msg_test.go b/internal/ui/login/qr/msg_test.go index 73fecfa..955a6ef 100644 --- a/internal/ui/login/qr/msg_test.go +++ b/internal/ui/login/qr/msg_test.go @@ -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") + } + }) } diff --git a/internal/ui/root/model_test.go b/internal/ui/root/model_test.go index 507cedc..181ba46 100644 --- a/internal/ui/root/model_test.go +++ b/internal/ui/root/model_test.go @@ -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)