diff --git a/src-tauri/src/vault/mod_tests.rs b/src-tauri/src/vault/mod_tests.rs index 14fd600f..2570a775 100644 --- a/src-tauri/src/vault/mod_tests.rs +++ b/src-tauri/src/vault/mod_tests.rs @@ -1521,6 +1521,36 @@ fn test_non_yml_file_uses_filename_as_title() { assert_eq!(entry.title, "notes.txt"); } +#[test] +fn test_classify_file_kind_yml_is_text() { + assert_eq!(classify_file_kind(Path::new("views/active-projects.yml")), "text"); + assert_eq!(classify_file_kind(Path::new("config.yaml")), "text"); + assert_eq!(classify_file_kind(Path::new("data.json")), "text"); + assert_eq!(classify_file_kind(Path::new("script.py")), "text"); + assert_eq!(classify_file_kind(Path::new("readme.txt")), "text"); +} + +#[test] +fn test_classify_file_kind_md_is_markdown() { + assert_eq!(classify_file_kind(Path::new("note.md")), "markdown"); + assert_eq!(classify_file_kind(Path::new("README.markdown")), "markdown"); +} + +#[test] +fn test_classify_file_kind_unknown_is_binary() { + assert_eq!(classify_file_kind(Path::new("photo.png")), "binary"); + assert_eq!(classify_file_kind(Path::new("archive.zip")), "binary"); +} + +#[test] +fn test_non_md_file_gets_text_file_kind() { + let dir = TempDir::new().unwrap(); + create_test_file(dir.path(), "views/my-view.yml", "name: My View\nicon: rocket\n"); + let entry = super::parse_non_md_file(&dir.path().join("views/my-view.yml"), None).unwrap(); + assert_eq!(entry.file_kind, "text"); + assert_eq!(entry.title, "My View"); +} + // Frontmatter update/delete tests are in frontmatter.rs // save_image tests are in vault/image.rs // purge_trash tests are in vault/trash.rs diff --git a/src/components/BreadcrumbBar.test.tsx b/src/components/BreadcrumbBar.test.tsx index d9401765..aafc5b1b 100644 --- a/src/components/BreadcrumbBar.test.tsx +++ b/src/components/BreadcrumbBar.test.tsx @@ -174,4 +174,17 @@ describe('BreadcrumbBar — raw editor toggle', () => { fireEvent.click(screen.getByTitle('Raw editor')) expect(onToggleRaw).toHaveBeenCalledOnce() }) + + it('hides raw toggle when forceRawMode is true (non-markdown file)', () => { + const onToggleRaw = vi.fn() + render() + expect(screen.queryByTitle('Raw editor')).not.toBeInTheDocument() + expect(screen.queryByTitle('Back to editor')).not.toBeInTheDocument() + }) + + it('shows raw toggle when forceRawMode is false (markdown file)', () => { + const onToggleRaw = vi.fn() + render() + expect(screen.getByTitle('Raw editor')).toBeInTheDocument() + }) }) diff --git a/src/components/BreadcrumbBar.tsx b/src/components/BreadcrumbBar.tsx index 1e9c8347..fa414dd9 100644 --- a/src/components/BreadcrumbBar.tsx +++ b/src/components/BreadcrumbBar.tsx @@ -26,6 +26,8 @@ interface BreadcrumbBarProps { onToggleDiff: () => void rawMode?: boolean onToggleRaw?: () => void + /** When true, raw mode is forced (non-markdown file) — hide the toggle. */ + forceRawMode?: boolean showAIChat?: boolean onToggleAIChat?: () => void inspectorCollapsed?: boolean @@ -58,7 +60,7 @@ function RawToggleButton({ rawMode, onToggleRaw }: { rawMode?: boolean; onToggle } function BreadcrumbActions({ entry, showDiffToggle, diffMode, diffLoading, onToggleDiff, - rawMode, onToggleRaw, + rawMode, onToggleRaw, forceRawMode, showAIChat, onToggleAIChat, inspectorCollapsed, onToggleInspector, onToggleFavorite, onToggleOrganized, onTrash, onRestore, onArchive, onUnarchive, }: Omit) { @@ -112,7 +114,7 @@ function BreadcrumbActions({ entry, showDiffToggle, diffMode, diffLoading, onTog )} - + {!forceRawMode && }