in Sources/PackageRegistryCompatibilityTestSuite/APITests/FetchPackageReleaseManifest.swift [25:87]
func run() async {
for fixture in self.configuration.packageReleases {
let scope = fixture.packageRelease.package.scope
let name = fixture.packageRelease.package.name
let version = fixture.packageRelease.version
// Package.swift
self.log.append(await self.run(scope: scope, name: name, version: version, fixture: fixture))
// Case-insensitivity
self.log.append(await self.run(scope: scope.flipcased, name: name.flipcased, version: version.flipcased, fixture: fixture))
let url = "\(self.registryURL)/\(scope)/\(name)/\(version)/Package.swift"
// Version-specific manifests
if let swiftVersions = fixture.swiftVersions {
for swiftVersion in swiftVersions {
self.log.append(await TestCase(name: "Fetch Package@swift-\(swiftVersion).swift for package release \(scope).\(name)@\(version)") { testCase in
let manifestURL = "\(url)?swift-version=\(swiftVersion)"
// "alternate" relations are not set for version-specific manifests
try await self.fetchAndCheckResponse(url: manifestURL, packageRelease: fixture.packageRelease, checkLinkAlternate: false,
expectedFilename: "Package@swift-\(swiftVersion).swift", for: &testCase)
})
}
}
// These Swift versions do not have version-specific manifest
if let noSwiftVersions = fixture.noSwiftVersions {
for swiftVersion in noSwiftVersions {
self.log.append(await TestCase(name: "Fetch missing Package@swift-\(swiftVersion).swift for package release \(scope).\(name)@\(version)") { testCase in
let manifestURL = "\(url)?swift-version=\(swiftVersion)"
// 4.3 Server should return 303 and redirect to unqualified (i.e., `Package.swift`) if version-specific manifest is not found
try await self.fetchAndCheckResponse(url: manifestURL, packageRelease: fixture.packageRelease, checkLinkAlternate: false,
expectedFilename: "Package.swift", for: &testCase)
})
}
}
}
for packageRelease in self.configuration.unknownPackageReleases {
self.log.append(await TestCase(name: "Fetch Package.swift for unknown package release \(packageRelease.package.scope).\(packageRelease.package.name)@\(packageRelease.version)") { testCase in
let url = "\(self.registryURL)/\(packageRelease.package.scope)/\(packageRelease.package.name)/\(packageRelease.version)/Package.swift"
testCase.mark("HTTP request: GET \(url)")
let response = try await self.get(url: url, mediaType: .swift)
// 4.3 Server should return 404 if package release is not found
testCase.mark("HTTP response status")
guard response.status == .notFound else {
throw TestError("Expected HTTP status code 404 but got \(response.status.code)")
}
// 3.3 Server should communicate errors using "problem details" object
testCase.mark("Response body")
if response.body == nil {
testCase.warning("Response should include problem details")
}
})
}
self.printLog()
}