From 404ab09faa0c0ef526fb1e009785e315df3c2f6a Mon Sep 17 00:00:00 2001 From: Max Goedjen Date: Sun, 17 Jan 2021 21:24:44 -0800 Subject: [PATCH] Tests --- Brief/Updater.swift | 16 ++++++-- BriefTests/ReleaseParsingTests.swift | 55 +++++++++++++++++++++++++++- BriefTests/SemVerTests.swift | 10 +++++ 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/Brief/Updater.swift b/Brief/Updater.swift index 2684e45..4cfcdef 100644 --- a/Brief/Updater.swift +++ b/Brief/Updater.swift @@ -11,7 +11,10 @@ public class Updater: ObservableObject, UpdaterProtocol { @Published public var update: Release? - public init(checkOnLaunch: Bool) { + private let osVersion: SemVer + + public init(checkOnLaunch: Bool, osVersion: SemVer = SemVer(ProcessInfo.processInfo.operatingSystemVersion)) { + self.osVersion = osVersion if checkOnLaunch { // Don't do a launch check if the user hasn't seen the setup prompt explaining updater yet. checkForUpdates() @@ -44,8 +47,9 @@ extension Updater { func evaluate(releases: [Release]) { guard let release = releases - .sorted() - .first(where: { $0.minimumOSVersion < SemVer(ProcessInfo.processInfo.operatingSystemVersionString) }) else { return } + .sorted() + .reversed() + .first(where: { $0.minimumOSVersion < osVersion }) else { return } guard !userIgnored(release: release) else { return } guard !release.prerelease else { return } let latestVersion = SemVer(release.name) @@ -71,7 +75,7 @@ public struct SemVer { let versionNumbers: [Int] - init(_ version: String) { + public init(_ version: String) { // Betas have the format 1.2.3_beta1 let strippedBeta = version.split(separator: "_").first! var split = strippedBeta.split(separator: ".").compactMap { Int($0) } @@ -81,6 +85,10 @@ public struct SemVer { versionNumbers = split } + public init(_ version: OperatingSystemVersion) { + versionNumbers = [version.majorVersion, version.minorVersion, version.patchVersion] + } + } extension SemVer: Comparable { diff --git a/BriefTests/ReleaseParsingTests.swift b/BriefTests/ReleaseParsingTests.swift index a032779..6c9b99d 100644 --- a/BriefTests/ReleaseParsingTests.swift +++ b/BriefTests/ReleaseParsingTests.swift @@ -4,29 +4,80 @@ import XCTest class ReleaseParsingTests: XCTestCase { func testNonCritical() { - + let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release") + XCTAssert(release.critical == false) } func testCritical() { + let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update") + XCTAssert(release.critical == true) + } + func testOSMissing() { + let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update") + XCTAssert(release.minimumOSVersion == SemVer("11.0.0")) + } + + func testOSPresent() { + let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update Requires macOS 11.0.0") + XCTAssert(release.minimumOSVersion == SemVer("11.0.0")) } func testOSGreaterThanMinimum() { + let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update") + XCTAssert(release.minimumOSVersion < SemVer("11.0.0")) + } + func testOSEqualToMinimum() { + let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update") + XCTAssert(release.minimumOSVersion <= SemVer("11.0.0")) } func testOSLessThanMinimum() { - + let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update") + XCTAssert(release.minimumOSVersion > SemVer("10.0.0")) } func testGreatestSelectedIfOldPatchIsPublishedLater() { // If 2.x.x series has been published, and a patch for 1.x.x is issued // 2.x.x should still be selected if user can run it. + let updater = Updater(checkOnLaunch: false, osVersion: SemVer("10.0.0")) + let two = Release(name: "2.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "2.0 available!") + let releases = [ + Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release"), + Release(name: "1.0.1", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Bug fixes"), + two, + Release(name: "1.0.2", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Emergency patch!"), + ] + updater.evaluate(releases: releases) + XCTAssert(updater.update == two) } func testLatestVersionIsRunnable() { // If the 2.x.x series has been published but the user can't run it // the last version the user can run should be selected. + let updater = Updater(checkOnLaunch: false, osVersion: SemVer("10.0.0")) + let oneOhTwo = Release(name: "1.0.2", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Emergency patch!") + let releases = [ + Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release"), + Release(name: "1.0.1", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Bug fixes"), + Release(name: "2.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "2.0 available!"), + oneOhTwo, + ] + updater.evaluate(releases: releases) + XCTAssert(updater.update == oneOhTwo) + } + + func testSorting() { + let two = Release(name: "2.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "2.0 available!") + let releases = [ + Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release"), + Release(name: "1.0.1", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Bug fixes"), + two, + Release(name: "1.0.2", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Emergency patch!"), + ] + let sorted = releases.sorted().reversed().first + XCTAssert(sorted == two) } } diff --git a/BriefTests/SemVerTests.swift b/BriefTests/SemVerTests.swift index 02729fa..274e5aa 100644 --- a/BriefTests/SemVerTests.swift +++ b/BriefTests/SemVerTests.swift @@ -27,6 +27,16 @@ class SemVerTests: XCTestCase { XCTAssert(current < new) } + func testRegularParsing() { + let current = SemVer("1.0.2") + XCTAssert(current.versionNumbers == [1, 0, 2]) + } + + func testNoPatch() { + let current = SemVer("1.1") + XCTAssert(current.versionNumbers == [1, 1, 0]) + } + func testBeta() { let current = SemVer("1.0.2") let new = SemVer("1.1.0_beta1")