js/bridge_test.go

90 lines
1.9 KiB
Go

package js
import (
"bytes"
"context"
"log"
"strings"
"testing"
"github.com/dop251/goja"
)
func TestBridgeSafeMode(t *testing.T) {
vm := goja.New()
unsafeFn := func() string { return "danger" }
// Register with isUnsafe = true
vm.Set("danger", wrapGoFunc(vm, unsafeFn, true))
// 1. Default (SafeMode = true)
_, err := vm.RunString(`danger()`)
if err == nil || !strings.Contains(err.Error(), "blocked by safeMode") {
t.Fatalf("Expected safeMode block, got: %v", err)
}
// 2. Disable SafeMode
vm.Set("__safeMode__", false)
val, err := vm.RunString(`danger()`)
if err != nil {
t.Fatal(err)
}
if val.Export() != "danger" {
t.Errorf("Expected 'danger', got %v", val.Export())
}
}
func TestBridgeLoggerInjection(t *testing.T) {
vm := goja.New()
var buf bytes.Buffer
logger := log.New(&buf, "", 0)
vm.Set("__logger__", vm.ToValue(logger))
logFn := func(l *log.Logger, msg string) {
l.Print(msg)
}
vm.Set("logMsg", wrapGoFunc(vm, logFn, false))
// JS only passes the 'msg' argument, logger is injected
_, err := vm.RunString(`logMsg("hello from js")`)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(buf.String(), "hello from js") {
t.Errorf("Logger injection failed, buffer: %s", buf.String())
}
}
func TestBridgeMixedInjection(t *testing.T) {
vm := goja.New()
ctx := context.WithValue(context.Background(), "k", "v")
var buf bytes.Buffer
logger := log.New(&buf, "", 0)
vm.Set("__ctx__", vm.ToValue(ctx))
vm.Set("__logger__", vm.ToValue(logger))
mixedFn := func(c context.Context, l *log.Logger, a int) string {
l.Printf("val: %d", a)
return c.Value("k").(string)
}
vm.Set("mixed", wrapGoFunc(vm, mixedFn, false))
val, err := vm.RunString(`mixed(42)`)
if err != nil {
t.Fatal(err)
}
if val.Export() != "v" {
t.Errorf("Context injection failed")
}
if !strings.Contains(buf.String(), "val: 42") {
t.Errorf("Logger injection failed")
}
}