package device import ( "context" "encoding/base64" "strings" "testing" "yovision.local/sense/app/sense/identity" ) func testService(t *testing.T) *Service { t.Helper() vault, err := NewCredentialVault(base64.StdEncoding.EncodeToString([]byte("0123456789abcdef0123456789abcdef")), false) if err != nil { t.Fatal(err) } return NewService(NewMemoryStore(), vault) } func TestDeviceLifecycleAndCredentialNeverReturned(t *testing.T) { svc := testService(t) ctx := context.Background() actor := identity.Principal{UserID: "test"} item, err := svc.Create(ctx, actor, "东门摄像机", "东门", ModalityVideo, []string{"video"}) if err != nil { t.Fatal(err) } if item.AdapterStatus != AdapterReady { t.Fatalf("adapter=%s", item.AdapterStatus) } item, err = svc.SetCredential(ctx, actor, item.ID, "camera-user", "camera-password") if err != nil { t.Fatal(err) } if !item.CredentialConfigured || len(item.CredentialCiphertext) != 0 { t.Fatal("credential leaked or not configured") } page, err := svc.List(ctx, ListFilter{Page: 1, PageSize: 20}) if err != nil || page.Total != 1 || len(page.Items[0].CredentialCiphertext) != 0 { t.Fatalf("page=%#v err=%v", page, err) } } func TestNonVideoAdapterNotReadyAndPaginationNotCappedAt16(t *testing.T) { svc := testService(t) ctx := context.Background() for i := 0; i < 20; i++ { item, err := svc.Create(ctx, identity.Principal{}, strings.Repeat("x", i+1), "", "radar", nil) if err != nil { t.Fatal(err) } if item.AdapterStatus != AdapterNotReady { t.Fatal("unsupported adapter shown ready") } } page, err := svc.List(ctx, ListFilter{Page: 1, PageSize: 20}) if err != nil || len(page.Items) != 20 { t.Fatalf("items=%d err=%v", len(page.Items), err) } }