Преглед изворни кода

Pin CGMManagerAlertOwnership lookup, including the xDrip4iOS source path

The .xdrip CGM source has no CGMManager instance, so a manager-only
ownership check used to miss it. Lock the source-driven path down
with tests alongside the manager-type → app-name/URL mappings so a
future rename or omission surfaces as a failing test instead of a
silent UI string change.
trioneer пре 2 недеља
родитељ
комит
0277536d15
1 измењених фајлова са 54 додато и 0 уклоњено
  1. 54 0
      TrioTests/CGMManagerAlertOwnershipTests.swift

+ 54 - 0
TrioTests/CGMManagerAlertOwnershipTests.swift

@@ -0,0 +1,54 @@
+import CGMBLEKit
+import Foundation
+import G7SensorKit
+import LibreTransmitter
+import LoopKit
+import Testing
+
+@testable import Trio
+
+@Suite("Trio Alerts: CGMManagerAlertOwnership") struct CGMManagerAlertOwnershipTests {
+    @Test("nil manager + .none source → no owner") func noneSourceNoManager() {
+        #expect(CGMManagerAlertOwnership.owningApp(manager: nil, sourceType: .none) == nil)
+        #expect(!CGMManagerAlertOwnership.providesOwnGlucoseAlerts(manager: nil, sourceType: .none))
+    }
+
+    /// Pins the xDrip4iOS case that was missed before: .xdrip runs through
+    /// AppGroupSource without a CGMManager instance, so the ownership check
+    /// must trigger off the source type alone.
+    @Test(".xdrip source → xDrip4iOS owner + xdripswift:// deep link") func xdripSourceWinsWithNilManager() {
+        let app = CGMManagerAlertOwnership.owningApp(manager: nil, sourceType: .xdrip)
+        #expect(app?.name == "xDrip4iOS")
+        #expect(app?.deepLink == URL(string: "xdripswift://"))
+        #expect(CGMManagerAlertOwnership.providesOwnGlucoseAlerts(manager: nil, sourceType: .xdrip))
+    }
+
+    @Test("nightscout / simulator / enlite sources → no owner") func nonOwnerSources() {
+        for source in [CGMType.nightscout, .simulator, .enlite] {
+            #expect(CGMManagerAlertOwnership.owningApp(manager: nil, sourceType: source) == nil)
+        }
+    }
+
+    /// Each known manager type maps to a fixed (name, deepLink) pair. Pinning
+    /// the strings here means a rename in CGMManagerAlertOwnership.swift
+    /// surfaces as a failing test rather than a silent UI copy change.
+    @Test("G6CGMManager → Dexcom G6 / One + dexcomg6://") func g6Mapping() {
+        let manager = G6CGMManager(state: TransmitterManagerState(transmitterID: "TEST6A"))
+        let app = CGMManagerAlertOwnership.owningApp(manager: manager, sourceType: .plugin)
+        #expect(app?.name == "Dexcom G6 / One")
+        #expect(app?.deepLink == URL(string: "dexcomg6://"))
+    }
+
+    @Test("G7CGMManager → Dexcom G7 / One+ + dexcomg7://") func g7Mapping() {
+        let app = CGMManagerAlertOwnership.owningApp(manager: G7CGMManager(), sourceType: .plugin)
+        #expect(app?.name == "Dexcom G7 / One+")
+        #expect(app?.deepLink == URL(string: "dexcomg7://"))
+    }
+
+    @Test("G5CGMManager → Dexcom G5, no known deep link") func g5Mapping() {
+        let manager = G5CGMManager(state: TransmitterManagerState(transmitterID: "TEST5A"))
+        let app = CGMManagerAlertOwnership.owningApp(manager: manager, sourceType: .plugin)
+        #expect(app?.name == "Dexcom G5")
+        #expect(app?.deepLink == nil)
+    }
+}