Files
yay/pkg/settings/lua/autocmd_render_test.go
T
Jo 4869306719 feat(search): implement render-hooks for search (#2896)
* add render hooks

* re-render hook per event

* add example with single_line and simplify built rendering

* update docs availability

* remove comments
2026-07-06 14:15:57 +02:00

247 lines
5.9 KiB
Go

package lua
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestRunRenderAUREventShapeAndStringReturn(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.create_autocmd("RenderAUR", {
callback = function(event)
if event.event ~= "RenderAUR" then error("bad event name: " .. tostring(event.event)) end
local d = event.data
if d.name ~= "pkgA" then error("bad name") end
if d.version ~= "1.0-1" then error("bad version") end
if d.description ~= "A great package" then error("bad description") end
if d.base ~= "pkgA-base" then error("bad base") end
if d.votes ~= 42 then error("bad votes") end
if math.abs(d.popularity - 3.14) > 0.001 then error("bad popularity") end
if d.maintainer ~= "alice" then error("bad maintainer") end
if d.out_of_date ~= 0 then error("bad out_of_date") end
if d.first_submitted ~= 1000 then error("bad first_submitted") end
if d.last_modified ~= 2000 then error("bad last_modified") end
if d.local_version ~= "" then error("bad local_version") end
return "X:" .. d.name
end,
})
`))
rendered, ok, err := e.RunRenderAUR(&RenderAUREvent{
Name: "pkgA",
Version: "1.0-1",
Description: "A great package",
Base: "pkgA-base",
Votes: 42,
Popularity: 3.14,
Maintainer: "alice",
OutOfDate: 0,
FirstSubmitted: 1000,
LastModified: 2000,
LocalVersion: "",
})
require.NoError(t, err)
require.True(t, ok)
require.Equal(t, "X:pkgA", rendered)
}
func TestRunRenderAURNilReturnFallsBack(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.create_autocmd("RenderAUR", {
callback = function(event)
return nil
end,
})
`))
rendered, ok, err := e.RunRenderAUR(&RenderAUREvent{Name: "pkgA"})
require.NoError(t, err)
require.False(t, ok)
require.Equal(t, "", rendered)
}
func TestRunRenderAURNonStringReturnIsError(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.create_autocmd("RenderAUR", {
callback = function(event)
return 42
end,
})
`))
_, ok, err := e.RunRenderAUR(&RenderAUREvent{Name: "pkgA"})
require.Error(t, err)
require.False(t, ok)
require.Contains(t, err.Error(), "callback must return a string or nil")
}
func TestRunRenderAURHooksReceiveIndependentEventTables(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.create_autocmd("RenderAUR", {
callback = function(event)
event.data.name = "mutated"
return nil
end,
})
yay.create_autocmd("RenderAUR", {
callback = function(event)
return event.data.name
end,
})
`))
rendered, ok, err := e.RunRenderAUR(&RenderAUREvent{Name: "pkgA"})
require.NoError(t, err)
require.True(t, ok)
require.Equal(t, "pkgA", rendered)
}
func TestRunRenderAURLastHookWins(t *testing.T) {
t.Parallel()
// Sub-case 1: second hook returns "B" — last non-nil wins.
t.Run("second_returns_B", func(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.create_autocmd("RenderAUR", {
callback = function(event) return "A" end,
})
yay.create_autocmd("RenderAUR", {
callback = function(event) return "B" end,
})
`))
rendered, ok, err := e.RunRenderAUR(&RenderAUREvent{Name: "pkgA"})
require.NoError(t, err)
require.True(t, ok)
require.Equal(t, "B", rendered)
})
// Sub-case 2: second hook returns nil — first hook's "A" is retained.
t.Run("second_returns_nil_keeps_first", func(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.create_autocmd("RenderAUR", {
callback = function(event) return "A" end,
})
yay.create_autocmd("RenderAUR", {
callback = function(event) return nil end,
})
`))
rendered, ok, err := e.RunRenderAUR(&RenderAUREvent{Name: "pkgA"})
require.NoError(t, err)
require.True(t, ok)
require.Equal(t, "A", rendered)
})
}
func TestRunRenderAURAbort(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.create_autocmd("RenderAUR", {
callback = function(event)
yay.abort("blocked")
end,
})
`))
_, _, err := e.RunRenderAUR(&RenderAUREvent{Name: "pkgA"})
require.EqualError(t, err, "RenderAUR: blocked")
}
func TestRunRenderSyncEventShapeAndStringReturn(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
require.NoError(t, e.L.DoString(`
yay.create_autocmd("RenderSync", {
callback = function(event)
if event.event ~= "RenderSync" then error("bad event name") end
local d = event.data
if d.repository ~= "extra" then error("bad repository") end
if d.name ~= "mypkg" then error("bad name") end
if d.version ~= "2.0-1" then error("bad version") end
if d.groups[1] ~= "base" then error("bad groups[1]") end
if d.local_version ~= "1.9-2" then error("bad local_version") end
return "SYNC:" .. d.name .. "/" .. d.repository
end,
})
`))
rendered, ok, err := e.RunRenderSync(&RenderSyncEvent{
Repository: "extra",
Name: "mypkg",
Description: "My sync package",
Version: "2.0-1",
Groups: []string{"base"},
LocalVersion: "1.9-2",
})
require.NoError(t, err)
require.True(t, ok)
require.Equal(t, "SYNC:mypkg/extra", rendered)
}
func TestRunRenderNoHookReturnsFalse(t *testing.T) {
t.Parallel()
t.Run("aur", func(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
rendered, ok, err := e.RunRenderAUR(&RenderAUREvent{Name: "pkgA"})
require.NoError(t, err)
require.False(t, ok)
require.Equal(t, "", rendered)
})
t.Run("sync", func(t *testing.T) {
t.Parallel()
e := New()
defer e.Close()
rendered, ok, err := e.RunRenderSync(&RenderSyncEvent{Name: "mypkg"})
require.NoError(t, err)
require.False(t, ok)
require.Equal(t, "", rendered)
})
}