package actions import ( "os" "path/filepath" "testing" "verstak/internal/core/storage" ) func openTestDB(t *testing.T) *storage.DB { t.Helper() dir := t.TempDir() db, err := storage.Open(filepath.Join(dir, "test.db")) if err != nil { t.Fatalf("open db: %v", err) } t.Cleanup(func() { db.Close() }) return db } func TestCreateAndGet(t *testing.T) { db := openTestDB(t) svc := NewService(db) rec, err := svc.Create("node-1", KindOpenURL, "Открыть сайт", "", "", "https://example.com", nil, false, false) if err != nil { t.Fatalf("Create: %v", err) } if rec.ID == "" { t.Fatal("empty id") } if rec.Kind != KindOpenURL { t.Errorf("kind = %q", rec.Kind) } if rec.URL != "https://example.com" { t.Errorf("url = %q", rec.URL) } got, err := svc.Get(rec.ID) if err != nil { t.Fatalf("Get: %v", err) } if got.Title != "Открыть сайт" { t.Errorf("title = %q", got.Title) } if !got.ConfirmRequired { // default is false } } func TestCreateWithConfirm(t *testing.T) { db := openTestDB(t) svc := NewService(db) rec, err := svc.Create("node-1", KindRunCommand, "Backup", "./backup.sh", "/tmp", "", nil, true, true) if err != nil { t.Fatal(err) } if !rec.ConfirmRequired { t.Error("expected confirm_required") } if !rec.CaptureOutput { t.Error("expected capture_output") } if rec.Command != "./backup.sh" { t.Errorf("command = %q", rec.Command) } if rec.WorkingDir != "/tmp" { t.Errorf("working_dir = %q", rec.WorkingDir) } } func TestListByNode(t *testing.T) { db := openTestDB(t) svc := NewService(db) svc.Create("node-1", KindOpenURL, "A1", "", "", "https://a.com", nil, false, false) svc.Create("node-1", KindOpenURL, "A2", "", "", "https://b.com", nil, false, false) svc.Create("node-2", KindOpenURL, "B1", "", "", "https://c.com", nil, false, false) list1, err := svc.ListByNode("node-1") if err != nil { t.Fatal(err) } if len(list1) != 2 { t.Errorf("node-1 actions = %d, want 2", len(list1)) } list2, err := svc.ListByNode("node-2") if err != nil { t.Fatal(err) } if len(list2) != 1 { t.Errorf("node-2 actions = %d, want 1", len(list2)) } list3, err := svc.ListByNode("node-3") if err != nil { t.Fatal(err) } if len(list3) != 0 { t.Errorf("node-3 actions = %d, want 0", len(list3)) } } func TestDelete(t *testing.T) { db := openTestDB(t) svc := NewService(db) rec, _ := svc.Create("node-1", KindOpenURL, "ToDelete", "", "", "https://x.com", nil, false, false) if err := svc.Delete(rec.ID); err != nil { t.Fatalf("Delete: %v", err) } if _, err := svc.Get(rec.ID); err == nil { t.Error("expected error after delete") } } func TestGetNotFound(t *testing.T) { db := openTestDB(t) svc := NewService(db) if _, err := svc.Get("nonexistent"); err == nil { t.Error("expected error") } } func TestKindLabel(t *testing.T) { cases := map[string]string{ KindOpenURL: "Открыть URL", KindRunCommand: "Запустить команду", KindOpenFolder: "Открыть папку", "unknown": "unknown", } for kind, want := range cases { got := KindLabel(kind) if got != want { t.Errorf("KindLabel(%q) = %q, want %q", kind, got, want) } } } func TestValidKinds(t *testing.T) { kinds := ValidKinds() if len(kinds) != 7 { t.Errorf("valid kinds = %d, want 7", len(kinds)) } } // Silence unused import. var _ = os.Args