- Updated testConnectorID comment and model version in TestAnthropicStreamRetry to reflect the latest model (Claude Haiku 4.5). - Added Test command to the SUI command set with associated flags for improved testing capabilities.
110 lines
3.1 KiB
Go
110 lines
3.1 KiB
Go
package test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
v8 "github.com/yaoapp/gou/runtime/v8"
|
|
"github.com/yaoapp/yao/config"
|
|
"github.com/yaoapp/yao/engine"
|
|
"github.com/yaoapp/yao/sui/core"
|
|
yaotest "github.com/yaoapp/yao/test"
|
|
)
|
|
|
|
func prepareInternal(t *testing.T) {
|
|
t.Helper()
|
|
yaotest.Prepare(t, config.Conf)
|
|
_, err := engine.Load(config.Conf, engine.LoadOption{Action: "sui.test"})
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestExtractFuncName(t *testing.T) {
|
|
cases := []struct {
|
|
line string
|
|
want string
|
|
}{
|
|
{"export function TestFoo(t, ctx) {", "TestFoo"},
|
|
{"function TestBar(t, ctx) {", "TestBar"},
|
|
{"export function TestBaz() {", "TestBaz"},
|
|
{"// function TestComment(t) {", ""},
|
|
{"const x = 1", ""},
|
|
{"function notTest(t) {", "notTest"},
|
|
{"export function (t) {", ""},
|
|
{"function ", ""},
|
|
{"function TestNoParens", ""},
|
|
}
|
|
for _, tt := range cases {
|
|
got := extractFuncName(tt.line)
|
|
assert.Equal(t, tt.want, got, "extractFuncName(%q)", tt.line)
|
|
}
|
|
}
|
|
|
|
func TestFilterTestsInvalidRegex(t *testing.T) {
|
|
tc := []*TestCase{{Name: "TestFoo"}}
|
|
_, err := filterTests(tc, "[invalid")
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestFilterTestsNoMatch(t *testing.T) {
|
|
tc := []*TestCase{{Name: "TestFoo"}, {Name: "TestBar"}}
|
|
filtered, err := filterTests(tc, "^TestZzz$")
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, filtered)
|
|
}
|
|
|
|
func TestFilterTestsPartialMatch(t *testing.T) {
|
|
tc := []*TestCase{{Name: "TestFoo"}, {Name: "TestBar"}, {Name: "TestFooBar"}}
|
|
filtered, err := filterTests(tc, "Foo")
|
|
assert.NoError(t, err)
|
|
assert.Len(t, filtered, 2)
|
|
}
|
|
|
|
func TestExecuteTestScriptNotLoaded(t *testing.T) {
|
|
r := &Runner{opts: &Options{Timeout: 30 * time.Second}}
|
|
tc := &TestCase{Name: "TestX", Function: "TestX"}
|
|
|
|
result := r.executeTest(tc, nil, "nonexistent-script-id", "Api", "test-sid")
|
|
assert.Equal(t, "error", result.Status)
|
|
assert.Contains(t, result.Error, "not loaded")
|
|
}
|
|
|
|
func TestExecuteTestFunctionNotFound(t *testing.T) {
|
|
prepareInternal(t)
|
|
defer yaotest.Clean()
|
|
|
|
_, has := core.SUIs["agent"]
|
|
if !has {
|
|
t.Skip("no agent SUI")
|
|
}
|
|
|
|
// Load the errors test script
|
|
testFile := "assistants/tests/sui-pages/pages/errors/errors.backend_test.ts"
|
|
testScriptID := "sui-test.helpers-coverage"
|
|
_, err := v8.Load(testFile, testScriptID)
|
|
require.NoError(t, err)
|
|
|
|
backendPath := "assistants/tests/sui-pages/pages/errors/errors"
|
|
script, err := core.LoadScript(backendPath, true)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, script)
|
|
|
|
r := &Runner{opts: &Options{Timeout: 30 * time.Second}}
|
|
|
|
// Call with a function name that doesn't exist in the script
|
|
tc := &TestCase{Name: "NonExistent", Function: "NonExistentFunction"}
|
|
result := r.executeTest(tc, script, testScriptID, "Api", "test-sid")
|
|
assert.Equal(t, "error", result.Status)
|
|
assert.Contains(t, result.Error, "is not a function")
|
|
}
|
|
|
|
func TestLoadPageConfigBadJSON(t *testing.T) {
|
|
prepareInternal(t)
|
|
defer yaotest.Clean()
|
|
|
|
// dashboard.html exists but is not valid JSON
|
|
cfg, err := LoadPageConfig("assistants/tests/sui-pages/pages/dashboard/dashboard.html")
|
|
assert.Error(t, err)
|
|
assert.Nil(t, cfg)
|
|
}
|