- Add AtlasUpdateChecker with GitHub Releases API integration - Add AtlasVersionComparator for semantic version comparison - Add AboutUpdateToolbarButton with popover update UI - Enhance AboutFeatureView with social QR codes and layout refinements - Add CHANGELOG.md and CODE_OF_CONDUCT.md - Rebrand project files from Mole to Atlas for Mac - Update build script to support version/build number injection - Add installation guide to README - Add bilingual localization strings for update feature - Add unit tests for update checker and version comparator
70 lines
2.5 KiB
Swift
70 lines
2.5 KiB
Swift
import Foundation
|
|
import XCTest
|
|
@testable import AtlasApplication
|
|
|
|
final class AtlasUpdateCheckerTests: XCTestCase {
|
|
func testCheckForUpdateReturnsAvailableRelease() async throws {
|
|
let checker = AtlasUpdateChecker { request in
|
|
XCTAssertEqual(
|
|
request.url?.absoluteString,
|
|
"https://api.github.com/repos/CSZHK/CleanMyPc/releases/latest"
|
|
)
|
|
let body = """
|
|
{
|
|
"tag_name": "V1.2.3",
|
|
"html_url": "https://github.com/CSZHK/CleanMyPc/releases/tag/V1.2.3",
|
|
"body": "Release notes"
|
|
}
|
|
"""
|
|
return (
|
|
Data(body.utf8),
|
|
HTTPURLResponse(url: request.url!, statusCode: 200, httpVersion: nil, headerFields: nil)!
|
|
)
|
|
}
|
|
|
|
let result = try await checker.checkForUpdate(currentVersion: "1.0.0")
|
|
|
|
XCTAssertEqual(result.currentVersion, "1.0.0")
|
|
XCTAssertEqual(result.latestVersion, "V1.2.3")
|
|
XCTAssertEqual(result.releaseURL?.absoluteString, "https://github.com/CSZHK/CleanMyPc/releases/tag/V1.2.3")
|
|
XCTAssertEqual(result.releaseNotes, "Release notes")
|
|
XCTAssertTrue(result.isUpdateAvailable)
|
|
}
|
|
|
|
func testCheckForUpdateTreatsMissingReleaseAsUnavailable() async {
|
|
let checker = AtlasUpdateChecker { request in
|
|
(
|
|
Data(),
|
|
HTTPURLResponse(url: request.url!, statusCode: 404, httpVersion: nil, headerFields: nil)!
|
|
)
|
|
}
|
|
|
|
do {
|
|
_ = try await checker.checkForUpdate(currentVersion: "1.0.0")
|
|
XCTFail("Expected missing releases to be reported explicitly")
|
|
} catch let error as AtlasUpdateCheckerError {
|
|
XCTAssertEqual(error, .noPublishedRelease)
|
|
} catch {
|
|
XCTFail("Unexpected error: \(error)")
|
|
}
|
|
}
|
|
|
|
func testCheckForUpdateMapsUnexpectedStatusToRequestFailure() async {
|
|
let checker = AtlasUpdateChecker { request in
|
|
(
|
|
Data(),
|
|
HTTPURLResponse(url: request.url!, statusCode: 500, httpVersion: nil, headerFields: nil)!
|
|
)
|
|
}
|
|
|
|
do {
|
|
_ = try await checker.checkForUpdate(currentVersion: "1.0.0")
|
|
XCTFail("Expected a request failure")
|
|
} catch let error as AtlasUpdateCheckerError {
|
|
XCTAssertEqual(error, .requestFailed)
|
|
} catch {
|
|
XCTFail("Unexpected error: \(error)")
|
|
}
|
|
}
|
|
}
|