Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions TableProTests/Core/Storage/ConnectionStorageSyncDeleteTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
//
// ConnectionStorageSyncDeleteTests.swift
// TableProTests
//

import Foundation
import TableProPluginKit
import Testing

@testable import TablePro

@Suite("ConnectionStorage sync delete ordering")
@MainActor
struct ConnectionStorageSyncDeleteTests {
private let storage: ConnectionStorage
private let metadata: SyncMetadataStorage
private let storageDirectory: URL

init() {
let unique = UUID().uuidString
let fileURL = FileManager.default.temporaryDirectory
.appendingPathComponent("tablepro-tests")
.appendingPathComponent("connections_\(unique).json")
storageDirectory = fileURL.deletingLastPathComponent()
try? FileManager.default.createDirectory(at: storageDirectory, withIntermediateDirectories: true)

let defaults = UserDefaults(suiteName: "com.TablePro.tests.ConnectionStorage.\(unique)")!
let syncDefaults = UserDefaults(suiteName: "com.TablePro.tests.Sync.\(unique)")!
metadata = SyncMetadataStorage(userDefaults: syncDefaults)
storage = ConnectionStorage(
fileURL: fileURL,
userDefaults: defaults,
syncTracker: SyncChangeTracker(metadataStorage: metadata)
)
}

@Test("Deleting a connection records a sync tombstone after it is persisted")
func deleteRecordsTombstoneAfterPersisting() {
let connection = TestFixtures.makeConnection()
storage.addConnection(connection)
#expect(metadata.tombstones(for: .connection).isEmpty)

storage.deleteConnection(connection)

#expect(metadata.tombstones(for: .connection).contains { $0.id == connection.id.uuidString })
}

@Test("A delete that fails to persist records no tombstone (persist before notify)")
func failedPersistenceRecordsNoTombstone() {
let connection = TestFixtures.makeConnection()
storage.addConnection(connection)
try? FileManager.default.removeItem(at: storageDirectory)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use a per-test temp directory before deleting it

When the Swift Testing runner executes storage tests concurrently, this removes the shared temporaryDirectory/tablepro-tests directory rather than only this test's fixture, because storageDirectory is just fileURL.deletingLastPathComponent(). Other tests in the repo create their own temp databases/files under the same parent (for example QueryHistoryStorageTests and SQLFavoriteStorageTests), so this test can nondeterministically delete another test's live file and cause unrelated failures; make the UUID a directory component and delete only that unique directory.

Useful? React with 👍 / 👎.


storage.deleteConnection(connection)

#expect(metadata.tombstones(for: .connection).isEmpty)
}
}
Loading