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>
46 lines
1.8 KiB
Swift
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"))
|
|
}
|
|
}
|