package main import ( "encoding/base64" "os" "path/filepath" "strings" "testing" ) func TestCaptureTextCreatesInboxArtifact(t *testing.T) { app, _ := setupTestApp(t) dto, err := app.CaptureText("Нужно разобрать этот текст") if err != nil { t.Fatalf("CaptureText: %v", err) } if dto.ID == "" { t.Fatal("empty captured node id") } if dto.CaptureKind != "text" { t.Fatalf("CaptureKind = %q, want text", dto.CaptureKind) } if dto.CaptureSource != "clipboard" { t.Fatalf("CaptureSource = %q, want clipboard", dto.CaptureSource) } content, err := app.ReadNote(dto.ID) if err != nil { t.Fatalf("ReadNote: %v", err) } if !strings.Contains(content, "Нужно разобрать этот текст") { t.Fatalf("captured content missing: %q", content) } var path string if err := app.db.QueryRow(`SELECT f.path FROM notes n JOIN files f ON f.id = n.file_id WHERE n.node_id = ?`, dto.ID).Scan(&path); err != nil { t.Fatalf("query note file path: %v", err) } if !strings.HasPrefix(path, ".verstak/inbox/") { t.Fatalf("path = %q, want .verstak/inbox prefix", path) } inbox, err := app.ListInboxNodes() if err != nil { t.Fatalf("ListInboxNodes: %v", err) } var found bool for _, item := range inbox { if item.ID == dto.ID { found = true } } if !found { t.Fatal("captured text missing from inbox") } } func TestCaptureURLCreatesInboxArtifact(t *testing.T) { app, _ := setupTestApp(t) dto, err := app.CaptureURL("https://example.test/page", "Example Page") if err != nil { t.Fatalf("CaptureURL: %v", err) } if dto.CaptureKind != "url" { t.Fatalf("CaptureKind = %q, want url", dto.CaptureKind) } if dto.Title != "Example Page" { t.Fatalf("Title = %q, want Example Page", dto.Title) } content, err := app.ReadNote(dto.ID) if err != nil { t.Fatalf("ReadNote: %v", err) } if !strings.Contains(content, "https://example.test/page") { t.Fatalf("captured URL missing: %q", content) } } func TestCapturePathCopiesFileIntoInbox(t *testing.T) { app, vaultRoot := setupTestApp(t) sourceDir := t.TempDir() source := filepath.Join(sourceDir, "brief.pdf") if err := os.WriteFile(source, []byte("pdf content"), 0o640); err != nil { t.Fatalf("write source: %v", err) } dto, err := app.CapturePath(source) if err != nil { t.Fatalf("CapturePath: %v", err) } if dto.CaptureKind != "file" { t.Fatalf("CaptureKind = %q, want file", dto.CaptureKind) } records, err := app.files.ListByNode(dto.ID) if err != nil { t.Fatalf("ListByNode: %v", err) } if len(records) != 1 { t.Fatalf("records = %d, want 1", len(records)) } if !strings.HasPrefix(records[0].Path, ".verstak/inbox/") { t.Fatalf("path = %q, want .verstak/inbox prefix", records[0].Path) } if _, err := os.Stat(filepath.Join(vaultRoot, records[0].Path)); err != nil { t.Fatalf("captured file missing in vault: %v", err) } } func TestCapturePathCopiesDirectoryIntoInbox(t *testing.T) { app, _ := setupTestApp(t) source := t.TempDir() if err := os.MkdirAll(filepath.Join(source, "nested"), 0o750); err != nil { t.Fatalf("mkdir nested: %v", err) } if err := os.WriteFile(filepath.Join(source, "nested", "note.txt"), []byte("nested"), 0o640); err != nil { t.Fatalf("write nested file: %v", err) } dto, err := app.CapturePath(source) if err != nil { t.Fatalf("CapturePath: %v", err) } if dto.CaptureKind != "folder" { t.Fatalf("CaptureKind = %q, want folder", dto.CaptureKind) } items, err := app.ListItems(dto.ID) if err != nil { t.Fatalf("ListItems: %v", err) } var foundNested bool for _, item := range items { if item.Name == "nested" && item.Type == "folder" { foundNested = true } } if !foundNested { t.Fatalf("captured folder children missing: %+v", items) } } func TestCaptureFileDataCreatesImageInboxArtifact(t *testing.T) { app, _ := setupTestApp(t) data := base64.StdEncoding.EncodeToString([]byte("fake image bytes")) dto, err := app.CaptureFileData("pasted.png", data) if err != nil { t.Fatalf("CaptureFileData: %v", err) } if dto.CaptureKind != "image" { t.Fatalf("CaptureKind = %q, want image", dto.CaptureKind) } records, err := app.files.ListByNode(dto.ID) if err != nil { t.Fatalf("ListByNode: %v", err) } if len(records) != 1 || records[0].MIME != "image/png" { t.Fatalf("records = %+v, want one png image", records) } }