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>
60 lines
2.5 KiB
Swift
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)
|
|
}
|
|
}
|