krz/orgstar

A native macOS editor for org-mode files. editor org-mode swift

Tests/OrgWorkspaceTests/ReconcileTests.swift

111 lines · 5318 bytes

9 symbols in this file
  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}