36 lines
2.0 KiB
Swift
36 lines
2.0 KiB
Swift
// Copyright (C) 2026 ysicing
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import Foundation
|
|
import Testing
|
|
@testable import AIUsage
|
|
|
|
struct LocalUsageScanCacheTests {
|
|
@Test func revisionsInvalidateOnFileChangesAndCalendarBoundaries() throws {
|
|
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
|
|
try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true)
|
|
defer { try? FileManager.default.removeItem(at: root) }
|
|
let file = root.appendingPathComponent("usage.jsonl")
|
|
try Data("one".utf8).write(to: file)
|
|
var calendar = Calendar(identifier: .gregorian)
|
|
calendar.timeZone = TimeZone(secondsFromGMT: 0)!
|
|
let now = Date(timeIntervalSince1970: 1_800_000_000)
|
|
let initial = try LocalUsageScanCache.Revision(files: [file], now: now, calendar: calendar)
|
|
#expect(initial == (try LocalUsageScanCache.Revision(files: [file], now: now, calendar: calendar)))
|
|
#expect(initial != (try LocalUsageScanCache.Revision(files: [], now: now, calendar: calendar)))
|
|
#expect(initial != (try LocalUsageScanCache.Revision(files: [file], now: now.addingTimeInterval(86400), calendar: calendar)))
|
|
calendar.timeZone = TimeZone(secondsFromGMT: 3600)!
|
|
#expect(initial != (try LocalUsageScanCache.Revision(files: [file], now: now, calendar: calendar)))
|
|
calendar.timeZone = TimeZone(secondsFromGMT: 0)!
|
|
// 等长原子替换也必须失效,不能只比较文件大小。
|
|
try Data("two".utf8).write(to: file, options: .atomic)
|
|
#expect(initial != (try LocalUsageScanCache.Revision(files: [file], now: now, calendar: calendar)))
|
|
try Data("appended".utf8).write(to: file)
|
|
#expect(initial != (try LocalUsageScanCache.Revision(files: [file], now: now, calendar: calendar)))
|
|
try FileManager.default.removeItem(at: file)
|
|
#expect(throws: (any Error).self) {
|
|
try LocalUsageScanCache.Revision(files: [file], now: now, calendar: calendar)
|
|
}
|
|
}
|
|
}
|