Tests/OrgWorkspaceTests/ReconcileTests.swift
111 lines · 5318 bytes
1import Foundation
2import OrgIndex
3import Testing
4@testable import OrgWorkspace
5
6struct ReconcileTests {
7 @Test func indexesUpdatesMovesAndRemoves() throws {
8 let folder = try Folder()
9 let index = try IndexStore()
10 let reconciler = Reconciler(index: index, settings: IndexSettings())
11 let a = try folder.write("a.org", "* Alpha\n")
12 try folder.write("b.org", "* Beta\n")
13
14 var report = try reconciler.reconcile(root: folder.url)
15 #expect(report.indexed.count == 2)
16 #expect(try index.search("alpha").map(\.path) == [a.path])
17
18 report = try reconciler.reconcile(root: folder.url)
19 #expect(report.unchanged == 2 && report.indexed.isEmpty)
20
21 try FileManager.default.moveItem(at: folder.url.appendingPathComponent("b.org"), to: folder.url.appendingPathComponent("c.org"))
22 try folder.write("a.org", "* Gamma\n")
23 report = try reconciler.reconcile(root: folder.url)
24 #expect(report.moved.map { URL(fileURLWithPath: $0).lastPathComponent } == ["c.org"])
25 #expect(report.indexed == [a.path])
26 #expect(try index.search("gamma").count == 1)
27 #expect(try index.search("beta").map { URL(fileURLWithPath: $0.path).lastPathComponent } == ["c.org"])
28
29 try FileManager.default.removeItem(at: a)
30 report = try reconciler.reconcile(root: folder.url)
31 #expect(report.removed == [a.path])
32 #expect(try index.search("gamma").isEmpty)
33 }
34
35 @Test func touchedFileWithSameContentIsNotReparsed() throws {
36 let folder = try Folder()
37 let index = try IndexStore()
38 let reconciler = Reconciler(index: index, settings: IndexSettings())
39 let a = try folder.write("a.org", "* Alpha\n")
40 _ = try reconciler.reconcile(root: folder.url)
41 try FileManager.default.setAttributes([.modificationDate: Date(timeIntervalSinceNow: 60)], ofItemAtPath: a.path)
42 #expect(try reconciler.reconcile(root: folder.url).touched == [a.path])
43 }
44
45 @Test func changedSetupFileReindexesTheFilesNamingIt() throws {
46 let folder = try Folder()
47 let index = try IndexStore()
48 let reconciler = Reconciler(index: index, settings: IndexSettings())
49 try folder.write("setup.txt", "#+TODO: TODO | DONE\n")
50 let a = try folder.write("a.org", "#+SETUPFILE: setup.txt\n* NEXT Alpha\n")
51 _ = try reconciler.reconcile(root: folder.url)
52 #expect(try reconciler.reconcile(root: folder.url).indexed.isEmpty)
53 try folder.write("setup.txt", "#+TODO: NEXT | DONE\n")
54 #expect(try reconciler.reconcile(root: folder.url).indexed.contains(a.path))
55 #expect(try reconciler.reconcile(root: folder.url).indexed.isEmpty)
56 }
57
58 @Test func newSettingsVersionReindexes() throws {
59 let folder = try Folder()
60 let index = try IndexStore()
61 try folder.write("a.org", "* Alpha\n")
62 _ = try Reconciler(index: index, settings: IndexSettings(version: 1)).reconcile(root: folder.url)
63 #expect(try Reconciler(index: index, settings: IndexSettings(version: 2)).reconcile(root: folder.url).indexed.count == 1)
64 }
65
66 @Test func otherFilesAreListedUnreadAndHiddenFoldersSkipped() throws {
67 let folder = try Folder()
68 let index = try IndexStore()
69 let reconciler = Reconciler(index: index, settings: IndexSettings())
70 let notes = try folder.write("notes.md", "* Alpha\n")
71 try folder.write(".git/HEAD", "ref: refs/heads/main\n")
72 _ = try reconciler.reconcile(root: folder.url)
73 #expect(try index.files().map(\.kind) == [.other])
74 #expect(try index.search("alpha").isEmpty)
75 #expect(try reconciler.reconcile(root: folder.url).unchanged == 1)
76
77 let head = folder.url.appendingPathComponent(".git/HEAD")
78 let report = try reconciler.reconcile(root: folder.url, paths: [head, notes])
79 #expect(report.indexed.isEmpty && report.unchanged == 1)
80 #expect(try index.files().map(\.path) == [notes.path])
81 }
82
83 @Test func conflictCopiesAreListedButNotSearchable() throws {
84 let folder = try Folder()
85 let index = try IndexStore()
86 try folder.write("a.sync-conflict-1.org", "* Alpha\n")
87 _ = try Reconciler(index: index, settings: IndexSettings()).reconcile(root: folder.url)
88 #expect(try index.files().map(\.kind) == [.conflict])
89 #expect(try index.search("alpha").isEmpty)
90 }
91
92 @Test func reconcilingChangedPaths() throws {
93 let folder = try Folder()
94 let index = try IndexStore()
95 let reconciler = Reconciler(index: index, settings: IndexSettings())
96 let a = try folder.write("a.org", "* Alpha\n")
97 let b = try folder.write("b.org", "* Beta\n")
98 _ = try reconciler.reconcile(root: folder.url)
99 try folder.write("a.org", "* Delta\n")
100 try FileManager.default.removeItem(at: b)
101 let report = try reconciler.reconcile(root: folder.url, paths: [a, b])
102 #expect(report.indexed == [a.path])
103 #expect(report.removed == [b.path])
104 }
105
106 @Test func rootBookmarkResolves() throws {
107 let folder = try Folder()
108 let root = try WorkspaceRoot(url: folder.url)
109 #expect(try root.resolve().url.resolvingSymlinksInPath() == folder.url.resolvingSymlinksInPath())
110 }
111}