LocalData/Tests/LocalDataTests/AppGroupTests.swift

86 lines
3.9 KiB
Swift

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
)
}
}
}
@Test func fileStorageAppGroupRoundTrip() async throws {
// In simulator, this usually returns a placeholder path
let identifier = "group.com.test.localdata"
let fileName = "appgroup_file.txt"
let data = Data("appgroup-file-content".utf8)
// Only run if the simulator/environment gives us a container
if let _ = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: identifier) {
try await fileStorageHelper.write(data, to: .documents, fileName: fileName, appGroupIdentifier: identifier)
let exists = await fileStorageHelper.exists(in: .documents, fileName: fileName, appGroupIdentifier: identifier)
#expect(exists == true)
let retrieved = try await fileStorageHelper.read(from: .documents, fileName: fileName, appGroupIdentifier: identifier)
#expect(retrieved == data)
let list = try await fileStorageHelper.list(in: .documents, appGroupIdentifier: identifier)
#expect(list.contains(fileName))
let size = try await fileStorageHelper.size(of: .documents, fileName: fileName, appGroupIdentifier: identifier)
#expect(size == Int64(data.count))
try await fileStorageHelper.delete(from: .documents, fileName: fileName, appGroupIdentifier: identifier)
let afterDelete = await fileStorageHelper.exists(in: .documents, fileName: fileName, appGroupIdentifier: identifier)
#expect(afterDelete == false)
}
}
}