@@ -12,6 +12,7 @@ import XCTest
12
12
@testable import SwiftDocC
13
13
import Markdown
14
14
import SymbolKit
15
+ import SwiftDocCTestUtilities
15
16
16
17
class ExternalReferenceResolverTests : XCTestCase {
17
18
class TestExternalReferenceResolver : ExternalReferenceResolver , FallbackReferenceResolver {
@@ -399,6 +400,66 @@ Document @1:1-1:35
399
400
] )
400
401
}
401
402
403
+ func testExternalReferenceWithDifferentResolvedPath( ) throws {
404
+ let externalResolver = TestExternalReferenceResolver ( )
405
+ externalResolver. bundleIdentifier = " com.test.external "
406
+ // Return a different path for this resolved reference
407
+ externalResolver. expectedReferencePath = " /path/to/externally-resolved-symbol "
408
+ externalResolver. resolvedEntityTitle = " ClassName "
409
+ externalResolver. resolvedEntityKind = . class
410
+
411
+ let tempFolder = try createTempFolder ( content: [
412
+ Folder ( name: " SingleArticleWithExternalLink.docc " , content: [
413
+ TextFile ( name: " article.md " , utf8Content: """
414
+ # Article with external link
415
+
416
+ @Metadata {
417
+ @TechnologyRoot
418
+ }
419
+
420
+ Link to an external page: <doc://com.test.external/path/to/external/symbol>
421
+ """ )
422
+ ] )
423
+ ] )
424
+
425
+ let workspace = DocumentationWorkspace ( )
426
+ let context = try DocumentationContext ( dataProvider: workspace)
427
+ context. externalReferenceResolvers = [ externalResolver. bundleIdentifier: externalResolver]
428
+ let dataProvider = try LocalFileSystemDataProvider ( rootURL: tempFolder)
429
+ try workspace. registerProvider ( dataProvider)
430
+ let bundle = try XCTUnwrap ( workspace. bundles. first? . value)
431
+
432
+ let converter = DocumentationNodeConverter ( bundle: bundle, context: context)
433
+ let node = try context. entity ( with: ResolvedTopicReference ( bundleIdentifier: bundle. identifier, path: " /documentation/article " , sourceLanguage: . swift) )
434
+
435
+ guard let fileURL = context. documentURL ( for: node. reference) else {
436
+ XCTFail ( " Unable to find the file for \( node. reference. path) " )
437
+ return
438
+ }
439
+
440
+ let renderNode = try converter. convert ( node, at: fileURL)
441
+
442
+ XCTAssertEqual ( externalResolver. resolvedExternalPaths, [ " /path/to/external/symbol " ] , " The authored link was resolved " )
443
+
444
+ // Verify that the article contains the external reference
445
+ guard let symbolRenderReference = renderNode. references [ " doc://com.test.external/path/to/externally-resolved-symbol " ] as? TopicRenderReference else {
446
+ XCTFail ( " The external reference should be resolved and included among the article's references. " )
447
+ return
448
+ }
449
+
450
+ XCTAssertEqual ( symbolRenderReference. identifier. identifier, " doc://com.test.external/path/to/externally-resolved-symbol " )
451
+ XCTAssertEqual ( symbolRenderReference. title, " ClassName " )
452
+ XCTAssertEqual ( symbolRenderReference. url, " /example/path/to/externally-resolved-symbol " ) // External references in topic groups use relative URLs
453
+ XCTAssertEqual ( symbolRenderReference. kind, . symbol)
454
+
455
+ // Verify that the rendered abstract contains the resolved link
456
+ if case RenderInlineContent . reference( identifier: let identifier, isActive: true , overridingTitle: _, overridingTitleInlineContent: _) ? = renderNode. abstract? . last {
457
+ XCTAssertEqual ( identifier. identifier, " doc://com.test.external/path/to/externally-resolved-symbol " )
458
+ } else {
459
+ XCTFail ( " Unexpected abstract content: \( renderNode. abstract ?? [ ] ) " )
460
+ }
461
+ }
462
+
402
463
func testSampleCodeReferenceHasSampleCodeRole( ) throws {
403
464
let externalResolver = TestExternalReferenceResolver ( )
404
465
externalResolver. bundleIdentifier = " com.test.external "
0 commit comments