Add tests for 1.1.0 features

This commit is contained in:
alexandrev-tibco
2026-02-01 14:40:10 +01:00
parent d55b999bef
commit 2437dd647f
11 changed files with 297 additions and 29 deletions
+41 -11
View File
@@ -17,7 +17,11 @@ struct BackupRecord: Identifiable {
class BackupService {
static let shared = BackupService()
private let fileManager = FileManager.default
private let fileManager: FileManager
private let dateProvider: () -> Date
private let localBaseDirectoryProvider: () -> URL?
private let iCloudBaseDirectoryProvider: () -> URL?
private let exportProvider: () -> String
private let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMdd-HHmmss"
@@ -25,16 +29,42 @@ class BackupService {
return formatter
}()
private init() {}
private init() {
fileManager = .default
dateProvider = Date.init
localBaseDirectoryProvider = { [fileManager] in
fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
}
iCloudBaseDirectoryProvider = { [fileManager] in
fileManager.url(forUbiquityContainerIdentifier: nil)
}
exportProvider = {
let context = CoreDataStack.shared.viewContext
let sources = BackupService.fetchAllSources(in: context)
let categories = BackupService.fetchAllCategories(in: context)
return ExportService.shared.exportToJSON(sources: sources, categories: categories)
}
}
init(
fileManager: FileManager = .default,
dateProvider: @escaping () -> Date,
localBaseDirectoryProvider: @escaping () -> URL?,
iCloudBaseDirectoryProvider: @escaping () -> URL?,
exportProvider: @escaping () -> String
) {
self.fileManager = fileManager
self.dateProvider = dateProvider
self.localBaseDirectoryProvider = localBaseDirectoryProvider
self.iCloudBaseDirectoryProvider = iCloudBaseDirectoryProvider
self.exportProvider = exportProvider
}
func createBackup(retentionCount: Int, includeICloud: Bool) -> [BackupRecord] {
let timestamp = dateFormatter.string(from: Date())
let timestamp = dateFormatter.string(from: dateProvider())
let fileName = "backup-\(timestamp).json"
let context = CoreDataStack.shared.viewContext
let sources = fetchAllSources(in: context)
let categories = fetchAllCategories(in: context)
let content = ExportService.shared.exportToJSON(sources: sources, categories: categories)
let content = exportProvider()
var records: [BackupRecord] = []
@@ -67,7 +97,7 @@ class BackupService {
}
private func backupDirectory() -> URL? {
guard let base = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first else {
guard let base = localBaseDirectoryProvider() else {
return nil
}
let dir = base.appendingPathComponent("Backups", isDirectory: true)
@@ -76,7 +106,7 @@ class BackupService {
}
private func iCloudBackupDirectory() -> URL? {
guard let base = fileManager.url(forUbiquityContainerIdentifier: nil) else { return nil }
guard let base = iCloudBaseDirectoryProvider() else { return nil }
let dir = base.appendingPathComponent("Documents/Backups", isDirectory: true)
ensureDirectoryExists(dir)
return dir
@@ -137,13 +167,13 @@ class BackupService {
return dateFormatter.date(from: dateString)
}
private func fetchAllSources(in context: NSManagedObjectContext) -> [InvestmentSource] {
private static func fetchAllSources(in context: NSManagedObjectContext) -> [InvestmentSource] {
let request: NSFetchRequest<InvestmentSource> = InvestmentSource.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(keyPath: \InvestmentSource.name, ascending: true)]
return (try? context.fetch(request)) ?? []
}
private func fetchAllCategories(in context: NSManagedObjectContext) -> [Category] {
private static func fetchAllCategories(in context: NSManagedObjectContext) -> [Category] {
let request: NSFetchRequest<Category> = Category.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(keyPath: \Category.name, ascending: true)]
return (try? context.fetch(request)) ?? []