Files
Olivier Meunier 3b6a674f87 Lint all the things!
- golangci-lint configuration
- gofumpt on all go files
- added package comments
- added missing comments on exported functions
- do not check for bodyclose on http testing responses.
- check for errors on triggered tasks
- check for errors in acls
- check for errors during policy loading
- check for errors in password recovery process
- better error checking in pkg/extract/contentscripts
- nolint rules for errcheck when it's not needed
  (mostly defer calls for file reader closing)
2023-11-28 20:26:05 +01:00

125 lines
2.7 KiB
Go

// SPDX-FileCopyrightText: © 2023 Olivier Meunier <olivier@neokraft.net>
//
// SPDX-License-Identifier: AGPL-3.0-only
package contentscripts_test
import (
"strings"
"testing"
"github.com/dop251/goja"
"github.com/stretchr/testify/require"
"codeberg.org/readeck/readeck/pkg/extract"
"codeberg.org/readeck/readeck/pkg/extract/contentscripts"
)
func testProgram(name string, src string) *contentscripts.Program {
p, err := goja.Compile(name, src, true)
if err != nil {
panic(err)
}
return &contentscripts.Program{
Program: p,
Name: name,
}
}
func TestRuntime(t *testing.T) {
t.Run("setConfig", func(t *testing.T) {
vm, _ := contentscripts.New()
err := vm.AddScript("1", strings.NewReader(`
exports.isActive = function() { return true }
exports.setConfig = function(config) {
config.titleSelectors = ["/html/head/title"]
config.bodySelectors = ["//body"]
}
`))
assert := require.New(t)
assert.NoError(err)
err = vm.AddScript("2", strings.NewReader(`
exports.isActive = function() { return true }
exports.setConfig = function(config) {
config.bodySelectors.push("//body/div")
}
`))
assert.NoError(err)
err = vm.AddScript("3", strings.NewReader(""))
assert.NoError(err)
cf := &contentscripts.SiteConfig{}
_ = vm.SetConfig(cf)
assert.Equal([]string{"/html/head/title"}, cf.TitleSelectors)
assert.Equal([]string{"//body", "//body/div"}, cf.BodySelectors)
})
t.Run("processMeta", func(t *testing.T) {
extractor, _ := extract.New("https://example.net/")
pm := &extract.ProcessMessage{
Extractor: extractor,
}
vm, _ := contentscripts.New()
vm.SetProcessMessage(pm)
err := vm.AddScript("1", strings.NewReader(`
exports.isActive = function() { return true }
exports.processMeta = function() {
$.meta["script.name"] = __name__
}
`))
assert := require.New(t)
assert.NoError(err)
err = vm.ProcessMeta()
assert.NoError(err)
assert.Equal([]string{"1"}, pm.Extractor.Drop().Meta["script.name"])
})
t.Run("error list", func(t *testing.T) {
extractor, _ := extract.New("https://example.net/")
pm := &extract.ProcessMessage{
Extractor: extractor,
}
vm, _ := contentscripts.New()
vm.SetProcessMessage(pm)
err := vm.AddScript("1", strings.NewReader(`
exports.isActive = function() { return true }
exports.processMeta = function() {
throw new Error("script 1")
}
`))
assert := require.New(t)
assert.NoError(err)
err = vm.AddScript("2", strings.NewReader(`
exports.isActive = function() { return true }
exports.processMeta = function() {
throw new Error("script 2")
}
`))
assert.NoError(err)
err = vm.ProcessMeta()
assert.Error(err)
assert.ErrorContains(err, "script 1")
assert.ErrorContains(err, "script 2")
})
}