From 24db9fa6a58616d6f333d0a6f0ea0c3901ba8c51 Mon Sep 17 00:00:00 2001 From: ila <2+ila@noreply.git.ilapage.cn> Date: Thu, 13 Aug 2026 12:42:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=87=AA=E5=8A=A8=E5=BB=BA=E7=AB=8B?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E7=9B=91=E7=9C=8B=E5=AA=92=E4=BD=93=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=20(#51)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sense/server/app/sense/media/service_test.go | 36 ++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Sense/server/app/sense/media/service_test.go b/Sense/server/app/sense/media/service_test.go index 5f536d3..dc55b3b 100644 --- a/Sense/server/app/sense/media/service_test.go +++ b/Sense/server/app/sense/media/service_test.go @@ -3,9 +3,11 @@ package media import ( "context" "errors" + "strings" "testing" "yovision.local/sense/app/sense/adapters/mediamtx" + "yovision.local/sense/app/sense/adapters/rtsp" "yovision.local/sense/app/sense/admission" "yovision.local/sense/app/sense/device" "yovision.local/sense/app/sense/identity" @@ -108,3 +110,37 @@ func TestReconcileRecordsFailureStates(t *testing.T) { t.Fatalf("result=%#v err=%v", result, err) } } + +func TestConfigureProfilesIsIdempotentAndReportsMediaState(t *testing.T) { + process := &fakeProcess{startErr: errors.New("binary missing")} + service := NewService(NewMemoryStore(), process, fakeController{}) + service.profile = func(_ string, token string) (admission.Profile, error) { + return admission.Profile{Token: token, StreamURI: "rtsp://camera.invalid/" + token}, nil + } + service.credential = func(context.Context, string) (device.Credential, error) { + return device.Credential{Username: "fixture", Password: "fixture"}, nil + } + result := admission.Result{DeviceID: "device", Profiles: []admission.Profile{{Token: "main", Verification: rtspReady()}, {Token: "sub", Verification: rtspReady()}}} + outcome := service.ConfigureProfiles(context.Background(), identity.Principal{}, result) + if outcome.Status != "needs_attention" { + t.Fatalf("outcome=%#v", outcome) + } + outcome = service.ConfigureProfiles(context.Background(), identity.Principal{}, result) + items, err := service.List(context.Background()) + if err != nil || len(items) != 2 || outcome.Status != "needs_attention" { + t.Fatalf("items=%#v outcome=%#v err=%v", items, outcome, err) + } + for _, item := range items { + if item.Actual != "process_failed" || strings.Contains(item.Detail, "binary missing") { + t.Fatalf("unsafe route detail=%#v", item) + } + } + process.startErr = nil + outcome = service.ConfigureProfiles(context.Background(), identity.Principal{}, result) + if outcome.Status != "ready" { + t.Fatalf("ready outcome=%#v", outcome) + } +} + +func rtspReady() rtsp.Result { return rtsp.Result{Status: "ready"} } +