amplify-swift/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Migration/SQLiteMutationSyncMetadataM...

150 lines
6.0 KiB
Swift

//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
import XCTest
import SQLite
@testable import Amplify
@testable import AmplifyTestCommon
@testable import AWSDataStorePlugin
@testable import AWSPluginsCore
class SQLiteMutationSyncMetadataMigrationDelegateTests: MutationSyncMetadataMigrationTestBase {
// MARK: - Clear tests
func testClearSuccess() throws {
try setUpAllModels()
let delegate = SQLiteMutationSyncMetadataMigrationDelegate(storageAdapter: storageAdapter,
modelSchemas: modelSchemas)
try delegate.emptyMutationSyncMetadataStore()
try delegate.emptyModelSyncMetadataStore()
}
/// Ensure the deleted MutationSyncMetadata table is query-ably and empty after deleting all the records
func testDeleteMutationSyncMetadata() throws {
try setUpAllModels()
let metadata = MutationSyncMetadata(modelId: "1", modelName: "2", deleted: false, lastChangedAt: 1, version: 1)
save(metadata)
guard let mutationSyncMetadatas = queryMutationSyncMetadata() else {
XCTFail("Could not get metadata")
return
}
XCTAssertEqual(mutationSyncMetadatas.count, 1)
let delegate = SQLiteMutationSyncMetadataMigrationDelegate(storageAdapter: storageAdapter,
modelSchemas: modelSchemas)
let sql = try delegate.emptyMutationSyncMetadataStore()
XCTAssertEqual(sql, "delete from \"MutationSyncMetadata\" as root")
guard let mutationSyncMetadatas = queryMutationSyncMetadata() else {
XCTFail("Could not get metadata")
return
}
XCTAssertTrue(mutationSyncMetadatas.isEmpty)
}
/// Ensure the deleted ModelSyncMetadata table is query-ably and empty after deleting all the records
func testDeleteModelSyncMetadata() throws {
try setUpAllModels()
let metadata = ModelSyncMetadata(id: "modelName", lastSync: 1)
save(metadata)
guard let modelSyncMetadatas = queryModelSyncMetadata() else {
XCTFail("Could not get metadata")
return
}
XCTAssertEqual(modelSyncMetadatas.count, 1)
let delegate = SQLiteMutationSyncMetadataMigrationDelegate(storageAdapter: storageAdapter,
modelSchemas: modelSchemas)
let sql = try delegate.emptyModelSyncMetadataStore()
XCTAssertEqual(sql, "delete from \"ModelSyncMetadata\" as root")
guard let modelSyncMetadatasDeleted = queryModelSyncMetadata() else {
XCTFail("Could not get metadata")
return
}
XCTAssertTrue(modelSyncMetadatasDeleted.isEmpty)
}
// MARK: - Migration tests
func testMigrate() throws {
try setUpAllModels()
let restaurant = Restaurant(restaurantName: "name")
save(restaurant)
let metadata = MutationSyncMetadata(id: restaurant.id, deleted: false, lastChangedAt: 1, version: 1)
saveMutationSyncMetadata(metadata)
guard let mutationSyncMetadatas = queryMutationSyncMetadata() else {
XCTFail("Could not get metadata")
return
}
XCTAssertEqual(mutationSyncMetadatas.count, 1)
XCTAssertEqual(mutationSyncMetadatas[0].id, restaurant.id)
let delegate = SQLiteMutationSyncMetadataMigrationDelegate(storageAdapter: storageAdapter,
modelSchemas: modelSchemas)
try delegate.removeMutationSyncMetadataCopyStore()
try delegate.createMutationSyncMetadataCopyStore()
try delegate.backfillMutationSyncMetadata()
try delegate.removeMutationSyncMetadataStore()
try delegate.renameMutationSyncMetadataCopy()
guard let mutationSyncMetadatasBackfilled = queryMutationSyncMetadata() else {
XCTFail("Could not get metadata")
return
}
XCTAssertEqual(mutationSyncMetadatasBackfilled.count, 1)
XCTAssertEqual(mutationSyncMetadatasBackfilled[0].id, "\(Restaurant.modelName)|\(restaurant.id)")
guard let restaurantMetadata = try storageAdapter.queryMutationSyncMetadata(
for: restaurant.id,
modelName: Restaurant.modelName) else {
XCTFail("Could not get metadata")
return
}
XCTAssertEqual(restaurantMetadata.modelId, restaurant.id)
XCTAssertEqual(restaurantMetadata.modelName, Restaurant.modelName)
}
/// Ensure creating and dropping the MutationSyncMetadataCopy works as expected
func testDropMutationSyncMetadataCopyIfExists() throws {
let delegate = SQLiteMutationSyncMetadataMigrationDelegate(storageAdapter: storageAdapter,
modelSchemas: modelSchemas)
try delegate.removeMutationSyncMetadataCopyStore()
// Dropping the table without the table in the database is successful
let drop = try delegate.removeMutationSyncMetadataCopyStore()
XCTAssertEqual(drop, """
DROP TABLE IF EXISTS "MutationSyncMetadataCopy"
""")
// Creating the table is successful
let create = try delegate.createMutationSyncMetadataCopyStore()
let exectedCreateSQL = """
create table if not exists "MutationSyncMetadataCopy" (
"id" text primary key not null,
"deleted" integer not null,
"lastChangedAt" integer not null,
"version" integer not null
);
"""
XCTAssertEqual(create, exectedCreateSQL)
// A second create does not throw if the table has already been created
try delegate.createMutationSyncMetadataCopyStore()
// A drop is successful when the table has been created
try delegate.removeMutationSyncMetadataCopyStore()
// Dropping twice is successfully
try delegate.removeMutationSyncMetadataCopyStore()
}
}