Files
ShadowsocksX-NG/ShadowsocksX-NG2/Tests/Settings/ProxyControlPreferencesTests.swift
Qiu Yuzhou 32709333f5 refactor(rules): require explicit preset selection
Remove lossy default-action writes that can replace china-proxy
with gfwlist. Preserve legacy preference reads and derive the
default action from the selected preset.

Update tests to use explicit presets and verify identity,
legacy compatibility, and no-op reselection.
2026-10-25 14:32:12 +08:00

80 lines
3.4 KiB
Swift

import Foundation
import Testing
@testable import ShadowsocksX_NG2
struct ProxyControlPreferencesTests {
@Test func freshPreferencesUseFactoryIntentWithoutChangingExistingPreferences() throws {
let suite = "proxy-control-defaults-\(UUID().uuidString)"
let defaults = try #require(UserDefaults(suiteName: suite))
defer { defaults.removePersistentDomain(forName: suite) }
defaults.set(true, forKey: "silentLaunch")
defaults.set("http://example.com/probe", forKey: "connectivityTestURL")
let settings = ProxyRuntimeSettings(
listen: ProxyListeningConfiguration(),
preferences: ProxyControlPreferences(defaults: defaults))
#expect(settings.preferredMode == .rule)
#expect(settings.rulePreset == .gfwlist)
#expect(settings.ruleDefaultAction == .directWhenUnmatched)
#expect(!settings.agentEnabled)
#expect(!settings.systemProxyEnabled)
#expect(settings.proxyExceptions.isEmpty)
#expect(defaults.bool(forKey: "silentLaunch"))
#expect(defaults.string(forKey: "connectivityTestURL") == "http://example.com/probe")
}
@Test func rebuildingSnapshotRestoresIndependentPreferencesAndCurrentListeningConfiguration()
throws
{
let suite = "proxy-control-roundtrip-\(UUID().uuidString)"
let defaults = try #require(UserDefaults(suiteName: suite))
defer { defaults.removePersistentDomain(forName: suite) }
let preferences = ProxyControlPreferences(defaults: defaults)
preferences.preferredMode = .direct
preferences.rulePreset = .chinaProxy
preferences.agentEnabled = true
preferences.systemProxyEnabled = true
preferences.proxyExceptions = "example.com, localhost"
var listen = ProxyListeningConfiguration()
listen.socksPort = 23001
listen.httpPort = 23002
let reopened = ProxyControlPreferences(defaults: try #require(UserDefaults(suiteName: suite)))
let settings = ProxyRuntimeSettings(listen: listen, preferences: reopened)
#expect(settings.preferredMode == .direct)
#expect(settings.rulePreset == .chinaProxy)
#expect(settings.ruleDefaultAction == .directWhenUnmatched)
#expect(settings.agentEnabled)
#expect(settings.systemProxyEnabled)
#expect(settings.proxyExceptionList == ["example.com", "localhost"])
#expect(settings.listen.socksPort == 23001)
#expect(settings.listen.httpPort == 23002)
}
@Test(arguments: RuleDefaultAction.allCases)
func legacyDefaultActionIsReadUntilAnExplicitPresetIsSaved(_ action: RuleDefaultAction) throws {
let suite = "proxy-control-legacy-\(UUID().uuidString)"
let defaults = try #require(UserDefaults(suiteName: suite))
defer { defaults.removePersistentDomain(forName: suite) }
defaults.set(action.rawValue, forKey: "proxyControl.ruleDefaultAction")
let preferences = ProxyControlPreferences(defaults: defaults)
let expected: RulePreset = action == .proxyWhenUnmatched ? .chinaDirect : .gfwlist
#expect(preferences.rulePreset == expected)
#expect(defaults.object(forKey: "proxyControl.rulePreset") == nil)
for preset in RulePreset.allCases {
preferences.rulePreset = preset
let reopened = ProxyControlPreferences(defaults: defaults)
let settings = ProxyRuntimeSettings(
listen: ProxyListeningConfiguration(), preferences: reopened)
#expect(settings.rulePreset == preset)
#expect(settings.ruleDefaultAction == preset.defaultAction)
#expect(defaults.string(forKey: "proxyControl.ruleDefaultAction") == action.rawValue)
}
}
}