1
0
mirror of https://github.com/nicoverbruggen/phpmon.git synced 2025-12-21 03:10:06 +01:00

Improve tests

This commit is contained in:
2025-09-26 21:13:06 +02:00
parent 21296d09aa
commit af13913d9e
6 changed files with 42 additions and 56 deletions

View File

@@ -3880,7 +3880,7 @@
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ""; INFOPLIST_FILE = "";
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.feature-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.feature-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3898,7 +3898,7 @@
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ""; INFOPLIST_FILE = "";
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.feature-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.feature-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3915,7 +3915,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.ui-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.ui-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -3933,7 +3933,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.ui-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.ui-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4100,7 +4100,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
"@loader_path/../Frameworks", "@loader_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.unit-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.unit-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@@ -4116,7 +4116,7 @@
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ""; INFOPLIST_FILE = "";
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.feature-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.feature-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4133,7 +4133,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.ui-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.ui-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4293,7 +4293,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
"@loader_path/../Frameworks", "@loader_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.unit-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.unit-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@@ -4309,7 +4309,7 @@
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ""; INFOPLIST_FILE = "";
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.feature-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.feature-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4326,7 +4326,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.ui-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.ui-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4349,7 +4349,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
"@loader_path/../Frameworks", "@loader_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.unit-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.unit-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@@ -4369,7 +4369,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
"@loader_path/../Frameworks", "@loader_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 12.4; MACOSX_DEPLOYMENT_TARGET = 13.5;
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.unit-tests"; PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon.unit-tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;

View File

@@ -140,6 +140,12 @@ public struct TestableConfiguration: Codable {
Log.info("Applying fake Valet domain interactor...") Log.info("Applying fake Valet domain interactor...")
ValetInteractor.useFake() ValetInteractor.useFake()
} }
// Clear volatile app state for tests
UserDefaults.standard.removeObject(forKey: PersistentAppState.lastAutomaticUpdateCheck.rawValue)
// Set variable to tell app we're testin'
App.hasLoadedTestableConfiguration = true
} }
// MARK: Persist and load // MARK: Persist and load

View File

