apple_kit

Apple-native services for Radroots iOS and macOS apps
git clone https://radroots.dev/git/apple_kit.git
Log | Files | Refs | README

commit 91da1787ca4af03c61a9bf1dd10e61b66746f126
parent 22cf4fd131673bab9cd51d12969bac9df1c33993
Author: triesap <tyson@radroots.org>
Date:   Fri, 12 Jun 2026 00:05:34 -0700

kit: expose local state reset from radroots kit

- move reusable app local-state reset into the production kit target

- keep UI-test launch configuration in RadrootsKitTesting

- cover missing-state and keychain-service reset behavior

Diffstat:
MPackage.swift | 5+----
RSources/RadrootsKitTesting/RadrootsAppLocalStateReset.swift -> Sources/RadrootsKit/RadrootsAppLocalStateReset.swift | 0
MTests/RadrootsKitTestingTests/RadrootsKitTestingTests.swift | 9---------
MTests/RadrootsKitTests/RadrootsSecureStoreTests.swift | 28++++++++++++++++++++++++++++
4 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/Package.swift b/Package.swift @@ -27,10 +27,7 @@ let package = Package( ), .target( name: "RadrootsKitTesting", - dependencies: ["RadrootsKit"], - linkerSettings: [ - .linkedFramework("Security") - ] + dependencies: ["RadrootsKit"] ), .testTarget( name: "RadrootsKitTests", diff --git a/Sources/RadrootsKitTesting/RadrootsAppLocalStateReset.swift b/Sources/RadrootsKit/RadrootsAppLocalStateReset.swift diff --git a/Tests/RadrootsKitTestingTests/RadrootsKitTestingTests.swift b/Tests/RadrootsKitTestingTests/RadrootsKitTestingTests.swift @@ -30,12 +30,3 @@ import RadrootsKitTesting "C": "keep" ]) } - -@Test func resetAllowsMissingState() throws { - let request = RadrootsAppLocalStateResetRequest( - appIdentifier: "org.radroots.tests.\(UUID().uuidString)", - keychainServiceNames: ["org.radroots.tests.\(UUID().uuidString)"] - ) - - try RadrootsAppLocalStateReset.reset(request) -} diff --git a/Tests/RadrootsKitTests/RadrootsSecureStoreTests.swift b/Tests/RadrootsKitTests/RadrootsSecureStoreTests.swift @@ -28,6 +28,34 @@ import Testing #expect(try store.get(key) == nil) } +@Test func resetAllowsMissingState() throws { + let request = RadrootsAppLocalStateResetRequest( + appIdentifier: "org.radroots.tests.\(UUID().uuidString)", + keychainServiceNames: ["org.radroots.tests.\(UUID().uuidString)"] + ) + + try RadrootsAppLocalStateReset.reset(request) +} + +@Test func resetClearsNamedKeychainService() throws { + let servicePrefix = "org.radroots.tests.\(UUID().uuidString)" + let store = RadrootsAppleKeychainSecureStore(servicePrefix: servicePrefix) + let key = RadrootsSecureStoreKey(namespace: "reset", name: "secret") + let serviceName = try key.serviceName(servicePrefix: servicePrefix) + + try store.put(Data("secret".utf8), for: key) + #expect(try store.get(key) == Data("secret".utf8)) + + try RadrootsAppLocalStateReset.reset( + RadrootsAppLocalStateResetRequest( + appIdentifier: "org.radroots.tests.\(UUID().uuidString)", + keychainServiceNames: [serviceName] + ) + ) + + #expect(try store.get(key) == nil) +} + @Test func userPresenceStatusIsInspectable() async { let userPresence = RadrootsAppleUserPresence() let status = await userPresence.currentStatus()