krz/orgstar

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

Tests/OrgAppTests/TangleWriterTests.swift

c1295824f55c7bba681fca8338bf08167e110105
orgstar/Tests/OrgAppTests/TangleWriterTests.swift history · blame · raw

45 lines · 2333 bytes

 1import Foundation
 2import OrgCore
 3import Testing
 4@testable import OrgApp
 5
 6struct TangleWriterTests {
 7    @Test func writesMakesFoldersAndSetsModes() throws {
 8        let folder = try Folder()
 9        let source = try folder.write("notes.org", """
10            #+begin_src sh :tangle bin/run.sh :mkdirp yes :shebang "#!/bin/sh"
11            echo run
12            #+end_src
13            #+begin_src text :tangle missing/x.txt
14            x
15            #+end_src
16            """)
17        let text = try String(contentsOf: source, encoding: .utf8)
18        let output = try Tangle.run(text: text, path: source.path).get()
19        // The second file's folder is missing and it has no :mkdirp.
20        #expect(throws: TangleWriter.Failure.self) { try TangleWriter.write(output, source: source.path) }
21        let script = folder.url.appendingPathComponent("bin/run.sh")
22        #expect(try String(contentsOf: script, encoding: .utf8) == "#!/bin/sh\necho run\n")
23        let mode = try FileManager.default.attributesOfItem(atPath: script.path)[.posixPermissions] as? Int
24        #expect(mode == 0o755)
25    }
26
27    @Test func leavesUnchangedFilesAndRefusesItsOwnSource() throws {
28        let folder = try Folder()
29        let source = try folder.write("notes.org", "#+begin_src sh :tangle yes\necho a\n#+end_src\n")
30        let text = try String(contentsOf: source, encoding: .utf8)
31        let output = try Tangle.run(text: text, path: source.path).get()
32        let paths = try TangleWriter.write(output, source: source.path)
33        #expect(paths == [folder.url.appendingPathComponent("notes.sh").path])
34        let written = try FileManager.default.attributesOfItem(atPath: paths[0])[.modificationDate] as? Date
35        Thread.sleep(forTimeInterval: 1.1)
36        try TangleWriter.write(output, source: source.path)
37        #expect(try FileManager.default.attributesOfItem(atPath: paths[0])[.modificationDate] as? Date == written)
38        #expect(TangleWriter.message(output, source: source.path) == "Tangled 1 code block from notes.org")
39
40        let own = try Tangle.run(text: "#+begin_src org :tangle notes.org\nx\n#+end_src\n", path: source.path).get()
41        #expect(throws: TangleWriter.Failure(message: "Not allowed to tangle into the same file as self")) {
42            try TangleWriter.write(own, source: source.path)
43        }
44    }
45}