150 lines
6.0 KiB
Swift
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()
|
|
}
|
|
|
|
}
|