1 contributor
import XCTest
@testable import HealthProbe
final class PrototypeStoreResetPolicyTests: XCTestCase {
private var temporaryDirectory: URL!
private var defaults: UserDefaults!
private var defaultsSuiteName: String!
override func setUpWithError() throws {
temporaryDirectory = FileManager.default.temporaryDirectory
.appending(path: "HealthProbeResetTests-\(UUID().uuidString)", directoryHint: .isDirectory)
try FileManager.default.createDirectory(at: temporaryDirectory, withIntermediateDirectories: true)
defaultsSuiteName = "HealthProbeResetTests-\(UUID().uuidString)"
defaults = UserDefaults(suiteName: defaultsSuiteName)
defaults.removePersistentDomain(forName: defaultsSuiteName)
}
override func tearDownWithError() throws {
if let temporaryDirectory {
try? FileManager.default.removeItem(at: temporaryDirectory)
}
if let defaults {
defaults.removePersistentDomain(forName: defaultsSuiteName)
}
temporaryDirectory = nil
defaults = nil
defaultsSuiteName = nil
}
func testApplyIfNeededRemovesPrototypeArchiveAndCacheStoresOnce() throws {
let files = [
"HealthProbeRecords.store",
"HealthProbeRecords.store-wal",
"HealthProbeArchive.sqlite",
"HealthProbeArchive.sqlite-shm",
"HealthProbeCache.sqlite"
]
for file in files {
try Data("prototype".utf8).write(to: temporaryDirectory.appending(path: file))
}
try Data("settings".utf8).write(to: temporaryDirectory.appending(path: "HealthProbeLocal.store"))
let first = try PrototypeStoreResetPolicy.applyIfNeeded(
appSupportURL: temporaryDirectory,
defaults: defaults
)
XCTAssertTrue(first.didReset)
XCTAssertEqual(Set(first.removedURLs.map(\.lastPathComponent)), Set(files))
for file in files {
XCTAssertFalse(FileManager.default.fileExists(atPath: temporaryDirectory.appending(path: file).path))
}
XCTAssertTrue(FileManager.default.fileExists(atPath: temporaryDirectory.appending(path: "HealthProbeLocal.store").path))
let second = try PrototypeStoreResetPolicy.applyIfNeeded(
appSupportURL: temporaryDirectory,
defaults: defaults
)
XCTAssertFalse(second.didReset)
XCTAssertTrue(second.removedURLs.isEmpty)
}
func testRequestResetOnNextLaunchMarksResetPending() throws {
defaults.set(PrototypeStoreResetPolicy.currentGeneration, forKey: PrototypeStoreResetPolicy.defaultsKey)
XCTAssertFalse(PrototypeStoreResetPolicy.isResetScheduled(defaults: defaults))
PrototypeStoreResetPolicy.requestResetOnNextLaunch(defaults: defaults)
XCTAssertTrue(PrototypeStoreResetPolicy.isResetScheduled(defaults: defaults))
}
func testManualResetDeletesStoresEvenWhenGenerationIsCurrent() throws {
defaults.set(PrototypeStoreResetPolicy.currentGeneration, forKey: PrototypeStoreResetPolicy.defaultsKey)
let archiveURL = temporaryDirectory.appending(path: "HealthProbeArchive.sqlite")
let cacheWALURL = temporaryDirectory.appending(path: "HealthProbeCache.sqlite-wal")
try Data("archive".utf8).write(to: archiveURL)
try Data("cache".utf8).write(to: cacheWALURL)
PrototypeStoreResetPolicy.requestResetOnNextLaunch(defaults: defaults)
let result = try PrototypeStoreResetPolicy.applyIfNeeded(
appSupportURL: temporaryDirectory,
defaults: defaults
)
XCTAssertTrue(result.didReset)
XCTAssertEqual(Set(result.removedURLs.map(\.lastPathComponent)), Set([
"HealthProbeArchive.sqlite",
"HealthProbeCache.sqlite-wal"
]))
XCTAssertFalse(FileManager.default.fileExists(atPath: archiveURL.path))
XCTAssertFalse(FileManager.default.fileExists(atPath: cacheWALURL.path))
XCTAssertFalse(PrototypeStoreResetPolicy.isResetScheduled(defaults: defaults))
}
func testManualResetFlagSurvivesWithoutChangingGenerationKey() throws {
defaults.set(PrototypeStoreResetPolicy.currentGeneration, forKey: PrototypeStoreResetPolicy.defaultsKey)
PrototypeStoreResetPolicy.requestResetOnNextLaunch(defaults: defaults)
XCTAssertEqual(defaults.integer(forKey: PrototypeStoreResetPolicy.defaultsKey), PrototypeStoreResetPolicy.currentGeneration)
XCTAssertTrue(defaults.bool(forKey: PrototypeStoreResetPolicy.manualResetDefaultsKey))
}
}