Files
yay/pkg/settings/lua/log_test.go
T
Jo 421b65bf43 feat: Add UpgradeSelect hook, logging and security example (#2855)
* add upgrade hook structure

* remove extra field

* feat: Add UpgradeSelect hook logging and security example

Add yay.log API to UpgradeSelect hooks for informational and warning messages.

- Add yay.log.info() and yay.log.warn() for hook logging
- Add doc/examples/recently_modified.lua: practical example to pre-exclude
  recently-modified AUR packages (supply chain attack mitigation)
- Update doc/init.lua with improved UpgradeSelect example
- Update doc/lua.md with logging API documentation
- Refactor autocmd and load modules for cleaner log integration
- Add comprehensive unit tests for logging functionality

* lint
2026-06-15 15:25:40 +02:00

103 lines
2.6 KiB
Go

package lua
import (
"bytes"
"strings"
"testing"
"github.com/stretchr/testify/require"
"github.com/Jguer/yay/v12/pkg/text"
)
func withColorDisabled(t *testing.T) {
t.Helper()
original := text.UseColor
text.UseColor = false
t.Cleanup(func() { text.UseColor = original })
}
func newLogTestEngine(t *testing.T, debug bool) (*Engine, *bytes.Buffer, *bytes.Buffer) {
t.Helper()
withColorDisabled(t)
var stdout, stderr bytes.Buffer
logger := text.NewLogger(&stdout, &stderr, strings.NewReader(""), debug, "lua")
engine := NewWithLogger(logger)
t.Cleanup(engine.Close)
return engine, &stdout, &stderr
}
func TestLogInfoWarnAndErrorUseLoggerStreams(t *testing.T) {
engine, stdout, stderr := newLogTestEngine(t, false)
require.NoError(t, engine.L.DoString(`
yay.log.info("info message")
yay.log.warn("warn message")
yay.log.error("error message")
`))
require.Equal(t, "==> info message\n -> warn message\n", stdout.String())
require.Equal(t, " -> error message\n", stderr.String())
}
func TestLogDebugUsesLoggerDebugGate(t *testing.T) {
engine, stdout, stderr := newLogTestEngine(t, false)
require.NoError(t, engine.L.DoString(`yay.log.debug("hidden")`))
require.Empty(t, stdout.String())
require.Empty(t, stderr.String())
debugLogger := text.NewLogger(stdout, stderr, strings.NewReader(""), true, "lua")
engine.SetLogger(debugLogger)
require.NoError(t, engine.L.DoString(`yay.log.debug("visible")`))
require.Equal(t, "[DEBUG:lua]visible\n", stdout.String())
require.Empty(t, stderr.String())
}
func TestLogStringifiesLuaArgumentsInOrder(t *testing.T) {
engine, stdout, stderr := newLogTestEngine(t, false)
require.NoError(t, engine.L.DoString(`
local value = setmetatable({}, {
__tostring = function()
return "custom"
end,
})
yay.log.info("pkg", 12, true, nil, value)
`))
require.Equal(t, "==> pkg 12 true nil custom\n", stdout.String())
require.Empty(t, stderr.String())
}
func TestLogWithoutLoggerDoesNotPanic(t *testing.T) {
engine := New()
t.Cleanup(engine.Close)
require.NoError(t, engine.L.DoString(`
yay.log.debug("debug")
yay.log.info("info")
yay.log.warn("warn")
yay.log.error("error")
`))
}
func TestLoadUsesLuaChildLogger(t *testing.T) {
withColorDisabled(t)
path := writeLuaFile(t, `yay.log.debug("loaded")`)
var stdout, stderr bytes.Buffer
logger := text.NewLogger(&stdout, &stderr, strings.NewReader(""), true, "fallback")
engine, err := Load(logger, path, &testConfig{})
require.NoError(t, err)
t.Cleanup(engine.Close)
require.Equal(t, "[DEBUG:lua]loaded\n", stdout.String())
require.Empty(t, stderr.String())
}