feat: add development-only synthetic Bell events (#18)
This commit is contained in:
@@ -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
@@ -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)
|
||||
}
|
||||
@@ -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":{}}}
|
||||
@@ -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"}}}
|
||||
@@ -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}}}
|
||||
Reference in New Issue
Block a user