diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/AWSCloudWatchLoggingPlugin.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/AWSCloudWatchLoggingPlugin.xcscheme index 29ec3fca31..ce4dcb87b8 100644 --- a/.swiftpm/xcode/xcshareddata/xcschemes/AWSCloudWatchLoggingPlugin.xcscheme +++ b/.swiftpm/xcode/xcshareddata/xcschemes/AWSCloudWatchLoggingPlugin.xcscheme @@ -1,7 +1,7 @@ + version = "1.3"> diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/Decorator/ConflictResolutionDecorator.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/Decorator/ConflictResolutionDecorator.swift index f775d80cd0..72ed86a415 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/Decorator/ConflictResolutionDecorator.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/Decorator/ConflictResolutionDecorator.swift @@ -15,12 +15,12 @@ import Foundation public struct ConflictResolutionDecorator: ModelBasedGraphQLDocumentDecorator { private let version: Int? - private let lastSync: Int? + private let lastSync: Int64? private let graphQLType: GraphQLOperationType private var primaryKeysOnly: Bool public init(version: Int? = nil, - lastSync: Int? = nil, + lastSync: Int64? = nil, graphQLType: GraphQLOperationType, primaryKeysOnly: Bool = true) { self.version = version diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+AnyModelWithSync.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+AnyModelWithSync.swift index 0e63d0b63a..b779199e53 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+AnyModelWithSync.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+AnyModelWithSync.swift @@ -49,7 +49,7 @@ protocol ModelSyncGraphQLRequestFactory { where predicate: QueryPredicate?, limit: Int?, nextToken: String?, - lastSync: Int?, + lastSync: Int64?, authType: AWSAuthorizationType?) -> GraphQLRequest } @@ -110,7 +110,7 @@ extension GraphQLRequest: ModelSyncGraphQLRequestFactory { where predicate: QueryPredicate? = nil, limit: Int? = nil, nextToken: String? = nil, - lastSync: Int? = nil, + lastSync: Int64? = nil, authType: AWSAuthorizationType? = nil) -> GraphQLRequest { syncQuery(modelSchema: modelType.schema, where: predicate, @@ -215,7 +215,7 @@ extension GraphQLRequest: ModelSyncGraphQLRequestFactory { where predicate: QueryPredicate? = nil, limit: Int? = nil, nextToken: String? = nil, - lastSync: Int? = nil, + lastSync: Int64? = nil, authType: AWSAuthorizationType? = nil) -> GraphQLRequest { var documentBuilder = ModelBasedGraphQLDocumentBuilder(modelSchema: modelSchema, operationType: .query, diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/GraphQLDocumentInputValue.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/GraphQLDocumentInputValue.swift index b5bfa0f8e1..ea33ad9334 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/GraphQLDocumentInputValue.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/GraphQLDocumentInputValue.swift @@ -37,6 +37,16 @@ extension Int: GraphQLDocumentValueRepresentable { } } +extension Int64: GraphQLDocumentValueRepresentable { + public var graphQLDocumentValue: String { + return "\(self)" + } + + public var graphQLInlineValue: String { + return "\(self)" + } +} + extension String: GraphQLDocumentValueRepresentable { public var graphQLDocumentValue: String { return self diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Sync/ModelSync/ModelSyncMetadata.swift b/AmplifyPlugins/Core/AWSPluginsCore/Sync/ModelSync/ModelSyncMetadata.swift index 07eea52406..074a86f288 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Sync/ModelSync/ModelSyncMetadata.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Sync/ModelSync/ModelSyncMetadata.swift @@ -12,10 +12,10 @@ public struct ModelSyncMetadata: Model { public let id: String /// The timestamp (in Unix seconds) at which the last sync was started, as reported by the service - public var lastSync: Int? + public var lastSync: Int64? public init(id: String, - lastSync: Int?) { + lastSync: Int64?) { self.id = id self.lastSync = lastSync } diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Sync/MutationSync/MutationSync.swift b/AmplifyPlugins/Core/AWSPluginsCore/Sync/MutationSync/MutationSync.swift index 65ec677e29..8348ac5132 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Sync/MutationSync/MutationSync.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Sync/MutationSync/MutationSync.swift @@ -87,7 +87,7 @@ public struct MutationSync: Decodable { self.syncMetadata = MutationSyncMetadata(modelId: modelIdentifier, modelName: resolvedModelName, deleted: deleted, - lastChangedAt: Int(lastChangedAt), + lastChangedAt: Int64(lastChangedAt), version: Int(version)) } } diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Sync/MutationSync/MutationSyncMetadata.swift b/AmplifyPlugins/Core/AWSPluginsCore/Sync/MutationSync/MutationSyncMetadata.swift index 8b4290e59f..1e905b5439 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Sync/MutationSync/MutationSyncMetadata.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Sync/MutationSync/MutationSyncMetadata.swift @@ -14,7 +14,7 @@ public struct MutationSyncMetadata: Model { public let id: MutationSyncIdentifier public var deleted: Bool - public var lastChangedAt: Int + public var lastChangedAt: Int64 public var version: Int static let deliminator = "|" @@ -30,14 +30,14 @@ public struct MutationSyncMetadata: Model { The format of the `id` has changed to support unique ids across mutiple model types. Use init(modelId:modelName:deleted:lastChangedAt) to pass in the `modelName`. """) - public init(id: MutationSyncIdentifier, deleted: Bool, lastChangedAt: Int, version: Int) { + public init(id: MutationSyncIdentifier, deleted: Bool, lastChangedAt: Int64, version: Int) { self.id = id self.deleted = deleted self.lastChangedAt = lastChangedAt self.version = version } - public init(modelId: ModelId, modelName: String, deleted: Bool, lastChangedAt: Int, version: Int) { + public init(modelId: ModelId, modelName: String, deleted: Bool, lastChangedAt: Int64, version: Int) { self.id = Self.identifier(modelName: modelName, modelId: modelId) self.deleted = deleted self.lastChangedAt = lastChangedAt diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Sync/PaginatedList.swift b/AmplifyPlugins/Core/AWSPluginsCore/Sync/PaginatedList.swift index d1b126e9cf..b77a11cbb9 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Sync/PaginatedList.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Sync/PaginatedList.swift @@ -11,5 +11,5 @@ import Foundation public struct PaginatedList: Decodable { public let items: [MutationSync] public let nextToken: String? - public let startedAt: Int? + public let startedAt: Int64? } diff --git a/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLDocument/GraphQLSyncQueryTests.swift b/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLDocument/GraphQLSyncQueryTests.swift index 0426140a0f..f8d225a8c4 100644 --- a/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLDocument/GraphQLSyncQueryTests.swift +++ b/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLDocument/GraphQLSyncQueryTests.swift @@ -77,7 +77,7 @@ class GraphQLSyncQueryTests: XCTestCase { XCTAssertEqual(variables["nextToken"] as? String, "token") XCTAssertNotNil(variables["filter"]) XCTAssertNotNil(variables["lastSync"]) - XCTAssertEqual(variables["lastSync"] as? Int, 123) + XCTAssertEqual(variables["lastSync"] as? Int64, 123) } func testSyncGraphQLQueryForComment() { diff --git a/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestAnyModelWithSyncTests.swift b/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestAnyModelWithSyncTests.swift index 0779edc428..7af997bad4 100644 --- a/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestAnyModelWithSyncTests.swift +++ b/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestAnyModelWithSyncTests.swift @@ -228,7 +228,7 @@ class GraphQLRequestAnyModelWithSyncTests: XCTestCase { let modelType = Post.self as Model.Type let nextToken = "nextToken" let limit = 100 - let lastSync = 123 + let lastSync: Int64 = 123 var documentBuilder = ModelBasedGraphQLDocumentBuilder(modelSchema: modelType.schema, operationType: .query) documentBuilder.add(decorator: DirectiveNameDecorator(type: .sync)) documentBuilder.add(decorator: PaginationDecorator(limit: limit, nextToken: nextToken)) @@ -274,14 +274,14 @@ class GraphQLRequestAnyModelWithSyncTests: XCTestCase { XCTAssertNotNil(variables["nextToken"]) XCTAssertEqual(variables["nextToken"] as? String, nextToken) XCTAssertNotNil(variables["lastSync"]) - XCTAssertEqual(variables["lastSync"] as? Int, lastSync) + XCTAssertEqual(variables["lastSync"] as? Int64, lastSync) } func testOptimizedSyncQueryGraphQLRequestWithFilter() { let modelType = Post.self as Model.Type let nextToken = "nextToken" let limit = 100 - let lastSync = 123 + let lastSync: Int64 = 123 let postId = "123" let predicate = Post.CodingKeys.id.eq(postId) let request = GraphQLRequest.syncQuery( @@ -310,7 +310,7 @@ class GraphQLRequestAnyModelWithSyncTests: XCTestCase { let modelType = Post.self as Model.Type let nextToken = "nextToken" let limit = 100 - let lastSync = 123 + let lastSync: Int64 = 123 let postId = "123" let altPostId = "456" let predicate = Post.CodingKeys.id.eq(postId) || Post.CodingKeys.id.eq(altPostId) diff --git a/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestAuthRuleTests.swift b/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestAuthRuleTests.swift index 1e71d4db58..7c24a3182a 100644 --- a/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestAuthRuleTests.swift +++ b/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestAuthRuleTests.swift @@ -303,7 +303,7 @@ class GraphQLRequestAuthRuleTests: XCTestCase { let modelType = Article.self as Model.Type let nextToken = "nextToken" let limit = 100 - let lastSync = 123 + let lastSync: Int64 = 123 var documentBuilder = ModelBasedGraphQLDocumentBuilder(modelSchema: modelType.schema, operationType: .query) documentBuilder.add(decorator: DirectiveNameDecorator(type: .sync)) documentBuilder.add(decorator: PaginationDecorator(limit: limit, nextToken: nextToken)) @@ -347,6 +347,6 @@ class GraphQLRequestAuthRuleTests: XCTestCase { XCTAssertNotNil(variables["nextToken"]) XCTAssertEqual(variables["nextToken"] as? String, nextToken) XCTAssertNotNil(variables["lastSync"]) - XCTAssertEqual(variables["lastSync"] as? Int, lastSync) + XCTAssertEqual(variables["lastSync"] as? Int64, lastSync) } } diff --git a/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestSyncCustomPrimaryKeyWithMultipleFieldsTests.swift b/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestSyncCustomPrimaryKeyWithMultipleFieldsTests.swift index 29051f17f2..694dcc8600 100644 --- a/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestSyncCustomPrimaryKeyWithMultipleFieldsTests.swift +++ b/AmplifyPlugins/Core/AWSPluginsCoreTests/Model/GraphQLRequest/GraphQLRequestSyncCustomPrimaryKeyWithMultipleFieldsTests.swift @@ -137,7 +137,7 @@ class GraphQLRequestSyncCustomPrimaryKeyWithMultipleFieldsTests: XCTestCase { func testSyncQueryGraphQLRequestWithDateInPK() throws { let nextToken = "nextToken" let limit = 100 - let lastSync = 123 + let lastSync: Int64 = 123 var documentBuilder = ModelBasedGraphQLDocumentBuilder(modelName: CustomerWithMultipleFieldsinPK.modelName, operationType: .query) documentBuilder.add(decorator: DirectiveNameDecorator(type: .sync)) @@ -188,7 +188,7 @@ class GraphQLRequestSyncCustomPrimaryKeyWithMultipleFieldsTests: XCTestCase { XCTAssertNotNil(variables["nextToken"]) XCTAssertEqual(variables["nextToken"] as? String, nextToken) XCTAssertNotNil(variables["lastSync"]) - XCTAssertEqual(variables["lastSync"] as? Int, lastSync) + XCTAssertEqual(variables["lastSync"] as? Int64, lastSync) } } diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/AWSDataStorePlugin.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/AWSDataStorePlugin.swift index c929c872fe..5f775a0e69 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/AWSDataStorePlugin.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/AWSDataStorePlugin.swift @@ -55,9 +55,13 @@ final public class AWSDataStorePlugin: DataStoreCategoryPlugin { } } - /// No-argument init that uses defaults for all providers + #if os(watchOS) + /// Initializer + /// - Parameters: + /// - modelRegistration: Register DataStore models. + /// - dataStoreConfiguration: Configuration object for DataStore public init(modelRegistration: AmplifyModelRegistration, - configuration dataStoreConfiguration: DataStoreConfiguration = .default) { + configuration dataStoreConfiguration: DataStoreConfiguration) { self.modelRegistration = modelRegistration self.configuration = InternalDatastoreConfiguration( isSyncEnabled: false, @@ -77,10 +81,37 @@ final public class AWSDataStorePlugin: DataStoreCategoryPlugin { self.dataStorePublisher = DataStorePublisher() self.dispatchedModelSyncedEvents = [:] } + #else + /// Initializer + /// - Parameters: + /// - modelRegistration: Register DataStore models. + /// - dataStoreConfiguration: Configuration object for DataStore + public init(modelRegistration: AmplifyModelRegistration, + configuration dataStoreConfiguration: DataStoreConfiguration = .default) { + self.modelRegistration = modelRegistration + self.configuration = InternalDatastoreConfiguration( + isSyncEnabled: false, + validAPIPluginKey: "awsAPIPlugin", + validAuthPluginKey: "awsCognitoAuthPlugin", + pluginConfiguration: dataStoreConfiguration) + self.storageEngineBehaviorFactory = + StorageEngine.init( + isSyncEnabled: + dataStoreConfiguration: + validAPIPluginKey: + validAuthPluginKey: + modelRegistryVersion: + userDefault: + ) + self.dataStorePublisher = DataStorePublisher() + self.dispatchedModelSyncedEvents = [:] + } + #endif + /// Internal initializer for testing init(modelRegistration: AmplifyModelRegistration, - configuration dataStoreConfiguration: DataStoreConfiguration = .default, + configuration dataStoreConfiguration: DataStoreConfiguration = .testDefault(), storageEngineBehaviorFactory: StorageEngineBehaviorFactory? = nil, dataStorePublisher: ModelSubcriptionBehavior, operationQueue: OperationQueue = OperationQueue(), diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Configuration/DataStoreConfiguration+Helper.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Configuration/DataStoreConfiguration+Helper.swift index ae530e0bb0..cf518f0882 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Configuration/DataStoreConfiguration+Helper.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Configuration/DataStoreConfiguration+Helper.swift @@ -15,6 +15,42 @@ extension DataStoreConfiguration { public static let defaultSyncMaxRecords: UInt = 10_000 public static let defaultSyncPageSize: UInt = 1_000 + #if os(watchOS) + /// Creates a custom configuration. The only required property is `conflictHandler`. + /// + /// - Parameters: + /// - errorHandler: a callback function called on unhandled errors + /// - conflictHandler: a callback called when a conflict could not be resolved by the service + /// - syncInterval: how often the sync engine will run (in seconds) + /// - syncMaxRecords: the number of records to sync per execution + /// - syncPageSize: the page size of each sync execution + /// - authModeStrategy: authorization strategy (.default | multiauth) + /// - disableSubscriptions: called before establishing subscriptions. Return true to disable subscriptions. + /// - Returns: an instance of `DataStoreConfiguration` with the passed parameters. + public static func custom( + errorHandler: @escaping DataStoreErrorHandler = { error in + Amplify.Logging.error(error: error) + }, + conflictHandler: @escaping DataStoreConflictHandler = { _, resolve in + resolve(.applyRemote) + }, + syncInterval: TimeInterval = DataStoreConfiguration.defaultSyncInterval, + syncMaxRecords: UInt = DataStoreConfiguration.defaultSyncMaxRecords, + syncPageSize: UInt = DataStoreConfiguration.defaultSyncPageSize, + syncExpressions: [DataStoreSyncExpression] = [], + authModeStrategy: AuthModeStrategyType = .default, + disableSubscriptions: @escaping () -> Bool + ) -> DataStoreConfiguration { + return DataStoreConfiguration(errorHandler: errorHandler, + conflictHandler: conflictHandler, + syncInterval: syncInterval, + syncMaxRecords: syncMaxRecords, + syncPageSize: syncPageSize, + syncExpressions: syncExpressions, + authModeStrategy: authModeStrategy, + disableSubscriptions: disableSubscriptions) + } + #else /// Creates a custom configuration. The only required property is `conflictHandler`. /// /// - Parameters: @@ -46,10 +82,32 @@ extension DataStoreConfiguration { syncExpressions: syncExpressions, authModeStrategy: authModeStrategy) } - + #endif + + #if os(watchOS) + /// Default configuration with subscriptions disabled for watchOS. DataStore uses subscriptions via websockets, + /// which work on the watchOS simulator but not on the device. Running DataStore on watchOS with subscriptions + /// enabled is only possible during special circumstances such as actively streaming audio. + /// See https://github.com/aws-amplify/amplify-swift/pull/3368 for more details. + public static var subscriptionsDisabled: DataStoreConfiguration { + .custom(disableSubscriptions: { false }) + } + #else /// The default configuration. public static var `default`: DataStoreConfiguration { .custom() } - + #endif + + #if os(watchOS) + /// Internal method for testing + static func testDefault(disableSubscriptions: @escaping () -> Bool = { false }) -> DataStoreConfiguration { + .custom(disableSubscriptions: disableSubscriptions) + } + #else + /// Internal method for testing + static func testDefault() -> DataStoreConfiguration { + .custom() + } + #endif } diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Configuration/DataStoreConfiguration.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Configuration/DataStoreConfiguration.swift index f491600882..96271bd008 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Configuration/DataStoreConfiguration.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Configuration/DataStoreConfiguration.swift @@ -70,6 +70,27 @@ public struct DataStoreConfiguration { /// Authorization mode strategy public var authModeStrategyType: AuthModeStrategyType + public let disableSubscriptions: () -> Bool + + #if os(watchOS) + init(errorHandler: @escaping DataStoreErrorHandler, + conflictHandler: @escaping DataStoreConflictHandler, + syncInterval: TimeInterval, + syncMaxRecords: UInt, + syncPageSize: UInt, + syncExpressions: [DataStoreSyncExpression], + authModeStrategy: AuthModeStrategyType = .default, + disableSubscriptions: @escaping () -> Bool) { + self.errorHandler = errorHandler + self.conflictHandler = conflictHandler + self.syncInterval = syncInterval + self.syncMaxRecords = syncMaxRecords + self.syncPageSize = syncPageSize + self.syncExpressions = syncExpressions + self.authModeStrategyType = authModeStrategy + self.disableSubscriptions = disableSubscriptions + } + #else init(errorHandler: @escaping DataStoreErrorHandler, conflictHandler: @escaping DataStoreConflictHandler, syncInterval: TimeInterval, @@ -84,6 +105,7 @@ public struct DataStoreConfiguration { self.syncPageSize = syncPageSize self.syncExpressions = syncExpressions self.authModeStrategyType = authModeStrategy + self.disableSubscriptions = { false } } - + #endif } diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Migration/MutationSyncMetadataCopy.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Migration/MutationSyncMetadataCopy.swift index 592f0a62fd..855b3cf079 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Migration/MutationSyncMetadataCopy.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Migration/MutationSyncMetadataCopy.swift @@ -12,7 +12,7 @@ extension MutationSyncMetadataMigration { public struct MutationSyncMetadataCopy: Model { public let id: String public var deleted: Bool - public var lastChangedAt: Int + public var lastChangedAt: Int64 public var version: Int // MARK: - CodingKeys diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/ModelValueConverter+SQLite.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/ModelValueConverter+SQLite.swift index 369fb58981..ab1a85aed9 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/ModelValueConverter+SQLite.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/ModelValueConverter+SQLite.swift @@ -31,7 +31,13 @@ public struct SQLiteModelValueConverter: ModelValueConverter { case .string: return value as? String case .int: - return value as? Int + if let intValue = value as? Int { + return intValue + } + if let int64Value = value as? Int64 { + return int64Value + } + return nil case .double: return value as? Double case .date, .dateTime, .time: diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Subscribe/Support/Model+Sort.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Subscribe/Support/Model+Sort.swift index b9bdbfaf20..4c3b72f55c 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Subscribe/Support/Model+Sort.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Subscribe/Support/Model+Sort.swift @@ -103,13 +103,19 @@ extension ModelSchema { value2Optional: value2Optional) .sortComparator(sortOrder: sortOrder) case .int, .timestamp: - guard let value1Optional = value1 as? Int?, let value2Optional = value2 as? Int? else { - return false + if let value1Optional = value1 as? Int?, let value2Optional = value2 as? Int? { + return ModelValueCompare(value1Optional: value1Optional, + value2Optional: value2Optional) + .sortComparator(sortOrder: sortOrder) } - return ModelValueCompare(value1Optional: value1Optional, - value2Optional: value2Optional) - .sortComparator(sortOrder: sortOrder) - + + if let value1Optional = value1 as? Int64?, let value2Optional = value2 as? Int64? { + return ModelValueCompare(value1Optional: value1Optional, + value2Optional: value2Optional) + .sortComparator(sortOrder: sortOrder) + } + + return false case .double: guard let value1Optional = value1 as? Double?, let value2Optional = value2 as? Double? else { return false diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/Events/OutboxMutationEvent.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/Events/OutboxMutationEvent.swift index 0401663f6f..3fdf36b4d7 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/Events/OutboxMutationEvent.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/Events/OutboxMutationEvent.swift @@ -36,7 +36,7 @@ public struct OutboxMutationEvent { public struct OutboxMutationEventElement { public let model: Model public var version: Int? - public var lastChangedAt: Int? + public var lastChangedAt: Int64? public var deleted: Bool? } } diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/InitialSync/InitialSyncOperation.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/InitialSync/InitialSyncOperation.swift index d90392260a..a81f840cd0 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/InitialSync/InitialSyncOperation.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/InitialSync/InitialSyncOperation.swift @@ -67,7 +67,7 @@ final class InitialSyncOperation: AsynchronousOperation { } } - private func getLastSyncTime() -> Int? { + private func getLastSyncTime() -> Int64? { guard !isCancelled else { finish(result: .successfulVoid) return nil @@ -109,7 +109,7 @@ final class InitialSyncOperation: AsynchronousOperation { } } - private func query(lastSyncTime: Int?, nextToken: String? = nil) async { + private func query(lastSyncTime: Int64?, nextToken: String? = nil) async { guard !isCancelled else { finish(result: .successfulVoid) return @@ -160,7 +160,7 @@ final class InitialSyncOperation: AsynchronousOperation { /// Disposes of the query results: Stops if error, reconciles results if success, and kick off a new query if there /// is a next token - private func handleQueryResults(lastSyncTime: Int?, + private func handleQueryResults(lastSyncTime: Int64?, graphQLResult: Result>) { guard !isCancelled else { finish(result: .successfulVoid) @@ -198,7 +198,7 @@ final class InitialSyncOperation: AsynchronousOperation { } } - private func updateModelSyncMetadata(lastSyncTime: Int?) { + private func updateModelSyncMetadata(lastSyncTime: Int64?) { guard !isCancelled else { finish(result: .successfulVoid) return diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/RemoteSyncEngine.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/RemoteSyncEngine.swift index a32648d653..b361e0ab22 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/RemoteSyncEngine.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/RemoteSyncEngine.swift @@ -86,7 +86,7 @@ class RemoteSyncEngine: RemoteSyncEngineBehavior { authModeStrategy: resolvedAuthStrategy) let reconciliationQueueFactory = reconciliationQueueFactory ?? - AWSIncomingEventReconciliationQueue.init(modelSchemas:api:storageAdapter:syncExpressions:auth:authModeStrategy:modelReconciliationQueueFactory:) + AWSIncomingEventReconciliationQueue.init(modelSchemas:api:storageAdapter:syncExpressions:auth:authModeStrategy:modelReconciliationQueueFactory:disableSubscriptions:) let initialSyncOrchestratorFactory = initialSyncOrchestratorFactory ?? AWSInitialSyncOrchestrator.init(dataStoreConfiguration:authModeStrategy:api:reconciliationQueue:storageAdapter:) @@ -289,7 +289,8 @@ class RemoteSyncEngine: RemoteSyncEngineBehavior { dataStoreConfiguration.syncExpressions, auth, authModeStrategy, - nil) + nil, + dataStoreConfiguration.disableSubscriptions) reconciliationQueueSink = reconciliationQueue? .publisher .sink( diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/AWSIncomingEventReconciliationQueue.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/AWSIncomingEventReconciliationQueue.swift index c9994ccbdd..0f116dec8e 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/AWSIncomingEventReconciliationQueue.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/AWSIncomingEventReconciliationQueue.swift @@ -10,6 +10,8 @@ import AWSPluginsCore import Combine import Foundation +typealias DisableSubscriptions = () -> Bool + // Used for testing: typealias IncomingEventReconciliationQueueFactory = ([ModelSchema], @@ -18,7 +20,8 @@ typealias IncomingEventReconciliationQueueFactory = [DataStoreSyncExpression], AuthCategoryBehavior?, AuthModeStrategy, - ModelReconciliationQueueFactory? + ModelReconciliationQueueFactory?, + @escaping DisableSubscriptions ) async -> IncomingEventReconciliationQueue final class AWSIncomingEventReconciliationQueue: IncomingEventReconciliationQueue { @@ -48,7 +51,8 @@ final class AWSIncomingEventReconciliationQueue: IncomingEventReconciliationQueu syncExpressions: [DataStoreSyncExpression], auth: AuthCategoryBehavior? = nil, authModeStrategy: AuthModeStrategy, - modelReconciliationQueueFactory: ModelReconciliationQueueFactory? = nil) async { + modelReconciliationQueueFactory: ModelReconciliationQueueFactory? = nil, + disableSubscriptions: @escaping () -> Bool = { false } ) async { self.modelSchemasCount = modelSchemas.count self.modelReconciliationQueueSinks.set([:]) self.eventReconciliationQueueTopic = CurrentValueSubject(.idle) @@ -67,6 +71,19 @@ final class AWSIncomingEventReconciliationQueue: IncomingEventReconciliationQueu self.connectionStatusSerialQueue = DispatchQueue(label: "com.amazonaws.DataStore.AWSIncomingEventReconciliationQueue") + let subscriptionsDisabled = disableSubscriptions() + + #if targetEnvironment(simulator) && os(watchOS) + if !subscriptionsDisabled { + let message = """ + DataStore uses subscriptions via websockets, which work on the watchOS simulator but not on the device. + Running DataStore on watchOS with subscriptions enabled is only possible during special circumstances + such as actively streaming audio. See https://github.com/aws-amplify/amplify-swift/pull/3368 for more details. + """ + self.log.verbose(message) + } + #endif + for modelSchema in modelSchemas { let modelName = modelSchema.name let syncExpression = syncExpressions.first(where: { @@ -78,13 +95,13 @@ final class AWSIncomingEventReconciliationQueue: IncomingEventReconciliationQueu continue } let queue = await self.modelReconciliationQueueFactory(modelSchema, - storageAdapter, - api, - reconcileAndSaveQueue, - modelPredicate, - auth, - authModeStrategy, - nil) + storageAdapter, + api, + reconcileAndSaveQueue, + modelPredicate, + auth, + authModeStrategy, + subscriptionsDisabled ? OperationDisabledIncomingSubscriptionEventPublisher() : nil) reconciliationQueues.with { reconciliationQueues in reconciliationQueues[modelName] = queue @@ -190,14 +207,15 @@ extension AWSIncomingEventReconciliationQueue: DefaultLogger { // MARK: - Static factory extension AWSIncomingEventReconciliationQueue { - static let factory: IncomingEventReconciliationQueueFactory = { modelSchemas, api, storageAdapter, syncExpressions, auth, authModeStrategy, _ in + static let factory: IncomingEventReconciliationQueueFactory = { modelSchemas, api, storageAdapter, syncExpressions, auth, authModeStrategy, _, disableSubscriptions in await AWSIncomingEventReconciliationQueue(modelSchemas: modelSchemas, - api: api, - storageAdapter: storageAdapter, - syncExpressions: syncExpressions, - auth: auth, - authModeStrategy: authModeStrategy, - modelReconciliationQueueFactory: nil) + api: api, + storageAdapter: storageAdapter, + syncExpressions: syncExpressions, + auth: auth, + authModeStrategy: authModeStrategy, + modelReconciliationQueueFactory: nil, + disableSubscriptions: disableSubscriptions) } } diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/OperationDisabledSubscriptionEventPublisher.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/OperationDisabledSubscriptionEventPublisher.swift new file mode 100644 index 0000000000..277b4685d8 --- /dev/null +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/OperationDisabledSubscriptionEventPublisher.swift @@ -0,0 +1,31 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Amplify +import AWSPluginsCore +import Combine + +final class OperationDisabledIncomingSubscriptionEventPublisher: IncomingSubscriptionEventPublisher { + + private let subscriptionEventSubject: PassthroughSubject + + var publisher: AnyPublisher { + return subscriptionEventSubject.eraseToAnyPublisher() + } + + init() { + self.subscriptionEventSubject = PassthroughSubject() + + let apiError = APIError.operationError(AppSyncErrorType.operationDisabled.rawValue, "", nil) + let dataStoreError = DataStoreError.api(apiError, nil) + subscriptionEventSubject.send(completion: .failure(dataStoreError)) + + } + + func cancel() { + } +} diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/ReconcileAndLocalSave/AWSModelReconciliationQueue.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/ReconcileAndLocalSave/AWSModelReconciliationQueue.swift index 7f34881c49..86c7aca2c9 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/ReconcileAndLocalSave/AWSModelReconciliationQueue.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/SubscriptionSync/ReconcileAndLocalSave/AWSModelReconciliationQueue.swift @@ -209,8 +209,8 @@ final class AWSModelReconciliationQueue: ModelReconciliationQueue { return } if case let .api(error, _) = dataStoreError, - case let APIError.operationError(_, _, underlyingError) = error, - isOperationDisabledError(underlyingError) { + case let APIError.operationError(errorMessage, _, underlyingError) = error, + isOperationDisabledError(errorMessage, underlyingError) { log.verbose("[InitializeSubscription.3] AWSModelReconciliationQueue determined isOperationDisabledError \(modelSchema.name)") modelReconciliationQueueSubject.send(.disconnected(modelName: modelSchema.name, reason: .operationDisabled)) return @@ -284,7 +284,12 @@ extension AWSModelReconciliationQueue { return false } - private func isOperationDisabledError(_ error: Error?) -> Bool { + private func isOperationDisabledError(_ errorMessage: String?, _ error: Error?) -> Bool { + if let errorMessage = errorMessage, + case .operationDisabled = AppSyncErrorType(errorMessage) { + return true + } + if let responseError = error as? GraphQLResponseError, let graphQLError = graphqlErrors(from: responseError)?.first, let errorTypeValue = errorTypeValueFrom(graphQLError: graphQLError), diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/Support/Model+Compare.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/Support/Model+Compare.swift index 9860ae68bb..ca9595dbf1 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/Support/Model+Compare.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/Support/Model+Compare.swift @@ -56,12 +56,17 @@ extension ModelSchema { return false } case .int: - guard let value1Optional = value1 as? Int?, let value2Optional = value2 as? Int? else { - return false + if let value1Optional = value1 as? Int?, let value2Optional = value2 as? Int? { + if !compare(value1Optional, value2Optional) { + return false + } } - if !compare(value1Optional, value2Optional) { - return false + if let value1Optional = value1 as? Int64?, let value2Optional = value2 as? Int64? { + if !compare(value1Optional, value2Optional) { + return false + } } + return false case .double: guard let value1Optional = value1 as? Double?, let value2Optional = value2 as? Double? else { return false diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/AWSDataStorePluginAmplifyVersionableTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/AWSDataStorePluginAmplifyVersionableTests.swift index 19f710bfba..410ac16eec 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/AWSDataStorePluginAmplifyVersionableTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/AWSDataStorePluginAmplifyVersionableTests.swift @@ -13,7 +13,12 @@ import AWSDataStorePlugin class AWSDataStorePluginAmplifyVersionableTests: XCTestCase { func testVersionExists() { + #if os(watchOS) + let plugin = AWSDataStorePlugin(modelRegistration: AmplifyModels(), + configuration: .subscriptionsDisabled) + #else let plugin = AWSDataStorePlugin(modelRegistration: AmplifyModels()) + #endif XCTAssertNotNil(plugin.version) } diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/DataStoreCategoryConfigurationTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/DataStoreCategoryConfigurationTests.swift index a60dcac2d7..8aa3354572 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/DataStoreCategoryConfigurationTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/DataStoreCategoryConfigurationTests.swift @@ -16,7 +16,13 @@ class AWSDataStorePluginConfigurationTests: XCTestCase { } func testDoesNotThrowOnMissingConfig() throws { + #if os(watchOS) + let plugin = AWSDataStorePlugin(modelRegistration: TestModelRegistration(), + configuration: .subscriptionsDisabled) + #else let plugin = AWSDataStorePlugin(modelRegistration: TestModelRegistration()) + + #endif try Amplify.add(plugin: plugin) let categoryConfig = DataStoreCategoryConfiguration(plugins: ["NonExistentPlugin": true]) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/SQLiteStorageEngineAdapterJsonTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/SQLiteStorageEngineAdapterJsonTests.swift index c1543d89d4..d71082ff45 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/SQLiteStorageEngineAdapterJsonTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/SQLiteStorageEngineAdapterJsonTests.swift @@ -36,9 +36,9 @@ class SQLiteStorageEngineAdapterJsonTests: XCTestCase { try storageAdapter.setUp(modelSchemas: StorageEngine.systemModelSchemas) let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default) + dataStoreConfiguration: .testDefault()) storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/SQLiteStorageEngineAdapterTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/SQLiteStorageEngineAdapterTests.swift index 16870f2ed4..c14e909701 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/SQLiteStorageEngineAdapterTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/SQLiteStorageEngineAdapterTests.swift @@ -676,7 +676,7 @@ class SQLiteStorageEngineAdapterTests: BaseDataStoreTests { let metadata = MutationSyncMetadata(modelId: modelId, modelName: modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) storageAdapter.save(metadata) { result in @@ -700,12 +700,12 @@ class SQLiteStorageEngineAdapterTests: BaseDataStoreTests { let metadata1 = MutationSyncMetadata(modelId: UUID().uuidString, modelName: modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let metadata2 = MutationSyncMetadata(modelId: UUID().uuidString, modelName: modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let saveMetadata1 = expectation(description: "save metadata1 success") diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/StorageAdapterMutationSyncTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/StorageAdapterMutationSyncTests.swift index f33024288b..07c9e922b2 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/StorageAdapterMutationSyncTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Core/StorageAdapterMutationSyncTests.swift @@ -32,7 +32,7 @@ class StorageAdapterMutationSyncTests: BaseDataStoreTests { MutationSyncMetadata(modelId: $0.id, modelName: Post.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) } populateData(syncMetadataList) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/CascadeDeleteOperationTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/CascadeDeleteOperationTests.swift index dd3a7dd4ea..f7eea5c6aa 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/CascadeDeleteOperationTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/CascadeDeleteOperationTests.swift @@ -29,7 +29,7 @@ class CascadeDeleteOperationTests: StorageEngineTestsBase { syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEnginePublisherTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEnginePublisherTests.swift index 3fabbb069d..6f189b06bb 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEnginePublisherTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEnginePublisherTests.swift @@ -24,7 +24,7 @@ class StorageEnginePublisherTests: StorageEngineTestsBase { try storageAdapter.setUp(modelSchemas: StorageEngine.systemModelSchemas) syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsDelete.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsDelete.swift index 810db0030f..14e44c62ac 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsDelete.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsDelete.swift @@ -28,7 +28,7 @@ class StorageEngineTestsDelete: StorageEngineTestsBase { syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsHasMany.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsHasMany.swift index daa980866b..98234107dc 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsHasMany.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsHasMany.swift @@ -29,7 +29,7 @@ class StorageEngineTestsHasMany: StorageEngineTestsBase { syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsHasOne.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsHasOne.swift index 6adf34fd54..14133c3701 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsHasOne.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsHasOne.swift @@ -28,7 +28,7 @@ class StorageEngineTestsHasOne: StorageEngineTestsBase { syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsLazyPostComment4V2Tests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsLazyPostComment4V2Tests.swift index e58def1ef1..f6801b0394 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsLazyPostComment4V2Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsLazyPostComment4V2Tests.swift @@ -29,7 +29,7 @@ final class StorageEngineTestsLazyPostComment4V2Tests: StorageEngineTestsBase, S syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsManyToMany.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsManyToMany.swift index d7e04398d4..4280e73a26 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsManyToMany.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsManyToMany.swift @@ -28,7 +28,7 @@ class StorageEngineTestsManyToMany: StorageEngineTestsBase { syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsOptionalAssociation.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsOptionalAssociation.swift index e430554d8e..ef740ed914 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsOptionalAssociation.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsOptionalAssociation.swift @@ -28,7 +28,7 @@ class StorageEngineTestsOptionalAssociation: StorageEngineTestsBase { syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsPostComment4V2Tests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsPostComment4V2Tests.swift index addf726da5..d1d8ffc064 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsPostComment4V2Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsPostComment4V2Tests.swift @@ -28,7 +28,7 @@ final class StorageEngineTestsPostComment4V2Tests: StorageEngineTestsBase, Share syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsSQLiteIndex.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsSQLiteIndex.swift index dcb8fa1c88..c13a16895d 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsSQLiteIndex.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Storage/StorageEngineTestsSQLiteIndex.swift @@ -34,7 +34,7 @@ class StorageEngineTestsSQLiteIndex: StorageEngineTestsBase { try storageAdapter.setUp(modelSchemas: StorageEngine.systemModelSchemas) syncEngine = MockRemoteSyncEngine() storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Subscribe/ObserveQueryTaskRunnerTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Subscribe/ObserveQueryTaskRunnerTests.swift index a172663280..75ede3ddd9 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Subscribe/ObserveQueryTaskRunnerTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Subscribe/ObserveQueryTaskRunnerTests.swift @@ -43,7 +43,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: false), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let snapshots = taskRunner.sequence @@ -96,7 +96,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: dispatchedModelSyncedEvent, dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let snapshots = taskRunner.sequence @@ -157,7 +157,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: false), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let post = Post(title: "model1", @@ -204,7 +204,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: false), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let snapshots = taskRunner.sequence @@ -260,7 +260,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: false), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let snapshots = taskRunner.sequence @@ -320,7 +320,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: false), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let snapshots = taskRunner.sequence @@ -369,7 +369,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: false), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let snapshots = taskRunner.sequence @@ -409,7 +409,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: false), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let snapshots = taskRunner.sequence @@ -455,7 +455,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: false), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let snapshots = taskRunner.sequence @@ -497,7 +497,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: nil, storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: false), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) let post = Post(title: "model1", @@ -556,7 +556,7 @@ class ObserveQueryTaskRunnerTests: XCTestCase { sortInput: QuerySortInput.ascending(Post.keys.id).asSortDescriptors(), storageEngine: storageEngine, dataStorePublisher: dataStorePublisher, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), dispatchedModelSyncedEvent: AtomicValue(initialValue: true), dataStoreStatePublisher: dataStoreStateSubject.eraseToAnyPublisher()) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/APICategoryDependencyTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/APICategoryDependencyTests.swift index 0c560327fe..c578764c7c 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/APICategoryDependencyTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/APICategoryDependencyTests.swift @@ -63,11 +63,11 @@ extension APICategoryDependencyTests { try storageAdapter.setUp(modelSchemas: StorageEngine.systemModelSchemas) let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default) + dataStoreConfiguration: .testDefault()) let validAPIPluginKey = "MockAPICategoryPlugin" let validAuthPluginKey = "MockAuthCategoryPlugin" let storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOperationSyncExpressionTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOperationSyncExpressionTests.swift index bd78525e71..d2e0d60242 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOperationSyncExpressionTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOperationSyncExpressionTests.swift @@ -37,7 +37,14 @@ class InitialSyncOperationSyncExpressionTests: XCTestCase { func initialSyncOperation(withSyncExpression syncExpression: DataStoreSyncExpression, responder: APIPluginQueryResponder) -> InitialSyncOperation { apiPlugin.responders[.queryRequestListener] = responder - let configuration = DataStoreConfiguration.custom(syncPageSize: 10, syncExpressions: [syncExpression]) + #if os(watchOS) + let configuration = DataStoreConfiguration.custom(syncPageSize: 10, + syncExpressions: [syncExpression], + disableSubscriptions: { false }) + #else + let configuration = DataStoreConfiguration.custom(syncPageSize: 10, + syncExpressions: [syncExpression]) + #endif return InitialSyncOperation( modelSchema: MockSynced.schema, api: apiPlugin, diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOperationTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOperationTests.swift index 405bb0f18b..d5fd935321 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOperationTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOperationTests.swift @@ -29,7 +29,7 @@ class InitialSyncOperationTests: XCTestCase { /// - It reads sync metadata from storage func testReadsMetadata() { let responder = QueryRequestListenerResponder> { _, listener in - let startDateMilliseconds = Int(Date().timeIntervalSince1970) * 1_000 + let startDateMilliseconds = Int64(Date().timeIntervalSince1970) * 1_000 let list = PaginatedList(items: [], nextToken: nil, startedAt: startDateMilliseconds) let event: GraphQLOperation>.OperationResult = .success(.success(list)) listener?(event) @@ -51,7 +51,7 @@ class InitialSyncOperationTests: XCTestCase { api: apiPlugin, reconciliationQueue: reconciliationQueue, storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy()) let syncStartedReceived = expectation(description: "Sync started received, sync operation started") @@ -90,7 +90,7 @@ class InitialSyncOperationTests: XCTestCase { func testQueriesAPI() { let apiWasQueried = expectation(description: "API was queried for a PaginatedList of AnyModel") let responder = QueryRequestListenerResponder> { _, listener in - let startDateMilliseconds = Int(Date().timeIntervalSince1970) * 1_000 + let startDateMilliseconds = Int64(Date().timeIntervalSince1970) * 1_000 let list = PaginatedList(items: [], nextToken: nil, startedAt: startDateMilliseconds) let event: GraphQLOperation>.OperationResult = .success(.success(list)) listener?(event) @@ -110,7 +110,7 @@ class InitialSyncOperationTests: XCTestCase { api: apiPlugin, reconciliationQueue: reconciliationQueue, storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy()) let syncStartedReceived = expectation(description: "Sync started received, sync operation started") @@ -148,7 +148,7 @@ class InitialSyncOperationTests: XCTestCase { /// - The method invokes a completion callback when complete func testInvokesPublisherCompletion() { let responder = QueryRequestListenerResponder> { _, listener in - let startDateMilliseconds = Int(Date().timeIntervalSince1970) * 1_000 + let startDateMilliseconds = Int64(Date().timeIntervalSince1970) * 1_000 let list = PaginatedList(items: [], nextToken: nil, startedAt: startDateMilliseconds) let event: GraphQLOperation>.OperationResult = .success(.success(list)) listener?(event) @@ -167,7 +167,7 @@ class InitialSyncOperationTests: XCTestCase { api: apiPlugin, reconciliationQueue: reconciliationQueue, storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy()) let syncCompletionReceived = expectation(description: "Sync completion received, sync operation is complete") @@ -203,7 +203,7 @@ class InitialSyncOperationTests: XCTestCase { var nextTokens = ["token1", "token2"] let responder = QueryRequestListenerResponder> { _, listener in - let startedAt = Int(Date().timeIntervalSince1970) + let startedAt = Int64(Date().timeIntervalSince1970) let nextToken = nextTokens.isEmpty ? nil : nextTokens.removeFirst() let list = PaginatedList(items: [], nextToken: nextToken, startedAt: startedAt) let event: GraphQLOperation>.OperationResult = .success(.success(list)) @@ -224,7 +224,7 @@ class InitialSyncOperationTests: XCTestCase { api: apiPlugin, reconciliationQueue: reconciliationQueue, storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy()) let syncCompletionReceived = expectation(description: "Sync completion received, sync operation is complete") @@ -254,13 +254,13 @@ class InitialSyncOperationTests: XCTestCase { /// - Then: /// - The method submits the returned data to the reconciliation queue func testSubmitsToReconciliationQueue() { - let startedAtMilliseconds = Int(Date().timeIntervalSince1970) * 1_000 + let startedAtMilliseconds = Int64(Date().timeIntervalSince1970) * 1_000 let model = MockSynced(id: "1") let anyModel = AnyModel(model) let metadata = MutationSyncMetadata(modelId: "1", modelName: MockSynced.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let mutationSync = MutationSync(model: anyModel, syncMetadata: metadata) let responder = QueryRequestListenerResponder> { _, listener in @@ -291,7 +291,7 @@ class InitialSyncOperationTests: XCTestCase { api: apiPlugin, reconciliationQueue: reconciliationQueue, storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy()) let syncStartedReceived = expectation(description: "Sync started received, sync operation started") @@ -331,7 +331,7 @@ class InitialSyncOperationTests: XCTestCase { /// - Then: /// - The method submits the returned data to the reconciliation queue func testUpdatesSyncMetadata() throws { - let startDateMilliseconds = Int(Date().timeIntervalSince1970) * 1_000 + let startDateMilliseconds = Int64(Date().timeIntervalSince1970) * 1_000 let responder = QueryRequestListenerResponder> { _, listener in let startedAt = startDateMilliseconds let list = PaginatedList(items: [], nextToken: nil, startedAt: startedAt) @@ -352,7 +352,7 @@ class InitialSyncOperationTests: XCTestCase { api: apiPlugin, reconciliationQueue: reconciliationQueue, storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy()) let syncStartedReceived = expectation(description: "Sync started received, sync operation started") @@ -411,6 +411,25 @@ class InitialSyncOperationTests: XCTestCase { let reconciliationQueue = MockReconciliationQueue() let expectErrorHandlerCalled = expectation(description: "Expect error handler called") + + #if os(watchOS) + let configuration = DataStoreConfiguration.custom(errorHandler: { error in + guard let dataStoreError = error as? DataStoreError, + case let .api(amplifyError, mutationEventOptional) = dataStoreError else { + XCTFail("Expected API error with mutationEvent") + return + } + guard let actualAPIError = amplifyError as? APIError, + case let .operationError(_, _, underlyingError) = actualAPIError, + let authError = underlyingError as? AuthError, + case .signedOut = authError else { + XCTFail("Should be `signedOut` error but got \(amplifyError)") + return + } + expectErrorHandlerCalled.fulfill() + XCTAssertNil(mutationEventOptional) + }, disableSubscriptions: { false }) + #else let configuration = DataStoreConfiguration.custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { @@ -427,6 +446,7 @@ class InitialSyncOperationTests: XCTestCase { expectErrorHandlerCalled.fulfill() XCTAssertNil(mutationEventOptional) }) + #endif let operation = InitialSyncOperation( modelSchema: MockSynced.schema, api: apiPlugin, @@ -477,7 +497,7 @@ class InitialSyncOperationTests: XCTestCase { /// - It performs a sync query against the API category with a "lastSync" time from the last start time of /// the stored metadata func testQueriesFromLastSync() throws { - let startDateMilliseconds = (Int(Date().timeIntervalSince1970) - 100) * 1_000 + let startDateMilliseconds = (Int64(Date().timeIntervalSince1970) - 100) * 1_000 let storageAdapter = try SQLiteStorageEngineAdapter(connection: Connection(.inMemory)) try storageAdapter.setUp(modelSchemas: StorageEngine.systemModelSchemas + [MockSynced.schema]) @@ -496,7 +516,7 @@ class InitialSyncOperationTests: XCTestCase { let apiWasQueried = expectation(description: "API was queried for a PaginatedList of AnyModel") let responder = QueryRequestListenerResponder> { request, listener in - let lastSync = request.variables?["lastSync"] as? Int + let lastSync = request.variables?["lastSync"] as? Int64 XCTAssertEqual(lastSync, startDateMilliseconds) let list = PaginatedList(items: [], nextToken: nil, startedAt: nil) @@ -515,7 +535,7 @@ class InitialSyncOperationTests: XCTestCase { api: apiPlugin, reconciliationQueue: reconciliationQueue, storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy()) let syncStartedReceived = expectation(description: "Sync started received, sync operation started") @@ -548,7 +568,7 @@ class InitialSyncOperationTests: XCTestCase { func testBaseQueryWhenExpiredLastSync() throws { // Set start date to 100 seconds in the past - let startDateMilliSeconds = (Int(Date().timeIntervalSince1970) - 100) * 1_000 + let startDateMilliSeconds = (Int64(Date().timeIntervalSince1970) - 100) * 1_000 let storageAdapter = try SQLiteStorageEngineAdapter(connection: Connection(.inMemory)) try storageAdapter.setUp(modelSchemas: StorageEngine.systemModelSchemas + [MockSynced.schema]) @@ -581,7 +601,11 @@ class InitialSyncOperationTests: XCTestCase { apiPlugin.responders[.queryRequestListener] = responder let reconciliationQueue = MockReconciliationQueue() + #if os(watchOS) + let configuration = DataStoreConfiguration.custom(syncInterval: 60, disableSubscriptions: { false }) + #else let configuration = DataStoreConfiguration.custom(syncInterval: 60) + #endif let operation = InitialSyncOperation( modelSchema: MockSynced.schema, api: apiPlugin, @@ -641,7 +665,11 @@ class InitialSyncOperationTests: XCTestCase { apiPlugin.responders[.queryRequestListener] = responder let reconciliationQueue = MockReconciliationQueue() + #if os(watchOS) + let configuration = DataStoreConfiguration.custom(syncPageSize: 10, disableSubscriptions: { false }) + #else let configuration = DataStoreConfiguration.custom(syncPageSize: 10) + #endif let operation = InitialSyncOperation( modelSchema: MockSynced.schema, api: apiPlugin, diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOrchestratorTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOrchestratorTests.swift index 6d85a46cf6..fbe3f5b6af 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOrchestratorTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/InitialSyncOrchestratorTests.swift @@ -28,7 +28,7 @@ class InitialSyncOrchestratorTests: XCTestCase { ModelRegistry.reset() PostCommentModelRegistration().registerModels(registry: ModelRegistry.self) let responder = QueryRequestListenerResponder> { _, listener in - let startedAt = Int(Date().timeIntervalSince1970) + let startedAt = Int64(Date().timeIntervalSince1970) let list = PaginatedList(items: [], nextToken: nil, startedAt: startedAt) let event: GraphQLOperation>.OperationResult = .success(.success(list)) listener?(event) @@ -44,7 +44,7 @@ class InitialSyncOrchestratorTests: XCTestCase { let reconciliationQueue = MockReconciliationQueue() let orchestrator: AWSInitialSyncOrchestrator = - AWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + AWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy(), api: apiPlugin, reconciliationQueue: reconciliationQueue, @@ -126,7 +126,7 @@ class InitialSyncOrchestratorTests: XCTestCase { .failure(APIError.operationError("", "", nil)) listener?(event) } else if request.document.contains("SyncComments") { - let startedAt = Int(Date().timeIntervalSince1970) + let startedAt = Int64(Date().timeIntervalSince1970) let list = PaginatedList(items: [], nextToken: nil, startedAt: startedAt) let event: GraphQLOperation>.OperationResult = .success(.success(list)) listener?(event) @@ -144,7 +144,7 @@ class InitialSyncOrchestratorTests: XCTestCase { let reconciliationQueue = MockReconciliationQueue() let orchestrator: AWSInitialSyncOrchestrator = - AWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + AWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy(), api: apiPlugin, reconciliationQueue: reconciliationQueue, @@ -239,7 +239,7 @@ class InitialSyncOrchestratorTests: XCTestCase { TestModelsWithNoAssociations().registerModels(registry: ModelRegistry.self) let responder = QueryRequestListenerResponder> { _, listener in - let startedAt = Int(Date().timeIntervalSince1970) + let startedAt = Int64(Date().timeIntervalSince1970) let list = PaginatedList(items: [], nextToken: nil, startedAt: startedAt) let event: GraphQLOperation>.OperationResult = .success(.success(list)) listener?(event) @@ -254,7 +254,7 @@ class InitialSyncOrchestratorTests: XCTestCase { let reconciliationQueue = MockReconciliationQueue() - let orchestrator = AWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + let orchestrator = AWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy(), api: apiPlugin, reconciliationQueue: reconciliationQueue, @@ -306,7 +306,7 @@ class InitialSyncOrchestratorTests: XCTestCase { commentWasQueried.fulfill() } - let startedAt = Int(Date().timeIntervalSince1970) + let startedAt = Int64(Date().timeIntervalSince1970) let list = PaginatedList(items: [], nextToken: nil, startedAt: startedAt) let event: GraphQLOperation>.OperationResult = .success(.success(list)) listener?(event) @@ -322,7 +322,7 @@ class InitialSyncOrchestratorTests: XCTestCase { let reconciliationQueue = MockReconciliationQueue() let orchestrator: AWSInitialSyncOrchestrator = - AWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + AWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy(), api: apiPlugin, reconciliationQueue: reconciliationQueue, @@ -380,7 +380,7 @@ class InitialSyncOrchestratorTests: XCTestCase { commentWasQueried.fulfill() } - let startedAt = Int(Date().timeIntervalSince1970) + let startedAt = Int64(Date().timeIntervalSince1970) let nextToken = nextTokens.isEmpty ? nil : nextTokens.removeFirst() let list = PaginatedList(items: [], nextToken: nextToken, startedAt: startedAt) let event: GraphQLOperation>.OperationResult = .success(.success(list)) @@ -397,7 +397,7 @@ class InitialSyncOrchestratorTests: XCTestCase { let reconciliationQueue = MockReconciliationQueue() let orchestrator: AWSInitialSyncOrchestrator = - AWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + AWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy(), api: apiPlugin, reconciliationQueue: reconciliationQueue, @@ -441,7 +441,7 @@ class InitialSyncOrchestratorTests: XCTestCase { let reconciliationQueue = MockReconciliationQueue() let orchestrator = - AWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + AWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy(), api: apiPlugin, reconciliationQueue: reconciliationQueue, diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/ModelSyncedEventEmitterTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/ModelSyncedEventEmitterTests.swift index 2dabd2bac3..f241dc20f8 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/ModelSyncedEventEmitterTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/ModelSyncedEventEmitterTests.swift @@ -20,7 +20,7 @@ class ModelSyncedEventEmitterTests: XCTestCase { var reconciliationQueue: MockAWSIncomingEventReconciliationQueue? override func setUp() { - initialSyncOrchestrator = MockAWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + initialSyncOrchestrator = MockAWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), api: nil, reconciliationQueue: nil, storageAdapter: nil) @@ -49,7 +49,7 @@ class ModelSyncedEventEmitterTests: XCTestCase { let anyPostMetadata = MutationSyncMetadata(modelId: "1", modelName: Post.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let testPost = Post(id: "1", title: "post1", content: "content", createdAt: .now()) let anyPost = AnyModel(testPost) @@ -129,7 +129,7 @@ class ModelSyncedEventEmitterTests: XCTestCase { let anyPostMetadata = MutationSyncMetadata(modelId: "1", modelName: "", deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let testPost = Post(id: "1", title: "post1", content: "content", createdAt: .now()) let anyPost = AnyModel(testPost) @@ -202,7 +202,7 @@ class ModelSyncedEventEmitterTests: XCTestCase { let anyPostMetadata = MutationSyncMetadata(modelId: "1", modelName: Post.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let testPost = Post(id: "1", title: "post1", content: "content", createdAt: .now()) let anyPost = AnyModel(testPost) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/SyncEventEmitterTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/SyncEventEmitterTests.swift index d5f497274c..b74eed4313 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/SyncEventEmitterTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/InitialSync/SyncEventEmitterTests.swift @@ -45,7 +45,7 @@ class SyncEventEmitterTests: XCTestCase { let anyPostMetadata = MutationSyncMetadata(modelId: "1", modelName: Post.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let anyPostMutationSync = MutationSync(model: anyPost, syncMetadata: anyPostMetadata) let postMutationEvent = try MutationEvent(untypedModel: testPost, mutationType: .create) @@ -56,7 +56,7 @@ class SyncEventEmitterTests: XCTestCase { syncExpressions: [], auth: nil) - initialSyncOrchestrator = MockAWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + initialSyncOrchestrator = MockAWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), api: nil, reconciliationQueue: nil, storageAdapter: nil) @@ -131,7 +131,7 @@ class SyncEventEmitterTests: XCTestCase { syncExpressions: [], auth: nil) - initialSyncOrchestrator = MockAWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + initialSyncOrchestrator = MockAWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), api: nil, reconciliationQueue: nil, storageAdapter: nil) @@ -196,7 +196,7 @@ class SyncEventEmitterTests: XCTestCase { let anyPostMetadata = MutationSyncMetadata(modelId: "1", modelName: Post.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let anyPostMutationSync = MutationSync(model: anyPost, syncMetadata: anyPostMetadata) @@ -207,7 +207,7 @@ class SyncEventEmitterTests: XCTestCase { let anyCommentMetadata = MutationSyncMetadata(modelId: "1", modelName: Comment.modelName, deleted: true, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 2) let anyCommentMutationSync = MutationSync(model: anyComment, syncMetadata: anyCommentMetadata) let commentMutationEvent = try MutationEvent(untypedModel: testComment, mutationType: .delete) @@ -229,7 +229,7 @@ class SyncEventEmitterTests: XCTestCase { syncExpressions: [], auth: nil) - initialSyncOrchestrator = MockAWSInitialSyncOrchestrator(dataStoreConfiguration: .default, + initialSyncOrchestrator = MockAWSInitialSyncOrchestrator(dataStoreConfiguration: .testDefault(), api: nil, reconciliationQueue: nil, storageAdapter: nil) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/LocalSubscriptionTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/LocalSubscriptionTests.swift index 31abc3a127..13d8333dc5 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/LocalSubscriptionTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/LocalSubscriptionTests.swift @@ -41,7 +41,7 @@ class LocalSubscriptionTests: XCTestCase { let syncEngine = RemoteSyncEngine( storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy(), outgoingMutationQueue: outgoingMutationQueue, mutationEventIngester: mutationDatabaseAdapter, @@ -54,7 +54,7 @@ class LocalSubscriptionTests: XCTestCase { ) storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/LocalSubscriptionWithJSONModelTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/LocalSubscriptionWithJSONModelTests.swift index 38284d7204..c20ad32848 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/LocalSubscriptionWithJSONModelTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/LocalSubscriptionWithJSONModelTests.swift @@ -43,7 +43,7 @@ class LocalSubscriptionWithJSONModelTests: XCTestCase { let syncEngine = RemoteSyncEngine( storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy(), outgoingMutationQueue: outgoingMutationQueue, mutationEventIngester: mutationDatabaseAdapter, @@ -56,7 +56,7 @@ class LocalSubscriptionWithJSONModelTests: XCTestCase { ) storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/AWSMutationEventIngesterTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/AWSMutationEventIngesterTests.swift index 03e9e0a56a..40dfb6a6b6 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/AWSMutationEventIngesterTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/AWSMutationEventIngesterTests.swift @@ -37,12 +37,12 @@ class AWSMutationEventIngesterTests: XCTestCase { try storageAdapter.setUp(modelSchemas: StorageEngine.systemModelSchemas) let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default) + dataStoreConfiguration: .testDefault()) let validAPIPluginKey = "MockAPICategoryPlugin" let validAuthPluginKey = "MockAuthCategoryPlugin" let storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueNetworkTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueNetworkTests.swift index fecedfda2b..035918e8bf 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueNetworkTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueNetworkTests.swift @@ -62,7 +62,7 @@ class OutgoingMutationQueueNetworkTests: SyncEngineTestBase { let mutationQueue = OutgoingMutationQueue( storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy() ) try setUpDataStore(mutationQueue: mutationQueue) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueTests.swift index 24f0d5a131..41f3244351 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueTests.swift @@ -25,7 +25,7 @@ class OutgoingMutationQueueTests: SyncEngineTestBase { await tryOrFail { try setUpStorageAdapter() try setUpDataStore(mutationQueue: OutgoingMutationQueue(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy())) } let post = Post(title: "Post title", @@ -190,7 +190,7 @@ class OutgoingMutationQueueTests: SyncEngineTestBase { await tryOrFail { try setUpDataStore(mutationQueue: OutgoingMutationQueue(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy())) try await startAmplify() } diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueTestsWithMockStateMachine.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueTestsWithMockStateMachine.swift index 34fac59b71..d8442e9b96 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueTestsWithMockStateMachine.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/OutgoingMutationQueueTestsWithMockStateMachine.swift @@ -34,7 +34,7 @@ class OutgoingMutationQueueMockStateTest: XCTestCase { storageAdapter = MockSQLiteStorageEngineAdapter() mutationQueue = OutgoingMutationQueue(stateMachine, storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy()) eventSource = MockMutationEventSource() publisher = AWSMutationEventPublisher(eventSource: eventSource) @@ -51,7 +51,7 @@ class OutgoingMutationQueueMockStateTest: XCTestCase { mutationQueue = OutgoingMutationQueue(stateMachine, storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy()) waitForExpectations(timeout: 1) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/ProcessMutationErrorFromCloudOperationTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/ProcessMutationErrorFromCloudOperationTests.swift index 12afd41348..ca28f1608d 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/ProcessMutationErrorFromCloudOperationTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/MutationQueue/ProcessMutationErrorFromCloudOperationTests.swift @@ -50,7 +50,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { expectCompletion.fulfill() } let expectErrorHandlerCalled = expectation(description: "Expect error handler called") - let configuration = DataStoreConfiguration.custom(errorHandler: { error in + let configuration = custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { XCTFail("Expected API error with mutationEvent") @@ -96,7 +96,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { expectCompletion.fulfill() } let expectErrorHandlerCalled = expectation(description: "Expect error handler called") - let configuration = DataStoreConfiguration.custom(errorHandler: { error in + let configuration = custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { XCTFail("Expected API error with mutationEvent") @@ -139,7 +139,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { expectCompletion.fulfill() } let expectErrorHandlerCalled = expectation(description: "Expect error handler called") - let configuration = DataStoreConfiguration.custom(errorHandler: { error in + let configuration = custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { XCTFail("Expected API error with mutationEvent") @@ -182,7 +182,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { expectCompletion.fulfill() } let expectErrorHandlerCalled = expectation(description: "Expect error handler called") - let configuration = DataStoreConfiguration.custom(errorHandler: { error in + let configuration = custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { XCTFail("Expected API error with mutationEvent") @@ -227,7 +227,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { expectCompletion.fulfill() } let expectErrorHandlerCalled = expectation(description: "Expect error handler called") - let configuration = DataStoreConfiguration.custom(errorHandler: { error in + let configuration = custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { XCTFail("Expected API error with mutationEvent") @@ -278,7 +278,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { self.assertSuccessfulNil(result) expectCompletion.fulfill() } - let configuration = DataStoreConfiguration.custom(errorHandler: { error in + let configuration = custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { XCTFail("Expected API error with mutationEvent") @@ -318,7 +318,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { self.assertSuccessfulNil(result) expectCompletion.fulfill() } - let configuration = DataStoreConfiguration.custom(errorHandler: { error in + let configuration = custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { XCTFail("Expected API error with mutationEvent") @@ -357,7 +357,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { self.assertSuccessfulNil(result) expectCompletion.fulfill() } - let configuration = DataStoreConfiguration.custom(errorHandler: { error in + let configuration = custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { XCTFail("Expected API error with mutationEvent") @@ -396,7 +396,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { self.assertSuccessfulNil(result) expectCompletion.fulfill() } - let configuration = DataStoreConfiguration.custom(errorHandler: { error in + let configuration = custom(errorHandler: { error in guard let dataStoreError = error as? DataStoreError, case let .api(amplifyError, mutationEventOptional) = dataStoreError else { XCTFail("Expected API error with mutationEvent") @@ -448,7 +448,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { XCTAssertEqual(dataStoreError.errorDescription, "Missing remote model from the response from AppSync.") expectCompletion.fulfill() } - let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .default, + let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .testDefault(), mutationEvent: mutationEvent, api: mockAPIPlugin, storageAdapter: storageAdapter, @@ -484,7 +484,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { XCTAssertEqual(dataStoreError.errorDescription, "Should never get conflict unhandled for create mutation") expectCompletion.fulfill() } - let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .default, + let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .testDefault(), mutationEvent: mutationEvent, api: mockAPIPlugin, storageAdapter: storageAdapter, @@ -514,7 +514,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { self.assertSuccessfulNil(result) expectCompletion.fulfill() } - let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .default, + let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .testDefault(), mutationEvent: mutationEvent, api: mockAPIPlugin, storageAdapter: storageAdapter, @@ -561,7 +561,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { } let expectConflicthandlerCalled = expectation(description: "Expect conflict handler called") - let configuration = DataStoreConfiguration.custom(conflictHandler: { data, resolve in + let configuration = custom(conflictHandler: { data, resolve in guard let localPost = data.local as? Post, let remotePost = data.remote as? Post else { XCTFail("Couldn't get Posts from local and remote data") @@ -638,7 +638,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { } let expectConflicthandlerCalled = expectation(description: "Expect conflict handler called") - let configuration = DataStoreConfiguration.custom(conflictHandler: { data, resolve in + let configuration = custom(conflictHandler: { data, resolve in guard let localPost = data.local as? Post, let remotePost = data.remote as? Post else { XCTFail("Couldn't get Posts from local and remote data") @@ -731,7 +731,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { expectHubEvent.fulfill() } } - let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .default, + let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .testDefault(), mutationEvent: mutationEvent, api: mockAPIPlugin, storageAdapter: storageAdapter, @@ -794,7 +794,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { expectHubEvent.fulfill() } } - let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .default, + let operation = ProcessMutationErrorFromCloudOperation(dataStoreConfiguration: .testDefault(), mutationEvent: mutationEvent, api: mockAPIPlugin, storageAdapter: storageAdapter, @@ -864,7 +864,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { } } let expectConflicthandlerCalled = expectation(description: "Expect conflict handler called") - let configuration = DataStoreConfiguration.custom(conflictHandler: { data, resolve in + let configuration = custom(conflictHandler: { data, resolve in guard let localPost = data.local as? Post, let remotePost = data.remote as? Post else { XCTFail("Couldn't get Posts from local and remote data") @@ -933,7 +933,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { } let expectConflicthandlerCalled = expectation(description: "Expect conflict handler called") - let configuration = DataStoreConfiguration.custom(conflictHandler: { data, resolve in + let configuration = custom(conflictHandler: { data, resolve in guard let localPost = data.local as? Post, let remotePost = data.remote as? Post else { XCTFail("Couldn't get Posts from local and remote data") @@ -1012,7 +1012,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { } let expectConflicthandlerCalled = expectation(description: "Expect conflict handler called") - let configuration = DataStoreConfiguration.custom(conflictHandler: { data, resolve in + let configuration = custom(conflictHandler: { data, resolve in guard let localPost = data.local as? Post, let remotePost = data.remote as? Post else { XCTFail("Couldn't get Posts from local and remote data") @@ -1091,7 +1091,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { let expectConflicthandlerCalled = expectation(description: "Expect conflict handler called") let expectErrorHandlerCalled = expectation(description: "Expect error handler called") - let configuration = DataStoreConfiguration.custom(errorHandler: { _ in + let configuration = custom(errorHandler: { _ in expectErrorHandlerCalled.fulfill() }, conflictHandler: { data, resolve in guard let localPost = data.local as? Post, @@ -1151,7 +1151,7 @@ class ProcessMutationErrorFromCloudOperationTests: XCTestCase { errorType: .operationDisabled) let operation = ProcessMutationErrorFromCloudOperation( - dataStoreConfiguration: DataStoreConfiguration.default, + dataStoreConfiguration: DataStoreConfiguration.testDefault(), mutationEvent: mutationEvent, api: mockAPIPlugin, storageAdapter: storageAdapter, @@ -1245,4 +1245,33 @@ extension ProcessMutationErrorFromCloudOperationTests { path: nil, extensions: ["errorType": .string(errorType.rawValue)]) } + + private func custom(errorHandler: DataStoreErrorHandler? = nil, + conflictHandler: (DataStoreConflictHandler)? = nil) -> DataStoreConfiguration { + if let conflictHandler = conflictHandler, let errorHandler = errorHandler { + #if os(watchOS) + return .custom(errorHandler: errorHandler, + conflictHandler: conflictHandler, + disableSubscriptions: { false }) + #else + return .custom(errorHandler: errorHandler, + conflictHandler: conflictHandler) + #endif + } else if let errorHandler = errorHandler { + #if os(watchOS) + return .custom(errorHandler: errorHandler, + disableSubscriptions: { false }) + #else + return .custom(errorHandler: errorHandler) + #endif + } else if let conflictHandler = conflictHandler { + #if os(watchOS) + return .custom(conflictHandler: conflictHandler, + disableSubscriptions: { false }) + #else + return .custom(conflictHandler: conflictHandler) + #endif + } + return .testDefault() + } } diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/RemoteSync/RemoteSyncAPIInvocationTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/RemoteSync/RemoteSyncAPIInvocationTests.swift index 0879f7d345..0192e13ed3 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/RemoteSync/RemoteSyncAPIInvocationTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/RemoteSync/RemoteSyncAPIInvocationTests.swift @@ -41,9 +41,9 @@ class RemoteSyncAPIInvocationTests: XCTestCase { try storageAdapter.setUp(modelSchemas: StorageEngine.systemModelSchemas) let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default) + dataStoreConfiguration: .testDefault()) storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/RemoteSyncEngineTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/RemoteSyncEngineTests.swift index da315bde7e..fd2686b5ab 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/RemoteSyncEngineTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/RemoteSyncEngineTests.swift @@ -33,7 +33,7 @@ class RemoteSyncEngineTests: XCTestCase { do { remoteSyncEngine = try RemoteSyncEngine( storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), outgoingMutationQueue: mockOutgoingMutationQueue, initialSyncOrchestratorFactory: MockAWSInitialSyncOrchestrator.factory, reconciliationQueueFactory: MockAWSIncomingEventReconciliationQueue.factory, diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/SubscriptionSync/ReconcileAndLocalSaveOperationTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/SubscriptionSync/ReconcileAndLocalSaveOperationTests.swift index 2b7d4220e6..d0d19eeb4e 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/SubscriptionSync/ReconcileAndLocalSaveOperationTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/SubscriptionSync/ReconcileAndLocalSaveOperationTests.swift @@ -39,7 +39,7 @@ class ReconcileAndLocalSaveOperationTests: XCTestCase { anyPostMetadata = MutationSyncMetadata(modelId: "1", modelName: testPost.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) anyPostMutationSync = MutationSync(model: anyPost, syncMetadata: anyPostMetadata) @@ -48,7 +48,7 @@ class ReconcileAndLocalSaveOperationTests: XCTestCase { let anyPostDeleteMetadata = MutationSyncMetadata(modelId: "2", modelName: testPost.modelName, deleted: true, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 2) anyPostDeletedMutationSync = MutationSync(model: anyPostDelete, syncMetadata: anyPostDeleteMetadata) anyPostMutationEvent = MutationEvent(id: "1", @@ -338,12 +338,12 @@ class ReconcileAndLocalSaveOperationTests: XCTestCase { let metadata1 = MutationSyncMetadata(modelId: model1.id, modelName: model1.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let metadata2 = MutationSyncMetadata(modelId: model2.id, modelName: model2.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let remoteModel1 = MutationSync(model: model1, syncMetadata: metadata1) let remoteModel2 = MutationSync(model: model2, syncMetadata: metadata2) @@ -491,12 +491,12 @@ class ReconcileAndLocalSaveOperationTests: XCTestCase { let metadata1 = MutationSyncMetadata(modelId: model1.id, modelName: model1.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let metadata2 = MutationSyncMetadata(modelId: model2.id, modelName: model2.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) let remoteModel1 = MutationSync(model: model1, syncMetadata: metadata1) let remoteModel2 = MutationSync(model: model2, syncMetadata: metadata2) @@ -504,12 +504,12 @@ class ReconcileAndLocalSaveOperationTests: XCTestCase { let localMetadata1 = MutationSyncMetadata(modelId: model1.id, modelName: model1.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 3) let localMetadata2 = MutationSyncMetadata(modelId: model2.id, modelName: model2.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 4) operation.publisher .sink { completion in diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/SubscriptionSync/ReconcileAndSaveQueueTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/SubscriptionSync/ReconcileAndSaveQueueTests.swift index aeb93311cb..da06a88397 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/SubscriptionSync/ReconcileAndSaveQueueTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/SubscriptionSync/ReconcileAndSaveQueueTests.swift @@ -23,7 +23,7 @@ class ReconcileAndSaveQueueTests: XCTestCase { anyPostMetadata = MutationSyncMetadata(modelId: "1", modelName: testPost.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: 1) anyPostMutationSync = MutationSync(model: anyPost, syncMetadata: anyPostMetadata) anyPostMutationSync = MutationSync(model: anyPost, syncMetadata: anyPostMetadata) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/Support/MutationEventExtensionsTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/Support/MutationEventExtensionsTests.swift index e709ebe364..7938a953ff 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/Support/MutationEventExtensionsTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/Sync/Support/MutationEventExtensionsTests.swift @@ -361,7 +361,7 @@ class MutationEventExtensionsTest: BaseDataStoreTests { let metadata = MutationSyncMetadata(modelId: model.identifier(schema: MutationEvent.schema).stringValue, modelName: model.modelName, deleted: false, - lastChangedAt: Int(Date().timeIntervalSince1970), + lastChangedAt: Int64(Date().timeIntervalSince1970), version: version) return MutationSync(model: AnyModel(model), syncMetadata: metadata) } diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/BaseDataStoreTests.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/BaseDataStoreTests.swift index 6318ef6ce8..2d91bccd89 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/BaseDataStoreTests.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/BaseDataStoreTests.swift @@ -36,9 +36,9 @@ class BaseDataStoreTests: XCTestCase { try storageAdapter.setUp(modelSchemas: StorageEngine.systemModelSchemas) let syncEngine = try RemoteSyncEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default) + dataStoreConfiguration: .testDefault()) storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/Foundation+TestExtensions.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/Foundation+TestExtensions.swift index a86c286cdf..53c8c27732 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/Foundation+TestExtensions.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/Foundation+TestExtensions.swift @@ -8,7 +8,7 @@ import Foundation extension Date { - var unixSeconds: Int { - Int(timeIntervalSince1970) + var unixSeconds: Int64 { + Int64(timeIntervalSince1970) } } diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/LocalStoreIntegrationTestBase.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/LocalStoreIntegrationTestBase.swift index 645a4df4ad..217db3315e 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/LocalStoreIntegrationTestBase.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/LocalStoreIntegrationTestBase.swift @@ -21,7 +21,12 @@ class LocalStoreIntegrationTestBase: XCTestCase { continueAfterFailure = false do { + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, + configuration: .subscriptionsDisabled)) + #else try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models)) + #endif try Amplify.configure(AmplifyConfiguration(dataStore: nil)) } catch { XCTFail(String(describing: error)) diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/Mocks/MockAWSIncomingEventReconciliationQueue.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/Mocks/MockAWSIncomingEventReconciliationQueue.swift index 6be0a7ccfc..05b5750b8a 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/Mocks/MockAWSIncomingEventReconciliationQueue.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/Mocks/MockAWSIncomingEventReconciliationQueue.swift @@ -13,7 +13,7 @@ import Combine @testable import AWSDataStorePlugin class MockAWSIncomingEventReconciliationQueue: IncomingEventReconciliationQueue { - static let factory: IncomingEventReconciliationQueueFactory = { modelSchemas, api, storageAdapter, syncExpressions, auth, _, _ in + static let factory: IncomingEventReconciliationQueueFactory = { modelSchemas, api, storageAdapter, syncExpressions, auth, _, _, _ in MockAWSIncomingEventReconciliationQueue(modelSchemas: modelSchemas, api: api, storageAdapter: storageAdapter, diff --git a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/SyncEngineTestBase.swift b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/SyncEngineTestBase.swift index 39be1f31c2..5d69207902 100644 --- a/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/SyncEngineTestBase.swift +++ b/AmplifyPlugins/DataStore/Tests/AWSDataStorePluginTests/TestSupport/SyncEngineTestBase.swift @@ -127,7 +127,7 @@ class SyncEngineTestBase: XCTestCase { resolver: RemoteSyncEngine.Resolver.resolve(currentState:action:)) syncEngine = RemoteSyncEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), authModeStrategy: AWSDefaultAuthModeStrategy(), outgoingMutationQueue: mutationQueue, mutationEventIngester: mutationDatabaseAdapter, @@ -156,7 +156,7 @@ class SyncEngineTestBase: XCTestCase { let validAuthPluginKey = "MockAuthCategoryPlugin" let storageEngine = StorageEngine(storageAdapter: storageAdapter, - dataStoreConfiguration: .default, + dataStoreConfiguration: .testDefault(), syncEngine: syncEngine, validAPIPluginKey: validAPIPluginKey, validAuthPluginKey: validAuthPluginKey) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginAuthCognitoTests/AWSDataStoreAuthBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginAuthCognitoTests/AWSDataStoreAuthBaseTest.swift index f1615670ec..9b47d85f1c 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginAuthCognitoTests/AWSDataStoreAuthBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginAuthCognitoTests/AWSDataStoreAuthBaseTest.swift @@ -164,8 +164,11 @@ class AWSDataStoreAuthBaseTest: XCTestCase { do { setupCredentials(forAuthStrategy: testType) + #if os(watchOS) + let datastoreConfig = DataStoreConfiguration.custom(authModeStrategy: testType.authStrategy, disableSubscriptions: { false }) + #else let datastoreConfig = DataStoreConfiguration.custom(authModeStrategy: testType.authStrategy) - + #endif try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, configuration: datastoreConfig)) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginAuthIAMTests/AWSDataStoreAuthBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginAuthIAMTests/AWSDataStoreAuthBaseTest.swift index 885e9e590c..8f89a32442 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginAuthIAMTests/AWSDataStoreAuthBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginAuthIAMTests/AWSDataStoreAuthBaseTest.swift @@ -195,8 +195,11 @@ class AWSDataStoreAuthBaseTest: XCTestCase { do { setupCredentials(forAuthStrategy: testType) + #if os(watchOS) + let datastoreConfig = DataStoreConfiguration.custom(authModeStrategy: testType.authStrategy, disableSubscriptions: { false }) + #else let datastoreConfig = DataStoreConfiguration.custom(authModeStrategy: testType.authStrategy) - + #endif try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, configuration: datastoreConfig)) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/11/AWSDataStoreIntSortKeyTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/11/AWSDataStoreIntSortKeyTest.swift index 57244703bd..937ec840b0 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/11/AWSDataStoreIntSortKeyTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/11/AWSDataStoreIntSortKeyTest.swift @@ -40,10 +40,17 @@ class AWSDataStoreIntSortKeyTest: XCTestCase { try Amplify.add(plugin: AWSAPIPlugin( sessionFactory: AmplifyURLSessionFactory()) ) + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin( + modelRegistration: TestModels(), + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }) + )) + #else try Amplify.add(plugin: AWSDataStorePlugin( modelRegistration: TestModels(), configuration: .custom(syncMaxRecords: 100) )) + #endif Amplify.Logging.logLevel = .verbose try Amplify.configure(config) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/12/AWSDataStoreFloatSortKeyTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/12/AWSDataStoreFloatSortKeyTest.swift index 82e1e47419..2f9fe125f7 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/12/AWSDataStoreFloatSortKeyTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/12/AWSDataStoreFloatSortKeyTest.swift @@ -40,10 +40,17 @@ class AWSDataStoreFloatSortKeyTest: XCTestCase { try Amplify.add(plugin: AWSAPIPlugin( sessionFactory: AmplifyURLSessionFactory()) ) + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin( + modelRegistration: TestModels(), + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }) + )) + #else try Amplify.add(plugin: AWSDataStorePlugin( modelRegistration: TestModels(), configuration: .custom(syncMaxRecords: 100) )) + #endif Amplify.Logging.logLevel = .verbose try Amplify.configure(config) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/13/AWSDataStoreDateTimeSortKeyTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/13/AWSDataStoreDateTimeSortKeyTest.swift index 3926927e3e..3d3e3704c9 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/13/AWSDataStoreDateTimeSortKeyTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/13/AWSDataStoreDateTimeSortKeyTest.swift @@ -40,10 +40,17 @@ class AWSDataStoreDateTimeSortKeyTest: XCTestCase { try Amplify.add(plugin: AWSAPIPlugin( sessionFactory: AmplifyURLSessionFactory()) ) + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin( + modelRegistration: TestModels(), + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }) + )) + #else try Amplify.add(plugin: AWSDataStorePlugin( modelRegistration: TestModels(), configuration: .custom(syncMaxRecords: 100) )) + #endif Amplify.Logging.logLevel = .verbose try Amplify.configure(config) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/14/AWSDataStoreDateSortKeyTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/14/AWSDataStoreDateSortKeyTest.swift index ba712b65e6..61303670f0 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/14/AWSDataStoreDateSortKeyTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/14/AWSDataStoreDateSortKeyTest.swift @@ -40,10 +40,17 @@ class AWSDataStoreDateSortKeyTest: XCTestCase { try Amplify.add(plugin: AWSAPIPlugin( sessionFactory: AmplifyURLSessionFactory()) ) + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin( + modelRegistration: TestModels(), + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }) + )) + #else try Amplify.add(plugin: AWSDataStorePlugin( modelRegistration: TestModels(), configuration: .custom(syncMaxRecords: 100) )) + #endif Amplify.Logging.logLevel = .verbose try Amplify.configure(config) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/15/AWSDataStoreTimeSortKeyTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/15/AWSDataStoreTimeSortKeyTest.swift index 256578c464..54cf724cee 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/15/AWSDataStoreTimeSortKeyTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/15/AWSDataStoreTimeSortKeyTest.swift @@ -40,10 +40,17 @@ class AWSDataStoreTimeSortKeyTest: XCTestCase { try Amplify.add(plugin: AWSAPIPlugin( sessionFactory: AmplifyURLSessionFactory()) ) + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin( + modelRegistration: TestModels(), + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }) + )) + #else try Amplify.add(plugin: AWSDataStorePlugin( modelRegistration: TestModels(), configuration: .custom(syncMaxRecords: 100) )) + #endif Amplify.Logging.logLevel = .verbose try Amplify.configure(config) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/9/AWSDataStoreCompositeSortKeyIdentifierTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/9/AWSDataStoreCompositeSortKeyIdentifierTest.swift index 35d28c67bf..f107bc47bf 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/9/AWSDataStoreCompositeSortKeyIdentifierTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/9/AWSDataStoreCompositeSortKeyIdentifierTest.swift @@ -34,10 +34,17 @@ class AWSDataStoreCompositeSortKeyIdentifierTest: XCTestCase { try Amplify.add(plugin: AWSAPIPlugin( sessionFactory: AmplifyURLSessionFactory()) ) + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin( + modelRegistration: TestModels(), + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }) + )) + #else try Amplify.add(plugin: AWSDataStorePlugin( modelRegistration: TestModels(), configuration: .custom(syncMaxRecords: 100) )) + #endif Amplify.Logging.logLevel = .verbose try Amplify.configure(config) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/AWSDataStorePrimaryKeyBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/AWSDataStorePrimaryKeyBaseTest.swift index 781d532348..6f22c32ed0 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/AWSDataStorePrimaryKeyBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/AWSDataStorePrimaryKeyBaseTest.swift @@ -36,10 +36,17 @@ class AWSDataStorePrimaryKeyBaseTest: XCTestCase { func setup(withModels models: AmplifyModelRegistration) { do { loadAmplifyConfig() + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin( + modelRegistration: models, + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }) + )) + #else try Amplify.add(plugin: AWSDataStorePlugin( modelRegistration: models, configuration: .custom(syncMaxRecords: 100) )) + #endif try Amplify.add(plugin: AWSAPIPlugin(sessionFactory: AmplifyURLSessionFactory())) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/AWSDataStoreSortKeyBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/AWSDataStoreSortKeyBaseTest.swift index 66cecade28..1eeb5518ea 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/AWSDataStoreSortKeyBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginCPKTests/PrimaryKey/AWSDataStoreSortKeyBaseTest.swift @@ -36,10 +36,17 @@ class AWSDataStoreSortKeyBaseTest: XCTestCase { ) async throws { let config = try TestConfigHelper.retrieveAmplifyConfiguration(forResource: "testconfiguration/\(configFile)") try Amplify.add(plugin: AWSAPIPlugin(sessionFactory: AmplifyURLSessionFactory())) + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin( + modelRegistration: models, + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }) + )) + #else try Amplify.add(plugin: AWSDataStorePlugin( modelRegistration: models, configuration: .custom(syncMaxRecords: 100) )) + #endif Amplify.Logging.logLevel = .verbose try Amplify.configure(config) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/AWSDataStorePluginConfigurationTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/AWSDataStorePluginConfigurationTests.swift index 1d829087e9..1166319a9c 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/AWSDataStorePluginConfigurationTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/AWSDataStorePluginConfigurationTests.swift @@ -19,7 +19,11 @@ class AWSDataStorePluginConfigurationTests: XCTestCase { // Note this test requires the ability to write a new database in the Documents directcory, so it must be embedded // in a host app func testDoesNotThrowOnMissingConfig() throws { + #if os(watchOS) + let plugin = AWSDataStorePlugin(modelRegistration: TestModelRegistration(), configuration: .subscriptionsDisabled) + #else let plugin = AWSDataStorePlugin(modelRegistration: TestModelRegistration()) + #endif try Amplify.add(plugin: plugin) let amplifyConfig = AmplifyConfiguration() diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/Connection/DataStoreConnectionScenario1Tests+WatchOS.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/Connection/DataStoreConnectionScenario1Tests+WatchOS.swift new file mode 100644 index 0000000000..c2c3aeafb7 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/Connection/DataStoreConnectionScenario1Tests+WatchOS.swift @@ -0,0 +1,77 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation + +extension DataStoreConnectionScenario1Tests { + + #if os(watchOS) + func testStartAndSync() async throws { + await setUp(withModels: TestModelRegistration(), + dataStoreConfiguration: .custom(syncMaxRecords: 100, disableSubscriptions: { true })) + try await startAmplifyAndWaitForSync() + } + + func testSaveReconciled() async throws { + await setUp(withModels: TestModelRegistration(), + dataStoreConfiguration: .custom(syncMaxRecords: 100, disableSubscriptions: { true })) + try await startAmplifyAndWaitForSync() + + let team = Team1(name: "name1") + let project = Project1(team: team) + let syncedTeamReceived = expectation(description: "received team from sync path") + var hubListener = Amplify.Hub.listen(to: .dataStore, + eventName: HubPayload.EventName.DataStore.syncReceived) { payload in + guard let mutationEvent = payload.data as? MutationEvent else { + XCTFail("Could not cast payload to mutation event") + return + } + + if let syncedTeam = try? mutationEvent.decodeModel() as? Team1, + syncedTeam == team { + syncedTeamReceived.fulfill() + } + } + guard try await HubListenerTestUtilities.waitForListener(with: hubListener, timeout: 5.0) else { + XCTFail("Listener not registered for hub") + return + } + + _ = try await Amplify.DataStore.save(team) + await fulfillment(of: [syncedTeamReceived], timeout: networkTimeout) + + let syncProjectReceived = expectation(description: "received project from sync path") + hubListener = Amplify.Hub.listen(to: .dataStore, + eventName: HubPayload.EventName.DataStore.syncReceived) { payload in + guard let mutationEvent = payload.data as? MutationEvent else { + XCTFail("Could not cast payload to mutation event") + return + } + + if let syncedProject = try? mutationEvent.decodeModel() as? Project1, + syncedProject == project { + syncProjectReceived.fulfill() + } + } + guard try await HubListenerTestUtilities.waitForListener(with: hubListener, timeout: 5.0) else { + XCTFail("Listener not registered for hub") + return + } + _ = try await Amplify.DataStore.save(project) + await fulfillment(of: [syncProjectReceived], timeout: networkTimeout) + + let queriedProjectOptional = try await Amplify.DataStore.query(Project1.self, byId: project.id) + guard let queriedProject = queriedProjectOptional else { + XCTFail("Failed") + return + } + XCTAssertEqual(queriedProject.id, project.id) + XCTAssertEqual(queriedProject.team, team) + } + #endif + +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/Connection/DataStoreConnectionScenario1Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/Connection/DataStoreConnectionScenario1Tests.swift index bb4d290b87..ae26e441e7 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/Connection/DataStoreConnectionScenario1Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/Connection/DataStoreConnectionScenario1Tests.swift @@ -32,13 +32,13 @@ import XCTest */ class DataStoreConnectionScenario1Tests: SyncEngineIntegrationTestBase { - + struct TestModelRegistration: AmplifyModelRegistration { func registerModels(registry: ModelRegistry.Type) { registry.register(modelType: Team1.self) registry.register(modelType: Project1.self) } - + let version: String = "1" } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreConfigurationTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreConfigurationTests.swift index 752958c841..c7762a8aaa 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreConfigurationTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreConfigurationTests.swift @@ -23,7 +23,11 @@ class DataStoreConfigurationTests: XCTestCase { func testConfigureWithSameSchemaDoesNotDeleteDatabase() async throws { let previousVersion = "previousVersion" do { + #if os(watchOS) + let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels(version: previousVersion), configuration: .subscriptionsDisabled) + #else let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels(version: previousVersion)) + #endif try Amplify.add(plugin: dataStorePlugin) try Amplify.configure(AmplifyConfiguration(dataStore: nil)) } catch { @@ -37,7 +41,11 @@ class DataStoreConfigurationTests: XCTestCase { await Amplify.reset() do { + #if os(watchOS) + let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels(version: previousVersion), configuration: .subscriptionsDisabled) + #else let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels(version: previousVersion)) + #endif try Amplify.add(plugin: dataStorePlugin) try Amplify.configure(AmplifyConfiguration(dataStore: nil)) } catch { @@ -60,7 +68,11 @@ class DataStoreConfigurationTests: XCTestCase { let prevoisVersion = "previousVersion" do { + #if os(watchOS) + let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels(version: prevoisVersion), configuration: .subscriptionsDisabled) + #else let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels(version: prevoisVersion)) + #endif try Amplify.add(plugin: dataStorePlugin) try Amplify.configure(AmplifyConfiguration(dataStore: nil)) } catch { @@ -73,7 +85,11 @@ class DataStoreConfigurationTests: XCTestCase { await Amplify.reset() do { + #if os(watchOS) + let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels(version: "1234"), configuration: .subscriptionsDisabled) + #else let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels(version: "1234")) + #endif try Amplify.add(plugin: dataStorePlugin) try Amplify.configure(AmplifyConfiguration(dataStore: nil)) } catch { diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreEndToEndTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreEndToEndTests.swift index 1576d90407..a23a537dd1 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreEndToEndTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreEndToEndTests.swift @@ -589,10 +589,17 @@ class DataStoreEndToEndTests: SyncEngineIntegrationTestBase { let syncExpression = DataStoreSyncExpression(modelSchema: Post.schema) { Post.keys.createdAt >= startTime } + #if os(watchOS) + await setUp( + withModels: TestModelRegistration(), + dataStoreConfiguration: .custom(syncExpressions: [syncExpression], disableSubscriptions: { false }) + ) + #else await setUp( withModels: TestModelRegistration(), dataStoreConfiguration: .custom(syncExpressions: [syncExpression]) ) + #endif try await startAmplifyAndWaitForSync() let postCount = 1_000 diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreObserveQueryTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreObserveQueryTests.swift index 2ac54a0f71..7b40d7a51f 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreObserveQueryTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/DataStoreObserveQueryTests.swift @@ -164,18 +164,30 @@ class DataStoreObserveQueryTests: SyncEngineIntegrationTestBase { /// func testInitialSyncWithPredicate() async throws { let startTime = Temporal.DateTime.now() + #if os(watchOS) + let configuration: DataStoreConfiguration = .custom( + syncMaxRecords: 100, + syncExpressions: [ + DataStoreSyncExpression( + modelSchema: Post.schema, + modelPredicate: { Post.keys.createdAt.ge(startTime) } + ) + ], + disableSubscriptions: { false }) + #else + let configuration: DataStoreConfiguration = .custom( + syncMaxRecords: 100, + syncExpressions: [ + DataStoreSyncExpression( + modelSchema: Post.schema, + modelPredicate: { Post.keys.createdAt.ge(startTime) } + ) + ]) + #endif await setUp( withModels: TestModelRegistration(), logLevel: .verbose, - dataStoreConfiguration: .custom( - syncMaxRecords: 100, - syncExpressions: [ - DataStoreSyncExpression( - modelSchema: Post.schema, - modelPredicate: { Post.keys.createdAt.ge(startTime) } - ) - ] - ) + dataStoreConfiguration: configuration ) try startAmplify() diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/TestSupport/HubEventsIntegrationTestBase.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/TestSupport/HubEventsIntegrationTestBase.swift index 87f2eab238..9bb4167312 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/TestSupport/HubEventsIntegrationTestBase.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/TestSupport/HubEventsIntegrationTestBase.swift @@ -49,7 +49,11 @@ class HubEventsIntegrationTestBase: XCTestCase { func configureAmplify(withModels models: AmplifyModelRegistration) throws { let amplifyConfig = try TestConfigHelper.retrieveAmplifyConfiguration(forResource: Self.amplifyConfigurationFile) + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, configuration: .subscriptionsDisabled)) + #else try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models)) + #endif try Amplify.add(plugin: AWSAPIPlugin( modelRegistration: models, sessionFactory: AmplifyURLSessionFactory() diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/TestSupport/SyncEngineIntegrationTestBase.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/TestSupport/SyncEngineIntegrationTestBase.swift index 41ed785503..33be2c76f0 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/TestSupport/SyncEngineIntegrationTestBase.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginIntegrationTests/TestSupport/SyncEngineIntegrationTestBase.swift @@ -59,12 +59,21 @@ class SyncEngineIntegrationTestBase: DataStoreTestBase { modelRegistration: models, sessionFactory: AmplifyURLSessionFactory() )) + #if os(watchOS) + try Amplify.add( + plugin: AWSDataStorePlugin( + modelRegistration: models, + configuration: dataStoreConfiguration ?? .custom(syncMaxRecords: 100, disableSubscriptions: { false }) + ) + ) + #else try Amplify.add( plugin: AWSDataStorePlugin( modelRegistration: models, configuration: dataStoreConfiguration ?? .custom(syncMaxRecords: 100) ) ) + #endif } catch { XCTFail(String(describing: error)) return diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift index d0d7ae72e5..8042b895a4 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift @@ -66,8 +66,13 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { setupConfig() Amplify.Logging.logLevel = logLevel + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }))) + #else try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, configuration: .custom(syncMaxRecords: 100))) + #endif try Amplify.add(plugin: AWSAPIPlugin(sessionFactory: AmplifyURLSessionFactory())) try Amplify.configure(amplifyConfig) @@ -85,7 +90,12 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { setupConfig() Amplify.Logging.logLevel = logLevel + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, configuration: .subscriptionsDisabled)) + #else try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models)) + #endif + try Amplify.configure(amplifyConfig) try await deleteMutationEvents() diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginMultiAuthTests/AWSDataStoreAuthBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginMultiAuthTests/AWSDataStoreAuthBaseTest.swift index 04bfce9c8e..155915a31b 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginMultiAuthTests/AWSDataStoreAuthBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginMultiAuthTests/AWSDataStoreAuthBaseTest.swift @@ -198,8 +198,12 @@ class AWSDataStoreAuthBaseTest: XCTestCase { do { setupCredentials(forAuthStrategy: testType) + #if os(watchOS) + let datastoreConfig = DataStoreConfiguration.custom(authModeStrategy: testType.authStrategy, disableSubscriptions: { false }) + #else let datastoreConfig = DataStoreConfiguration.custom(authModeStrategy: testType.authStrategy) - + #endif + try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, configuration: datastoreConfig)) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginV2Tests/TestSupport/SyncEngineIntegrationV2TestBase.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginV2Tests/TestSupport/SyncEngineIntegrationV2TestBase.swift index 13f11537ea..7ff6649ed0 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginV2Tests/TestSupport/SyncEngineIntegrationV2TestBase.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginV2Tests/TestSupport/SyncEngineIntegrationV2TestBase.swift @@ -53,8 +53,13 @@ class SyncEngineIntegrationV2TestBase: DataStoreTestBase { modelRegistration: models, sessionFactory: AmplifyURLSessionFactory() )) + #if os(watchOS) + try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, + configuration: .custom(syncMaxRecords: 100, disableSubscriptions: { false }))) + #else try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models, configuration: .custom(syncMaxRecords: 100))) + #endif } catch { XCTFail(String(describing: error)) return diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index 7d5b1c23f0..10dd122d5e 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -265,6 +265,7 @@ 21977DBF289C171A005B49D6 /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21977DBE289C1719005B49D6 /* TestConfigHelper.swift */; }; 219B518528E3A4B00080EDCC /* DataStoreConnectionOptionalAssociations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA00289BFE3400B32A39 /* DataStoreConnectionOptionalAssociations.swift */; }; 219B518628E3A7150080EDCC /* DataStoreHubEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBF9EE289BFE3400B32A39 /* DataStoreHubEvent.swift */; }; + 21A418212B0E78F400FF89E1 /* DataStoreConnectionScenario1Tests+WatchOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21A418202B0E78F400FF89E1 /* DataStoreConnectionScenario1Tests+WatchOS.swift */; }; 21AA64B72AC5D78B001C6D3B /* TodoCognitoMultiOwner+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210445622AB4F6C900420AF9 /* TodoCognitoMultiOwner+Schema.swift */; }; 21AA64B82AC5D791001C6D3B /* TodoCognitoMultiOwner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210445612AB4F6C900420AF9 /* TodoCognitoMultiOwner.swift */; }; 21AB5C2A297AE56D00CCA482 /* AWSDataStoreLazyLoadPostTagSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21AB5C29297AE56D00CCA482 /* AWSDataStoreLazyLoadPostTagSnapshotTests.swift */; }; @@ -1724,6 +1725,7 @@ 219253BD28BFE84000820737 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 21977D84289C1633005B49D6 /* primarykey_schema.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = primarykey_schema.graphql; sourceTree = ""; }; 21977DBE289C1719005B49D6 /* TestConfigHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = ""; }; + 21A418202B0E78F400FF89E1 /* DataStoreConnectionScenario1Tests+WatchOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataStoreConnectionScenario1Tests+WatchOS.swift"; sourceTree = ""; }; 21AB5C29297AE56D00CCA482 /* AWSDataStoreLazyLoadPostTagSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostTagSnapshotTests.swift; sourceTree = ""; }; 21AB5C4829819BF000CCA482 /* Nested.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Nested.swift; sourceTree = ""; }; 21AB5C4929819BF000CCA482 /* NestedTypeTestModel+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NestedTypeTestModel+Schema.swift"; sourceTree = ""; }; @@ -2879,6 +2881,7 @@ 21BBF9F6289BFE3400B32A39 /* DataStoreConnectionScenario4Tests.swift */, 21BBF9F4289BFE3400B32A39 /* DataStoreConnectionScenario5Tests.swift */, 21BBF9F8289BFE3400B32A39 /* DataStoreConnectionScenario6Tests.swift */, + 21A418202B0E78F400FF89E1 /* DataStoreConnectionScenario1Tests+WatchOS.swift */, ); path = Connection; sourceTree = ""; @@ -5302,6 +5305,7 @@ 21BBFDC7289C06E400B32A39 /* Blog6+Schema.swift in Sources */, 21BBFD34289C06E400B32A39 /* MenuType.swift in Sources */, 21BBFC0B289C037000B32A39 /* TestModelV2Registration.swift in Sources */, + 21A418212B0E78F400FF89E1 /* DataStoreConnectionScenario1Tests+WatchOS.swift in Sources */, 21BBFD7A289C06E400B32A39 /* Attendee8V2+Schema.swift in Sources */, 21BBFD8B289C06E400B32A39 /* ListStringContainer+Schema.swift in Sources */, 21BBFD94289C06E400B32A39 /* NestedTypeTestModel+Schema.swift in Sources */,