@@ -14,6 +14,9 @@ class App {
/** The static app instance. Accessible at any time. */ /** The static app instance. Accessible at any time. */
static let shared = App() static let shared = App()
/** Use to determine whether a loaded testable configuration is being used. */
static var hasLoadedTestableConfiguration: Bool = false
/** Retrieve the version number from the main info dictionary, Info.plist. */ /** Retrieve the version number from the main info dictionary, Info.plist. */
static var version: String { static var version: String {
let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String

View File

@@ -24,13 +24,11 @@ struct CaskFile {
return self.properties["version"]! return self.properties["version"]!
} }
public static func from(url: URL) async -> CaskFile? { private static func loadFromApi(_ url: URL) async -> String {
var string: String? if App.hasLoadedTestableConfiguration {
return await Shell.pipe("curl -s --max-time 10 '\(url.absoluteString)'").out
if url.scheme == "file" {
string = try? String(contentsOf: url)
} else { } else {
string = await Shell.pipe(""" return await Shell.pipe("""
curl -s --max-time 10 \ curl -s --max-time 10 \
-H "User-Agent: phpmon \(App.shortVersion)" \ -H "User-Agent: phpmon \(App.shortVersion)" \
-H "X-phpmon-version: \(App.bundleVersion)" \ -H "X-phpmon-version: \(App.bundleVersion)" \
@@ -39,6 +37,16 @@ struct CaskFile {
'\(url.absoluteString)' '\(url.absoluteString)'
""").out """).out
} }
}
public static func from(url: URL) async -> CaskFile? {
var string: String?
if url.scheme == "file" {
string = try? String(contentsOf: url)
} else {
string = await CaskFile.loadFromApi(url)
}
guard let string else { guard let string else {
Log.err("The content of the URL for the CaskFile could not be retrieved") Log.err("The content of the URL for the CaskFile could not be retrieved")

View File

@@ -138,14 +138,7 @@ class TestableConfigurations {
: .instant(ShellStrings.shared.brewServicesAsRoot), : .instant(ShellStrings.shared.brewServicesAsRoot),
"/opt/homebrew/bin/brew services info --all --json" "/opt/homebrew/bin/brew services info --all --json"
: .instant(ShellStrings.shared.brewServicesAsUser), : .instant(ShellStrings.shared.brewServicesAsUser),
""" "curl -s --max-time 10 '\(Constants.Urls.UpdateCheckEndpoint.absoluteString)'"
curl -s --max-time 10 \
-H "User-Agent: phpmon \(App.shortVersion)" \
-H "X-phpmon-version: \(App.bundleVersion)" \
-H "X-phpmon-os-version: \(App.macVersion)" \
-H "X-phpmon-bundle-id: \(App.identifier)" \
'\(Constants.Urls.UpdateCheckEndpoint.absoluteString)'
"""
: .delayed(0.5, """ : .delayed(0.5, """
cask 'phpmon-dev' do cask 'phpmon-dev' do
depends_on formula: 'gnu-sed' depends_on formula: 'gnu-sed'

View File

@@ -32,14 +32,7 @@ final class UpdateCheckTest: UITestCase {
// Ensure an update is available // Ensure an update is available
configuration.shellOutput[ configuration.shellOutput[
""" "curl -s --max-time 10 '\(Constants.Urls.UpdateCheckEndpoint.absoluteString)'"
curl -s --max-time 10 \
-H "User-Agent: phpmon \(App.shortVersion)" \
-H "X-phpmon-version: \(App.bundleVersion)" \
-H "X-phpmon-os-version: \(App.macVersion)" \
-H "X-phpmon-bundle-id: \(App.identifier)" \
'\(Constants.Urls.UpdateCheckEndpoint.absoluteString)'
"""
] = .delayed(0.5, """ ] = .delayed(0.5, """
cask 'phpmon-dev' do cask 'phpmon-dev' do
depends_on formula: 'gnu-sed' depends_on formula: 'gnu-sed'
@@ -57,8 +50,9 @@ final class UpdateCheckTest: UITestCase {
let app = launch(openMenu: false, with: configuration) let app = launch(openMenu: false, with: configuration)
// Expect to see the content of the appropriate alert box // Expect to see the content of the appropriate alert box, but this may take a while; if this test fails try increasing the timeout
assertExists(app.staticTexts["updater.alerts.newer_version_available.title".localized("99.0.0 (9999)")], 3.0) let timeout: TimeInterval = 10.0
assertExists(app.staticTexts["updater.alerts.newer_version_available.title".localized("99.0.0 (9999)")], timeout)
assertExists(app.buttons["updater.alerts.buttons.install".localized]) assertExists(app.buttons["updater.alerts.buttons.install".localized])
assertExists(app.buttons["updater.alerts.buttons.dismiss".localized]) assertExists(app.buttons["updater.alerts.buttons.dismiss".localized])
} }
@@ -70,16 +64,7 @@ final class UpdateCheckTest: UITestCase {
configuration.preferenceOverrides[.automaticBackgroundUpdateCheck] = false configuration.preferenceOverrides[.automaticBackgroundUpdateCheck] = false
// Ensure an update is available // Ensure an update is available
configuration.shellOutput[ configuration.shellOutput["curl -s --max-time 10 '\(Constants.Urls.UpdateCheckEndpoint.absoluteString)'"] = .delayed(0.5, """
"""
curl -s --max-time 10 \
-H "User-Agent: phpmon \(App.shortVersion)" \
-H "X-phpmon-version: \(App.bundleVersion)" \
-H "X-phpmon-os-version: \(App.macVersion)" \
-H "X-phpmon-bundle-id: \(App.identifier)" \
'\(Constants.Urls.UpdateCheckEndpoint.absoluteString)'
"""
] = .delayed(0.5, """
cask 'phpmon-dev' do cask 'phpmon-dev' do
depends_on formula: 'gnu-sed' depends_on formula: 'gnu-sed'
@@ -117,16 +102,7 @@ final class UpdateCheckTest: UITestCase {
configuration.preferenceOverrides[.automaticBackgroundUpdateCheck] = false configuration.preferenceOverrides[.automaticBackgroundUpdateCheck] = false
// Ensure an update is available // Ensure an update is available
configuration.shellOutput[ configuration.shellOutput["curl -s --max-time 10 '\(Constants.Urls.UpdateCheckEndpoint.absoluteString)'"] = .delayed(0.5, "404 PAGE NOT FOUND")
"""
curl -s --max-time 10 \
-H "User-Agent: phpmon \(App.shortVersion)" \
-H "X-phpmon-version: \(App.bundleVersion)" \
-H "X-phpmon-os-version: \(App.macVersion)" \
-H "X-phpmon-bundle-id: \(App.identifier)" \
'\(Constants.Urls.UpdateCheckEndpoint.absoluteString)'
"""
] = .delayed(0.5, "404 PAGE NOT FOUND")
// Wait for the menu to open and search for updates // Wait for the menu to open and search for updates
let app = launch(openMenu: true, with: configuration) let app = launch(openMenu: true, with: configuration)