- 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.2 KiB
Go
110 lines
3.2 KiB
Go
package test
|
|
|
|
import (
|
|
"time"
|
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
"github.com/yaoapp/gou/application"
|
|
"github.com/yaoapp/yao/sui/core"
|
|
)
|
|
|
|
// Options holds configuration for a SUI backend test run
|
|
type Options struct {
|
|
SUIID string `json:"sui_id"`
|
|
Template string `json:"template"`
|
|
Page string `json:"page,omitempty"`
|
|
Run string `json:"run,omitempty"`
|
|
Data string `json:"data,omitempty"`
|
|
Verbose bool `json:"verbose,omitempty"`
|
|
JSON bool `json:"json,omitempty"`
|
|
FailFast bool `json:"fail_fast,omitempty"`
|
|
Timeout time.Duration `json:"timeout,omitempty"`
|
|
}
|
|
|
|
// PageTestInfo describes a page that has backend tests
|
|
type PageTestInfo struct {
|
|
Route string `json:"route"`
|
|
Name string `json:"name"`
|
|
BackendFile string `json:"backend_file"`
|
|
TestFile string `json:"test_file"`
|
|
PageConfigFile string `json:"page_config_file,omitempty"`
|
|
Prefix string `json:"prefix"`
|
|
}
|
|
|
|
// TestCase represents a single test function discovered in a backend_test.ts file
|
|
type TestCase struct {
|
|
Name string `json:"name"`
|
|
Function string `json:"function"`
|
|
}
|
|
|
|
// TestResult represents the outcome of a single test function
|
|
type TestResult struct {
|
|
Name string `json:"name"`
|
|
Status string `json:"status"`
|
|
DurationMs int64 `json:"duration_ms"`
|
|
Error string `json:"error,omitempty"`
|
|
Assertion *AssertionInfo `json:"assertion,omitempty"`
|
|
Logs []string `json:"logs,omitempty"`
|
|
}
|
|
|
|
// AssertionInfo contains details about an assertion failure
|
|
type AssertionInfo struct {
|
|
Type string `json:"type"`
|
|
Expected interface{} `json:"expected,omitempty"`
|
|
Actual interface{} `json:"actual,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
}
|
|
|
|
// TestSummary contains aggregated statistics
|
|
type TestSummary struct {
|
|
Total int `json:"total"`
|
|
Passed int `json:"passed"`
|
|
Failed int `json:"failed"`
|
|
Skipped int `json:"skipped"`
|
|
DurationMs int64 `json:"duration_ms"`
|
|
}
|
|
|
|
// Report represents the complete test report for yao sui test
|
|
type Report struct {
|
|
Type string `json:"type"`
|
|
SUIID string `json:"sui_id"`
|
|
Template string `json:"template"`
|
|
Summary *TestSummary `json:"summary"`
|
|
Pages []*PageReport `json:"pages"`
|
|
Metadata *TestMetadata `json:"metadata"`
|
|
}
|
|
|
|
// PageReport contains results for a single page
|
|
type PageReport struct {
|
|
Route string `json:"route"`
|
|
Results []*TestResult `json:"results"`
|
|
}
|
|
|
|
// TestMetadata contains metadata about the test run
|
|
type TestMetadata struct {
|
|
StartedAt time.Time `json:"started_at"`
|
|
CompletedAt time.Time `json:"completed_at"`
|
|
}
|
|
|
|
// HasFailures returns true if any tests failed
|
|
func (r *Report) HasFailures() bool {
|
|
return r.Summary.Failed > 0
|
|
}
|
|
|
|
// LoadPageConfig reads and parses a .cfg file for a SUI page
|
|
func LoadPageConfig(file string) (*core.PageConfig, error) {
|
|
if exist, _ := application.App.Exists(file); !exist {
|
|
return nil, nil
|
|
}
|
|
|
|
source, err := application.App.Read(file)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
cfg := core.PageConfig{}
|
|
if err := jsoniter.Unmarshal(source, &cfg); err != nil {
|
|
return nil, err
|
|
}
|
|
return &cfg, nil
|
|
}
|