//! Raw UTF-8 file buffers retain vault safety and attachment indexing. mod common; use common::{seed, temp_vault}; use notescraft_engine::Session; #[test] fn raw_files_share_atomic_save_and_dirty_buffers() { let vault = temp_vault("raw_files"); seed(vault.path(), &[("board.canvas", "{\"nodes\":[]}"), ("a.mmd", "flowchart LR\nA-->B")]); let mut session = Session::open(vault.path()).expect("session"); assert_eq!(session.read_file("board.canvas").expect("raw"), "{\"nodes\":[]}"); session.open_file_buffer("board.canvas").expect("buffer"); session.buffer_mut("board.canvas").expect("buffer").edit(0..0, " ").expect("edit"); assert!(session.save_buffer("board.canvas").expect("save")); assert!(!session.buffer("board.canvas").expect("buffer").is_dirty()); assert!(session.index().note("board.canvas").is_none()); assert!(session.index().files().contains(&"board.canvas")); assert!(session.write_file("../escape.canvas", "x").is_err()); for path in [".obsidian/x.canvas", ".notescraft/x.canvas"] { assert!(session.write_file(path, "x").is_err()); } assert!(session.write_file("new.excalidraw", "{}").expect("write")); assert!(session.index().files().contains(&"new.excalidraw")); let mut readonly = Session::open_read_only(vault.path()).expect("readonly"); assert!(readonly.write_file("board.canvas", "{}").is_err()); } #[test] fn non_markdown_files_can_be_renamed_duplicated_and_deleted() { let vault = temp_vault("raw_file_ops"); seed(vault.path(), &[("Untitled.excalidraw", "{}"), ("note.md", "![[Untitled.excalidraw]]")]); let mut session = Session::open(vault.path()).expect("session"); let copy = session.duplicate_note("Untitled.excalidraw").expect("duplicate"); assert_eq!(copy, "Untitled copy.excalidraw"); assert!(session.index().files().contains(&"Untitled copy.excalidraw")); session.rename_note("Untitled copy.excalidraw", "Board.excalidraw", true).expect("rename"); assert!(session.index().files().contains(&"Board.excalidraw")); assert!(!session.index().files().contains(&"Untitled copy.excalidraw")); assert!(session.rename_note("Board.excalidraw", "Board.md", true).is_err(), "a drawing cannot become a note"); session.delete_note("Board.excalidraw").expect("delete"); session.delete_note("Untitled.excalidraw").expect("delete"); assert_eq!(session.index().files().len(), 0); assert!(session.delete_note("../x.canvas").is_err()); assert!(session.delete_note(".obsidian/x.canvas").is_err()); }