1use notebook::session::Notebook;
2use onestore::page::link::{LinkTarget, internal_link};
3use std::io::Write;
4
5fn 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]
17fn 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}