tiki/plugin/merger_test.go

129 lines
3.5 KiB
Go
Raw Normal View History

2026-01-17 16:08:53 +00:00
package plugin
import (
"testing"
"github.com/gdamore/tcell/v2"
2026-04-10 20:07:34 +00:00
"github.com/boolean-maybe/tiki/config"
2026-04-09 02:46:46 +00:00
rukiRuntime "github.com/boolean-maybe/tiki/internal/ruki/runtime"
"github.com/boolean-maybe/tiki/ruki"
2026-01-17 16:08:53 +00:00
)
2026-04-09 02:46:46 +00:00
// mustParseFilter is a test helper that parses a ruki select statement or panics.
func mustParseFilter(t *testing.T, expr string) *ruki.ValidatedStatement {
t.Helper()
schema := rukiRuntime.NewSchema()
parser := ruki.NewParser(schema)
stmt, err := parser.ParseAndValidateStatement(expr, ruki.ExecutorRuntimePlugin)
if err != nil {
t.Fatalf("failed to parse ruki statement %q: %v", expr, err)
}
return stmt
}
2026-01-17 16:08:53 +00:00
func TestMergePluginDefinitions_TikiToTiki(t *testing.T) {
2026-04-09 02:46:46 +00:00
baseFilter := mustParseFilter(t, `select where status = "ready"`)
2026-01-17 16:08:53 +00:00
base := &TikiPlugin{
BasePlugin: BasePlugin{
Name: "Base",
Key: tcell.KeyRune,
Rune: 'B',
Modifier: 0,
2026-04-10 20:07:34 +00:00
Foreground: config.NewColor(tcell.ColorRed),
Background: config.NewColor(tcell.ColorBlue),
2026-01-17 16:08:53 +00:00
Type: "tiki",
},
2026-02-10 21:18:05 +00:00
Lanes: []TikiLane{
2026-01-21 21:16:54 +00:00
{Name: "Todo", Columns: 1, Filter: baseFilter},
},
2026-01-17 16:08:53 +00:00
ViewMode: "compact",
}
2026-04-09 02:46:46 +00:00
overrideFilter := mustParseFilter(t, `select where type = "bug"`)
2026-01-17 16:08:53 +00:00
override := &TikiPlugin{
BasePlugin: BasePlugin{
Name: "Base",
Key: tcell.KeyRune,
Rune: 'O',
Modifier: tcell.ModAlt,
2026-04-10 20:07:34 +00:00
Foreground: config.NewColor(tcell.ColorGreen),
Background: config.DefaultColor(),
2026-01-17 16:08:53 +00:00
FilePath: "override.yaml",
ConfigIndex: 1,
Type: "tiki",
},
2026-02-10 21:18:05 +00:00
Lanes: []TikiLane{
2026-01-21 21:16:54 +00:00
{Name: "Bugs", Columns: 1, Filter: overrideFilter},
},
2026-01-17 16:08:53 +00:00
ViewMode: "expanded",
}
result := mergePluginDefinitions(base, override)
resultTiki, ok := result.(*TikiPlugin)
if !ok {
2026-04-09 02:46:46 +00:00
t.Fatal("expected result to be *TikiPlugin")
2026-01-17 16:08:53 +00:00
}
2026-04-09 02:46:46 +00:00
// check overridden values
2026-01-17 16:08:53 +00:00
if resultTiki.Rune != 'O' {
2026-04-09 02:46:46 +00:00
t.Errorf("expected rune 'O', got %q", resultTiki.Rune)
2026-01-17 16:08:53 +00:00
}
if resultTiki.Modifier != tcell.ModAlt {
2026-04-09 02:46:46 +00:00
t.Errorf("expected ModAlt, got %v", resultTiki.Modifier)
2026-01-17 16:08:53 +00:00
}
2026-04-10 20:07:34 +00:00
if resultTiki.Foreground.TCell() != tcell.ColorGreen {
2026-04-09 02:46:46 +00:00
t.Errorf("expected green foreground, got %v", resultTiki.Foreground)
2026-01-17 16:08:53 +00:00
}
if resultTiki.ViewMode != "expanded" {
2026-04-09 02:46:46 +00:00
t.Errorf("expected expanded view, got %q", resultTiki.ViewMode)
2026-01-17 16:08:53 +00:00
}
2026-02-10 21:18:05 +00:00
if len(resultTiki.Lanes) != 1 || resultTiki.Lanes[0].Filter == nil {
2026-04-09 02:46:46 +00:00
t.Error("expected lane filter to be overridden")
2026-01-17 16:08:53 +00:00
}
}
func TestMergePluginDefinitions_PreservesModifier(t *testing.T) {
2026-04-09 02:46:46 +00:00
baseFilter := mustParseFilter(t, `select where status = "ready"`)
2026-01-17 16:08:53 +00:00
base := &TikiPlugin{
BasePlugin: BasePlugin{
Name: "Base",
Key: tcell.KeyRune,
Rune: 'M',
2026-04-09 02:46:46 +00:00
Modifier: tcell.ModAlt, // this should be preserved
2026-04-10 20:07:34 +00:00
Foreground: config.NewColor(tcell.ColorWhite),
Background: config.DefaultColor(),
2026-01-17 16:08:53 +00:00
Type: "tiki",
},
2026-02-10 21:18:05 +00:00
Lanes: []TikiLane{
2026-01-21 21:16:54 +00:00
{Name: "Todo", Columns: 1, Filter: baseFilter},
},
2026-01-17 16:08:53 +00:00
}
2026-04-09 02:46:46 +00:00
// override with no modifier change (Modifier: 0)
2026-01-17 16:08:53 +00:00
override := &TikiPlugin{
BasePlugin: BasePlugin{
Name: "Base",
FilePath: "config.yaml",
ConfigIndex: 0,
Type: "tiki",
},
}
result := mergePluginDefinitions(base, override)
resultTiki, ok := result.(*TikiPlugin)
if !ok {
2026-04-09 02:46:46 +00:00
t.Fatal("expected result to be *TikiPlugin")
2026-01-17 16:08:53 +00:00
}
2026-04-09 02:46:46 +00:00
// the Modifier from base should be preserved
2026-01-17 16:08:53 +00:00
if resultTiki.Modifier != tcell.ModAlt {
2026-04-09 02:46:46 +00:00
t.Errorf("expected ModAlt to be preserved from base, got %v", resultTiki.Modifier)
2026-01-17 16:08:53 +00:00
}
if resultTiki.Rune != 'M' {
2026-04-09 02:46:46 +00:00
t.Errorf("expected rune 'M' to be preserved from base, got %q", resultTiki.Rune)
2026-01-17 16:08:53 +00:00
}
}