verstak/internal/core/actions/action_test.go

155 lines
3.3 KiB
Go

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