| 1 | use notebook::session::Notebook; |
| 2 | use onestore::page::link::{LinkTarget, internal_link}; |
| 3 | use std::io::Write; |
| 4 | |
| 5 | fn write_section(root: &std::path::Path, name: &str, text: &str) -> [u8; 16] { |
| 6 | let bytes = onestore::create_section(name, text, "Author").unwrap(); |
| 7 | std::fs::File::create_new(root.join(name)) |
| 8 | .unwrap() |
| 9 | .write_all(&bytes) |
| 10 | .unwrap(); |
| 11 | onestore::Store::parse(&bytes).unwrap().header.file_id |
| 12 | } |
| 13 | |
| 14 | /// Links resolve by identity: a page keeps its link when its section is renamed or moved, |
| 15 | /// and a link whose section identity is stale still finds the page in another section. |
| 16 | #[test] |
| 17 | fn internal_links_find_their_page_by_identity() { |
| 18 | let temporary = tempfile::tempdir().unwrap(); |
| 19 | let root = temporary.path().join("notebook"); |
| 20 | std::fs::create_dir(&root).unwrap(); |
| 21 | let first = write_section(&root, "First.one", "Target page"); |
| 22 | let second = write_section(&root, "Second.one", "Other page"); |
| 23 | std::fs::write( |
| 24 | root.join("Open Notebook.onetoc2"), |
| 25 | onestore::create_table_of_contents( |
| 26 | "Open Notebook.onetoc2", |
| 27 | &[("First.one", first), ("Second.one", second)], |
| 28 | ) |
| 29 | .unwrap(), |
| 30 | ) |
| 31 | .unwrap(); |
| 32 | let mut notebook = Notebook::open(&root, temporary.path().join("cache")).unwrap(); |
| 33 | let section = notebook.section("First.one", || {}).unwrap(); |
| 34 | let (space, _, _) = section.pages().unwrap()[0]; |
| 35 | let page = section.page(space).unwrap(); |
| 36 | section.close().unwrap(); |
| 37 | let target = LinkTarget::Page { |
| 38 | identity: page.identity.unwrap(), |
| 39 | title: &page.title, |
| 40 | }; |
| 41 | let link = internal_link(first, "C:\\notebook\\First.one", target); |
| 42 | assert_eq!( |
| 43 | notebook.find_page(&link).unwrap(), |
| 44 | Some(("First.one".to_owned(), Some(space))) |
| 45 | ); |
| 46 | assert_eq!( |
| 47 | notebook |
| 48 | .find_page(&internal_link(first, "", LinkTarget::Section)) |
| 49 | .unwrap(), |
| 50 | Some(("First.one".to_owned(), None)) |
| 51 | ); |
| 52 | assert_eq!( |
| 53 | notebook.find_page("https://example.invalid/").unwrap(), |
| 54 | None |
| 55 | ); |
| 56 | |
| 57 | notebook.create_group("", "Group").unwrap(); |
| 58 | notebook.rename("First.one", "Renamed").unwrap(); |
| 59 | assert_eq!( |
| 60 | notebook.find_page(&link).unwrap(), |
| 61 | Some(("Renamed.one".to_owned(), Some(space))) |
| 62 | ); |
| 63 | |
| 64 | let stale = internal_link(second, "", target); |
| 65 | assert_eq!( |
| 66 | notebook.find_page(&stale).unwrap(), |
| 67 | Some(("Renamed.one".to_owned(), Some(space))) |
| 68 | ); |
| 69 | let unknown = internal_link( |
| 70 | second, |
| 71 | "", |
| 72 | LinkTarget::Page { |
| 73 | identity: [7; 16], |
| 74 | title: "Gone", |
| 75 | }, |
| 76 | ); |
| 77 | assert_eq!(notebook.find_page(&unknown).unwrap(), None); |
| 78 | } |