feat(core): ManaAppLog + appGroup/logSubsystem in ManaAppConfig (v1.7.0)
Audit 2026-05-17 V4. Ersetzt das hand-getippte Log.swift-Boilerplate
in jeder App durch einen Config-getriebenen Wrapper.
Neu:
- `ManaAppLog` — Factory fuer OSLog-Logger gegen ein ManaAppConfig.
Standard-Kategorien app/auth/api/db/web, plus `category("…")` fuer
app-spezifische Kategorien.
- `ManaAppConfig.appGroup: String?` (default nil) — Single-Source fuer
den App-Group-String, der heute in jeder App 3-4× hardcoded steht.
- `ManaAppConfig.logSubsystem: String` (default = keychainService) —
Subsystem fuer ManaAppLog.
Nichts breaking — beide neuen Felder haben Default-Implementations,
DefaultManaAppConfig.init hat zwei zusaetzliche optionale Parameter.
Tests: 4 neue ManaAppConfig-Tests + 5 neue ManaAppLog-Tests.
85/85 gruen (vorher 76/76).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
20c30fc321
commit
4ce22ac74e
5 changed files with 242 additions and 1 deletions
|
|
@ -24,4 +24,42 @@ struct ManaAppConfigTests {
|
|||
)
|
||||
#expect(config.keychainAccessGroup == nil)
|
||||
}
|
||||
|
||||
@Test("AppGroup ist optional, default nil")
|
||||
func appGroupDefaultsNil() {
|
||||
let config = DefaultManaAppConfig(
|
||||
authBaseURL: URL(string: "https://auth.mana.how")!,
|
||||
keychainService: "ev.mana.cards"
|
||||
)
|
||||
#expect(config.appGroup == nil)
|
||||
}
|
||||
|
||||
@Test("AppGroup wird durchgereicht wenn gesetzt")
|
||||
func appGroupPassedThrough() {
|
||||
let config = DefaultManaAppConfig(
|
||||
authBaseURL: URL(string: "https://auth.mana.how")!,
|
||||
keychainService: "ev.mana.cards",
|
||||
appGroup: "group.ev.mana.cards"
|
||||
)
|
||||
#expect(config.appGroup == "group.ev.mana.cards")
|
||||
}
|
||||
|
||||
@Test("LogSubsystem default = keychainService")
|
||||
func logSubsystemDefaultsToKeychainService() {
|
||||
let config = DefaultManaAppConfig(
|
||||
authBaseURL: URL(string: "https://auth.mana.how")!,
|
||||
keychainService: "ev.mana.cards"
|
||||
)
|
||||
#expect(config.logSubsystem == "ev.mana.cards")
|
||||
}
|
||||
|
||||
@Test("LogSubsystem kann explizit überschrieben werden")
|
||||
func logSubsystemOverride() {
|
||||
let config = DefaultManaAppConfig(
|
||||
authBaseURL: URL(string: "https://auth.mana.how")!,
|
||||
keychainService: "ev.mana.cards",
|
||||
logSubsystem: "ev.mana.cards.debug"
|
||||
)
|
||||
#expect(config.logSubsystem == "ev.mana.cards.debug")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
53
Tests/ManaCoreTests/ManaAppLogTests.swift
Normal file
53
Tests/ManaCoreTests/ManaAppLogTests.swift
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
import Foundation
|
||||
import Testing
|
||||
@testable import ManaCore
|
||||
|
||||
@Suite("ManaAppLog")
|
||||
struct ManaAppLogTests {
|
||||
@Test("Init aus Config nimmt logSubsystem")
|
||||
func initFromConfig() {
|
||||
let config = DefaultManaAppConfig(
|
||||
authBaseURL: URL(string: "https://auth.mana.how")!,
|
||||
keychainService: "ev.mana.cards"
|
||||
)
|
||||
let log = ManaAppLog(config)
|
||||
#expect(log.subsystem == "ev.mana.cards")
|
||||
}
|
||||
|
||||
@Test("Explizit gesetztes logSubsystem überschreibt keychainService")
|
||||
func initFromConfigWithCustomSubsystem() {
|
||||
let config = DefaultManaAppConfig(
|
||||
authBaseURL: URL(string: "https://auth.mana.how")!,
|
||||
keychainService: "ev.mana.cards",
|
||||
logSubsystem: "ev.mana.cards.test"
|
||||
)
|
||||
let log = ManaAppLog(config)
|
||||
#expect(log.subsystem == "ev.mana.cards.test")
|
||||
}
|
||||
|
||||
@Test("Direkter String-Constructor")
|
||||
func initFromString() {
|
||||
let log = ManaAppLog(subsystem: "ev.mana.test")
|
||||
#expect(log.subsystem == "ev.mana.test")
|
||||
}
|
||||
|
||||
@Test("Standard-Kategorien sind erreichbar")
|
||||
func standardCategoriesExist() {
|
||||
let log = ManaAppLog(subsystem: "ev.mana.test")
|
||||
// Logger ist nicht Equatable, aber wir können Existenz prüfen
|
||||
// indem wir den Wert binden — Compile genügt.
|
||||
let _ = log.app
|
||||
let _ = log.auth
|
||||
let _ = log.api
|
||||
let _ = log.db
|
||||
let _ = log.web
|
||||
}
|
||||
|
||||
@Test("category() liefert beliebige Custom-Kategorie")
|
||||
func customCategory() {
|
||||
let log = ManaAppLog(subsystem: "ev.mana.test")
|
||||
let _ = log.category("study")
|
||||
let _ = log.category("tracking")
|
||||
let _ = log.category("llm")
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue