import Foundation import Testing @testable import LocalData @Suite struct AppGroupTests { private let userDefaultsHelper: UserDefaultsHelper private let fileStorageHelper: FileStorageHelper init() { let suiteName = "AppGroupTests-\(UUID().uuidString)" userDefaultsHelper = UserDefaultsHelper(defaults: UserDefaults(suiteName: suiteName)!) let testBaseURL = FileManager.default.temporaryDirectory.appending(path: "AppGroupTests-\(UUID().uuidString)") fileStorageHelper = FileStorageHelper(configuration: FileStorageConfiguration(baseURL: testBaseURL)) } // Note: These tests might fail to find real containers in a unit test environment, // but they will exercise the routing logic. @Test func userDefaultsAppGroupRoundTrip() async throws { let identifier = "group.com.test.localdata" let key = "test.appgroup.key" let data = Data("appgroup-value".utf8) // This usually works in simulators even without real entitlements try await userDefaultsHelper.set(data, forKey: key, appGroupIdentifier: identifier) let retrieved = try await userDefaultsHelper.get(forKey: key, appGroupIdentifier: identifier) #expect(retrieved == data) let exists = try await userDefaultsHelper.exists(forKey: key, appGroupIdentifier: identifier) #expect(exists == true) let allKeys = try await userDefaultsHelper.allKeys(appGroupIdentifier: identifier) #expect(allKeys.contains(key)) try await userDefaultsHelper.remove(forKey: key, appGroupIdentifier: identifier) } @Test func fileStorageAppGroupError() async throws { let identifier = "invalid.group.id" let data = Data("data".utf8) // Simulators often return a URL even for invalid group IDs. // On real devices/authorized environments, it returns nil if not matched. if FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: identifier) == nil { await #expect(throws: StorageError.invalidAppGroupIdentifier(identifier)) { try await fileStorageHelper.write( data, to: .documents, fileName: "test.txt", appGroupIdentifier: identifier ) } } } }