1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-30 22:26:24 -07:00
gochan/pkg/gcplugin/lua_test.go

122 lines
4 KiB
Go

package gcplugin
import (
"html/template"
"testing"
"github.com/gochan-org/gochan/pkg/config"
"github.com/gochan-org/gochan/pkg/gcsql"
"github.com/gochan-org/gochan/pkg/gcutil/testutil"
"github.com/stretchr/testify/assert"
lua "github.com/yuin/gopher-lua"
luar "layeh.com/gopher-luar"
)
const (
versionStr = `return _GOCHAN_VERSION
`
structPassingStr = `print(string.format("Receiving post from %q", post.Name))
print(string.format("Message before changing: %q", post.MessageRaw))
post.MessageRaw = "Message modified by a plugin\n"
post.Message = "Message modified by a plugin<br />"
print(string.format("Modified message text: %q", post.MessageText))`
eventsTestingStr = `local events = require("events")
events.register_event({"newPost"}, function(tr, ...)
print("newPost triggered :D")
for i, v in ipairs(arg) do
print(i .. ": " .. tostring(v))
end
end)
events.trigger_event("newPost", "blah", 16, 3.14, true, nil)`
configTestingStr = `local config = require("config")
local system_critical_cfg = config.system_critical_config()
local site_cfg = config.site_config()
local board_cfg = config.board_config()
return { ListenAddress = system_critical_cfg.ListenAddress, SiteSlogan = site_cfg.SiteSlogan, DefaultStyle = board_cfg.DefaultStyle }`
)
func initPluginTests() {
config.InitTestConfig()
initLua()
}
func TestVersionFunction(t *testing.T) {
initPluginTests()
err := lState.DoString(versionStr)
assert.NoError(t, err)
testingVersionStr := lState.Get(-1).(lua.LString)
assert.EqualValues(t, config.GochanVersion, testingVersionStr)
}
func TestStructPassing(t *testing.T) {
initPluginTests()
p := &gcsql.Post{
Name: "Joe Poster",
Email: "joeposter@gmail.com",
Message: "Message test<br />",
MessageRaw: "Message text\n",
}
lState.SetGlobal("post", luar.New(lState, p))
err := lState.DoString(structPassingStr)
assert.NoError(t, err)
t.Logf("Modified message text after Lua: %q", p.MessageRaw)
assert.Equal(t, "Message modified by a plugin\n", p.MessageRaw)
assert.Equal(t, template.HTML("Message modified by a plugin<br />"), p.Message)
}
func TestEventModule(t *testing.T) {
initPluginTests()
err := lState.DoString(eventsTestingStr)
assert.NoError(t, err)
}
func TestConfigModule(t *testing.T) {
testutil.GoToGochanRoot(t)
config.InitConfig()
initPluginTests()
err := lState.DoString(configTestingStr)
assert.NoError(t, err)
returnTable := lState.CheckTable(-1)
assert.Equal(t, "127.0.0.1", returnTable.RawGetString("ListenAddress").(lua.LString).String())
assert.Equal(t, "Gochan testing", returnTable.RawGetString("SiteSlogan").(lua.LString).String())
assert.Equal(t, "pipes.css", returnTable.RawGetString("DefaultStyle").(lua.LString).String())
}
func TestLuaURL(t *testing.T) {
initPluginTests()
err := lState.DoString(`local url = require("url")
local joined = url.join_path("test", "path")
local path_escaped = url.path_escape("test +/string")
local path_unescaped = url.path_unescape(path_escaped)
local query_escaped = url.query_escape("test +/string")
local query_unescaped, err = url.query_unescape(query_escaped)
return joined, query_escaped, query_unescaped, err`)
assert.NoError(t, err)
joined := lState.CheckString(-4)
pathEscaped := lState.CheckString(-3)
pathUnescaped := lState.CheckString(-2)
queryEscaped := lState.CheckString(-3)
queryUnescaped := lState.CheckString(-2)
errLV := lState.CheckAny(-1)
assert.Equal(t, "test/path", joined)
assert.Equal(t, "test+%2B%2Fstring", pathEscaped)
assert.Equal(t, "test +/string", pathUnescaped)
assert.Equal(t, "test+%2B%2Fstring", queryEscaped)
assert.Equal(t, "test +/string", queryUnescaped)
assert.Equal(t, errLV.Type(), lua.LTNil)
ClosePlugins()
}
func TestLoadPlugin(t *testing.T) {
testutil.GoToGochanRoot(t)
initPluginTests()
assert.NoError(t, LoadPlugins([]string{"examples/plugins/uploadfilenameupper.lua"}))
assert.NoError(t, LoadPlugins(nil))
assert.Error(t, LoadPlugins([]string{"not_a_file.lua"}))
assert.Error(t, LoadPlugins([]string{"invalid_ext.dll"}))
assert.ErrorContains(t, LoadPlugins([]string{"not_a_file.so"}), "realpath failed")
ClosePlugins()
}