@@ -58,6 +58,26 @@ final class ContextEditorTests: XCTestCase {
5858 }
5959 }
6060
61+ func testResolveTargetApplicationRejectsMalformedConfiguration( ) throws {
62+ let root = makeTemporaryDirectory ( )
63+ defer { try ? FileManager . default. removeItem ( at: root) }
64+
65+ let projectRoot = root. appendingPathComponent ( " project " )
66+ try FileManager . default. createDirectory ( at: projectRoot, withIntermediateDirectories: true )
67+ try " { " . write (
68+ to: projectRoot. appendingPathComponent ( " .contexteditor " ) ,
69+ atomically: true ,
70+ encoding: . utf8
71+ )
72+
73+ let fileURL = projectRoot. appendingPathComponent ( " index.txt " )
74+ try " " . write ( to: fileURL, atomically: true , encoding: . utf8)
75+
76+ let resolver = EditorResolver ( )
77+
78+ XCTAssertThrowsError ( try resolver. resolveTargetApplication ( for: fileURL) )
79+ }
80+
6181 func testFallbackReturnsFirstInstalledEditor( ) {
6282 let resolver = EditorResolver { target in
6383 if target == TargetApplication ( appName: " Nova " , bundleIdentifier: " com.panic.Nova " ) {
@@ -102,6 +122,19 @@ final class ContextEditorTests: XCTestCase {
102122 )
103123 }
104124
125+ func testResolveTargetApplicationThrowsWhenNoConfigurationOrFallbackExists( ) {
126+ let resolver = EditorResolver (
127+ appLocator: { _ in nil } ,
128+ systemDefaultLocator: { _ in nil }
129+ )
130+
131+ XCTAssertThrowsError (
132+ try resolver. resolveTargetApplication ( for: URL ( fileURLWithPath: " /tmp/example.txt " ) )
133+ ) { error in
134+ XCTAssertEqual ( error as? ConfigError , . missingConfiguration)
135+ }
136+ }
137+
105138 private func makeTemporaryDirectory( ) -> URL {
106139 let url = FileManager . default. temporaryDirectory. appendingPathComponent ( UUID ( ) . uuidString)
107140 try ? FileManager . default. createDirectory ( at: url, withIntermediateDirectories: true )
0 commit comments