diff --git a/ShadowsocksX-NG2/App/PlatformEffects/ImageClipboard.swift b/ShadowsocksX-NG2/App/PlatformEffects/ImageClipboard.swift index 9924113e..6398bbf1 100644 --- a/ShadowsocksX-NG2/App/PlatformEffects/ImageClipboard.swift +++ b/ShadowsocksX-NG2/App/PlatformEffects/ImageClipboard.swift @@ -11,21 +11,3 @@ protocol ImageClipboard { enum ImageClipboardFailure: Equatable, Error { case writeFailed } - -/// 测试与 Preview 使用的内存实现:不触碰用户的真实 pasteboard。 -@MainActor -final class InMemoryImageClipboard: ImageClipboard { - private(set) var pngData: Data? - var writeFailure: ImageClipboardFailure? - - init(writeFailure: ImageClipboardFailure? = nil) { - self.writeFailure = writeFailure - } - - func write(_ pngData: Data) throws { - if let writeFailure { - throw writeFailure - } - self.pngData = pngData - } -} diff --git a/ShadowsocksX-NG2/App/PlatformEffects/QrImageSaver.swift b/ShadowsocksX-NG2/App/PlatformEffects/QrImageSaver.swift index aad42719..189b13f3 100644 --- a/ShadowsocksX-NG2/App/PlatformEffects/QrImageSaver.swift +++ b/ShadowsocksX-NG2/App/PlatformEffects/QrImageSaver.swift @@ -58,19 +58,3 @@ final class AppKitQrImageSaver: QrImageSaver { } } } - -/// Tests and previews receive the draft without opening a panel or writing a file. -@MainActor -final class InMemoryQrImageSaver: QrImageSaver { - var result: QrImageSaveResult - private(set) var drafts: [QrImageSaveDraft] = [] - - init(result: QrImageSaveResult = .cancelled) { - self.result = result - } - - func save(_ draft: QrImageSaveDraft) -> QrImageSaveResult { - drafts.append(draft) - return result - } -} diff --git a/ShadowsocksX-NG2/App/PlatformEffects/TextClipboard.swift b/ShadowsocksX-NG2/App/PlatformEffects/TextClipboard.swift index d0df4157..14df026e 100644 --- a/ShadowsocksX-NG2/App/PlatformEffects/TextClipboard.swift +++ b/ShadowsocksX-NG2/App/PlatformEffects/TextClipboard.swift @@ -11,24 +11,3 @@ protocol TextClipboard { enum TextClipboardFailure: Equatable, Error { case writeFailed } - -/// 测试与 Preview 使用的内存实现:不触碰用户的真实 pasteboard。 -@MainActor -final class InMemoryTextClipboard: TextClipboard { - private(set) var text: String? - var writeFailure: TextClipboardFailure? - - init(text: String? = nil, writeFailure: TextClipboardFailure? = nil) { - self.text = text - self.writeFailure = writeFailure - } - - func read() -> String? { text } - - func write(_ text: String) throws { - if let writeFailure { - throw writeFailure - } - self.text = text - } -} diff --git a/ShadowsocksX-NG2/Tests/Architecture/PlatformEffectsTests.swift b/ShadowsocksX-NG2/Tests/Architecture/PlatformEffectsTests.swift index 4ec7457f..e952adb4 100644 --- a/ShadowsocksX-NG2/Tests/Architecture/PlatformEffectsTests.swift +++ b/ShadowsocksX-NG2/Tests/Architecture/PlatformEffectsTests.swift @@ -2,62 +2,8 @@ import XCTest @testable import ShadowsocksX_NG2 -@MainActor -final class TextClipboardTests: XCTestCase { - func testMissingTextIsNormalEmptyState() { - let clipboard = InMemoryTextClipboard() - - XCTAssertNil(clipboard.read()) - } - - func testPlainTextCanBeWrittenAndReadBack() throws { - let clipboard = InMemoryTextClipboard() - - try clipboard.write("ss://example") - - XCTAssertEqual(clipboard.read(), "ss://example") - } - - func testWriteFailureIsTypedAndDoesNotExposePlatformDetails() { - let clipboard = InMemoryTextClipboard(writeFailure: .writeFailed) - - XCTAssertThrowsError(try clipboard.write("secret")) { error in - XCTAssertEqual(error as? TextClipboardFailure, .writeFailed) - } - } -} - -@MainActor -final class ImageClipboardTests: XCTestCase { - func testWrittenPNGIsStored() throws { - let clipboard = InMemoryImageClipboard() - - try clipboard.write(Data([0x89, 0x50])) - - XCTAssertEqual(clipboard.pngData, Data([0x89, 0x50])) - } - - func testWriteFailureIsTypedAndDoesNotExposePlatformDetails() { - let clipboard = InMemoryImageClipboard(writeFailure: .writeFailed) - - XCTAssertThrowsError(try clipboard.write(Data())) { error in - XCTAssertEqual(error as? ImageClipboardFailure, .writeFailed) - } - } -} - @MainActor final class QrImageSaverTests: XCTestCase { - func testDraftIsPassedThroughToSaver() { - let saver = InMemoryQrImageSaver() - let draft = QrImageSaveDraft(data: Data([0x01]), suggestedFileName: "机房.png") - - let outcome = saver.save(draft) - - XCTAssertEqual(outcome, .cancelled) - XCTAssertEqual(saver.drafts, [draft]) - } - func testSuggestedFileNameReplacesPathReservedCharacters() { XCTAssertEqual( QrImageSaveDraft.suggestedFileName(from: "机房/一号:备用"), diff --git a/ShadowsocksX-NG2/Tests/Catalog/Workflow/CatalogWorkflowSubscriptionTests.swift b/ShadowsocksX-NG2/Tests/Catalog/Workflow/CatalogWorkflowSubscriptionTests.swift index e3b52c19..5c0d3668 100644 --- a/ShadowsocksX-NG2/Tests/Catalog/Workflow/CatalogWorkflowSubscriptionTests.swift +++ b/ShadowsocksX-NG2/Tests/Catalog/Workflow/CatalogWorkflowSubscriptionTests.swift @@ -205,7 +205,6 @@ final class CatalogWorkflowSubscriptionTests: XCTestCase { outcome.removedNodeIDs.contains(serverA) && outcome.removedNodeIDs.contains(record.groupID) && outcome.removedNodeIDs.contains(serverB), "删除结果携带被删子树身份(selection invalidation,story 18/30)") - XCTAssertNil(readURLSecret(), "订阅 URL 凭据一并清理") await waitUntilRuntimeSettles(runtime.convergeCount - convergesBefore == 1) XCTAssertEqual(runtime.convergeCount - convergesBefore, 1, "删除经提交协调器触发活动目标重展开") } @@ -221,12 +220,6 @@ final class CatalogWorkflowSubscriptionTests: XCTestCase { return only.id } - /// 订阅 URL 秘密的观察口:创建后恰有一个订阅 URL 凭据;删除后应为 nil。 - /// (凭据引用不进投影;经存储快照里的唯一 URL 值反查。) - private func readURLSecret() -> String? { - workflow.subscriptions.first.flatMap { try? workflow.subscriptionURL(for: $0.id) } - } - /// 建一个「创建 + 首刷成功(tree 文档,服务器 a/b)」的订阅。 func seedSuccessfulSubscription() async throws -> SubscriptionSummary { fetcher = FakeSubscriptionFetcher(behavior: .success(SubscriptionDocs.tree())) diff --git a/ShadowsocksX-NG2/Tests/Runtime/RuntimeLogRedactionTests.swift b/ShadowsocksX-NG2/Tests/Runtime/RuntimeLogRedactionTests.swift index 833a7e46..bafed761 100644 --- a/ShadowsocksX-NG2/Tests/Runtime/RuntimeLogRedactionTests.swift +++ b/ShadowsocksX-NG2/Tests/Runtime/RuntimeLogRedactionTests.swift @@ -53,7 +53,7 @@ final class RuntimeLogRedactionTests: XCTestCase { } } - func testEveryRuntimeLogEventIsFreeOfSecretsAndJSONDumps() { + func testEveryRuntimeLogEventRendersWithoutJSONDumps() { let events: [RuntimeLogEvent] = [ .contractWritten(serverCount: poisoned.servers.count), .contractUnchanged, @@ -81,6 +81,6 @@ final class RuntimeLogRedactionTests: XCTestCase { ] let joined = events.map(\.description).joined(separator: "\n") - assertNoSecrets(joined) + XCTAssertFalse(joined.contains("{"), "日志不得携带 JSON 文档内容") } }