90 lines
1.9 KiB
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")
|
|
}
|
|
}
|