Files
yay/pkg/settings/lua/hooks_test.go
T
2026-06-15 21:18:11 +02:00

151 lines
3.6 KiB
Go

package lua
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestRenderHandledReturnsLine(t *testing.T) {
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.on("render_search", function(results)
local out = {}
for _, pkg in ipairs(results) do
out[#out + 1] = pkg.source .. "/" .. pkg.name .. " " .. pkg.version
end
return table.concat(out, "\n")
end)
`))
assert.True(t, e.HasHooks())
out, handled, err := e.RenderSearch([]map[string]any{
{"source": "aur", "name": "yay", "version": "12.0.0"},
{"source": "extra", "name": "bash", "version": "5.2"},
})
require.NoError(t, err)
assert.True(t, handled)
assert.Equal(t, "aur/yay 12.0.0\nextra/bash 5.2", out)
}
func TestRenderNoHookReturnsUnhandled(t *testing.T) {
e := New()
defer e.Close()
assert.False(t, e.HasHooks())
out, handled, err := e.RenderSearch([]map[string]any{{"name": "yay"}})
require.NoError(t, err)
assert.False(t, handled)
assert.Empty(t, out)
}
func TestRenderNonStringReturnIsUnhandled(t *testing.T) {
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.on("render_search", function(results)
return 42
end)
`))
out, handled, err := e.RenderSearch([]map[string]any{{"name": "bash"}})
require.NoError(t, err)
assert.False(t, handled)
assert.Empty(t, out)
}
func TestRenderNilReturnIsUnhandled(t *testing.T) {
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.on("render_search", function(results)
return nil
end)
`))
_, handled, err := e.RenderSearch([]map[string]any{{"name": "bash"}})
require.NoError(t, err)
assert.False(t, handled)
}
func TestRenderRuntimeErrorWraps(t *testing.T) {
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.on("render_search", function(results)
error("boom")
end)
`))
_, handled, err := e.RenderSearch([]map[string]any{{"name": "yay"}})
require.Error(t, err)
assert.False(t, handled)
assert.Contains(t, err.Error(), "init.lua render_search hook")
assert.Contains(t, err.Error(), "boom")
}
func TestOnUnknownEventErrors(t *testing.T) {
e := New()
defer e.Close()
err := e.L.DoString(`yay.on("bogus", function(pkg) return "x" end)`)
require.Error(t, err)
assert.Contains(t, err.Error(), "unknown event")
assert.False(t, e.HasHooks())
}
func TestOnLastWinsSingleSlot(t *testing.T) {
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.on("render_search", function(results) return "first" end)
yay.on("render_search", function(results) return "second" end)
`))
out, handled, err := e.RenderSearch([]map[string]any{{"name": "yay"}})
require.NoError(t, err)
assert.True(t, handled)
assert.Equal(t, "second", out)
}
func TestToTableConvertsAllKinds(t *testing.T) {
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.on("render_search", function(results)
local pkg = results[1]
assert(pkg.name == "yay", "name")
assert(pkg.votes == 10, "votes")
assert(math.abs(pkg.popularity - 1.5) < 0.001, "popularity")
assert(pkg.size == 4096, "size")
assert(pkg.installed == true, "installed")
assert(pkg.installed_version == nil, "installed_version absent")
assert(#pkg.provides == 2, "provides len")
assert(pkg.provides[1] == "a" and pkg.provides[2] == "b", "provides items")
return "ok"
end)
`))
out, handled, err := e.RenderSearch([]map[string]any{{
"name": "yay",
"votes": 10,
"popularity": 1.5,
"size": int64(4096),
"installed": true,
"provides": []string{"a", "b"},
}})
require.NoError(t, err)
assert.True(t, handled)
assert.Equal(t, "ok", out)
}