mana-swift-event-sync/Tests/ManaEventSyncTests/SyncConsentTests.swift
Till JS e574bc55d6 Cloud-Sync-Opt-in-Gate (Art. 25) — Parität zur Web-App
Native synct bisher per Default beim Login, Web ist Opt-in. Neues
EventSyncConfig.requireSyncConsent (Default false → abwärtskompatibel):
ist es gesetzt, läuft die Engine ohne explizite Einwilligung lokal-only
(authMode() → anonymous trotz JWT, kein Egress, Outbox staut). Einwilligung
beim start() aus mana-auth /api/v1/settings (gleiche Quelle wie Web),
setSyncConsent(_:) als Konto-Toggle (true claimt+startet wie signIn, false
stoppt Server-Sync; lokale Daten bleiben). + syncConsentRequired/hasSyncConsent.

Tests: SyncConsentTests (6) grün, volle Suite ohne Regression.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 16:09:25 +02:00

46 lines
1.8 KiB
Swift

import Foundation
import XCTest
@testable import ManaEventSync
/// Parsing der Cloud-Sync-Einwilligung aus der mana-auth-Settings-Antwort.
/// Reihenfolge muss zur Web-App passen: App-Override vor globaler Präferenz,
/// fehlend = aus (Opt-in).
final class SyncConsentTests: XCTestCase {
private func json(_ string: String) -> Data { Data(string.utf8) }
func testAbsentSettingsDefaultsToFalse() {
XCTAssertFalse(parseSyncConsent(fromSettingsJSON: json("{}"), appId: "pageta"))
}
func testGlobalEnabledTrue() {
let data = json(#"{"globalSettings":{"sync":{"enabled":true}}}"#)
XCTAssertTrue(parseSyncConsent(fromSettingsJSON: data, appId: "pageta"))
}
func testAppOverrideWinsOverGlobal() {
// Global an, App-Override aus → App-Override gewinnt (false).
let data = json(#"""
{"globalSettings":{"sync":{"enabled":true}},
"appOverrides":{"pageta":{"sync":{"enabled":false}}}}
"""#)
XCTAssertFalse(parseSyncConsent(fromSettingsJSON: data, appId: "pageta"))
}
func testAppOverrideEnablesWhenGlobalAbsent() {
let data = json(#"{"appOverrides":{"pageta":{"sync":{"enabled":true}}}}"#)
XCTAssertTrue(parseSyncConsent(fromSettingsJSON: data, appId: "pageta"))
}
func testOtherAppOverrideIgnored() {
// Override für eine andere App darf pageta nicht beeinflussen → global.
let data = json(#"""
{"globalSettings":{"sync":{"enabled":true}},
"appOverrides":{"zitare":{"sync":{"enabled":false}}}}
"""#)
XCTAssertTrue(parseSyncConsent(fromSettingsJSON: data, appId: "pageta"))
}
func testGarbageJSONDefaultsToFalse() {
XCTAssertFalse(parseSyncConsent(fromSettingsJSON: json("not json"), appId: "pageta"))
}
}