feat: add development-only synthetic Bell events (#18)

This commit is contained in:
QiuSW
2026-08-12 17:53:24 +08:00
parent 64a1d82db4
commit 55d54d06db
16 changed files with 249 additions and 11 deletions
+1
View File
@@ -0,0 +1 @@
{"name":"danger-zone","label":"危险区域进入","command":{"producer_id":"bell-synthetic","source_event_id":"fixture-danger-zone","event_type":"danger-zone-entry","occurred_at":"2026-08-12T09:00:00Z","location":"北侧围墙","severity":"high","evidence_ref":"evidence://synthetic/danger-zone","attributes":{"object":"anonymous-person","zone":"north-wall"}}}
+57
View File
@@ -0,0 +1,57 @@
package events
import (
"embed"
"encoding/json"
"fmt"
"io/fs"
"sort"
bellEvent "git.ilapage.cn/ila/yovision/Bell/server/app/event"
)
//go:embed *.json
var files embed.FS
type Fixture struct {
Name string `json:"name"`
Label string `json:"label"`
ValidationError string `json:"validation_error,omitempty"`
Command bellEvent.Command `json:"command"`
}
func All() ([]Fixture, error) {
entries, err := fs.ReadDir(files, ".")
if err != nil {
return nil, err
}
items := []Fixture{}
for _, entry := range entries {
if entry.IsDir() {
continue
}
data, err := files.ReadFile(entry.Name())
if err != nil {
return nil, err
}
var item Fixture
if err := json.Unmarshal(data, &item); err != nil {
return nil, fmt.Errorf("decode fixture %s: %w", entry.Name(), err)
}
items = append(items, item)
}
sort.Slice(items, func(i, j int) bool { return items[i].Name < items[j].Name })
return items, nil
}
func Find(name string) (Fixture, error) {
items, err := All()
if err != nil {
return Fixture{}, err
}
for _, item := range items {
if item.Name == name {
return item, nil
}
}
return Fixture{}, fmt.Errorf("unknown synthetic fixture %q", name)
}
+1
View File
@@ -0,0 +1 @@
{"name":"invalid-fields","label":"字段无效(预期失败)","validation_error":"夹具用于验证字段拒绝","command":{"producer_id":"bell-synthetic","source_event_id":"fixture-invalid","event_type":"","occurred_at":"2026-08-12T09:02:00Z","location":"测试区域","severity":"unknown","attributes":{}}}
+1
View File
@@ -0,0 +1 @@
{"name":"line-crossing","label":"方向越线","command":{"producer_id":"bell-synthetic","source_event_id":"fixture-line-crossing","event_type":"line-crossing","occurred_at":"2026-08-12T09:01:00Z","location":"宿舍楼东门","severity":"critical","evidence_ref":"evidence://synthetic/line-crossing","attributes":{"direction":"outside-to-inside","object":"anonymous-person"}}}
+1
View File
@@ -0,0 +1 @@
{"name":"missing-evidence","label":"证据缺失(预期失败)","validation_error":"此测试场景要求证据引用","command":{"producer_id":"bell-synthetic","source_event_id":"fixture-missing-evidence","event_type":"danger-zone-entry","occurred_at":"2026-08-12T09:03:00Z","location":"测试区域","severity":"high","attributes":{"requires_evidence":true}}}