mana-swift-event-sync/Tests/ManaEventSyncTests/CryptoTests.swift
Till JS ca6d024dbb chore(lint): swiftlint --strict sauber (0 Violations)
inclusive_language erlaubt „master" (Krypto-Standard, spiegelt Web-
MasterKeyCryptoProvider); opening_brace deaktiviert (kollidiert mit
swiftformats Brace-Wrapping); type_body_length (zentrale Engine) +
cyclomatic_complexity (pull) gezielt stummgeschaltet; Test-Variablen
auf ≥2 Zeichen. swift test 18/18 grün.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 15:49:48 +02:00

60 lines
2.5 KiB
Swift

import Foundation
import XCTest
@testable import ManaEventSync
final class CryptoTests: XCTestCase {
private func makeKey() -> Data {
Data((0 ..< 32).map { UInt8($0) })
}
func testMasterKeyRoundTrip() async throws {
let provider = try MasterKeyCryptoProvider(masterKeyBytes: makeKey(), providerId: "test")
let payload = JSONValue.object([
"text": .string("geheime markierung"),
"color": .string("yellow"),
"n": .int(42)
])
let encrypted = try await provider.encryptPayload(payload)
// Wire-Form ist ein enc:1:-String.
guard case let .string(wire) = encrypted else {
return XCTFail("erwartete String-Wire-Form")
}
XCTAssertTrue(wire.hasPrefix("enc:1:"))
let decrypted = try await provider.decryptPayload(encrypted)
XCTAssertEqual(decrypted, payload)
}
func testMasterKeyDecryptPassesPlaintextThrough() async throws {
// Mixed-Tolerance: nicht-verschlüsselte Payloads (z.B. aus dem
// Guest-Modus) müssen die Decrypt-Pipeline unverändert passieren.
let provider = try MasterKeyCryptoProvider(masterKeyBytes: makeKey(), providerId: "test")
let plain = JSONValue.object(["text": .string("guest-klartext")])
let out = try await provider.decryptPayload(plain)
XCTAssertEqual(out, plain)
}
func testNoOpIsPassthrough() async throws {
let provider = NoOpCryptoProvider()
let payload = JSONValue.array([.int(1), .string("x")])
let enc = try await provider.encryptPayload(payload)
XCTAssertEqual(enc, payload)
let dec = try await provider.decryptPayload(enc)
XCTAssertEqual(dec, payload)
}
func testInvalidKeySizeThrows() {
XCTAssertThrowsError(try MasterKeyCryptoProvider(masterKeyBytes: Data(count: 16), providerId: "x"))
}
func testEachEncryptionUsesFreshIV() async throws {
let provider = try MasterKeyCryptoProvider(masterKeyBytes: makeKey(), providerId: "test")
let payload = JSONValue.string("same")
let enc1 = try await provider.encryptPayload(payload)
let enc2 = try await provider.encryptPayload(payload)
XCTAssertNotEqual(enc1, enc2) // verschiedene IVs → verschiedene Wire-Strings
let dec1 = try await provider.decryptPayload(enc1)
let dec2 = try await provider.decryptPayload(enc2)
XCTAssertEqual(dec1, payload)
XCTAssertEqual(dec2, payload)
}
}