Files
tutti/services/tuttid/api/activity_vocabulary_sync_test.go
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

71 lines
2.3 KiB
Go

package api_test
import (
"os"
"testing"
"github.com/tutti-os/tutti/packages/agent/store-sqlite/canonical"
tuttigenerated "github.com/tutti-os/tutti/services/tuttid/api/generated"
"gopkg.in/yaml.v3"
)
func TestGeneratedActivityVocabularyMatchesCanonicalStore(t *testing.T) {
t.Parallel()
vocabulary := loadOpenAPIActivityVocabulary(t)
assertSameVocabulary(t, "turn phase", vocabulary["WorkspaceAgentTurnPhase"], canonical.TurnPhases())
assertSameVocabulary(t, "turn outcome", vocabulary["WorkspaceAgentTurnOutcome"], canonical.TurnOutcomes())
for _, value := range vocabulary["WorkspaceAgentTurnPhase"] {
if !tuttigenerated.WorkspaceAgentTurnPhase(value).Valid() {
t.Errorf("generated turn phase rejected OpenAPI value %q", value)
}
}
for _, value := range vocabulary["WorkspaceAgentTurnOutcome"] {
if !tuttigenerated.WorkspaceAgentTurnOutcome(value).Valid() {
t.Errorf("generated turn outcome rejected OpenAPI value %q", value)
}
}
}
func loadOpenAPIActivityVocabulary(t *testing.T) map[string][]string {
t.Helper()
raw, err := os.ReadFile("openapi/tuttid.v1.yaml")
if err != nil {
t.Fatal(err)
}
var document struct {
Components struct {
Schemas map[string]struct {
Enum []string `yaml:"enum"`
} `yaml:"schemas"`
} `yaml:"components"`
}
if err := yaml.Unmarshal(raw, &document); err != nil {
t.Fatal(err)
}
return map[string][]string{
"WorkspaceAgentTurnPhase": document.Components.Schemas["WorkspaceAgentTurnPhase"].Enum,
"WorkspaceAgentTurnOutcome": document.Components.Schemas["WorkspaceAgentTurnOutcome"].Enum,
}
}
func assertSameVocabulary(t *testing.T, name string, generated, canonicalValues []string) {
t.Helper()
if len(generated) != len(canonicalValues) {
t.Fatalf("%s vocabulary size: generated=%d canonical=%d", name, len(generated), len(canonicalValues))
}
canonicalSet := make(map[string]struct{}, len(canonicalValues))
for _, value := range canonicalValues {
canonicalSet[value] = struct{}{}
}
for _, value := range generated {
if _, ok := canonicalSet[value]; !ok {
t.Errorf("generated %s value %q is absent from canonical store vocabulary", name, value)
}
delete(canonicalSet, value)
}
for value := range canonicalSet {
t.Errorf("canonical %s value %q is absent from generated OpenAPI vocabulary", name, value)
}
}