// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // import Amplify import Combine class MockDataStoreCategoryPlugin: MessageReporter, DataStoreCategoryPlugin { var responders = [ResponderKeys: Any]() var key: String { return "MockDataStoreCategoryPlugin" } func configure(using configuration: Any?) throws { notify() } func reset() { notify("reset") } func save(_ model: M, where condition: QueryPredicate? = nil, completion: (DataStoreResult) -> Void) { notify("save") if let responder = responders[.saveModelListener] as? SaveModelResponder { if let callback = responder.callback((model: model, where: condition)) { completion(callback) } } } func save(_ model: M, where condition: QueryPredicate? = nil) async throws -> M { notify("save") return model } func query(_ modelType: M.Type, byId id: String, completion: (DataStoreResult) -> Void) { notify("queryById") if let responder = responders[.queryByIdListener] as? QueryByIdResponder { if let callback = responder.callback((modelType: modelType, id: id)) { completion(callback) } } } func query(_ modelType: M.Type, byId id: String) async throws -> M? { notify("queryById") return nil } func query(_ modelType: M.Type, byIdentifier id: String, completion: (DataStoreResult) -> Void) where M: ModelIdentifiable, M.IdentifierFormat == ModelIdentifierFormat.Default { notify("queryByIdentifier") if let responder = responders[.queryByIdListener] as? QueryByIdResponder { if let callback = responder.callback((modelType: modelType, id: id)) { completion(callback) } } } func query(_ modelType: M.Type, byIdentifier id: String) async throws -> M? where M: ModelIdentifiable, M.IdentifierFormat == ModelIdentifierFormat.Default { notify("queryByIdentifier") return nil } func query(_ modelType: M.Type, where predicate: QueryPredicate?, sort sortInput: QuerySortInput?, paginate paginationInput: QueryPaginationInput?, completion: (DataStoreResult<[M]>) -> Void) { notify("queryByPredicate") if let responder = responders[.queryModelsListener] as? QueryModelsResponder { if let result = responder.callback((modelType: modelType, where: predicate, sort: sortInput, paginate: paginationInput)) { completion(result) } } } func query(_ modelType: M.Type, where predicate: QueryPredicate?, sort sortInput: QuerySortInput?, paginate paginationInput: QueryPaginationInput?) async throws -> [M] { notify("queryByPredicate") if let responder = responders[.queryModelsListener] as? QueryModelsResponder { if let result = responder.callback((modelType: modelType, where: predicate, sort: sortInput, paginate: paginationInput)) { switch result { case .success(let models): return models case .failure(let error): throw error } } } return [] } func query(_ modelType: M.Type, byIdentifier id: ModelIdentifier, completion: (DataStoreResult) -> Void) where M: Model, M: ModelIdentifiable { notify("queryWithIdentifier") if let responder = responders[.queryByIdListener] as? QueryByIdResponder { if let callback = responder.callback((modelType: modelType, id: id.stringValue)) { completion(callback) } } } func query(_ modelType: M.Type, byIdentifier id: ModelIdentifier) async throws -> M? where M: Model, M: ModelIdentifiable { notify("queryWithIdentifier") return nil } func delete(_ modelType: M.Type, withId id: String, where predicate: QueryPredicate? = nil, completion: (DataStoreResult) -> Void) { notify("deleteById") if let responder = responders[.deleteByIdListener] as? DeleteByIdResponder { if let callback = responder.callback((modelType: modelType, id: id)) { completion(callback) } } } func delete(_ modelType: M.Type, withId id: String, where predicate: QueryPredicate? = nil) async throws { notify("deleteById") } func delete(_ modelType: M.Type, withIdentifier id: String, where predicate: QueryPredicate? = nil, completion: @escaping (DataStoreResult) -> Void) where M: ModelIdentifiable, M.IdentifierFormat == ModelIdentifierFormat.Default { notify("deleteByIdentifier") if let responder = responders[.deleteByIdListener] as? DeleteByIdResponder { if let callback = responder.callback((modelType: modelType, id: id)) { completion(callback) } } } func delete(_ modelType: M.Type, withIdentifier id: String, where predicate: QueryPredicate? = nil) async throws where M: ModelIdentifiable, M.IdentifierFormat == ModelIdentifierFormat.Default { notify("deleteByIdentifier") } func delete(_ modelType: M.Type, withIdentifier id: ModelIdentifier, where predicate: QueryPredicate?, completion: @escaping DataStoreCallback) where M: Model, M: ModelIdentifiable { notify("deleteByIdentifier") if let responder = responders[.deleteByIdListener] as? DeleteByIdResponder { if let callback = responder.callback((modelType: modelType, id: id.stringValue)) { completion(callback) } } } func delete(_ modelType: M.Type, withIdentifier id: ModelIdentifier, where predicate: QueryPredicate?) async throws where M: Model, M: ModelIdentifiable { notify("deleteByIdentifier") } func delete(_ modelType: M.Type, where predicate: QueryPredicate, completion: (DataStoreResult) -> Void) { notify("deleteModelTypeByPredicate") if let responder = responders[.deleteModelTypeListener] as? DeleteModelTypeResponder { if let callback = responder.callback((modelType: modelType, where: predicate)) { completion(callback) } } } func delete(_ modelType: M.Type, where predicate: QueryPredicate) async throws { notify("deleteModelTypeByPredicate") } func delete(_ model: M, where predicate: QueryPredicate? = nil, completion: @escaping DataStoreCallback) { notify("deleteByPredicate") if let responder = responders[.deleteModelListener] as? DeleteModelResponder { if let callback = responder.callback((model: model, where: predicate)) { completion(callback) } } } func delete(_ model: M, where predicate: QueryPredicate? = nil) async throws { notify("deleteByPredicate") } func clear(completion: @escaping DataStoreCallback) { notify("clear") if let responder = responders[.clearListener] as? ClearResponder { if let callback = responder.callback(()) { completion(callback) } } } func clear() async throws { notify("clear") } func start(completion: @escaping DataStoreCallback) { notify("start") if let responder = responders[.clearListener] as? ClearResponder { if let callback = responder.callback(()) { completion(callback) } } } func start() async throws { notify("start") } func stop(completion: @escaping DataStoreCallback) { notify("stop") if let responder = responders[.stopListener] as? StopResponder { if let callback = responder.callback(()) { completion(callback) } } } func stop() async throws { notify("stop") } func publisher(for modelType: M.Type) -> AnyPublisher { let mutationEvent = MutationEvent(id: "testevent", modelId: "123", modelName: modelType.modelName, json: "", mutationType: .create, createdAt: .now()) notify("publisher") return Result.Publisher(mutationEvent).eraseToAnyPublisher() } func observe(_ modelType: M.Type) -> AmplifyAsyncThrowingSequence { return AmplifyAsyncThrowingSequence(parent: nil) } public func observeQuery(for modelType: M.Type, where predicate: QueryPredicate? = nil, sort sortInput: QuerySortInput? = nil) -> AnyPublisher, DataStoreError> { notify("observeQuery") let snapshot = DataStoreQuerySnapshot(items: [], isSynced: false) return Result.Publisher(snapshot).eraseToAnyPublisher() } func observeQuery(for modelType: M.Type, where predicate: QueryPredicate?, sort sortInput: QuerySortInput?) -> AmplifyAsyncThrowingSequence> { let request = ObserveQueryRequest(options: []) let taskRunner = MockObserveQueryTaskRunner(request: request) return taskRunner.sequence } } class MockSecondDataStoreCategoryPlugin: MockDataStoreCategoryPlugin { override var key: String { return "MockSecondDataStoreCategoryPlugin" } } class ObserveQueryRequest: AmplifyOperationRequest { var options: Any typealias Options = Any init(options: Any) { self.options = options } } class MockObserveQueryTaskRunner: InternalTaskRunner, InternalTaskAsyncThrowingSequence, InternalTaskThrowingChannel { public typealias Request = ObserveQueryRequest public typealias InProcess = DataStoreQuerySnapshot public var request: ObserveQueryRequest public var context = InternalTaskAsyncThrowingSequenceContext>() func run() async throws { } init(request: ObserveQueryRequest) { self.request = request } }