@@ -12,6 +12,7 @@ import XCTest
1212@testable import SwiftDocC
1313import Markdown
1414import SymbolKit
15+ import SwiftDocCTestUtilities
1516
1617class ExternalReferenceResolverTests : XCTestCase {
1718 class TestExternalReferenceResolver : ExternalReferenceResolver , FallbackReferenceResolver {
@@ -399,6 +400,66 @@ Document @1:1-1:35
399400 ] )
400401 }
401402
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+
402463 func testSampleCodeReferenceHasSampleCodeRole( ) throws {
403464 let externalResolver = TestExternalReferenceResolver ( )
404465 externalResolver. bundleIdentifier = " com.test.external "
0 commit comments