From fd0d1317a715634b5f9b31dbd6b63166eeb811ae Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Fri, 14 Oct 2022 11:14:21 -0400 Subject: [PATCH 01/18] test(datastore): Lazy loading integration tests --- .../AWSDataStoreLazyLoadBaseTest.swift | 69 ++++ .../AWSDataStoreLazyLoadPostComment4V2.swift | 51 +++ .../Models/AmplifyModels.swift | 34 ++ .../Models/Blog8V2+Schema.swift | 44 +++ .../Models/Blog8V2.swift | 42 ++ .../Models/Comment4+Schema.swift | 50 +++ .../Models/Comment4.swift | 37 ++ .../Models/Comment4V2+Schema.swift | 45 +++ .../Models/Comment4V2.swift | 32 ++ .../Models/Comment7+Schema.swift | 49 +++ .../Models/Comment7.swift | 32 ++ .../Models/Comment8+Schema.swift | 51 +++ .../Models/Comment8.swift | 37 ++ .../Models/Comment8V2+Schema.swift | 41 ++ .../Models/Comment8V2.swift | 32 ++ .../CommentWithCompositeKey+Schema.swift | 48 +++ .../Models/CommentWithCompositeKey.swift | 32 ++ ...mmentWithCompositeKeyAndIndex+Schema.swift | 49 +++ .../CommentWithCompositeKeyAndIndex.swift | 32 ++ .../Models/MyCustomModel8+Schema.swift | 29 ++ .../Models/MyCustomModel8.swift | 10 + .../Models/MyNestedModel8+Schema.swift | 27 ++ .../Models/MyNestedModel8.swift | 9 + .../Models/Post4+Schema.swift | 48 +++ .../Models/Post4.swift | 32 ++ .../Models/Post4V2+Schema.swift | 44 +++ .../Models/Post4V2.swift | 32 ++ .../Models/Post7+Schema.swift | 48 +++ .../Models/Post7.swift | 32 ++ .../Models/Post8+Schema.swift | 48 +++ .../Models/Post8.swift | 32 ++ .../Models/Post8V2+Schema.swift | 46 +++ .../Models/Post8V2.swift | 42 ++ .../PostTagsWithCompositeKey+Schema.swift | 42 ++ .../Models/PostTagsWithCompositeKey.swift | 32 ++ .../Models/PostWithCompositeKey+Schema.swift | 48 +++ .../Models/PostWithCompositeKey.swift | 32 ++ .../PostWithCompositeKeyAndIndex+Schema.swift | 48 +++ .../Models/PostWithCompositeKeyAndIndex.swift | 32 ++ .../PostWithTagsCompositeKey+Schema.swift | 48 +++ .../Models/PostWithTagsCompositeKey.swift | 32 ++ .../Models/Project2+Schema.swift | 52 +++ .../Models/Project2.swift | 42 ++ .../Models/Project6+Schema.swift | 52 +++ .../Models/Project6.swift | 42 ++ .../Models/TagWithCompositeKey+Schema.swift | 48 +++ .../Models/TagWithCompositeKey.swift | 32 ++ .../Models/Team2+Schema.swift | 46 +++ .../Models/Team2.swift | 27 ++ .../Models/Team6+Schema.swift | 46 +++ .../Models/Team6.swift | 27 ++ .../AWSDataStorePluginLazyLoadTests/README.md | 32 ++ .../TestConfigHelper.swift | 44 +++ .../lazyload-schema.graphql | 239 ++++++++++++ .../project.pbxproj | 358 ++++++++++++++++++ .../AWSDataStorePluginLazyLoadTests.xcscheme | 77 ++++ .../xcschemes/DataStoreHostApp.xcscheme | 11 + 57 files changed, 2775 insertions(+) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/README.md create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/TestConfigHelper.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/AWSDataStorePluginLazyLoadTests.xcscheme diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift new file mode 100644 index 0000000000..4136ef549a --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift @@ -0,0 +1,69 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import XCTest +import Combine +import AWSDataStorePlugin +import AWSPluginsCore +import AWSAPIPlugin + +@testable import Amplify + +class AWSDataStoreLazyLoadBaseTest: XCTestCase { + var requests: Set = [] + + var amplifyConfig: AmplifyConfiguration! + + override func setUp() { + continueAfterFailure = false + } + + override func tearDown() async throws { + try await clearDataStore() + requests = [] + await Amplify.reset() + } + + func setupConfig() { + let basePath = "testconfiguration" + let baseFileName = "AWSDataStoreCategoryPluginLazyLoadIntegrationTests" + let configFile = "\(basePath)/\(baseFileName)-amplifyconfiguration" + + do { + amplifyConfig = try TestConfigHelper.retrieveAmplifyConfiguration(forResource: configFile) + } catch { + XCTFail("Error during setup: \(error)") + } + } + + func apiEndpointName() throws -> String { + guard let apiPlugin = amplifyConfig.api?.plugins["awsAPIPlugin"], + case .object(let value) = apiPlugin else { + throw APIError.invalidConfiguration("API endpoint not found.", "Check the provided configuration") + } + return value.keys.first! + } + + /// Setup DataStore with given models + /// - Parameter models: DataStore models + func setup(withModels models: AmplifyModelRegistration) async { + do { + setupConfig() + Amplify.Logging.logLevel = .verbose + try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models)) + try Amplify.add(plugin: AWSAPIPlugin()) + try Amplify.configure(amplifyConfig) + } catch { + XCTFail("Error during setup: \(error)") + } + } + + func clearDataStore() async throws { + try await Amplify.DataStore.clear() + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2.swift new file mode 100644 index 0000000000..e385a3c54a --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2.swift @@ -0,0 +1,51 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify + +class AWSDataStoreLazyLoadPostComment4V2: AWSDataStoreLazyLoadBaseTest { + + func testExample() async throws { + await setup(withModels: PostComment4V2Models()) + let post = Post4V2(title: "title") + let comment = Comment4V2(content: "content", post: post) + + let commentSynced = asyncExpectation(description: "DataStore start success") + let mutationEvents = Amplify.DataStore.observe(Comment4V2.self) + Task { + do { + for try await mutationEvent in mutationEvents { + if mutationEvent.version == 1 && mutationEvent.modelId == comment.id { + await commentSynced.fulfill() + } + } + } catch { + XCTFail("Failed with error \(error)") + } + } + + try await Amplify.DataStore.save(post) + try await Amplify.DataStore.save(comment) + + await waitForExpectations([commentSynced], timeout: 10) + } +} + + +extension AWSDataStoreLazyLoadPostComment4V2 { + struct PostComment4V2Models: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Post4V2.self) + ModelRegistry.register(modelType: Comment4V2.self) + } + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift new file mode 100644 index 0000000000..6336361c8e --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift @@ -0,0 +1,34 @@ +// swiftlint:disable all +import Amplify +import Foundation + +// Contains the set of classes that conforms to the `Model` protocol. + +final public class AmplifyModels: AmplifyModelRegistration { + public let version: String = "55f92d13a6658c6c92c10f097e770aa8" + + public func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Post4V2.self) + ModelRegistry.register(modelType: Comment4V2.self) + ModelRegistry.register(modelType: Blog8V2.self) + ModelRegistry.register(modelType: Post8V2.self) + ModelRegistry.register(modelType: Comment8V2.self) + ModelRegistry.register(modelType: PostWithCompositeKey.self) + ModelRegistry.register(modelType: CommentWithCompositeKey.self) + ModelRegistry.register(modelType: PostWithTagsCompositeKey.self) + ModelRegistry.register(modelType: TagWithCompositeKey.self) + ModelRegistry.register(modelType: PostWithCompositeKeyAndIndex.self) + ModelRegistry.register(modelType: CommentWithCompositeKeyAndIndex.self) + ModelRegistry.register(modelType: Project2.self) + ModelRegistry.register(modelType: Team2.self) + ModelRegistry.register(modelType: Post4.self) + ModelRegistry.register(modelType: Comment4.self) + ModelRegistry.register(modelType: Project6.self) + ModelRegistry.register(modelType: Team6.self) + ModelRegistry.register(modelType: Post7.self) + ModelRegistry.register(modelType: Comment7.self) + ModelRegistry.register(modelType: Post8.self) + ModelRegistry.register(modelType: Comment8.self) + ModelRegistry.register(modelType: PostTagsWithCompositeKey.self) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2+Schema.swift new file mode 100644 index 0000000000..caf4854d1e --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2+Schema.swift @@ -0,0 +1,44 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Blog8V2 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case name + case customs + case notes + case posts + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let blog8V2 = Blog8V2.keys + + model.pluralName = "Blog8V2s" + + model.attributes( + .primaryKey(fields: [blog8V2.id]) + ) + + model.fields( + .field(blog8V2.id, is: .required, ofType: .string), + .field(blog8V2.name, is: .required, ofType: .string), + .field(blog8V2.customs, is: .optional, ofType: .embeddedCollection(of: MyCustomModel8.self)), + .field(blog8V2.notes, is: .optional, ofType: .embeddedCollection(of: String.self)), + .hasMany(blog8V2.posts, is: .optional, ofType: Post8V2.self, associatedWith: Post8V2.keys.blog), + .field(blog8V2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(blog8V2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Blog8V2: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2.swift new file mode 100644 index 0000000000..d5209799e0 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2.swift @@ -0,0 +1,42 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Blog8V2: Model { + public let id: String + public var name: String + public var customs: [MyCustomModel8?]? + public var notes: [String?]? + public var posts: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + name: String, + customs: [MyCustomModel8?]? = nil, + notes: [String?]? = nil, + posts: List? = []) { + self.init(id: id, + name: name, + customs: customs, + notes: notes, + posts: posts, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + name: String, + customs: [MyCustomModel8?]? = nil, + notes: [String?]? = nil, + posts: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.name = name + self.customs = customs + self.notes = notes + self.posts = posts + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4+Schema.swift new file mode 100644 index 0000000000..6e27468d61 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4+Schema.swift @@ -0,0 +1,50 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Comment4 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case commentId + case content + case createdAt + case updatedAt + case post4CommentsPostId + case post4CommentsTitle + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let comment4 = Comment4.keys + + model.pluralName = "Comment4s" + + model.attributes( + .index(fields: ["commentId", "content"], name: nil), + .primaryKey(fields: [comment4.commentId, comment4.content]) + ) + + model.fields( + .field(comment4.commentId, is: .required, ofType: .string), + .field(comment4.content, is: .required, ofType: .string), + .field(comment4.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(comment4.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(comment4.post4CommentsPostId, is: .optional, ofType: .string), + .field(comment4.post4CommentsTitle, is: .optional, ofType: .string) + ) + } +} + +extension Comment4: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Comment4.IdentifierProtocol { + public static func identifier(commentId: String, + content: String) -> Self { + .make(fields:[(name: "commentId", value: commentId), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4.swift new file mode 100644 index 0000000000..bf249d1211 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4.swift @@ -0,0 +1,37 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Comment4: Model { + public let commentId: String + public let content: String + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + public var post4CommentsPostId: String? + public var post4CommentsTitle: String? + + public init(commentId: String, + content: String, + post4CommentsPostId: String? = nil, + post4CommentsTitle: String? = nil) { + self.init(commentId: commentId, + content: content, + createdAt: nil, + updatedAt: nil, + post4CommentsPostId: post4CommentsPostId, + post4CommentsTitle: post4CommentsTitle) + } + internal init(commentId: String, + content: String, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil, + post4CommentsPostId: String? = nil, + post4CommentsTitle: String? = nil) { + self.commentId = commentId + self.content = content + self.createdAt = createdAt + self.updatedAt = updatedAt + self.post4CommentsPostId = post4CommentsPostId + self.post4CommentsTitle = post4CommentsTitle + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2+Schema.swift new file mode 100644 index 0000000000..600509e366 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2+Schema.swift @@ -0,0 +1,45 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Comment4V2 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case content + case post + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let comment4V2 = Comment4V2.keys + + model.authRules = [ + rule(allow: .public, operations: [.create, .update, .delete, .read]) + ] + + model.pluralName = "Comment4V2s" + + model.attributes( + .index(fields: ["postID", "content"], name: "byPost4"), + .primaryKey(fields: [comment4V2.id]) + ) + + model.fields( + .field(comment4V2.id, is: .required, ofType: .string), + .field(comment4V2.content, is: .required, ofType: .string), + .belongsTo(comment4V2.post, is: .optional, ofType: Post4V2.self, targetNames: ["postID"]), + .field(comment4V2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(comment4V2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Comment4V2: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift new file mode 100644 index 0000000000..3de4f5acfa --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Comment4V2: Model { + public let id: String + public var content: String + public var post: Post4V2? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String, + post: Post4V2? = nil) { + self.init(id: id, + content: content, + post: post, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String, + post: Post4V2? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self.post = post + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7+Schema.swift new file mode 100644 index 0000000000..7f15cca8e7 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7+Schema.swift @@ -0,0 +1,49 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Comment7 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case commentId + case content + case post + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let comment7 = Comment7.keys + + model.pluralName = "Comment7s" + + model.attributes( + .index(fields: ["commentId", "content"], name: nil), + .index(fields: ["postId", "postTitle"], name: "byPost"), + .primaryKey(fields: [comment7.commentId, comment7.content]) + ) + + model.fields( + .field(comment7.commentId, is: .required, ofType: .string), + .field(comment7.content, is: .required, ofType: .string), + .belongsTo(comment7.post, is: .optional, ofType: Post7.self, targetNames: ["postId", "postTitle"]), + .field(comment7.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(comment7.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Comment7: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Comment7.IdentifierProtocol { + public static func identifier(commentId: String, + content: String) -> Self { + .make(fields:[(name: "commentId", value: commentId), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7.swift new file mode 100644 index 0000000000..bdf2ed40ce --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Comment7: Model { + public let commentId: String + public let content: String + public var post: Post7? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(commentId: String, + content: String, + post: Post7? = nil) { + self.init(commentId: commentId, + content: content, + post: post, + createdAt: nil, + updatedAt: nil) + } + internal init(commentId: String, + content: String, + post: Post7? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.commentId = commentId + self.content = content + self.post = post + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8+Schema.swift new file mode 100644 index 0000000000..7bec3d9989 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8+Schema.swift @@ -0,0 +1,51 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Comment8 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case commentId + case content + case postId + case postTitle + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let comment8 = Comment8.keys + + model.pluralName = "Comment8s" + + model.attributes( + .index(fields: ["commentId", "content"], name: nil), + .index(fields: ["postId", "postTitle"], name: "byPost"), + .primaryKey(fields: [comment8.commentId, comment8.content]) + ) + + model.fields( + .field(comment8.commentId, is: .required, ofType: .string), + .field(comment8.content, is: .required, ofType: .string), + .field(comment8.postId, is: .optional, ofType: .string), + .field(comment8.postTitle, is: .optional, ofType: .string), + .field(comment8.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(comment8.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Comment8: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Comment8.IdentifierProtocol { + public static func identifier(commentId: String, + content: String) -> Self { + .make(fields:[(name: "commentId", value: commentId), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8.swift new file mode 100644 index 0000000000..22fcd26a4b --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8.swift @@ -0,0 +1,37 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Comment8: Model { + public let commentId: String + public let content: String + public var postId: String? + public var postTitle: String? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(commentId: String, + content: String, + postId: String? = nil, + postTitle: String? = nil) { + self.init(commentId: commentId, + content: content, + postId: postId, + postTitle: postTitle, + createdAt: nil, + updatedAt: nil) + } + internal init(commentId: String, + content: String, + postId: String? = nil, + postTitle: String? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.commentId = commentId + self.content = content + self.postId = postId + self.postTitle = postTitle + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2+Schema.swift new file mode 100644 index 0000000000..ef1b3620a3 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2+Schema.swift @@ -0,0 +1,41 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Comment8V2 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case content + case post + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let comment8V2 = Comment8V2.keys + + model.pluralName = "Comment8V2s" + + model.attributes( + .index(fields: ["postId"], name: "commentByPost"), + .primaryKey(fields: [comment8V2.id]) + ) + + model.fields( + .field(comment8V2.id, is: .required, ofType: .string), + .field(comment8V2.content, is: .optional, ofType: .string), + .belongsTo(comment8V2.post, is: .optional, ofType: Post8V2.self, targetNames: ["postId"]), + .field(comment8V2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(comment8V2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Comment8V2: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2.swift new file mode 100644 index 0000000000..08fdfdafa1 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Comment8V2: Model { + public let id: String + public var content: String? + public var post: Post8V2? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String? = nil, + post: Post8V2? = nil) { + self.init(id: id, + content: content, + post: post, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String? = nil, + post: Post8V2? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self.post = post + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey+Schema.swift new file mode 100644 index 0000000000..e267c86f93 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension CommentWithCompositeKey { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case content + case post + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let commentWithCompositeKey = CommentWithCompositeKey.keys + + model.pluralName = "CommentWithCompositeKeys" + + model.attributes( + .index(fields: ["id", "content"], name: nil), + .primaryKey(fields: [commentWithCompositeKey.id, commentWithCompositeKey.content]) + ) + + model.fields( + .field(commentWithCompositeKey.id, is: .required, ofType: .string), + .field(commentWithCompositeKey.content, is: .required, ofType: .string), + .belongsTo(commentWithCompositeKey.post, is: .optional, ofType: PostWithCompositeKey.self, targetNames: ["postWithCompositeKeyCommentsId", "postWithCompositeKeyCommentsTitle"]), + .field(commentWithCompositeKey.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(commentWithCompositeKey.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension CommentWithCompositeKey: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension CommentWithCompositeKey.IdentifierProtocol { + public static func identifier(id: String, + content: String) -> Self { + .make(fields:[(name: "id", value: id), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift new file mode 100644 index 0000000000..ab7db0012a --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct CommentWithCompositeKey: Model { + public let id: String + public let content: String + public var post: PostWithCompositeKey? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String, + post: PostWithCompositeKey? = nil) { + self.init(id: id, + content: content, + post: post, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String, + post: PostWithCompositeKey? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self.post = post + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex+Schema.swift new file mode 100644 index 0000000000..777e8fe158 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex+Schema.swift @@ -0,0 +1,49 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension CommentWithCompositeKeyAndIndex { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case content + case post + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let commentWithCompositeKeyAndIndex = CommentWithCompositeKeyAndIndex.keys + + model.pluralName = "CommentWithCompositeKeyAndIndices" + + model.attributes( + .index(fields: ["id", "content"], name: nil), + .index(fields: ["postID", "postTitle"], name: "byPost"), + .primaryKey(fields: [commentWithCompositeKeyAndIndex.id, commentWithCompositeKeyAndIndex.content]) + ) + + model.fields( + .field(commentWithCompositeKeyAndIndex.id, is: .required, ofType: .string), + .field(commentWithCompositeKeyAndIndex.content, is: .required, ofType: .string), + .belongsTo(commentWithCompositeKeyAndIndex.post, is: .optional, ofType: PostWithCompositeKeyAndIndex.self, targetNames: ["postID", "postTitle"]), + .field(commentWithCompositeKeyAndIndex.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(commentWithCompositeKeyAndIndex.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension CommentWithCompositeKeyAndIndex: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension CommentWithCompositeKeyAndIndex.IdentifierProtocol { + public static func identifier(id: String, + content: String) -> Self { + .make(fields:[(name: "id", value: id), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex.swift new file mode 100644 index 0000000000..8f3562e1e0 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct CommentWithCompositeKeyAndIndex: Model { + public let id: String + public let content: String + public var post: PostWithCompositeKeyAndIndex? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String, + post: PostWithCompositeKeyAndIndex? = nil) { + self.init(id: id, + content: content, + post: post, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String, + post: PostWithCompositeKeyAndIndex? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self.post = post + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8+Schema.swift new file mode 100644 index 0000000000..2c926d8ab8 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8+Schema.swift @@ -0,0 +1,29 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension MyCustomModel8 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case name + case desc + case children + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let myCustomModel8 = MyCustomModel8.keys + + model.pluralName = "MyCustomModel8s" + + model.fields( + .field(myCustomModel8.id, is: .required, ofType: .string), + .field(myCustomModel8.name, is: .required, ofType: .string), + .field(myCustomModel8.desc, is: .optional, ofType: .string), + .field(myCustomModel8.children, is: .optional, ofType: .embeddedCollection(of: MyNestedModel8.self)) + ) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8.swift new file mode 100644 index 0000000000..6fb7a2b02d --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8.swift @@ -0,0 +1,10 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct MyCustomModel8: Embeddable { + var id: String + var name: String + var desc: String? + var children: [MyNestedModel8?]? +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8+Schema.swift new file mode 100644 index 0000000000..da4f5f1040 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8+Schema.swift @@ -0,0 +1,27 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension MyNestedModel8 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case nestedName + case notes + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let myNestedModel8 = MyNestedModel8.keys + + model.pluralName = "MyNestedModel8s" + + model.fields( + .field(myNestedModel8.id, is: .required, ofType: .string), + .field(myNestedModel8.nestedName, is: .required, ofType: .string), + .field(myNestedModel8.notes, is: .optional, ofType: .embeddedCollection(of: String.self)) + ) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8.swift new file mode 100644 index 0000000000..9884b8a197 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8.swift @@ -0,0 +1,9 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct MyNestedModel8: Embeddable { + var id: String + var nestedName: String + var notes: [String?]? +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4+Schema.swift new file mode 100644 index 0000000000..0f9b9f5740 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Post4 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case postId + case title + case comments + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let post4 = Post4.keys + + model.pluralName = "Post4s" + + model.attributes( + .index(fields: ["postId", "title"], name: nil), + .primaryKey(fields: [post4.postId, post4.title]) + ) + + model.fields( + .field(post4.postId, is: .required, ofType: .string), + .field(post4.title, is: .required, ofType: .string), + .hasMany(post4.comments, is: .optional, ofType: Comment4.self, associatedWith: Comment4.keys.post4CommentsPostId), + .field(post4.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(post4.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Post4: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Post4.IdentifierProtocol { + public static func identifier(postId: String, + title: String) -> Self { + .make(fields:[(name: "postId", value: postId), (name: "title", value: title)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4.swift new file mode 100644 index 0000000000..a50849704b --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Post4: Model { + public let postId: String + public let title: String + public var comments: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(postId: String, + title: String, + comments: List? = []) { + self.init(postId: postId, + title: title, + comments: comments, + createdAt: nil, + updatedAt: nil) + } + internal init(postId: String, + title: String, + comments: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.postId = postId + self.title = title + self.comments = comments + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2+Schema.swift new file mode 100644 index 0000000000..e8868bdb5d --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2+Schema.swift @@ -0,0 +1,44 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Post4V2 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case title + case comments + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let post4V2 = Post4V2.keys + + model.authRules = [ + rule(allow: .public, operations: [.create, .update, .delete, .read]) + ] + + model.pluralName = "Post4V2s" + + model.attributes( + .primaryKey(fields: [post4V2.id]) + ) + + model.fields( + .field(post4V2.id, is: .required, ofType: .string), + .field(post4V2.title, is: .required, ofType: .string), + .hasMany(post4V2.comments, is: .optional, ofType: Comment4V2.self, associatedWith: Comment4V2.keys.post), + .field(post4V2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(post4V2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Post4V2: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2.swift new file mode 100644 index 0000000000..08f3e4b429 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Post4V2: Model { + public let id: String + public var title: String + public var comments: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + title: String, + comments: List? = []) { + self.init(id: id, + title: title, + comments: comments, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + title: String, + comments: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.title = title + self.comments = comments + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7+Schema.swift new file mode 100644 index 0000000000..7700f9207a --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Post7 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case postId + case title + case comments + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let post7 = Post7.keys + + model.pluralName = "Post7s" + + model.attributes( + .index(fields: ["postId", "title"], name: nil), + .primaryKey(fields: [post7.postId, post7.title]) + ) + + model.fields( + .field(post7.postId, is: .required, ofType: .string), + .field(post7.title, is: .required, ofType: .string), + .hasMany(post7.comments, is: .optional, ofType: Comment7.self, associatedWith: Comment7.keys.post), + .field(post7.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(post7.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Post7: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Post7.IdentifierProtocol { + public static func identifier(postId: String, + title: String) -> Self { + .make(fields:[(name: "postId", value: postId), (name: "title", value: title)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7.swift new file mode 100644 index 0000000000..8cb750a96d --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Post7: Model { + public let postId: String + public let title: String + public var comments: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(postId: String, + title: String, + comments: List? = []) { + self.init(postId: postId, + title: title, + comments: comments, + createdAt: nil, + updatedAt: nil) + } + internal init(postId: String, + title: String, + comments: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.postId = postId + self.title = title + self.comments = comments + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8+Schema.swift new file mode 100644 index 0000000000..520236fa1e --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Post8 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case postId + case title + case comments + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let post8 = Post8.keys + + model.pluralName = "Post8s" + + model.attributes( + .index(fields: ["postId", "title"], name: nil), + .primaryKey(fields: [post8.postId, post8.title]) + ) + + model.fields( + .field(post8.postId, is: .required, ofType: .string), + .field(post8.title, is: .required, ofType: .string), + .hasMany(post8.comments, is: .optional, ofType: Comment8.self, associatedWith: Comment8.keys.postId), + .field(post8.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(post8.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Post8: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Post8.IdentifierProtocol { + public static func identifier(postId: String, + title: String) -> Self { + .make(fields:[(name: "postId", value: postId), (name: "title", value: title)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8.swift new file mode 100644 index 0000000000..440cd2b9d7 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Post8: Model { + public let postId: String + public let title: String + public var comments: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(postId: String, + title: String, + comments: List? = []) { + self.init(postId: postId, + title: title, + comments: comments, + createdAt: nil, + updatedAt: nil) + } + internal init(postId: String, + title: String, + comments: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.postId = postId + self.title = title + self.comments = comments + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2+Schema.swift new file mode 100644 index 0000000000..f703575013 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2+Schema.swift @@ -0,0 +1,46 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Post8V2 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case name + case randomId + case blog + case comments + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let post8V2 = Post8V2.keys + + model.pluralName = "Post8V2s" + + model.attributes( + .index(fields: ["blogId"], name: "postByBlog"), + .index(fields: ["randomId"], name: "byRandom"), + .primaryKey(fields: [post8V2.id]) + ) + + model.fields( + .field(post8V2.id, is: .required, ofType: .string), + .field(post8V2.name, is: .required, ofType: .string), + .field(post8V2.randomId, is: .optional, ofType: .string), + .belongsTo(post8V2.blog, is: .optional, ofType: Blog8V2.self, targetNames: ["blogId"]), + .hasMany(post8V2.comments, is: .optional, ofType: Comment8V2.self, associatedWith: Comment8V2.keys.post), + .field(post8V2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(post8V2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Post8V2: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2.swift new file mode 100644 index 0000000000..032848ac65 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2.swift @@ -0,0 +1,42 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Post8V2: Model { + public let id: String + public var name: String + public var randomId: String? + public var blog: Blog8V2? + public var comments: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + name: String, + randomId: String? = nil, + blog: Blog8V2? = nil, + comments: List? = []) { + self.init(id: id, + name: name, + randomId: randomId, + blog: blog, + comments: comments, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + name: String, + randomId: String? = nil, + blog: Blog8V2? = nil, + comments: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.name = name + self.randomId = randomId + self.blog = blog + self.comments = comments + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey+Schema.swift new file mode 100644 index 0000000000..172936f4e8 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey+Schema.swift @@ -0,0 +1,42 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension PostTagsWithCompositeKey { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case postWithTagsCompositeKey + case tagWithCompositeKey + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let postTagsWithCompositeKey = PostTagsWithCompositeKey.keys + + model.pluralName = "PostTagsWithCompositeKeys" + + model.attributes( + .index(fields: ["postWithTagsCompositeKeyPostId", "postWithTagsCompositeKeytitle"], name: "byPostWithTagsCompositeKey"), + .index(fields: ["tagWithCompositeKeyId", "tagWithCompositeKeyname"], name: "byTagWithCompositeKey"), + .primaryKey(fields: [postTagsWithCompositeKey.id]) + ) + + model.fields( + .field(postTagsWithCompositeKey.id, is: .required, ofType: .string), + .belongsTo(postTagsWithCompositeKey.postWithTagsCompositeKey, is: .required, ofType: PostWithTagsCompositeKey.self, targetNames: ["postWithTagsCompositeKeyPostId", "postWithTagsCompositeKeytitle"]), + .belongsTo(postTagsWithCompositeKey.tagWithCompositeKey, is: .required, ofType: TagWithCompositeKey.self, targetNames: ["tagWithCompositeKeyId", "tagWithCompositeKeyname"]), + .field(postTagsWithCompositeKey.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(postTagsWithCompositeKey.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension PostTagsWithCompositeKey: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey.swift new file mode 100644 index 0000000000..d03e2b5e42 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct PostTagsWithCompositeKey: Model { + public let id: String + public var postWithTagsCompositeKey: PostWithTagsCompositeKey + public var tagWithCompositeKey: TagWithCompositeKey + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + postWithTagsCompositeKey: PostWithTagsCompositeKey, + tagWithCompositeKey: TagWithCompositeKey) { + self.init(id: id, + postWithTagsCompositeKey: postWithTagsCompositeKey, + tagWithCompositeKey: tagWithCompositeKey, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + postWithTagsCompositeKey: PostWithTagsCompositeKey, + tagWithCompositeKey: TagWithCompositeKey, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.postWithTagsCompositeKey = postWithTagsCompositeKey + self.tagWithCompositeKey = tagWithCompositeKey + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey+Schema.swift new file mode 100644 index 0000000000..e7a9c5e1f4 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension PostWithCompositeKey { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case title + case comments + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let postWithCompositeKey = PostWithCompositeKey.keys + + model.pluralName = "PostWithCompositeKeys" + + model.attributes( + .index(fields: ["id", "title"], name: nil), + .primaryKey(fields: [postWithCompositeKey.id, postWithCompositeKey.title]) + ) + + model.fields( + .field(postWithCompositeKey.id, is: .required, ofType: .string), + .field(postWithCompositeKey.title, is: .required, ofType: .string), + .hasMany(postWithCompositeKey.comments, is: .optional, ofType: CommentWithCompositeKey.self, associatedWith: CommentWithCompositeKey.keys.post), + .field(postWithCompositeKey.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(postWithCompositeKey.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension PostWithCompositeKey: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension PostWithCompositeKey.IdentifierProtocol { + public static func identifier(id: String, + title: String) -> Self { + .make(fields:[(name: "id", value: id), (name: "title", value: title)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey.swift new file mode 100644 index 0000000000..e9de7de986 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct PostWithCompositeKey: Model { + public let id: String + public let title: String + public var comments: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + title: String, + comments: List? = []) { + self.init(id: id, + title: title, + comments: comments, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + title: String, + comments: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.title = title + self.comments = comments + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex+Schema.swift new file mode 100644 index 0000000000..0f13a541b9 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension PostWithCompositeKeyAndIndex { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case title + case comments + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let postWithCompositeKeyAndIndex = PostWithCompositeKeyAndIndex.keys + + model.pluralName = "PostWithCompositeKeyAndIndices" + + model.attributes( + .index(fields: ["id", "title"], name: nil), + .primaryKey(fields: [postWithCompositeKeyAndIndex.id, postWithCompositeKeyAndIndex.title]) + ) + + model.fields( + .field(postWithCompositeKeyAndIndex.id, is: .required, ofType: .string), + .field(postWithCompositeKeyAndIndex.title, is: .required, ofType: .string), + .hasMany(postWithCompositeKeyAndIndex.comments, is: .optional, ofType: CommentWithCompositeKeyAndIndex.self, associatedWith: CommentWithCompositeKeyAndIndex.keys.post), + .field(postWithCompositeKeyAndIndex.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(postWithCompositeKeyAndIndex.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension PostWithCompositeKeyAndIndex: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension PostWithCompositeKeyAndIndex.IdentifierProtocol { + public static func identifier(id: String, + title: String) -> Self { + .make(fields:[(name: "id", value: id), (name: "title", value: title)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex.swift new file mode 100644 index 0000000000..02bf0180d9 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct PostWithCompositeKeyAndIndex: Model { + public let id: String + public let title: String + public var comments: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + title: String, + comments: List? = []) { + self.init(id: id, + title: title, + comments: comments, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + title: String, + comments: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.title = title + self.comments = comments + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey+Schema.swift new file mode 100644 index 0000000000..2c0cd997e6 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension PostWithTagsCompositeKey { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case postId + case title + case tags + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let postWithTagsCompositeKey = PostWithTagsCompositeKey.keys + + model.pluralName = "PostWithTagsCompositeKeys" + + model.attributes( + .index(fields: ["postId", "title"], name: nil), + .primaryKey(fields: [postWithTagsCompositeKey.postId, postWithTagsCompositeKey.title]) + ) + + model.fields( + .field(postWithTagsCompositeKey.postId, is: .required, ofType: .string), + .field(postWithTagsCompositeKey.title, is: .required, ofType: .string), + .hasMany(postWithTagsCompositeKey.tags, is: .optional, ofType: PostTagsWithCompositeKey.self, associatedWith: PostTagsWithCompositeKey.keys.postWithTagsCompositeKey), + .field(postWithTagsCompositeKey.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(postWithTagsCompositeKey.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension PostWithTagsCompositeKey: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension PostWithTagsCompositeKey.IdentifierProtocol { + public static func identifier(postId: String, + title: String) -> Self { + .make(fields:[(name: "postId", value: postId), (name: "title", value: title)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey.swift new file mode 100644 index 0000000000..c739bc9c22 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct PostWithTagsCompositeKey: Model { + public let postId: String + public let title: String + public var tags: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(postId: String, + title: String, + tags: List? = []) { + self.init(postId: postId, + title: title, + tags: tags, + createdAt: nil, + updatedAt: nil) + } + internal init(postId: String, + title: String, + tags: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.postId = postId + self.title = title + self.tags = tags + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2+Schema.swift new file mode 100644 index 0000000000..2ca9794b8d --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2+Schema.swift @@ -0,0 +1,52 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Project2 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case projectId + case name + case team + case createdAt + case updatedAt + case project2TeamTeamId + case project2TeamName + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let project2 = Project2.keys + + model.pluralName = "Project2s" + + model.attributes( + .index(fields: ["projectId", "name"], name: nil), + .primaryKey(fields: [project2.projectId, project2.name]) + ) + + model.fields( + .field(project2.projectId, is: .required, ofType: .string), + .field(project2.name, is: .required, ofType: .string), + .hasOne(project2.team, is: .optional, ofType: Team2.self, associatedWith: Team2.keys.teamId, targetNames: ["project2TeamTeamId", "project2TeamName"]), + .field(project2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(project2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(project2.project2TeamTeamId, is: .optional, ofType: .string), + .field(project2.project2TeamName, is: .optional, ofType: .string) + ) + } +} + +extension Project2: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Project2.IdentifierProtocol { + public static func identifier(projectId: String, + name: String) -> Self { + .make(fields:[(name: "projectId", value: projectId), (name: "name", value: name)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2.swift new file mode 100644 index 0000000000..29e0c614bb --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2.swift @@ -0,0 +1,42 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Project2: Model { + public let projectId: String + public let name: String + public var team: Team2? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + public var project2TeamTeamId: String? + public var project2TeamName: String? + + public init(projectId: String, + name: String, + team: Team2? = nil, + project2TeamTeamId: String? = nil, + project2TeamName: String? = nil) { + self.init(projectId: projectId, + name: name, + team: team, + createdAt: nil, + updatedAt: nil, + project2TeamTeamId: project2TeamTeamId, + project2TeamName: project2TeamName) + } + internal init(projectId: String, + name: String, + team: Team2? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil, + project2TeamTeamId: String? = nil, + project2TeamName: String? = nil) { + self.projectId = projectId + self.name = name + self.team = team + self.createdAt = createdAt + self.updatedAt = updatedAt + self.project2TeamTeamId = project2TeamTeamId + self.project2TeamName = project2TeamName + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6+Schema.swift new file mode 100644 index 0000000000..6cda02ed54 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6+Schema.swift @@ -0,0 +1,52 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Project6 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case projectId + case name + case team + case teamId + case teamName + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let project6 = Project6.keys + + model.pluralName = "Project6s" + + model.attributes( + .index(fields: ["projectId", "name"], name: nil), + .primaryKey(fields: [project6.projectId, project6.name]) + ) + + model.fields( + .field(project6.projectId, is: .required, ofType: .string), + .field(project6.name, is: .required, ofType: .string), + .hasOne(project6.team, is: .optional, ofType: Team6.self, associatedWith: Team6.keys.teamId, targetNames: ["teamId", "teamName"]), + .field(project6.teamId, is: .optional, ofType: .string), + .field(project6.teamName, is: .optional, ofType: .string), + .field(project6.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(project6.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Project6: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Project6.IdentifierProtocol { + public static func identifier(projectId: String, + name: String) -> Self { + .make(fields:[(name: "projectId", value: projectId), (name: "name", value: name)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6.swift new file mode 100644 index 0000000000..346cb44d71 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6.swift @@ -0,0 +1,42 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Project6: Model { + public let projectId: String + public let name: String + public var team: Team6? + public var teamId: String? + public var teamName: String? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(projectId: String, + name: String, + team: Team6? = nil, + teamId: String? = nil, + teamName: String? = nil) { + self.init(projectId: projectId, + name: name, + team: team, + teamId: teamId, + teamName: teamName, + createdAt: nil, + updatedAt: nil) + } + internal init(projectId: String, + name: String, + team: Team6? = nil, + teamId: String? = nil, + teamName: String? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.projectId = projectId + self.name = name + self.team = team + self.teamId = teamId + self.teamName = teamName + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey+Schema.swift new file mode 100644 index 0000000000..dd535f584d --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension TagWithCompositeKey { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case name + case posts + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let tagWithCompositeKey = TagWithCompositeKey.keys + + model.pluralName = "TagWithCompositeKeys" + + model.attributes( + .index(fields: ["id", "name"], name: nil), + .primaryKey(fields: [tagWithCompositeKey.id, tagWithCompositeKey.name]) + ) + + model.fields( + .field(tagWithCompositeKey.id, is: .required, ofType: .string), + .field(tagWithCompositeKey.name, is: .required, ofType: .string), + .hasMany(tagWithCompositeKey.posts, is: .optional, ofType: PostTagsWithCompositeKey.self, associatedWith: PostTagsWithCompositeKey.keys.tagWithCompositeKey), + .field(tagWithCompositeKey.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(tagWithCompositeKey.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension TagWithCompositeKey: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension TagWithCompositeKey.IdentifierProtocol { + public static func identifier(id: String, + name: String) -> Self { + .make(fields:[(name: "id", value: id), (name: "name", value: name)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey.swift new file mode 100644 index 0000000000..8d8bbf9f26 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct TagWithCompositeKey: Model { + public let id: String + public let name: String + public var posts: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + name: String, + posts: List? = []) { + self.init(id: id, + name: name, + posts: posts, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + name: String, + posts: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.name = name + self.posts = posts + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2+Schema.swift new file mode 100644 index 0000000000..0f7353c4ab --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2+Schema.swift @@ -0,0 +1,46 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Team2 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case teamId + case name + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let team2 = Team2.keys + + model.pluralName = "Team2s" + + model.attributes( + .index(fields: ["teamId", "name"], name: nil), + .primaryKey(fields: [team2.teamId, team2.name]) + ) + + model.fields( + .field(team2.teamId, is: .required, ofType: .string), + .field(team2.name, is: .required, ofType: .string), + .field(team2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(team2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Team2: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Team2.IdentifierProtocol { + public static func identifier(teamId: String, + name: String) -> Self { + .make(fields:[(name: "teamId", value: teamId), (name: "name", value: name)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2.swift new file mode 100644 index 0000000000..90d68caa79 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2.swift @@ -0,0 +1,27 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Team2: Model { + public let teamId: String + public let name: String + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(teamId: String, + name: String) { + self.init(teamId: teamId, + name: name, + createdAt: nil, + updatedAt: nil) + } + internal init(teamId: String, + name: String, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.teamId = teamId + self.name = name + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6+Schema.swift new file mode 100644 index 0000000000..8556fdcbe1 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6+Schema.swift @@ -0,0 +1,46 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Team6 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case teamId + case name + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let team6 = Team6.keys + + model.pluralName = "Team6s" + + model.attributes( + .index(fields: ["teamId", "name"], name: nil), + .primaryKey(fields: [team6.teamId, team6.name]) + ) + + model.fields( + .field(team6.teamId, is: .required, ofType: .string), + .field(team6.name, is: .required, ofType: .string), + .field(team6.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(team6.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Team6: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Team6.IdentifierProtocol { + public static func identifier(teamId: String, + name: String) -> Self { + .make(fields:[(name: "teamId", value: teamId), (name: "name", value: name)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6.swift new file mode 100644 index 0000000000..88da92235b --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6.swift @@ -0,0 +1,27 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Team6: Model { + public let teamId: String + public let name: String + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(teamId: String, + name: String) { + self.init(teamId: teamId, + name: name, + createdAt: nil, + updatedAt: nil) + } + internal init(teamId: String, + name: String, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.teamId = teamId + self.name = name + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/README.md b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/README.md new file mode 100644 index 0000000000..57f3859fe8 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/README.md @@ -0,0 +1,32 @@ +## DataStore Lazy Load Integration Tests + +### Prerequisites +- AWS CLI +- Version used: `amplify -v` => `` + +### Set-up + +1. `amplify init` + +These tests were provisioned with V2 Transform:, and updates to `cli.json` +- "respectprimarykeyattributesonconnectionfield": true +- "TODOlazyLoadiOS": true + +2. `amplify add api` + +- Choose conflict resolution for DataStore +- Use API Key +- Use the `lazyload-schema.graphql` from this test directory. + +3. `amplify push` + +```perl +? Are you sure you want to continue? `Yes` +? Do you want to generate code for your newly created GraphQL API `No` +``` + +4. Copy `amplifyconfiguration.json` to a new file named `AWSDataStoreCategoryPluginLazyLoadIntegrationTests-amplifyconfiguration.json` inside `~/.aws-amplify/amplify-ios/testconfiguration/` + +```perl +cp amplifyconfiguration.json ~/.aws-amplify/amplify-ios/testconfiguration/AWSDataStoreCategoryPluginLazyLoadIntegrationTests-amplifyconfiguration.json +``` diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/TestConfigHelper.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/TestConfigHelper.swift new file mode 100644 index 0000000000..98a66edda4 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/TestConfigHelper.swift @@ -0,0 +1,44 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +@testable import Amplify + +extension String: Error { } + +class TestConfigHelper { + + static func retrieveAmplifyConfiguration(forResource: String) throws -> AmplifyConfiguration { + + let data = try retrieve(forResource: forResource) + return try AmplifyConfiguration.decodeAmplifyConfiguration(from: data) + } + + static func retrieveCredentials(forResource: String) throws -> [String: String] { + let data = try retrieve(forResource: forResource) + + let jsonOptional = try JSONSerialization.jsonObject(with: data, options: []) as? [String: String] + guard let json = jsonOptional else { + throw "Could not deserialize `\(forResource)` into JSON object" + } + + return json + } + + static func retrieve(forResource: String) throws -> Data { + guard let path = Bundle(for: self).path(forResource: forResource, ofType: "json") else { + throw "Could not retrieve configuration file: \(forResource)" + } + + let url = URL(fileURLWithPath: path) + return try Data(contentsOf: url) + } +} + +class TestCommonConstants { + static let networkTimeout = TimeInterval(10) +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql new file mode 100644 index 0000000000..3ec3502f5f --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql @@ -0,0 +1,239 @@ +# This "input" configures a global authorization rule to enable public access to +# all models in this schema. Learn more about authorization rules here: https://docs.amplify.aws/cli/graphql/authorization-rules +input AMPLIFY { globalAuthRule: AuthRule = { allow: public } } # FOR TESTING ONLY! + + +# 11 Explicit Bi-Directional Belongs to Relationship + +type Post4V2 @model @auth(rules: [{allow: public}]) { + id: ID! + title: String! + comments: [Comment4V2] @hasMany(indexName: "byPost4", fields: ["id"]) +} + +type Comment4V2 @model @auth(rules: [{allow: public}]) { + id: ID! + postID: ID! @index(name: "byPost4", sortKeyFields: ["content"]) + content: String! + post: Post4V2 @belongsTo(fields: ["postID"]) +} + +# 15 +# This is to address optional associations use case (Post can exist without a Blog) +# See issue https://github.com/aws-amplify/amplify-ios/issues/1792 for more details + +type Blog8V2 @model { + id: ID! + name: String! + customs: [MyCustomModel8] + notes: [String] + posts: [Post8V2] @hasMany(indexName: "postByBlog", fields: ["id"]) +} + +type Post8V2 @model { + id: ID! + name: String! + blogId: ID @index(name: "postByBlog") + randomId: String @index(name: "byRandom") + blog: Blog8V2 @belongsTo(fields: ["blogId"]) + comments: [Comment8V2] @hasMany(indexName: "commentByPost", fields: ["id"]) +} + +type Comment8V2 @model { + id: ID! + content: String + postId: ID @index(name: "commentByPost") + post: Post8V2 @belongsTo(fields: ["postId"]) +} + +type MyCustomModel8 { + id: ID! + name: String! + desc: String + children: [MyNestedModel8] +} + +type MyNestedModel8 { + id: ID! + nestedName: String! + notes: [String] +} + +# iOS.7. A Has-Many/Belongs-To relationship, each with a composite key +# Post with `id` and `title`, Comment with `id` and `content` + +type PostWithCompositeKey @model { + id: ID! @primaryKey(sortKeyFields: ["title"]) + title: String! + comments: [CommentWithCompositeKey] @hasMany +} + +type CommentWithCompositeKey @model { + id: ID! @primaryKey(sortKeyFields: ["content"]) + content: String! + post: PostWithCompositeKey @belongsTo +} + +# iOS.8. A Many-To-Many relationship, each with a composite key +# Post with `id` and `title`, Tag with `id` and `name` + +type PostWithTagsCompositeKey @model { + postId: ID! @primaryKey(sortKeyFields: ["title"]) + title: String! + tags: [TagWithCompositeKey] @manyToMany(relationName: "PostTagsWithCompositeKey") +} + +type TagWithCompositeKey @model { + id: ID! @primaryKey(sortKeyFields: ["name"]) + name: String! + posts: [PostWithTagsCompositeKey] @manyToMany(relationName: "PostTagsWithCompositeKey") +} + +# iOS.9. A Has-Many/Belongs-To relationship, with index +# Post with `id` and `title`, Comment with `id`, `content`, and index on `postID` and `postTitle` + +type PostWithCompositeKeyAndIndex @model { + id: ID! @primaryKey(sortKeyFields: ["title"]) + title: String! + comments: [CommentWithCompositeKeyAndIndex] @hasMany +} + +type CommentWithCompositeKeyAndIndex @model { + id: ID! @primaryKey(sortKeyFields: ["content"]) + content: String! + postID: ID @index(name: "byPost", sortKeyFields: ["postTitle"]) + postTitle: String + post: PostWithCompositeKeyAndIndex @belongsTo(fields: ["postID", "postTitle"]) +} + +# CLI.1. Implicit Bi-directional Has One + +#type Project1 @model { +# projectId: ID! @primaryKey(sortKeyFields:["name"]) +# name: String! +# team: Team1 @hasOne +#} +#type Team1 @model { +# teamId: ID! @primaryKey(sortKeyFields:["name"]) +# name: String! +# project: Project1 @belongsTo +#} + +# CLI.2. Implicit Uni-directional Has One + +type Project2 @model { + projectId: ID! @primaryKey(sortKeyFields:["name"]) + name: String! + team: Team2 @hasOne +} +type Team2 @model { + teamId: ID! @primaryKey(sortKeyFields:["name"]) + name: String! +} + +# CLI.3. Implicit Bi-directional Has Many + +#type Post3 @model { +# postId: ID! @primaryKey(sortKeyFields:["title"]) +# title: String! +# comments: [Comment3] @hasMany +#} +#type Comment3 @model { +# commentId: ID! @primaryKey(sortKeyFields:["content"]) +# content: String! +# post: Post3 @belongsTo +#} + +# CLI.4. Implicit Uni-directional Has Many + +type Post4 @model { + postId: ID! @primaryKey(sortKeyFields:["title"]) + title: String! + comments: [Comment4] @hasMany +} +type Comment4 @model { + commentId: ID! @primaryKey(sortKeyFields:["content"]) + content: String! +} + +# CLI.5. Explicit Bi-directional Has One + +#type Project5 @model { +# projectId: ID! @primaryKey(sortKeyFields:["name"]) +# name: String! +# team: Team5 @hasOne(fields:["teamId", "teamName"]) +# teamId: ID # customized foreign key for child primary key +# teamName: String # customized foreign key for child sort key +#} +#type Team5 @model { +# teamId: ID! @primaryKey(sortKeyFields:["name"]) +# name: String! +# project: Project5 @belongsTo(fields:["projectId", "projectName"]) +# projectId: ID # customized foreign key for parent primary key +# projectName: String # customized foreign key for parent sort key +#} + +# CLI.6. Explicit Uni-directional Has One + +type Project6 @model { + projectId: ID! @primaryKey(sortKeyFields:["name"]) + name: String! + team: Team6 @hasOne(fields:["teamId", "teamName"]) + teamId: ID # customized foreign key for child primary key + teamName: String # customized foreign key for child sort key +} +type Team6 @model { + teamId: ID! @primaryKey(sortKeyFields:["name"]) + name: String! +} + +# CLI.7. Explicit Bi-directional Has Many + +type Post7 @model { + postId: ID! @primaryKey(sortKeyFields:["title"]) + title: String! + comments: [Comment7] @hasMany(indexName:"byPost", fields:["postId", "title"]) +} +type Comment7 @model { + commentId: ID! @primaryKey(sortKeyFields:["content"]) + content: String! + post: Post7 @belongsTo(fields:["postId", "postTitle"]) + postId: ID @index(name: "byPost", sortKeyFields:["postTitle"]) # customized foreign key for parent primary key + postTitle: String # customized foreign key for parent sort key +} + +# CLI.8. Explicit Uni-directional Has Many + +type Post8 @model { + postId: ID! @primaryKey(sortKeyFields:["title"]) + title: String! + comments: [Comment8] @hasMany(indexName:"byPost", fields:["postId", "title"]) +} +type Comment8 @model { + commentId: ID! @primaryKey(sortKeyFields:["content"]) + content: String! + postId: ID @index(name: "byPost", sortKeyFields:["postTitle"]) # customized foreign key for parent primary key + postTitle: String # customized foreign key for parent sort key +} + +# CLI.9. Many To Many + +#type Post9 @model { +# customPostId: ID! @primaryKey(sortKeyFields: ["title"]) +# title: String! +# content: String +# tags: [Tag9] @manyToMany(relationName: "PostTags") +#} +#type Tag9 @model { +# customTagId: ID! @primaryKey(sortKeyFields: ["label"]) +# label: String! +# posts: [Post9] @manyToMany(relationName: "PostTags") +#} + +# CLI.10. Todo + +#type Book @model { +# isbn: ID! @primaryKey(sortKeyFields: ["title"]) +# title: String! +# description: String +#} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index 59c2654616..1cc2d3f9d7 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -153,6 +153,61 @@ 213DBC6128A5808400B30280 /* TodoIAMPrivate+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA8B289BFE4E00B32A39 /* TodoIAMPrivate+Schema.swift */; }; 213DBC6228A5808400B30280 /* TodoIAMPublic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA8D289BFE4E00B32A39 /* TodoIAMPublic.swift */; }; 213DBC6328A5841400B30280 /* HubListenerTestUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFE13289C073100B32A39 /* HubListenerTestUtilities.swift */; }; + 21801C7D28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */; }; + 21801C8728F9A38000FFA37E /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801C8628F9A37F00FFA37E /* TestConfigHelper.swift */; }; + 21801CD428F9A86800FFA37E /* PostWithCompositeKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */; }; + 21801CD528F9A86800FFA37E /* CommentWithCompositeKey+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CA428F9A86600FFA37E /* CommentWithCompositeKey+Schema.swift */; }; + 21801CD628F9A86800FFA37E /* PostWithTagsCompositeKey+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CA528F9A86600FFA37E /* PostWithTagsCompositeKey+Schema.swift */; }; + 21801CD728F9A86800FFA37E /* CommentWithCompositeKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CA628F9A86600FFA37E /* CommentWithCompositeKey.swift */; }; + 21801CD828F9A86800FFA37E /* Comment7+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CA728F9A86600FFA37E /* Comment7+Schema.swift */; }; + 21801CD928F9A86800FFA37E /* Post8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CA828F9A86600FFA37E /* Post8.swift */; }; + 21801CDA28F9A86800FFA37E /* PostWithTagsCompositeKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CA928F9A86600FFA37E /* PostWithTagsCompositeKey.swift */; }; + 21801CDB28F9A86800FFA37E /* MyNestedModel8+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CAA28F9A86600FFA37E /* MyNestedModel8+Schema.swift */; }; + 21801CDC28F9A86800FFA37E /* PostTagsWithCompositeKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CAB28F9A86600FFA37E /* PostTagsWithCompositeKey.swift */; }; + 21801CDD28F9A86800FFA37E /* Comment8V2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CAC28F9A86600FFA37E /* Comment8V2+Schema.swift */; }; + 21801CDE28F9A86800FFA37E /* Post4+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CAD28F9A86600FFA37E /* Post4+Schema.swift */; }; + 21801CDF28F9A86800FFA37E /* MyCustomModel8+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CAE28F9A86600FFA37E /* MyCustomModel8+Schema.swift */; }; + 21801CE028F9A86800FFA37E /* Post8V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CAF28F9A86600FFA37E /* Post8V2.swift */; }; + 21801CE128F9A86800FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB028F9A86600FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift */; }; + 21801CE228F9A86800FFA37E /* PostWithCompositeKeyAndIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB128F9A86600FFA37E /* PostWithCompositeKeyAndIndex.swift */; }; + 21801CE328F9A86800FFA37E /* Project6.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB228F9A86600FFA37E /* Project6.swift */; }; + 21801CE428F9A86800FFA37E /* Blog8V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB328F9A86700FFA37E /* Blog8V2.swift */; }; + 21801CE528F9A86800FFA37E /* PostTagsWithCompositeKey+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB428F9A86700FFA37E /* PostTagsWithCompositeKey+Schema.swift */; }; + 21801CE628F9A86800FFA37E /* TagWithCompositeKey+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB528F9A86700FFA37E /* TagWithCompositeKey+Schema.swift */; }; + 21801CE728F9A86800FFA37E /* Project2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB628F9A86700FFA37E /* Project2.swift */; }; + 21801CE828F9A86800FFA37E /* Comment4V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB728F9A86700FFA37E /* Comment4V2.swift */; }; + 21801CE928F9A86800FFA37E /* Post8+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB828F9A86700FFA37E /* Post8+Schema.swift */; }; + 21801CEA28F9A86800FFA37E /* Comment8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB928F9A86700FFA37E /* Comment8.swift */; }; + 21801CEB28F9A86800FFA37E /* Post4V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBA28F9A86700FFA37E /* Post4V2.swift */; }; + 21801CEC28F9A86800FFA37E /* Team6+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBB28F9A86700FFA37E /* Team6+Schema.swift */; }; + 21801CED28F9A86800FFA37E /* Post4.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBC28F9A86700FFA37E /* Post4.swift */; }; + 21801CEE28F9A86800FFA37E /* Comment4.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBD28F9A86700FFA37E /* Comment4.swift */; }; + 21801CEF28F9A86800FFA37E /* Blog8V2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBE28F9A86700FFA37E /* Blog8V2+Schema.swift */; }; + 21801CF028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBF28F9A86700FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift */; }; + 21801CF128F9A86800FFA37E /* Project2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC028F9A86700FFA37E /* Project2+Schema.swift */; }; + 21801CF228F9A86800FFA37E /* Post4V2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC128F9A86700FFA37E /* Post4V2+Schema.swift */; }; + 21801CF328F9A86800FFA37E /* Project6+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC228F9A86700FFA37E /* Project6+Schema.swift */; }; + 21801CF428F9A86800FFA37E /* Post7.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC328F9A86700FFA37E /* Post7.swift */; }; + 21801CF528F9A86800FFA37E /* Comment7.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC428F9A86700FFA37E /* Comment7.swift */; }; + 21801CF628F9A86800FFA37E /* Comment4+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC528F9A86700FFA37E /* Comment4+Schema.swift */; }; + 21801CF728F9A86800FFA37E /* Post8V2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC628F9A86700FFA37E /* Post8V2+Schema.swift */; }; + 21801CF828F9A86800FFA37E /* PostWithCompositeKey+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC728F9A86800FFA37E /* PostWithCompositeKey+Schema.swift */; }; + 21801CF928F9A86800FFA37E /* Team6.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC828F9A86800FFA37E /* Team6.swift */; }; + 21801CFA28F9A86800FFA37E /* TagWithCompositeKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC928F9A86800FFA37E /* TagWithCompositeKey.swift */; }; + 21801CFB28F9A86800FFA37E /* Team2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCA28F9A86800FFA37E /* Team2+Schema.swift */; }; + 21801CFC28F9A86800FFA37E /* Comment4V2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCB28F9A86800FFA37E /* Comment4V2+Schema.swift */; }; + 21801CFD28F9A86800FFA37E /* MyCustomModel8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCC28F9A86800FFA37E /* MyCustomModel8.swift */; }; + 21801CFE28F9A86800FFA37E /* Comment8V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCD28F9A86800FFA37E /* Comment8V2.swift */; }; + 21801CFF28F9A86800FFA37E /* Team2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCE28F9A86800FFA37E /* Team2.swift */; }; + 21801D0028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCF28F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift */; }; + 21801D0128F9A86800FFA37E /* AmplifyModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD028F9A86800FFA37E /* AmplifyModels.swift */; }; + 21801D0228F9A86800FFA37E /* Comment8+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */; }; + 21801D0328F9A86800FFA37E /* Post7+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD228F9A86800FFA37E /* Post7+Schema.swift */; }; + 21801D0428F9A86800FFA37E /* MyNestedModel8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD328F9A86800FFA37E /* MyNestedModel8.swift */; }; + 21801D0628F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift */; }; + 21801D0728F9B11800FFA37E /* AsyncTesting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681DFE8028E746C10000C36A /* AsyncTesting.swift */; }; + 21801D0828F9B11B00FFA37E /* AsyncExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681DFE8128E746C10000C36A /* AsyncExpectation.swift */; }; + 21801D0928F9B11E00FFA37E /* XCTestCase+AsyncTesting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681DFE8228E746C10000C36A /* XCTestCase+AsyncTesting.swift */; }; 219253BE28BFE84100820737 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 219253BD28BFE84000820737 /* XCTest.framework */; }; 21977DBF289C171A005B49D6 /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21977DBE289C1719005B49D6 /* TestConfigHelper.swift */; }; 219B518528E3A4B00080EDCC /* DataStoreConnectionOptionalAssociations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA00289BFE3400B32A39 /* DataStoreConnectionOptionalAssociations.swift */; }; @@ -540,6 +595,13 @@ remoteGlobalIDString = 2118212B289BFB4B001B5945; remoteInfo = DataStoreHostApp; }; + 21801C7E28F9A22900FFA37E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 21182124289BFB4B001B5945 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2118212B289BFB4B001B5945; + remoteInfo = DataStoreHostApp; + }; 21BBFB45289BFF6A00B32A39 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 21182124289BFB4B001B5945 /* Project object */; @@ -644,6 +706,61 @@ 213DBC5828A57FFE00B30280 /* TestConfigHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = ""; }; 213DBC5A28A5800F00B30280 /* TestConfigHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = ""; }; 213DBC5C28A5801900B30280 /* TestConfigHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = ""; }; + 21801C7A28F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AWSDataStorePluginLazyLoadTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadBaseTest.swift; sourceTree = ""; }; + 21801C8428F9A2DC00FFA37E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 21801C8528F9A36D00FFA37E /* lazyload-schema.graphql */ = {isa = PBXFileReference; lastKnownFileType = text; path = "lazyload-schema.graphql"; sourceTree = ""; }; + 21801C8628F9A37F00FFA37E /* TestConfigHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = ""; }; + 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostWithCompositeKey.swift; sourceTree = ""; }; + 21801CA428F9A86600FFA37E /* CommentWithCompositeKey+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CommentWithCompositeKey+Schema.swift"; sourceTree = ""; }; + 21801CA528F9A86600FFA37E /* PostWithTagsCompositeKey+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PostWithTagsCompositeKey+Schema.swift"; sourceTree = ""; }; + 21801CA628F9A86600FFA37E /* CommentWithCompositeKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommentWithCompositeKey.swift; sourceTree = ""; }; + 21801CA728F9A86600FFA37E /* Comment7+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Comment7+Schema.swift"; sourceTree = ""; }; + 21801CA828F9A86600FFA37E /* Post8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Post8.swift; sourceTree = ""; }; + 21801CA928F9A86600FFA37E /* PostWithTagsCompositeKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostWithTagsCompositeKey.swift; sourceTree = ""; }; + 21801CAA28F9A86600FFA37E /* MyNestedModel8+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MyNestedModel8+Schema.swift"; sourceTree = ""; }; + 21801CAB28F9A86600FFA37E /* PostTagsWithCompositeKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostTagsWithCompositeKey.swift; sourceTree = ""; }; + 21801CAC28F9A86600FFA37E /* Comment8V2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Comment8V2+Schema.swift"; sourceTree = ""; }; + 21801CAD28F9A86600FFA37E /* Post4+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Post4+Schema.swift"; sourceTree = ""; }; + 21801CAE28F9A86600FFA37E /* MyCustomModel8+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MyCustomModel8+Schema.swift"; sourceTree = ""; }; + 21801CAF28F9A86600FFA37E /* Post8V2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Post8V2.swift; sourceTree = ""; }; + 21801CB028F9A86600FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PostWithCompositeKeyAndIndex+Schema.swift"; sourceTree = ""; }; + 21801CB128F9A86600FFA37E /* PostWithCompositeKeyAndIndex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostWithCompositeKeyAndIndex.swift; sourceTree = ""; }; + 21801CB228F9A86600FFA37E /* Project6.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project6.swift; sourceTree = ""; }; + 21801CB328F9A86700FFA37E /* Blog8V2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Blog8V2.swift; sourceTree = ""; }; + 21801CB428F9A86700FFA37E /* PostTagsWithCompositeKey+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PostTagsWithCompositeKey+Schema.swift"; sourceTree = ""; }; + 21801CB528F9A86700FFA37E /* TagWithCompositeKey+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TagWithCompositeKey+Schema.swift"; sourceTree = ""; }; + 21801CB628F9A86700FFA37E /* Project2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project2.swift; sourceTree = ""; }; + 21801CB728F9A86700FFA37E /* Comment4V2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comment4V2.swift; sourceTree = ""; }; + 21801CB828F9A86700FFA37E /* Post8+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Post8+Schema.swift"; sourceTree = ""; }; + 21801CB928F9A86700FFA37E /* Comment8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comment8.swift; sourceTree = ""; }; + 21801CBA28F9A86700FFA37E /* Post4V2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Post4V2.swift; sourceTree = ""; }; + 21801CBB28F9A86700FFA37E /* Team6+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Team6+Schema.swift"; sourceTree = ""; }; + 21801CBC28F9A86700FFA37E /* Post4.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Post4.swift; sourceTree = ""; }; + 21801CBD28F9A86700FFA37E /* Comment4.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comment4.swift; sourceTree = ""; }; + 21801CBE28F9A86700FFA37E /* Blog8V2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Blog8V2+Schema.swift"; sourceTree = ""; }; + 21801CBF28F9A86700FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CommentWithCompositeKeyAndIndex+Schema.swift"; sourceTree = ""; }; + 21801CC028F9A86700FFA37E /* Project2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Project2+Schema.swift"; sourceTree = ""; }; + 21801CC128F9A86700FFA37E /* Post4V2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Post4V2+Schema.swift"; sourceTree = ""; }; + 21801CC228F9A86700FFA37E /* Project6+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Project6+Schema.swift"; sourceTree = ""; }; + 21801CC328F9A86700FFA37E /* Post7.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Post7.swift; sourceTree = ""; }; + 21801CC428F9A86700FFA37E /* Comment7.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comment7.swift; sourceTree = ""; }; + 21801CC528F9A86700FFA37E /* Comment4+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Comment4+Schema.swift"; sourceTree = ""; }; + 21801CC628F9A86700FFA37E /* Post8V2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Post8V2+Schema.swift"; sourceTree = ""; }; + 21801CC728F9A86800FFA37E /* PostWithCompositeKey+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PostWithCompositeKey+Schema.swift"; sourceTree = ""; }; + 21801CC828F9A86800FFA37E /* Team6.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Team6.swift; sourceTree = ""; }; + 21801CC928F9A86800FFA37E /* TagWithCompositeKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TagWithCompositeKey.swift; sourceTree = ""; }; + 21801CCA28F9A86800FFA37E /* Team2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Team2+Schema.swift"; sourceTree = ""; }; + 21801CCB28F9A86800FFA37E /* Comment4V2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Comment4V2+Schema.swift"; sourceTree = ""; }; + 21801CCC28F9A86800FFA37E /* MyCustomModel8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyCustomModel8.swift; sourceTree = ""; }; + 21801CCD28F9A86800FFA37E /* Comment8V2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comment8V2.swift; sourceTree = ""; }; + 21801CCE28F9A86800FFA37E /* Team2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Team2.swift; sourceTree = ""; }; + 21801CCF28F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommentWithCompositeKeyAndIndex.swift; sourceTree = ""; }; + 21801CD028F9A86800FFA37E /* AmplifyModels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AmplifyModels.swift; sourceTree = ""; }; + 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Comment8+Schema.swift"; sourceTree = ""; }; + 21801CD228F9A86800FFA37E /* Post7+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Post7+Schema.swift"; sourceTree = ""; }; + 21801CD328F9A86800FFA37E /* MyNestedModel8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyNestedModel8.swift; sourceTree = ""; }; + 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostComment4V2.swift; sourceTree = ""; }; 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 = ""; }; @@ -1124,6 +1241,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 21801C7728F9A22900FFA37E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 21BBFB3E289BFF6A00B32A39 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1167,6 +1291,7 @@ 213DBBDB28A5770000B30280 /* AWSDataStorePluginAuthCognitoTests */, 213DBBE828A5771400B30280 /* AWSDataStorePluginAuthIAMTests */, 213DBBF528A5772500B30280 /* AWSDataStorePluginMultiAuthTests */, + 21801C7B28F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests */, 2118212D289BFB4B001B5945 /* Products */, 2118213F289BFBC4001B5945 /* Frameworks */, ); @@ -1183,6 +1308,7 @@ 213DBBDA28A5770000B30280 /* AWSDataStorePluginAuthCognitoTests.xctest */, 213DBBE728A5771400B30280 /* AWSDataStorePluginAuthIAMTests.xctest */, 213DBBF428A5772500B30280 /* AWSDataStorePluginMultiAuthTests.xctest */, + 21801C7A28F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests.xctest */, ); name = Products; sourceTree = ""; @@ -1273,6 +1399,75 @@ path = AWSDataStorePluginMultiAuthTests; sourceTree = ""; }; + 21801C7B28F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests */ = { + isa = PBXGroup; + children = ( + 21801CA228F9A78F00FFA37E /* Models */, + 21801C8628F9A37F00FFA37E /* TestConfigHelper.swift */, + 21801C8528F9A36D00FFA37E /* lazyload-schema.graphql */, + 21801C8428F9A2DC00FFA37E /* README.md */, + 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */, + 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift */, + ); + path = AWSDataStorePluginLazyLoadTests; + sourceTree = ""; + }; + 21801CA228F9A78F00FFA37E /* Models */ = { + isa = PBXGroup; + children = ( + 21801CD028F9A86800FFA37E /* AmplifyModels.swift */, + 21801CB328F9A86700FFA37E /* Blog8V2.swift */, + 21801CBE28F9A86700FFA37E /* Blog8V2+Schema.swift */, + 21801CBD28F9A86700FFA37E /* Comment4.swift */, + 21801CC528F9A86700FFA37E /* Comment4+Schema.swift */, + 21801CB728F9A86700FFA37E /* Comment4V2.swift */, + 21801CCB28F9A86800FFA37E /* Comment4V2+Schema.swift */, + 21801CC428F9A86700FFA37E /* Comment7.swift */, + 21801CA728F9A86600FFA37E /* Comment7+Schema.swift */, + 21801CB928F9A86700FFA37E /* Comment8.swift */, + 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */, + 21801CCD28F9A86800FFA37E /* Comment8V2.swift */, + 21801CAC28F9A86600FFA37E /* Comment8V2+Schema.swift */, + 21801CA628F9A86600FFA37E /* CommentWithCompositeKey.swift */, + 21801CA428F9A86600FFA37E /* CommentWithCompositeKey+Schema.swift */, + 21801CCF28F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift */, + 21801CBF28F9A86700FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift */, + 21801CCC28F9A86800FFA37E /* MyCustomModel8.swift */, + 21801CAE28F9A86600FFA37E /* MyCustomModel8+Schema.swift */, + 21801CD328F9A86800FFA37E /* MyNestedModel8.swift */, + 21801CAA28F9A86600FFA37E /* MyNestedModel8+Schema.swift */, + 21801CBC28F9A86700FFA37E /* Post4.swift */, + 21801CAD28F9A86600FFA37E /* Post4+Schema.swift */, + 21801CBA28F9A86700FFA37E /* Post4V2.swift */, + 21801CC128F9A86700FFA37E /* Post4V2+Schema.swift */, + 21801CC328F9A86700FFA37E /* Post7.swift */, + 21801CD228F9A86800FFA37E /* Post7+Schema.swift */, + 21801CA828F9A86600FFA37E /* Post8.swift */, + 21801CB828F9A86700FFA37E /* Post8+Schema.swift */, + 21801CAF28F9A86600FFA37E /* Post8V2.swift */, + 21801CC628F9A86700FFA37E /* Post8V2+Schema.swift */, + 21801CAB28F9A86600FFA37E /* PostTagsWithCompositeKey.swift */, + 21801CB428F9A86700FFA37E /* PostTagsWithCompositeKey+Schema.swift */, + 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */, + 21801CC728F9A86800FFA37E /* PostWithCompositeKey+Schema.swift */, + 21801CB128F9A86600FFA37E /* PostWithCompositeKeyAndIndex.swift */, + 21801CB028F9A86600FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift */, + 21801CA928F9A86600FFA37E /* PostWithTagsCompositeKey.swift */, + 21801CA528F9A86600FFA37E /* PostWithTagsCompositeKey+Schema.swift */, + 21801CB628F9A86700FFA37E /* Project2.swift */, + 21801CC028F9A86700FFA37E /* Project2+Schema.swift */, + 21801CB228F9A86600FFA37E /* Project6.swift */, + 21801CC228F9A86700FFA37E /* Project6+Schema.swift */, + 21801CC928F9A86800FFA37E /* TagWithCompositeKey.swift */, + 21801CB528F9A86700FFA37E /* TagWithCompositeKey+Schema.swift */, + 21801CCE28F9A86800FFA37E /* Team2.swift */, + 21801CCA28F9A86800FFA37E /* Team2+Schema.swift */, + 21801CC828F9A86800FFA37E /* Team6.swift */, + 21801CBB28F9A86700FFA37E /* Team6+Schema.swift */, + ); + path = Models; + sourceTree = ""; + }; 21977D75289C161D005B49D6 /* Models */ = { isa = PBXGroup; children = ( @@ -2354,6 +2549,25 @@ productReference = 213DBBF428A5772500B30280 /* AWSDataStorePluginMultiAuthTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + 21801C7928F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 21801C8228F9A22900FFA37E /* Build configuration list for PBXNativeTarget "AWSDataStorePluginLazyLoadTests" */; + buildPhases = ( + 21801C7628F9A22900FFA37E /* Sources */, + 21801C7728F9A22900FFA37E /* Frameworks */, + 21801C7828F9A22900FFA37E /* Resources */, + 21801C8328F9A23300FFA37E /* Copy Configuration Files */, + ); + buildRules = ( + ); + dependencies = ( + 21801C7F28F9A22900FFA37E /* PBXTargetDependency */, + ); + name = AWSDataStorePluginLazyLoadTests; + productName = AWSDataStorePluginLazyLoadTests; + productReference = 21801C7A28F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 21BBFB40289BFF6A00B32A39 /* AWSDataStorePluginIntegrationTests */ = { isa = PBXNativeTarget; buildConfigurationList = 21BBFB49289BFF6A00B32A39 /* Build configuration list for PBXNativeTarget "AWSDataStorePluginIntegrationTests" */; @@ -2454,6 +2668,10 @@ CreatedOnToolsVersion = 14.0; TestTargetID = 2118212B289BFB4B001B5945; }; + 21801C7928F9A22900FFA37E = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 2118212B289BFB4B001B5945; + }; 21BBFB40289BFF6A00B32A39 = { CreatedOnToolsVersion = 13.4.1; TestTargetID = 2118212B289BFB4B001B5945; @@ -2493,6 +2711,7 @@ 213DBBD928A5770000B30280 /* AWSDataStorePluginAuthCognitoTests */, 213DBBE628A5771400B30280 /* AWSDataStorePluginAuthIAMTests */, 213DBBF328A5772500B30280 /* AWSDataStorePluginMultiAuthTests */, + 21801C7928F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests */, ); }; /* End PBXProject section */ @@ -2528,6 +2747,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 21801C7828F9A22900FFA37E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 21BBFB3F289BFF6A00B32A39 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2617,6 +2843,24 @@ shellPath = /bin/sh; shellScript = "TEMP_FILE=$HOME/.aws-amplify/amplify-ios/testconfiguration/.\nDEST_PATH=\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/testconfiguration/\"\n\nif [[ ! -d $TEMP_FILE ]] ; then\n echo \"${TEMP_FILE} does not exist. Using empty configuration.\"\n exit 0\nfi\n\nif [[ -f $DEST_PATH ]] ; then\n rm $DEST_PATH\nfi\n \ncp -r $TEMP_FILE $DEST_PATH\n"; }; + 21801C8328F9A23300FFA37E /* Copy Configuration Files */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Copy Configuration Files"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "TEMP_FILE=$HOME/.aws-amplify/amplify-ios/testconfiguration/.\nDEST_PATH=\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/testconfiguration/\"\n\nif [[ ! -d $TEMP_FILE ]] ; then\n echo \"${TEMP_FILE} does not exist. Using empty configuration.\"\n exit 0\nfi\n\nif [[ -f $DEST_PATH ]] ; then\n rm $DEST_PATH\nfi\n \ncp -r $TEMP_FILE $DEST_PATH\n"; + }; 21977DBC289C16EB005B49D6 /* Copy Configuration Files */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -2798,6 +3042,68 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 21801C7628F9A22900FFA37E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 21801CE328F9A86800FFA37E /* Project6.swift in Sources */, + 21801CE628F9A86800FFA37E /* TagWithCompositeKey+Schema.swift in Sources */, + 21801CE728F9A86800FFA37E /* Project2.swift in Sources */, + 21801CF728F9A86800FFA37E /* Post8V2+Schema.swift in Sources */, + 21801D0128F9A86800FFA37E /* AmplifyModels.swift in Sources */, + 21801CFB28F9A86800FFA37E /* Team2+Schema.swift in Sources */, + 21801D0328F9A86800FFA37E /* Post7+Schema.swift in Sources */, + 21801CEF28F9A86800FFA37E /* Blog8V2+Schema.swift in Sources */, + 21801CE428F9A86800FFA37E /* Blog8V2.swift in Sources */, + 21801CE028F9A86800FFA37E /* Post8V2.swift in Sources */, + 21801C7D28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift in Sources */, + 21801CFF28F9A86800FFA37E /* Team2.swift in Sources */, + 21801D0228F9A86800FFA37E /* Comment8+Schema.swift in Sources */, + 21801CFC28F9A86800FFA37E /* Comment4V2+Schema.swift in Sources */, + 21801CEC28F9A86800FFA37E /* Team6+Schema.swift in Sources */, + 21801CEA28F9A86800FFA37E /* Comment8.swift in Sources */, + 21801C8728F9A38000FFA37E /* TestConfigHelper.swift in Sources */, + 21801CE928F9A86800FFA37E /* Post8+Schema.swift in Sources */, + 21801CF528F9A86800FFA37E /* Comment7.swift in Sources */, + 21801CE828F9A86800FFA37E /* Comment4V2.swift in Sources */, + 21801CD528F9A86800FFA37E /* CommentWithCompositeKey+Schema.swift in Sources */, + 21801CED28F9A86800FFA37E /* Post4.swift in Sources */, + 21801CF228F9A86800FFA37E /* Post4V2+Schema.swift in Sources */, + 21801CFA28F9A86800FFA37E /* TagWithCompositeKey.swift in Sources */, + 21801CF828F9A86800FFA37E /* PostWithCompositeKey+Schema.swift in Sources */, + 21801CF328F9A86800FFA37E /* Project6+Schema.swift in Sources */, + 21801CE228F9A86800FFA37E /* PostWithCompositeKeyAndIndex.swift in Sources */, + 21801CD728F9A86800FFA37E /* CommentWithCompositeKey.swift in Sources */, + 21801CFE28F9A86800FFA37E /* Comment8V2.swift in Sources */, + 21801CD928F9A86800FFA37E /* Post8.swift in Sources */, + 21801CDD28F9A86800FFA37E /* Comment8V2+Schema.swift in Sources */, + 21801CD428F9A86800FFA37E /* PostWithCompositeKey.swift in Sources */, + 21801CD828F9A86800FFA37E /* Comment7+Schema.swift in Sources */, + 21801D0028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift in Sources */, + 21801CF028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift in Sources */, + 21801D0728F9B11800FFA37E /* AsyncTesting.swift in Sources */, + 21801CF128F9A86800FFA37E /* Project2+Schema.swift in Sources */, + 21801D0428F9A86800FFA37E /* MyNestedModel8.swift in Sources */, + 21801CF928F9A86800FFA37E /* Team6.swift in Sources */, + 21801CE128F9A86800FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift in Sources */, + 21801CD628F9A86800FFA37E /* PostWithTagsCompositeKey+Schema.swift in Sources */, + 21801CDC28F9A86800FFA37E /* PostTagsWithCompositeKey.swift in Sources */, + 21801CF628F9A86800FFA37E /* Comment4+Schema.swift in Sources */, + 21801CEB28F9A86800FFA37E /* Post4V2.swift in Sources */, + 21801CDF28F9A86800FFA37E /* MyCustomModel8+Schema.swift in Sources */, + 21801D0828F9B11B00FFA37E /* AsyncExpectation.swift in Sources */, + 21801CFD28F9A86800FFA37E /* MyCustomModel8.swift in Sources */, + 21801CEE28F9A86800FFA37E /* Comment4.swift in Sources */, + 21801D0628F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift in Sources */, + 21801CDB28F9A86800FFA37E /* MyNestedModel8+Schema.swift in Sources */, + 21801CE528F9A86800FFA37E /* PostTagsWithCompositeKey+Schema.swift in Sources */, + 21801CDE28F9A86800FFA37E /* Post4+Schema.swift in Sources */, + 21801CDA28F9A86800FFA37E /* PostWithTagsCompositeKey.swift in Sources */, + 21801D0928F9B11E00FFA37E /* XCTestCase+AsyncTesting.swift in Sources */, + 21801CF428F9A86800FFA37E /* Post7.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 21BBFB3D289BFF6A00B32A39 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -3246,6 +3552,11 @@ target = 2118212B289BFB4B001B5945 /* DataStoreHostApp */; targetProxy = 213DBBF828A5772500B30280 /* PBXContainerItemProxy */; }; + 21801C7F28F9A22900FFA37E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2118212B289BFB4B001B5945 /* DataStoreHostApp */; + targetProxy = 21801C7E28F9A22900FFA37E /* PBXContainerItemProxy */; + }; 21BBFB46289BFF6A00B32A39 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 2118212B289BFB4B001B5945 /* DataStoreHostApp */; @@ -3553,6 +3864,44 @@ }; name = Release; }; + 21801C8028F9A22900FFA37E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.aws.amplify.AWSDataStorePluginLazyLoadTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DataStoreHostApp.app/DataStoreHostApp"; + }; + name = Debug; + }; + 21801C8128F9A22900FFA37E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.aws.amplify.AWSDataStorePluginLazyLoadTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DataStoreHostApp.app/DataStoreHostApp"; + }; + name = Release; + }; 21BBFB47289BFF6A00B32A39 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3745,6 +4094,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 21801C8228F9A22900FFA37E /* Build configuration list for PBXNativeTarget "AWSDataStorePluginLazyLoadTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 21801C8028F9A22900FFA37E /* Debug */, + 21801C8128F9A22900FFA37E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 21BBFB49289BFF6A00B32A39 /* Build configuration list for PBXNativeTarget "AWSDataStorePluginIntegrationTests" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/AWSDataStorePluginLazyLoadTests.xcscheme b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/AWSDataStorePluginLazyLoadTests.xcscheme new file mode 100644 index 0000000000..7b04b96766 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/AWSDataStorePluginLazyLoadTests.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/DataStoreHostApp.xcscheme b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/DataStoreHostApp.xcscheme index e830be2802..4daa7ccb84 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/DataStoreHostApp.xcscheme +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/DataStoreHostApp.xcscheme @@ -28,6 +28,17 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> + + + + Date: Fri, 14 Oct 2022 11:35:21 -0400 Subject: [PATCH 02/18] manually modify codegenerated models --- .../Models/Comment4V2.swift | 77 ++++++++++++------- 1 file changed, 50 insertions(+), 27 deletions(-) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift index 3de4f5acfa..ee136f9708 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift @@ -3,30 +3,53 @@ import Amplify import Foundation public struct Comment4V2: Model { - public let id: String - public var content: String - public var post: Post4V2? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(id: String = UUID().uuidString, - content: String, - post: Post4V2? = nil) { - self.init(id: id, - content: content, - post: post, - createdAt: nil, - updatedAt: nil) - } - internal init(id: String = UUID().uuidString, - content: String, - post: Post4V2? = nil, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.id = id - self.content = content - self.post = post - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file + public let id: String + public var content: String + internal var _post: LazyModel + public var post: Post4V2? { + get async throws { + try await _post.get() + } + } + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String, + post: Post4V2? = nil) { + self.init(id: id, + content: content, + post: post, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String, + post: Post4V2? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self._post = LazyModel(element: post) + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public mutating func setPost(_ post: Post4V2) { + self._post = LazyModel(element: post) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + id = try values.decode(String.self, forKey: .id) + content = try values.decode(String.self, forKey: .content) + _post = try values.decode(LazyModel.self, forKey: .post) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(id, forKey: .id) + try container.encode(content, forKey: .content) + try container.encode(_post, forKey: .post) + } +} From 805cb0546479aa7cdb41c5c6e87a4f4ba0891bc3 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Mon, 17 Oct 2022 11:21:17 -0400 Subject: [PATCH 03/18] datastore PostComment with compositeKey --- .../OutgoingMutationQueue.swift | 6 +- .../AWSDataStoreLazyLoadBaseTest.swift | 12 ++- ...ataStoreLazyLoadPostComment4V2Tests.swift} | 6 +- ...LoadPostCommentWithCompositeKeyTests.swift | 85 +++++++++++++++++++ .../Models/CommentWithCompositeKey.swift | 77 +++++++++++------ .../project.pbxproj | 12 ++- 6 files changed, 159 insertions(+), 39 deletions(-) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{AWSDataStoreLazyLoadPostComment4V2.swift => AWSDataStoreLazyLoadPostComment4V2Tests.swift} (86%) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/OutgoingMutationQueue.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/OutgoingMutationQueue.swift index ac9308a492..fa8310af4f 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/OutgoingMutationQueue.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Sync/MutationSync/OutgoingMutationQueue/OutgoingMutationQueue.swift @@ -355,7 +355,8 @@ final class OutgoingMutationQueue: OutgoingMutationQueueBehavior { data: outboxMutationProcessedEvent) Amplify.Hub.dispatch(to: .dataStore, payload: payload) } catch { - log.error("\(#function) Couldn't decode local model as \(mutationEvent.modelName)") + log.error("\(#function) Couldn't decode local model as \(mutationEvent.modelName) \(error)") + log.error("\(#function) Couldn't decode from \(mutationEvent.json)") return } } @@ -370,7 +371,8 @@ final class OutgoingMutationQueue: OutgoingMutationQueueBehavior { data: outboxMutationEnqueuedEvent) Amplify.Hub.dispatch(to: .dataStore, payload: payload) } catch { - log.error("\(#function) Couldn't decode local model as \(mutationEvent.modelName)") + log.error("\(#function) Couldn't decode local model as \(mutationEvent.modelName) \(error)") + log.error("\(#function) Couldn't decode from \(mutationEvent.json)") return } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift index 4136ef549a..614a5ff715 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift @@ -51,11 +51,17 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { /// Setup DataStore with given models /// - Parameter models: DataStore models - func setup(withModels models: AmplifyModelRegistration) async { + func setup(withModels models: AmplifyModelRegistration, + logLevel: LogLevel = .verbose, + eagerLoad: Bool = true) async { do { setupConfig() - Amplify.Logging.logLevel = .verbose - try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: models)) + Amplify.Logging.logLevel = logLevel + + try Amplify.add(plugin: AWSDataStorePlugin( + modelRegistration: models, + configuration: .custom( + loadingStrategy: eagerLoad ? .eagerLoad : .lazyLoad))) try Amplify.add(plugin: AWSAPIPlugin()) try Amplify.configure(amplifyConfig) } catch { diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2Tests.swift similarity index 86% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2Tests.swift index e385a3c54a..76dc56758f 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2Tests.swift @@ -11,14 +11,14 @@ import XCTest @testable import Amplify -class AWSDataStoreLazyLoadPostComment4V2: AWSDataStoreLazyLoadBaseTest { +class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { func testExample() async throws { await setup(withModels: PostComment4V2Models()) let post = Post4V2(title: "title") let comment = Comment4V2(content: "content", post: post) - let commentSynced = asyncExpectation(description: "DataStore start success") + let commentSynced = asyncExpectation(description: "comment synced success") let mutationEvents = Amplify.DataStore.observe(Comment4V2.self) Task { do { @@ -40,7 +40,7 @@ class AWSDataStoreLazyLoadPostComment4V2: AWSDataStoreLazyLoadBaseTest { } -extension AWSDataStoreLazyLoadPostComment4V2 { +extension AWSDataStoreLazyLoadPostComment4V2Tests { struct PostComment4V2Models: AmplifyModelRegistration { public let version: String = "version" func registerModels(registry: ModelRegistry.Type) { diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift new file mode 100644 index 0000000000..d1e4177d51 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift @@ -0,0 +1,85 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify + +final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLazyLoadBaseTest { + + func testLazyLoadPostFromComment() async throws { + await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) + + // Save a comment with post + let post = PostWithCompositeKey(title: "title") + let comment = CommentWithCompositeKey(content: "content", post: post) + let commentSynced = asyncExpectation(description: "comment was synced successfully") + let mutationEvents = Amplify.DataStore.observe(CommentWithCompositeKey.self) + Task { + do { + for try await mutationEvent in mutationEvents { + if mutationEvent.version == 1 && mutationEvent.modelId == comment.identifier { + await commentSynced.fulfill() + } + } + } catch { + XCTFail("Failed with error \(error)") + } + } + try await Amplify.DataStore.save(post) + let savedComment = try await Amplify.DataStore.save(comment) + await waitForExpectations([commentSynced], timeout: 10) + + switch savedComment._post.modelProvider.getState() { + case .notLoaded: + XCTFail("The result from the save API should be a loaded post") + case .loaded(let loadedPost): + XCTAssertEqual(loadedPost?.id, post.id) + } + guard let loadedPost = try await savedComment.post else { + XCTFail("Failed to retrieve the post from the comment") + return + } + XCTAssertEqual(loadedPost.id, post.id) + guard let queriedComment = try await Amplify.DataStore.query(CommentWithCompositeKey.self, + byIdentifier: .identifier( + id: comment.id, + content: comment.content)) else { + XCTFail("Failed to query comment") + return + } + switch queriedComment._post.modelProvider.getState() { + case .notLoaded(let identifiers): + guard let identifier = identifiers.first else { + XCTFail("missing identifiers") + return + } + XCTAssertEqual(identifier.key, "@@primaryKey") + XCTAssertEqual(identifier.value, post.identifier) + case .loaded: + XCTFail("Should be not loaded when queried") + } + guard let loadedPost2 = try await queriedComment.post else { + XCTFail("Failed to retrieve the post from the comment") + return + } + XCTAssertEqual(loadedPost2.id, post.id) + } +} + + +extension AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests { + struct PostCommentWithCompositeKeyModels: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: PostWithCompositeKey.self) + ModelRegistry.register(modelType: CommentWithCompositeKey.self) + } + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift index ab7db0012a..736c260d3a 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift @@ -3,30 +3,53 @@ import Amplify import Foundation public struct CommentWithCompositeKey: Model { - public let id: String - public let content: String - public var post: PostWithCompositeKey? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(id: String = UUID().uuidString, - content: String, - post: PostWithCompositeKey? = nil) { - self.init(id: id, - content: content, - post: post, - createdAt: nil, - updatedAt: nil) - } - internal init(id: String = UUID().uuidString, - content: String, - post: PostWithCompositeKey? = nil, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.id = id - self.content = content - self.post = post - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file + public let id: String + public let content: String + internal var _post: LazyModel + public var post: PostWithCompositeKey? { + get async throws { + try await _post.get() + } + } + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String, + post: PostWithCompositeKey? = nil) { + self.init(id: id, + content: content, + post: post, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String, + post: PostWithCompositeKey? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self._post = LazyModel(element: post) + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public mutating func setPost(_ post: PostWithCompositeKey) { + self._post = LazyModel(element: post) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + id = try values.decode(String.self, forKey: .id) + content = try values.decode(String.self, forKey: .content) + _post = try values.decode(LazyModel.self, forKey: .post) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(id, forKey: .id) + try container.encode(content, forKey: .content) + try container.encode(_post, forKey: .post) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index 1cc2d3f9d7..a02442fd61 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -204,10 +204,11 @@ 21801D0228F9A86800FFA37E /* Comment8+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */; }; 21801D0328F9A86800FFA37E /* Post7+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD228F9A86800FFA37E /* Post7+Schema.swift */; }; 21801D0428F9A86800FFA37E /* MyNestedModel8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD328F9A86800FFA37E /* MyNestedModel8.swift */; }; - 21801D0628F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift */; }; + 21801D0628F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift */; }; 21801D0728F9B11800FFA37E /* AsyncTesting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681DFE8028E746C10000C36A /* AsyncTesting.swift */; }; 21801D0828F9B11B00FFA37E /* AsyncExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681DFE8128E746C10000C36A /* AsyncExpectation.swift */; }; 21801D0928F9B11E00FFA37E /* XCTestCase+AsyncTesting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681DFE8228E746C10000C36A /* XCTestCase+AsyncTesting.swift */; }; + 21801D2528FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D2428FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift */; }; 219253BE28BFE84100820737 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 219253BD28BFE84000820737 /* XCTest.framework */; }; 21977DBF289C171A005B49D6 /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21977DBE289C1719005B49D6 /* TestConfigHelper.swift */; }; 219B518528E3A4B00080EDCC /* DataStoreConnectionOptionalAssociations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA00289BFE3400B32A39 /* DataStoreConnectionOptionalAssociations.swift */; }; @@ -760,7 +761,8 @@ 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Comment8+Schema.swift"; sourceTree = ""; }; 21801CD228F9A86800FFA37E /* Post7+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Post7+Schema.swift"; sourceTree = ""; }; 21801CD328F9A86800FFA37E /* MyNestedModel8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyNestedModel8.swift; sourceTree = ""; }; - 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostComment4V2.swift; sourceTree = ""; }; + 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostComment4V2Tests.swift; sourceTree = ""; }; + 21801D2428FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift; sourceTree = ""; }; 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 = ""; }; @@ -1407,7 +1409,8 @@ 21801C8528F9A36D00FFA37E /* lazyload-schema.graphql */, 21801C8428F9A2DC00FFA37E /* README.md */, 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */, - 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift */, + 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift */, + 21801D2428FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift */, ); path = AWSDataStorePluginLazyLoadTests; sourceTree = ""; @@ -3094,9 +3097,10 @@ 21801D0828F9B11B00FFA37E /* AsyncExpectation.swift in Sources */, 21801CFD28F9A86800FFA37E /* MyCustomModel8.swift in Sources */, 21801CEE28F9A86800FFA37E /* Comment4.swift in Sources */, - 21801D0628F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2.swift in Sources */, + 21801D0628F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift in Sources */, 21801CDB28F9A86800FFA37E /* MyNestedModel8+Schema.swift in Sources */, 21801CE528F9A86800FFA37E /* PostTagsWithCompositeKey+Schema.swift in Sources */, + 21801D2528FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift in Sources */, 21801CDE28F9A86800FFA37E /* Post4+Schema.swift in Sources */, 21801CDA28F9A86800FFA37E /* PostWithTagsCompositeKey.swift in Sources */, 21801D0928F9B11E00FFA37E /* XCTestCase+AsyncTesting.swift in Sources */, From 4eabd82729bbbe4b1adfbd0126e31f0576c61a14 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 19 Oct 2022 12:02:51 -0400 Subject: [PATCH 04/18] complete AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests --- .../AWSDataStoreLazyLoadBaseTest.swift | 16 +++ ...LoadPostCommentWithCompositeKeyTests.swift | 125 +++++++++++++----- 2 files changed, 110 insertions(+), 31 deletions(-) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift index 614a5ff715..b9a07476a1 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift @@ -72,4 +72,20 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { func clearDataStore() async throws { try await Amplify.DataStore.clear() } + + func saveAndWaitForSync(_ model: M) async throws -> M { + let modelSynced = asyncExpectation(description: "model was synced successfully") + let mutationEvents = Amplify.DataStore.observe(M.self) + Task { + for try await mutationEvent in mutationEvents { + if mutationEvent.version == 1 && mutationEvent.modelId == model.identifier { + await modelSynced.fulfill() + } + } + + } + let savedModel = try await Amplify.DataStore.save(model) + await waitForExpectations([modelSynced], timeout: 10) + return savedModel + } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift index d1e4177d51..0a5a53b444 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift @@ -16,45 +16,61 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa func testLazyLoadPostFromComment() async throws { await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) - // Save a comment with post let post = PostWithCompositeKey(title: "title") let comment = CommentWithCompositeKey(content: "content", post: post) - let commentSynced = asyncExpectation(description: "comment was synced successfully") - let mutationEvents = Amplify.DataStore.observe(CommentWithCompositeKey.self) - Task { - do { - for try await mutationEvent in mutationEvents { - if mutationEvent.version == 1 && mutationEvent.modelId == comment.identifier { - await commentSynced.fulfill() - } - } - } catch { - XCTFail("Failed with error \(error)") - } + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + try await assertComment(savedComment, hasEagerLoaded: savedPost) + try await assertPost(savedPost, canLazyLoad: savedComment) + + guard let queriedComment = try await Amplify.DataStore.query(CommentWithCompositeKey.self, + byIdentifier: .identifier( + id: savedComment.id, + content: savedComment.content)) else { + XCTFail("Failed to query comment") + return } - try await Amplify.DataStore.save(post) - let savedComment = try await Amplify.DataStore.save(comment) - await waitForExpectations([commentSynced], timeout: 10) - - switch savedComment._post.modelProvider.getState() { + try await assertComment(queriedComment, canLazyLoad: savedPost) + + guard let queriedPost = try await Amplify.DataStore.query(PostWithCompositeKey.self, + byIdentifier: .identifier( + id: savedPost.id, + title: savedPost.title)) else { + XCTFail("Failed to query post") + return + } + try await assertPost(queriedPost, canLazyLoad: savedComment) + } + + func assertComment(_ comment: CommentWithCompositeKey, + hasEagerLoaded post: PostWithCompositeKey) async throws { + // assert that it is loaded + switch comment._post.modelProvider.getState() { case .notLoaded: - XCTFail("The result from the save API should be a loaded post") + XCTFail("Saving a comment should eager load the post") case .loaded(let loadedPost): XCTAssertEqual(loadedPost?.id, post.id) } - guard let loadedPost = try await savedComment.post else { + guard let loadedPost = try await comment.post else { XCTFail("Failed to retrieve the post from the comment") return } XCTAssertEqual(loadedPost.id, post.id) - guard let queriedComment = try await Amplify.DataStore.query(CommentWithCompositeKey.self, - byIdentifier: .identifier( - id: comment.id, - content: comment.content)) else { - XCTFail("Failed to query comment") + + // retrieve loaded model + guard let loadedPost = try await comment.post else { + XCTFail("Failed to retrieve the losfrf post from the comment") return } - switch queriedComment._post.modelProvider.getState() { + XCTAssertEqual(loadedPost.id, post.id) + + try await assertPost(loadedPost, canLazyLoad: comment) + } + + func assertComment(_ comment: CommentWithCompositeKey, + canLazyLoad post: PostWithCompositeKey) async throws { + // assert that it is not loaded + switch comment._post.modelProvider.getState() { case .notLoaded(let identifiers): guard let identifier = identifiers.first else { XCTFail("missing identifiers") @@ -63,17 +79,64 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa XCTAssertEqual(identifier.key, "@@primaryKey") XCTAssertEqual(identifier.value, post.identifier) case .loaded: - XCTFail("Should be not loaded when queried") + XCTFail("Should not be loaded") } - guard let loadedPost2 = try await queriedComment.post else { - XCTFail("Failed to retrieve the post from the comment") + + // lazy load + guard let loadedPost = try await comment.post else { + XCTFail("Failed to retrieve the losfrf post from the comment") + return + } + XCTAssertEqual(loadedPost.id, post.id) + + try await assertPost(loadedPost, canLazyLoad: comment) + } + + func assertPost(_ post: PostWithCompositeKey, + canLazyLoad comment: CommentWithCompositeKey) async throws { + guard let comments = post.comments else { + XCTFail("Missing comments on post") + return + } + + // assert that it is not loaded + switch comments.listProvider.getState() { + case .notLoaded(let associatedId, let associatedField): + XCTAssertEqual(associatedId, post.identifier) + XCTAssertEqual(associatedField, "post") + case .loaded: + XCTFail("It should not be loaded") + } + + // lazy load + try await comments.fetch() + switch comments.listProvider.getState() { + case .notLoaded: + XCTFail("It should be loaded after calling `fetch`") + case .loaded(let loadedComments): + XCTAssertEqual(loadedComments.count, 1) + } + + guard let comment = comments.first else { + XCTFail("Missing lazy loaded comment from post") return } - XCTAssertEqual(loadedPost2.id, post.id) + + // further nested models should not be loaded + switch comment._post.modelProvider.getState() { + case .notLoaded(let identifiers): + guard let identifier = identifiers.first else { + XCTFail("missing identifiers") + return + } + XCTAssertEqual(identifier.key, "@@primaryKey") + XCTAssertEqual(identifier.value, post.identifier) + case .loaded: + XCTFail("Should be not loaded") + } } } - extension AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests { struct PostCommentWithCompositeKeyModels: AmplifyModelRegistration { public let version: String = "version" From 42a5f55c219365fa5fc46909748dc0cc7b2d0e05 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 19 Oct 2022 13:56:34 -0400 Subject: [PATCH 05/18] update schema with ProjectTeam then fix cyclic issue --- .../Models/AmplifyModels.swift | 12 +- .../CommentWithCompositeKey+Schema.swift | 0 .../{ => LL3}/CommentWithCompositeKey.swift | 4 + .../PostWithCompositeKey+Schema.swift | 0 .../{ => LL3}/PostWithCompositeKey.swift | 0 .../Models/LL5/Project1+Schema.swift | 52 +++++++++ .../Models/LL5/Project1.swift | 73 ++++++++++++ .../Models/LL5/Team1+Schema.swift | 48 ++++++++ .../Models/LL5/Team1.swift | 32 +++++ .../Models/LL8/Project5+Schema.swift | 52 +++++++++ .../Models/LL8/Project5.swift | 73 ++++++++++++ .../Models/LL8/Team5+Schema.swift | 48 ++++++++ .../Models/LL8/Team5.swift | 32 +++++ .../lazyload-schema.graphql | 109 ++++++------------ .../project.pbxproj | 72 +++++++++++- 15 files changed, 523 insertions(+), 84 deletions(-) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/{ => LL3}/CommentWithCompositeKey+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/{ => LL3}/CommentWithCompositeKey.swift (86%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/{ => LL3}/PostWithCompositeKey+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/{ => LL3}/PostWithCompositeKey.swift (100%) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift index 6336361c8e..fa01b38420 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift @@ -2,10 +2,10 @@ import Amplify import Foundation -// Contains the set of classes that conforms to the `Model` protocol. +// Contains the set of classes that conforms to the `Model` protocol. final public class AmplifyModels: AmplifyModelRegistration { - public let version: String = "55f92d13a6658c6c92c10f097e770aa8" + public let version: String = "248b0ffa3d44f144554beab3bf489b20" public func registerModels(registry: ModelRegistry.Type) { ModelRegistry.register(modelType: Post4V2.self) @@ -17,12 +17,14 @@ final public class AmplifyModels: AmplifyModelRegistration { ModelRegistry.register(modelType: CommentWithCompositeKey.self) ModelRegistry.register(modelType: PostWithTagsCompositeKey.self) ModelRegistry.register(modelType: TagWithCompositeKey.self) - ModelRegistry.register(modelType: PostWithCompositeKeyAndIndex.self) - ModelRegistry.register(modelType: CommentWithCompositeKeyAndIndex.self) + ModelRegistry.register(modelType: Project1.self) + ModelRegistry.register(modelType: Team1.self) ModelRegistry.register(modelType: Project2.self) ModelRegistry.register(modelType: Team2.self) ModelRegistry.register(modelType: Post4.self) ModelRegistry.register(modelType: Comment4.self) + ModelRegistry.register(modelType: Project5.self) + ModelRegistry.register(modelType: Team5.self) ModelRegistry.register(modelType: Project6.self) ModelRegistry.register(modelType: Team6.self) ModelRegistry.register(modelType: Post7.self) @@ -31,4 +33,4 @@ final public class AmplifyModels: AmplifyModelRegistration { ModelRegistry.register(modelType: Comment8.self) ModelRegistry.register(modelType: PostTagsWithCompositeKey.self) } -} \ No newline at end of file +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/CommentWithCompositeKey+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/CommentWithCompositeKey+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/CommentWithCompositeKey.swift similarity index 86% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/CommentWithCompositeKey.swift index 736c260d3a..9f08785729 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKey.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/CommentWithCompositeKey.swift @@ -44,6 +44,8 @@ public struct CommentWithCompositeKey: Model { id = try values.decode(String.self, forKey: .id) content = try values.decode(String.self, forKey: .content) _post = try values.decode(LazyModel.self, forKey: .post) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) } public func encode(to encoder: Encoder) throws { @@ -51,5 +53,7 @@ public struct CommentWithCompositeKey: Model { try container.encode(id, forKey: .id) try container.encode(content, forKey: .content) try container.encode(_post, forKey: .post) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/PostWithCompositeKey+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/PostWithCompositeKey+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/PostWithCompositeKey.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKey.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/PostWithCompositeKey.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1+Schema.swift new file mode 100644 index 0000000000..4e4814df85 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1+Schema.swift @@ -0,0 +1,52 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Project1 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case projectId + case name + case team + case createdAt + case updatedAt + case project1TeamTeamId + case project1TeamName + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let project1 = Project1.keys + + model.pluralName = "Project1s" + + model.attributes( + .index(fields: ["projectId", "name"], name: nil), + .primaryKey(fields: [project1.projectId, project1.name]) + ) + + model.fields( + .field(project1.projectId, is: .required, ofType: .string), + .field(project1.name, is: .required, ofType: .string), + .hasOne(project1.team, is: .optional, ofType: Team1.self, associatedWith: Team1.keys.project, targetNames: ["project1TeamTeamId", "project1TeamName"]), + .field(project1.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(project1.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(project1.project1TeamTeamId, is: .optional, ofType: .string), + .field(project1.project1TeamName, is: .optional, ofType: .string) + ) + } +} + +extension Project1: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Project1.IdentifierProtocol { + public static func identifier(projectId: String, + name: String) -> Self { + .make(fields:[(name: "projectId", value: projectId), (name: "name", value: name)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1.swift new file mode 100644 index 0000000000..9187833c85 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1.swift @@ -0,0 +1,73 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Project1: Model { + public let projectId: String + public let name: String + internal var _team: LazyModel + public var team: Team1? { + get async throws { + try await _team.get() + } + } + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + public var project1TeamTeamId: String? + public var project1TeamName: String? + + public init(projectId: String, + name: String, + team: Team1? = nil, + project1TeamTeamId: String? = nil, + project1TeamName: String? = nil) { + self.init(projectId: projectId, + name: name, + team: team, + createdAt: nil, + updatedAt: nil, + project1TeamTeamId: project1TeamTeamId, + project1TeamName: project1TeamName) + } + internal init(projectId: String, + name: String, + team: Team1? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil, + project1TeamTeamId: String? = nil, + project1TeamName: String? = nil) { + self.projectId = projectId + self.name = name + self._team = LazyModel(element: team) + self.createdAt = createdAt + self.updatedAt = updatedAt + self.project1TeamTeamId = project1TeamTeamId + self.project1TeamName = project1TeamName + } + + public mutating func setTeam(_ team: Team1) { + self._team = LazyModel(element: team) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + projectId = try values.decode(String.self, forKey: .projectId) + name = try values.decode(String.self, forKey: .name) + _team = try values.decode(LazyModel.self, forKey: .team) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + project1TeamTeamId = try values.decode(String?.self, forKey: .project1TeamTeamId) + project1TeamName = try values.decode(String?.self, forKey: .project1TeamName) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(projectId, forKey: .projectId) + try container.encode(name, forKey: .name) + try container.encode(_team, forKey: .team) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + try container.encode(project1TeamTeamId, forKey: .project1TeamTeamId) + try container.encode(project1TeamName, forKey: .project1TeamName) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1+Schema.swift new file mode 100644 index 0000000000..3ec96f9969 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Team1 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case teamId + case name + case project + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let team1 = Team1.keys + + model.pluralName = "Team1s" + + model.attributes( + .index(fields: ["teamId", "name"], name: nil), + .primaryKey(fields: [team1.teamId, team1.name]) + ) + + model.fields( + .field(team1.teamId, is: .required, ofType: .string), + .field(team1.name, is: .required, ofType: .string), + .belongsTo(team1.project, is: .optional, ofType: Project1.self, targetNames: ["team1ProjectProjectId", "team1ProjectName"]), + .field(team1.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(team1.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Team1: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Team1.IdentifierProtocol { + public static func identifier(teamId: String, + name: String) -> Self { + .make(fields:[(name: "teamId", value: teamId), (name: "name", value: name)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1.swift new file mode 100644 index 0000000000..c0dfc18bae --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Team1: Model { + public let teamId: String + public let name: String + public var project: Project1? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(teamId: String, + name: String, + project: Project1? = nil) { + self.init(teamId: teamId, + name: name, + project: project, + createdAt: nil, + updatedAt: nil) + } + internal init(teamId: String, + name: String, + project: Project1? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.teamId = teamId + self.name = name + self.project = project + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5+Schema.swift new file mode 100644 index 0000000000..39a7855901 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5+Schema.swift @@ -0,0 +1,52 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Project5 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case projectId + case name + case team + case teamId + case teamName + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let project5 = Project5.keys + + model.pluralName = "Project5s" + + model.attributes( + .index(fields: ["projectId", "name"], name: nil), + .primaryKey(fields: [project5.projectId, project5.name]) + ) + + model.fields( + .field(project5.projectId, is: .required, ofType: .string), + .field(project5.name, is: .required, ofType: .string), + .hasOne(project5.team, is: .optional, ofType: Team5.self, associatedWith: Team5.keys.project, targetNames: ["teamId", "teamName"]), + .field(project5.teamId, is: .optional, ofType: .string), + .field(project5.teamName, is: .optional, ofType: .string), + .field(project5.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(project5.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Project5: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Project5.IdentifierProtocol { + public static func identifier(projectId: String, + name: String) -> Self { + .make(fields:[(name: "projectId", value: projectId), (name: "name", value: name)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5.swift new file mode 100644 index 0000000000..b7bbbd2d86 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5.swift @@ -0,0 +1,73 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Project5: Model { + public let projectId: String + public let name: String + internal var _team: LazyModel + public var team: Team5? { + get async throws { + try await _team.get() + } + } + public var teamId: String? + public var teamName: String? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(projectId: String, + name: String, + team: Team5? = nil, + teamId: String? = nil, + teamName: String? = nil) { + self.init(projectId: projectId, + name: name, + team: team, + teamId: teamId, + teamName: teamName, + createdAt: nil, + updatedAt: nil) + } + internal init(projectId: String, + name: String, + team: Team5? = nil, + teamId: String? = nil, + teamName: String? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.projectId = projectId + self.name = name + self._team = LazyModel(element: team) + self.teamId = teamId + self.teamName = teamName + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public mutating func setTeam(_ team: Team5) { + self._team = LazyModel(element: team) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + projectId = try values.decode(String.self, forKey: .projectId) + name = try values.decode(String.self, forKey: .name) + _team = try values.decode(LazyModel.self, forKey: .team) + teamId = try values.decode(String?.self, forKey: .teamId) + teamName = try values.decode(String?.self, forKey: .teamName) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(projectId, forKey: .projectId) + try container.encode(name, forKey: .name) + try container.encode(_team, forKey: .team) + try container.encode(teamId, forKey: .teamId) + try container.encode(teamName, forKey: .teamName) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5+Schema.swift new file mode 100644 index 0000000000..cbe640a92e --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension Team5 { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case teamId + case name + case project + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let team5 = Team5.keys + + model.pluralName = "Team5s" + + model.attributes( + .index(fields: ["teamId", "name"], name: nil), + .primaryKey(fields: [team5.teamId, team5.name]) + ) + + model.fields( + .field(team5.teamId, is: .required, ofType: .string), + .field(team5.name, is: .required, ofType: .string), + .belongsTo(team5.project, is: .optional, ofType: Project5.self, targetNames: ["projectId", "projectName"]), + .field(team5.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(team5.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension Team5: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension Team5.IdentifierProtocol { + public static func identifier(teamId: String, + name: String) -> Self { + .make(fields:[(name: "teamId", value: teamId), (name: "name", value: name)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5.swift new file mode 100644 index 0000000000..10f8f9084b --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Team5: Model { + public let teamId: String + public let name: String + public var project: Project5? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(teamId: String, + name: String, + project: Project5? = nil) { + self.init(teamId: teamId, + name: name, + project: project, + createdAt: nil, + updatedAt: nil) + } + internal init(teamId: String, + name: String, + project: Project5? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.teamId = teamId + self.name = name + self.project = project + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql index 3ec3502f5f..a4729b0a68 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql @@ -3,6 +3,7 @@ input AMPLIFY { globalAuthRule: AuthRule = { allow: public } } # FOR TESTING ONLY! +# LL.1. Explicit Bi-Directional Belongs-to Has-many PostComment4V2 # 11 Explicit Bi-Directional Belongs to Relationship type Post4V2 @model @auth(rules: [{allow: public}]) { @@ -18,6 +19,7 @@ type Comment4V2 @model @auth(rules: [{allow: public}]) { post: Post4V2 @belongsTo(fields: ["postID"]) } +# LL.2. BlogPostComment # 15 # This is to address optional associations use case (Post can exist without a Blog) # See issue https://github.com/aws-amplify/amplify-ios/issues/1792 for more details @@ -59,6 +61,7 @@ type MyNestedModel8 { notes: [String] } +# LL.3. Has-Many/Belongs-To With Composite Key # iOS.7. A Has-Many/Belongs-To relationship, each with a composite key # Post with `id` and `title`, Comment with `id` and `content` @@ -74,6 +77,7 @@ type CommentWithCompositeKey @model { post: PostWithCompositeKey @belongsTo } +# LL.4. Many-To-Many relationship With Composite Key # iOS.8. A Many-To-Many relationship, each with a composite key # Post with `id` and `title`, Tag with `id` and `name` @@ -89,36 +93,21 @@ type TagWithCompositeKey @model { posts: [PostWithTagsCompositeKey] @manyToMany(relationName: "PostTagsWithCompositeKey") } -# iOS.9. A Has-Many/Belongs-To relationship, with index -# Post with `id` and `title`, Comment with `id`, `content`, and index on `postID` and `postTitle` +# LL.5. Implicit Bi-directional Has One +# CLI.1. Implicit Bi-directional Has One -type PostWithCompositeKeyAndIndex @model { - id: ID! @primaryKey(sortKeyFields: ["title"]) - title: String! - comments: [CommentWithCompositeKeyAndIndex] @hasMany +type Project1 @model { + projectId: ID! @primaryKey(sortKeyFields:["name"]) + name: String! + team: Team1 @hasOne } - -type CommentWithCompositeKeyAndIndex @model { - id: ID! @primaryKey(sortKeyFields: ["content"]) - content: String! - postID: ID @index(name: "byPost", sortKeyFields: ["postTitle"]) - postTitle: String - post: PostWithCompositeKeyAndIndex @belongsTo(fields: ["postID", "postTitle"]) +type Team1 @model { + teamId: ID! @primaryKey(sortKeyFields:["name"]) + name: String! + project: Project1 @belongsTo } -# CLI.1. Implicit Bi-directional Has One - -#type Project1 @model { -# projectId: ID! @primaryKey(sortKeyFields:["name"]) -# name: String! -# team: Team1 @hasOne -#} -#type Team1 @model { -# teamId: ID! @primaryKey(sortKeyFields:["name"]) -# name: String! -# project: Project1 @belongsTo -#} - +# LL.6. Implicit Uni-directional Has One # CLI.2. Implicit Uni-directional Has One type Project2 @model { @@ -131,19 +120,7 @@ type Team2 @model { name: String! } -# CLI.3. Implicit Bi-directional Has Many - -#type Post3 @model { -# postId: ID! @primaryKey(sortKeyFields:["title"]) -# title: String! -# comments: [Comment3] @hasMany -#} -#type Comment3 @model { -# commentId: ID! @primaryKey(sortKeyFields:["content"]) -# content: String! -# post: Post3 @belongsTo -#} - +# LL.7. Implicit Uni-directional Has Many # CLI.4. Implicit Uni-directional Has Many type Post4 @model { @@ -156,23 +133,25 @@ type Comment4 @model { content: String! } +# LL.8. Explicit Bi-directional Has One # CLI.5. Explicit Bi-directional Has One -#type Project5 @model { -# projectId: ID! @primaryKey(sortKeyFields:["name"]) -# name: String! -# team: Team5 @hasOne(fields:["teamId", "teamName"]) -# teamId: ID # customized foreign key for child primary key -# teamName: String # customized foreign key for child sort key -#} -#type Team5 @model { -# teamId: ID! @primaryKey(sortKeyFields:["name"]) -# name: String! -# project: Project5 @belongsTo(fields:["projectId", "projectName"]) -# projectId: ID # customized foreign key for parent primary key -# projectName: String # customized foreign key for parent sort key -#} +type Project5 @model { + projectId: ID! @primaryKey(sortKeyFields:["name"]) + name: String! + team: Team5 @hasOne(fields:["teamId", "teamName"]) + teamId: ID # customized foreign key for child primary key + teamName: String # customized foreign key for child sort key +} +type Team5 @model { + teamId: ID! @primaryKey(sortKeyFields:["name"]) + name: String! + project: Project5 @belongsTo(fields:["projectId", "projectName"]) + projectId: ID # customized foreign key for parent primary key + projectName: String # customized foreign key for parent sort key +} +# LL.9. Explicit Uni-directional Has One # CLI.6. Explicit Uni-directional Has One type Project6 @model { @@ -187,6 +166,7 @@ type Team6 @model { name: String! } +# LL.10. Explicit Bi-directional Has Many # CLI.7. Explicit Bi-directional Has Many type Post7 @model { @@ -202,6 +182,7 @@ type Comment7 @model { postTitle: String # customized foreign key for parent sort key } +# LL.11. Explicit Uni-directional Has Many # CLI.8. Explicit Uni-directional Has Many type Post8 @model { @@ -215,25 +196,3 @@ type Comment8 @model { postId: ID @index(name: "byPost", sortKeyFields:["postTitle"]) # customized foreign key for parent primary key postTitle: String # customized foreign key for parent sort key } - -# CLI.9. Many To Many - -#type Post9 @model { -# customPostId: ID! @primaryKey(sortKeyFields: ["title"]) -# title: String! -# content: String -# tags: [Tag9] @manyToMany(relationName: "PostTags") -#} -#type Tag9 @model { -# customTagId: ID! @primaryKey(sortKeyFields: ["label"]) -# label: String! -# posts: [Post9] @manyToMany(relationName: "PostTags") -#} - -# CLI.10. Todo - -#type Book @model { -# isbn: ID! @primaryKey(sortKeyFields: ["title"]) -# title: String! -# description: String -#} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index a02442fd61..88a8eaeebc 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -209,6 +209,14 @@ 21801D0828F9B11B00FFA37E /* AsyncExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681DFE8128E746C10000C36A /* AsyncExpectation.swift */; }; 21801D0928F9B11E00FFA37E /* XCTestCase+AsyncTesting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681DFE8228E746C10000C36A /* XCTestCase+AsyncTesting.swift */; }; 21801D2528FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D2428FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift */; }; + 21801D2A29006DA300FFA37E /* Project1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D2829006DA100FFA37E /* Project1.swift */; }; + 21801D2B29006DA300FFA37E /* Project1+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D2929006DA300FFA37E /* Project1+Schema.swift */; }; + 21801D2E29006DA900FFA37E /* Team1+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D2C29006DA800FFA37E /* Team1+Schema.swift */; }; + 21801D2F29006DA900FFA37E /* Team1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D2D29006DA800FFA37E /* Team1.swift */; }; + 21801D3229006DB500FFA37E /* Team5+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3029006DB400FFA37E /* Team5+Schema.swift */; }; + 21801D3329006DB500FFA37E /* Team5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3129006DB500FFA37E /* Team5.swift */; }; + 21801D3629006DC200FFA37E /* Project5+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3429006DC000FFA37E /* Project5+Schema.swift */; }; + 21801D3729006DC200FFA37E /* Project5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3529006DC200FFA37E /* Project5.swift */; }; 219253BE28BFE84100820737 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 219253BD28BFE84000820737 /* XCTest.framework */; }; 21977DBF289C171A005B49D6 /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21977DBE289C1719005B49D6 /* TestConfigHelper.swift */; }; 219B518528E3A4B00080EDCC /* DataStoreConnectionOptionalAssociations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA00289BFE3400B32A39 /* DataStoreConnectionOptionalAssociations.swift */; }; @@ -763,6 +771,14 @@ 21801CD328F9A86800FFA37E /* MyNestedModel8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyNestedModel8.swift; sourceTree = ""; }; 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostComment4V2Tests.swift; sourceTree = ""; }; 21801D2428FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift; sourceTree = ""; }; + 21801D2829006DA100FFA37E /* Project1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project1.swift; sourceTree = ""; }; + 21801D2929006DA300FFA37E /* Project1+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Project1+Schema.swift"; sourceTree = ""; }; + 21801D2C29006DA800FFA37E /* Team1+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Team1+Schema.swift"; sourceTree = ""; }; + 21801D2D29006DA800FFA37E /* Team1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Team1.swift; sourceTree = ""; }; + 21801D3029006DB400FFA37E /* Team5+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Team5+Schema.swift"; sourceTree = ""; }; + 21801D3129006DB500FFA37E /* Team5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Team5.swift; sourceTree = ""; }; + 21801D3429006DC000FFA37E /* Project5+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Project5+Schema.swift"; sourceTree = ""; }; + 21801D3529006DC200FFA37E /* Project5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project5.swift; sourceTree = ""; }; 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 = ""; }; @@ -1431,10 +1447,12 @@ 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */, 21801CCD28F9A86800FFA37E /* Comment8V2.swift */, 21801CAC28F9A86600FFA37E /* Comment8V2+Schema.swift */, - 21801CA628F9A86600FFA37E /* CommentWithCompositeKey.swift */, - 21801CA428F9A86600FFA37E /* CommentWithCompositeKey+Schema.swift */, 21801CCF28F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift */, 21801CBF28F9A86700FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift */, + 21801D3929006F7E00FFA37E /* LL2 */, + 21801D3A29006F8600FFA37E /* LL3 */, + 21801D3829006F7500FFA37E /* LL5 */, + 21801D3B2900709200FFA37E /* LL8 */, 21801CCC28F9A86800FFA37E /* MyCustomModel8.swift */, 21801CAE28F9A86600FFA37E /* MyCustomModel8+Schema.swift */, 21801CD328F9A86800FFA37E /* MyNestedModel8.swift */, @@ -1451,8 +1469,6 @@ 21801CC628F9A86700FFA37E /* Post8V2+Schema.swift */, 21801CAB28F9A86600FFA37E /* PostTagsWithCompositeKey.swift */, 21801CB428F9A86700FFA37E /* PostTagsWithCompositeKey+Schema.swift */, - 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */, - 21801CC728F9A86800FFA37E /* PostWithCompositeKey+Schema.swift */, 21801CB128F9A86600FFA37E /* PostWithCompositeKeyAndIndex.swift */, 21801CB028F9A86600FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift */, 21801CA928F9A86600FFA37E /* PostWithTagsCompositeKey.swift */, @@ -1471,6 +1487,46 @@ path = Models; sourceTree = ""; }; + 21801D3829006F7500FFA37E /* LL5 */ = { + isa = PBXGroup; + children = ( + 21801D2829006DA100FFA37E /* Project1.swift */, + 21801D2929006DA300FFA37E /* Project1+Schema.swift */, + 21801D2D29006DA800FFA37E /* Team1.swift */, + 21801D2C29006DA800FFA37E /* Team1+Schema.swift */, + ); + path = LL5; + sourceTree = ""; + }; + 21801D3929006F7E00FFA37E /* LL2 */ = { + isa = PBXGroup; + children = ( + ); + path = LL2; + sourceTree = ""; + }; + 21801D3A29006F8600FFA37E /* LL3 */ = { + isa = PBXGroup; + children = ( + 21801CA628F9A86600FFA37E /* CommentWithCompositeKey.swift */, + 21801CA428F9A86600FFA37E /* CommentWithCompositeKey+Schema.swift */, + 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */, + 21801CC728F9A86800FFA37E /* PostWithCompositeKey+Schema.swift */, + ); + path = LL3; + sourceTree = ""; + }; + 21801D3B2900709200FFA37E /* LL8 */ = { + isa = PBXGroup; + children = ( + 21801D3529006DC200FFA37E /* Project5.swift */, + 21801D3429006DC000FFA37E /* Project5+Schema.swift */, + 21801D3129006DB500FFA37E /* Team5.swift */, + 21801D3029006DB400FFA37E /* Team5+Schema.swift */, + ); + path = LL8; + sourceTree = ""; + }; 21977D75289C161D005B49D6 /* Models */ = { isa = PBXGroup; children = ( @@ -3051,13 +3107,16 @@ files = ( 21801CE328F9A86800FFA37E /* Project6.swift in Sources */, 21801CE628F9A86800FFA37E /* TagWithCompositeKey+Schema.swift in Sources */, + 21801D2F29006DA900FFA37E /* Team1.swift in Sources */, 21801CE728F9A86800FFA37E /* Project2.swift in Sources */, 21801CF728F9A86800FFA37E /* Post8V2+Schema.swift in Sources */, 21801D0128F9A86800FFA37E /* AmplifyModels.swift in Sources */, 21801CFB28F9A86800FFA37E /* Team2+Schema.swift in Sources */, 21801D0328F9A86800FFA37E /* Post7+Schema.swift in Sources */, + 21801D3329006DB500FFA37E /* Team5.swift in Sources */, 21801CEF28F9A86800FFA37E /* Blog8V2+Schema.swift in Sources */, 21801CE428F9A86800FFA37E /* Blog8V2.swift in Sources */, + 21801D3629006DC200FFA37E /* Project5+Schema.swift in Sources */, 21801CE028F9A86800FFA37E /* Post8V2.swift in Sources */, 21801C7D28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift in Sources */, 21801CFF28F9A86800FFA37E /* Team2.swift in Sources */, @@ -3074,6 +3133,7 @@ 21801CF228F9A86800FFA37E /* Post4V2+Schema.swift in Sources */, 21801CFA28F9A86800FFA37E /* TagWithCompositeKey.swift in Sources */, 21801CF828F9A86800FFA37E /* PostWithCompositeKey+Schema.swift in Sources */, + 21801D2E29006DA900FFA37E /* Team1+Schema.swift in Sources */, 21801CF328F9A86800FFA37E /* Project6+Schema.swift in Sources */, 21801CE228F9A86800FFA37E /* PostWithCompositeKeyAndIndex.swift in Sources */, 21801CD728F9A86800FFA37E /* CommentWithCompositeKey.swift in Sources */, @@ -3083,8 +3143,11 @@ 21801CD428F9A86800FFA37E /* PostWithCompositeKey.swift in Sources */, 21801CD828F9A86800FFA37E /* Comment7+Schema.swift in Sources */, 21801D0028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift in Sources */, + 21801D3229006DB500FFA37E /* Team5+Schema.swift in Sources */, + 21801D2B29006DA300FFA37E /* Project1+Schema.swift in Sources */, 21801CF028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift in Sources */, 21801D0728F9B11800FFA37E /* AsyncTesting.swift in Sources */, + 21801D2A29006DA300FFA37E /* Project1.swift in Sources */, 21801CF128F9A86800FFA37E /* Project2+Schema.swift in Sources */, 21801D0428F9A86800FFA37E /* MyNestedModel8.swift in Sources */, 21801CF928F9A86800FFA37E /* Team6.swift in Sources */, @@ -3095,6 +3158,7 @@ 21801CEB28F9A86800FFA37E /* Post4V2.swift in Sources */, 21801CDF28F9A86800FFA37E /* MyCustomModel8+Schema.swift in Sources */, 21801D0828F9B11B00FFA37E /* AsyncExpectation.swift in Sources */, + 21801D3729006DC200FFA37E /* Project5.swift in Sources */, 21801CFD28F9A86800FFA37E /* MyCustomModel8.swift in Sources */, 21801CEE28F9A86800FFA37E /* Comment4.swift in Sources */, 21801D0628F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift in Sources */, From 00328914a98068e1eb675ea8e3f331936a618ccc Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 19 Oct 2022 15:32:53 -0400 Subject: [PATCH 06/18] fixes and test PostComment4V2 --- .../Model/Support/Model+GraphQL.swift | 4 +- .../Storage/SQLite/Statement+Model.swift | 5 +- ...DataStoreLazyLoadPostComment4V2Tests.swift | 51 ------ ...DataStoreLazyLoadPostComment4V2Tests.swift | 145 ++++++++++++++++++ .../{Models => LL1}/Comment4V2+Schema.swift | 0 .../{Models => LL1}/Comment4V2.swift | 0 .../{Models => LL1}/Post4V2+Schema.swift | 0 .../{Models => LL1}/Post4V2.swift | 0 ...LoadPostCommentWithCompositeKeyTests.swift | 10 +- .../LL3/CommentWithCompositeKey+Schema.swift | 0 .../LL3/CommentWithCompositeKey.swift | 0 .../LL3/PostWithCompositeKey+Schema.swift | 0 .../LL3/PostWithCompositeKey.swift | 0 .../project.pbxproj | 22 ++- 14 files changed, 172 insertions(+), 65 deletions(-) delete mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2Tests.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL1}/Comment4V2+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL1}/Comment4V2.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL1}/Post4V2+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL1}/Post4V2.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{ => LL3}/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift (96%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL3/CommentWithCompositeKey+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL3/CommentWithCompositeKey.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL3/PostWithCompositeKey+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL3/PostWithCompositeKey.swift (100%) diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/Model+GraphQL.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/Model+GraphQL.swift index 61c4ec47a7..60adda85f5 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/Model+GraphQL.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/Model+GraphQL.swift @@ -43,7 +43,7 @@ extension Model { guard let value = modelFieldValue else { // Special case for associated models when the value is `nil`, by setting all of the associated // model's primary key fields (targetNames) to `nil`. - if case .model = modelField.type { + if case .model = modelField.type { // add it for "belongs-to" let fieldNames = getFieldNameForAssociatedModels(modelField: modelField) for fieldName in fieldNames { // Only set to `nil` if it has not been set already. For hasOne relationships, where the @@ -59,6 +59,8 @@ extension Model { input.updateValue(nil, forKey: fieldName) } } + } else if case .collection = modelField.type { // skip all "has-many" + continue } else { input.updateValue(nil, forKey: name) } diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift index 60f7baf00e..089a6d1568 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift @@ -135,7 +135,10 @@ extension Statement: StatementModelConvertible { // For example, when the value is the `id` of the Blog, then the field.isPrimaryKey is satisfied. // Every association of the Blog, such as the has-many Post is populated with the List with // associatedId == blog's id. This way, the list of post can be lazily loaded later using the associated id. - if let id = modelValue as? String, field.isPrimaryKey { + if let id = modelValue as? String, + (field.name == ModelIdentifierFormat.Custom.sqlColumnName || // this is the `@@primaryKey` (CPK) + (schema.primaryKey.fields.count == 1 // or there's only one primary key (not composite key) + && schema.primaryKey.indexOfField(named: field.name) != nil)) { // and this field is the primary key let associations = schema.fields.values.filter { $0.isArray && $0.hasAssociation } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2Tests.swift deleted file mode 100644 index 76dc56758f..0000000000 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostComment4V2Tests.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// Copyright Amazon.com Inc. or its affiliates. -// All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 -// - -import Foundation -import Combine -import XCTest - -@testable import Amplify - -class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { - - func testExample() async throws { - await setup(withModels: PostComment4V2Models()) - let post = Post4V2(title: "title") - let comment = Comment4V2(content: "content", post: post) - - let commentSynced = asyncExpectation(description: "comment synced success") - let mutationEvents = Amplify.DataStore.observe(Comment4V2.self) - Task { - do { - for try await mutationEvent in mutationEvents { - if mutationEvent.version == 1 && mutationEvent.modelId == comment.id { - await commentSynced.fulfill() - } - } - } catch { - XCTFail("Failed with error \(error)") - } - } - - try await Amplify.DataStore.save(post) - try await Amplify.DataStore.save(comment) - - await waitForExpectations([commentSynced], timeout: 10) - } -} - - -extension AWSDataStoreLazyLoadPostComment4V2Tests { - struct PostComment4V2Models: AmplifyModelRegistration { - public let version: String = "version" - func registerModels(registry: ModelRegistry.Type) { - ModelRegistry.register(modelType: Post4V2.self) - ModelRegistry.register(modelType: Comment4V2.self) - } - } -} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift new file mode 100644 index 0000000000..127573a51a --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift @@ -0,0 +1,145 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify + +class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { + + func testLazyLoad() async throws { + await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post4V2(title: "title") + let comment = Comment4V2(content: "content", post: post) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + try await assertComment(savedComment, hasEagerLoaded: savedPost) + try await assertPost(savedPost, canLazyLoad: savedComment) + + guard let queriedComment = try await Amplify.DataStore.query(Comment4V2.self, + byIdentifier: savedComment.id) else { + XCTFail("Failed to query comment") + return + } + try await assertComment(queriedComment, canLazyLoad: savedPost) + + guard let queriedPost = try await Amplify.DataStore.query(Post4V2.self, + byIdentifier: savedPost.id) else { + XCTFail("Failed to query post") + return + } + try await assertPost(queriedPost, canLazyLoad: savedComment) + } + + func assertComment(_ comment: Comment4V2, + hasEagerLoaded post: Post4V2) async throws { + // assert that it is loaded + switch comment._post.modelProvider.getState() { + case .notLoaded: + XCTFail("Saving a comment should eager load the post") + case .loaded(let loadedPost): + XCTAssertEqual(loadedPost?.id, post.id) + } + guard let loadedPost = try await comment.post else { + XCTFail("Failed to retrieve the post from the comment") + return + } + XCTAssertEqual(loadedPost.id, post.id) + + // retrieve loaded model + guard let loadedPost = try await comment.post else { + XCTFail("Failed to retrieve the loaded post from the comment") + return + } + XCTAssertEqual(loadedPost.id, post.id) + + try await assertPost(loadedPost, canLazyLoad: comment) + } + + func assertComment(_ comment: Comment4V2, + canLazyLoad post: Post4V2) async throws { + // assert that it is not loaded + switch comment._post.modelProvider.getState() { + case .notLoaded(let identifiers): + guard let identifier = identifiers.first else { + XCTFail("missing identifiers") + return + } + XCTAssertEqual(identifier.key, "id") + XCTAssertEqual(identifier.value, post.identifier) + case .loaded: + XCTFail("Should not be loaded") + } + + // lazy load + guard let loadedPost = try await comment.post else { + XCTFail("Failed to retrieve the loaded post from the comment") + return + } + XCTAssertEqual(loadedPost.id, post.id) + + try await assertPost(loadedPost, canLazyLoad: comment) + } + + func assertPost(_ post: Post4V2, + canLazyLoad comment: Comment4V2) async throws { + guard let comments = post.comments else { + XCTFail("Missing comments on post") + return + } + + // assert that it is not loaded + switch comments.listProvider.getState() { + case .notLoaded(let associatedId, let associatedField): + XCTAssertEqual(associatedId, post.identifier) + XCTAssertEqual(associatedField, "post") + case .loaded: + XCTFail("It should not be loaded") + } + + // lazy load + try await comments.fetch() + switch comments.listProvider.getState() { + case .notLoaded: + XCTFail("It should be loaded after calling `fetch`") + case .loaded(let loadedComments): + XCTAssertEqual(loadedComments.count, 1) + } + + guard let comment = comments.first else { + XCTFail("Missing lazy loaded comment from post") + return + } + + // further nested models should not be loaded + switch comment._post.modelProvider.getState() { + case .notLoaded(let identifiers): + guard let identifier = identifiers.first else { + XCTFail("missing identifiers") + return + } + XCTAssertEqual(identifier.key, "id") + XCTAssertEqual(identifier.value, post.identifier) + case .loaded: + XCTFail("Should be not loaded") + } + } +} + + +extension AWSDataStoreLazyLoadPostComment4V2Tests { + struct PostComment4V2Models: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Post4V2.self) + ModelRegistry.register(modelType: Comment4V2.self) + } + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4V2.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Post4V2+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Post4V2+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Post4V2.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4V2.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Post4V2.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift similarity index 96% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift index 0a5a53b444..cd28caf0b2 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift @@ -13,7 +13,7 @@ import XCTest final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLazyLoadBaseTest { - func testLazyLoadPostFromComment() async throws { + func testLazyLoad() async throws { await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) let post = PostWithCompositeKey(title: "title") @@ -22,7 +22,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa let savedComment = try await saveAndWaitForSync(comment) try await assertComment(savedComment, hasEagerLoaded: savedPost) try await assertPost(savedPost, canLazyLoad: savedComment) - + guard let queriedComment = try await Amplify.DataStore.query(CommentWithCompositeKey.self, byIdentifier: .identifier( id: savedComment.id, @@ -31,7 +31,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa return } try await assertComment(queriedComment, canLazyLoad: savedPost) - + guard let queriedPost = try await Amplify.DataStore.query(PostWithCompositeKey.self, byIdentifier: .identifier( id: savedPost.id, @@ -59,7 +59,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa // retrieve loaded model guard let loadedPost = try await comment.post else { - XCTFail("Failed to retrieve the losfrf post from the comment") + XCTFail("Failed to retrieve the loaded post from the comment") return } XCTAssertEqual(loadedPost.id, post.id) @@ -84,7 +84,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa // lazy load guard let loadedPost = try await comment.post else { - XCTFail("Failed to retrieve the losfrf post from the comment") + XCTFail("Failed to retrieve the loaded post from the comment") return } XCTAssertEqual(loadedPost.id, post.id) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/CommentWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/CommentWithCompositeKey+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/CommentWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/CommentWithCompositeKey.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/PostWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/PostWithCompositeKey+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/PostWithCompositeKey+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/PostWithCompositeKey+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/PostWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/PostWithCompositeKey.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL3/PostWithCompositeKey.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/PostWithCompositeKey.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index 88a8eaeebc..33c611ce7b 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -1420,13 +1420,13 @@ 21801C7B28F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests */ = { isa = PBXGroup; children = ( + 21801D3C2900730B00FFA37E /* LL1 */, + 21801D3A29006F8600FFA37E /* LL3 */, 21801CA228F9A78F00FFA37E /* Models */, 21801C8628F9A37F00FFA37E /* TestConfigHelper.swift */, 21801C8528F9A36D00FFA37E /* lazyload-schema.graphql */, 21801C8428F9A2DC00FFA37E /* README.md */, 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */, - 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift */, - 21801D2428FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift */, ); path = AWSDataStorePluginLazyLoadTests; sourceTree = ""; @@ -1439,8 +1439,6 @@ 21801CBE28F9A86700FFA37E /* Blog8V2+Schema.swift */, 21801CBD28F9A86700FFA37E /* Comment4.swift */, 21801CC528F9A86700FFA37E /* Comment4+Schema.swift */, - 21801CB728F9A86700FFA37E /* Comment4V2.swift */, - 21801CCB28F9A86800FFA37E /* Comment4V2+Schema.swift */, 21801CC428F9A86700FFA37E /* Comment7.swift */, 21801CA728F9A86600FFA37E /* Comment7+Schema.swift */, 21801CB928F9A86700FFA37E /* Comment8.swift */, @@ -1450,7 +1448,6 @@ 21801CCF28F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift */, 21801CBF28F9A86700FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift */, 21801D3929006F7E00FFA37E /* LL2 */, - 21801D3A29006F8600FFA37E /* LL3 */, 21801D3829006F7500FFA37E /* LL5 */, 21801D3B2900709200FFA37E /* LL8 */, 21801CCC28F9A86800FFA37E /* MyCustomModel8.swift */, @@ -1459,8 +1456,6 @@ 21801CAA28F9A86600FFA37E /* MyNestedModel8+Schema.swift */, 21801CBC28F9A86700FFA37E /* Post4.swift */, 21801CAD28F9A86600FFA37E /* Post4+Schema.swift */, - 21801CBA28F9A86700FFA37E /* Post4V2.swift */, - 21801CC128F9A86700FFA37E /* Post4V2+Schema.swift */, 21801CC328F9A86700FFA37E /* Post7.swift */, 21801CD228F9A86800FFA37E /* Post7+Schema.swift */, 21801CA828F9A86600FFA37E /* Post8.swift */, @@ -1508,6 +1503,7 @@ 21801D3A29006F8600FFA37E /* LL3 */ = { isa = PBXGroup; children = ( + 21801D2428FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift */, 21801CA628F9A86600FFA37E /* CommentWithCompositeKey.swift */, 21801CA428F9A86600FFA37E /* CommentWithCompositeKey+Schema.swift */, 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */, @@ -1527,6 +1523,18 @@ path = LL8; sourceTree = ""; }; + 21801D3C2900730B00FFA37E /* LL1 */ = { + isa = PBXGroup; + children = ( + 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift */, + 21801CB728F9A86700FFA37E /* Comment4V2.swift */, + 21801CCB28F9A86800FFA37E /* Comment4V2+Schema.swift */, + 21801CBA28F9A86700FFA37E /* Post4V2.swift */, + 21801CC128F9A86700FFA37E /* Post4V2+Schema.swift */, + ); + path = LL1; + sourceTree = ""; + }; 21977D75289C161D005B49D6 /* Models */ = { isa = PBXGroup; children = ( From 5282d3816ee76f0dd964c65e8d75418f58c1452e Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 19 Oct 2022 17:16:19 -0400 Subject: [PATCH 07/18] add testDelete to the PostComment tests --- .../AWSDataStoreLazyLoadBaseTest.swift | 20 ++++++++++ ...DataStoreLazyLoadPostComment4V2Tests.swift | 35 +++++++++++++++++ ...LoadPostCommentWithCompositeKeyTests.swift | 39 +++++++++++++++++++ 3 files changed, 94 insertions(+) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift index b9a07476a1..89c72373da 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift @@ -88,4 +88,24 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { await waitForExpectations([modelSynced], timeout: 10) return savedModel } + + func deleteAndWaitForSync(_ model: M) async throws { + let modelSynced = asyncExpectation(description: "model was synced successfully") + let dataStoreEvents = HubPayload.EventName.DataStore.self + Amplify + .Hub + .publisher(for: .dataStore) + .sink { event in + if event.eventName == dataStoreEvents.outboxMutationProcessed, + let outboxMutationEvent = event.data as? OutboxMutationEvent, + outboxMutationEvent.modelName == model.modelName, + outboxMutationEvent.element.deleted == true { + Task { await modelSynced.fulfill() } + + } + } + .store(in: &requests) + try await Amplify.DataStore.delete(model) + await waitForExpectations([modelSynced], timeout: 10) + } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift index 127573a51a..c0f4ab1020 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift @@ -10,6 +10,7 @@ import Combine import XCTest @testable import Amplify +import AWSPluginsCore class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { @@ -131,6 +132,40 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { XCTFail("Should be not loaded") } } + + func testDelete() async throws { + await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post4V2(title: "title") + let comment = Comment4V2(content: "content", post: post) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + try await deleteAndWaitForSync(savedPost) + + let queriedComment = try await Amplify.DataStore.query(Comment4V2.self, + byIdentifier: savedComment.id) + XCTAssertNil(queriedComment) + let commentMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Comment4V2.modelName, + modelId: comment.identifier) + guard let commentMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, + byId: commentMetadataIdentifier) else { + XCTFail("Could not retrieve metadata for comment") + return + } + XCTAssertTrue(commentMetadata.deleted) + + let queriedPost = try await Amplify.DataStore.query(Post4V2.self, + byIdentifier: savedPost.id) + XCTAssertNil(queriedPost) + let postMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Post4V2.modelName, + modelId: post.identifier) + guard let postMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, + byId: postMetadataIdentifier) else { + XCTFail("Could not retrieve metadata for post") + return + } + XCTAssertTrue(postMetadata.deleted) + } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift index cd28caf0b2..863efe58e9 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift @@ -10,6 +10,7 @@ import Combine import XCTest @testable import Amplify +import AWSPluginsCore final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLazyLoadBaseTest { @@ -135,6 +136,44 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa XCTFail("Should be not loaded") } } + + func testDelete() async throws { + await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) + + let post = PostWithCompositeKey(title: "title") + let comment = CommentWithCompositeKey(content: "content", post: post) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + try await deleteAndWaitForSync(savedPost) + + let queriedComment = try await Amplify.DataStore.query(CommentWithCompositeKey.self, + byIdentifier: .identifier( + id: savedComment.id, + content: savedComment.content)) + XCTAssertNil(queriedComment) + let commentMetadataIdentifier = MutationSyncMetadata.identifier(modelName: CommentWithCompositeKey.modelName, + modelId: comment.identifier) + guard let commentMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, + byId: commentMetadataIdentifier) else { + XCTFail("Could not retrieve metadata for comment") + return + } + XCTAssertTrue(commentMetadata.deleted) + + let queriedPost = try await Amplify.DataStore.query(PostWithCompositeKey.self, + byIdentifier: .identifier( + id: savedPost.id, + title: savedPost.title)) + XCTAssertNil(queriedPost) + let postMetadataIdentifier = MutationSyncMetadata.identifier(modelName: PostWithCompositeKey.modelName, + modelId: post.identifier) + guard let postMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, + byId: postMetadataIdentifier) else { + XCTFail("Could not retrieve metadata for post") + return + } + XCTAssertTrue(postMetadata.deleted) + } } extension AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests { From 0fdcfcbacfe4766d61268dff0a22169109517a92 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 19 Oct 2022 18:14:12 -0400 Subject: [PATCH 08/18] progress on ProjectTeam1 and pause here --- ...DataStoreLazyLoadPostComment4V2Tests.swift | 1 - ...WSDataStoreLazyLoadProjectTeam1Tests.swift | 39 +++++++++++++ .../{Models => }/LL5/Project1+Schema.swift | 0 .../{Models => }/LL5/Project1.swift | 0 .../{Models => }/LL5/Team1+Schema.swift | 0 .../LL5/Team1.swift | 55 +++++++++++++++++++ .../Models/LL5/Team1.swift | 32 ----------- .../project.pbxproj | 6 +- 8 files changed, 99 insertions(+), 34 deletions(-) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL5/Project1+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL5/Project1.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL5/Team1+Schema.swift (100%) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift delete mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift index c0f4ab1020..4b8b8bed0e 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift @@ -168,7 +168,6 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { } } - extension AWSDataStoreLazyLoadPostComment4V2Tests { struct PostComment4V2Models: AmplifyModelRegistration { public let version: String = "version" diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift new file mode 100644 index 0000000000..f551051fea --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift @@ -0,0 +1,39 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify +import AWSPluginsCore + +class AWSDataStoreLazyLoadProjectTeam1Tests: AWSDataStoreLazyLoadBaseTest { + + func testSaveTeam() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let team = Team1(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + + let project = Project1(projectId: UUID().uuidString, + name: "name", + team: team, + project1TeamTeamId: team.teamId, + project1TeamName: team.name) + let savedProject = try await saveAndWaitForSync(project) + } +} + +extension AWSDataStoreLazyLoadProjectTeam1Tests { + struct ProjectTeam1Models: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Project1.self) + ModelRegistry.register(modelType: Team1.self) + } + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Project1+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Project1+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Project1.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Project1.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Project1.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift new file mode 100644 index 0000000000..2b8ba89ea6 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift @@ -0,0 +1,55 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Team1: Model { + public let teamId: String + public let name: String + internal var _project: LazyModel + public var project: Project1? { + get async throws { + try await _project.get() + } + } + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(teamId: String, + name: String, + project: Project1? = nil) { + self.init(teamId: teamId, + name: name, + project: project, + createdAt: nil, + updatedAt: nil) + } + internal init(teamId: String, + name: String, + project: Project1? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.teamId = teamId + self.name = name + self._project = LazyModel(element: project) + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + teamId = try values.decode(String.self, forKey: .teamId) + name = try values.decode(String.self, forKey: .name) + _project = try values.decode(LazyModel.self, forKey: .project) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(teamId, forKey: .teamId) + try container.encode(name, forKey: .name) + try container.encode(_project, forKey: .project) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1.swift deleted file mode 100644 index c0dfc18bae..0000000000 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL5/Team1.swift +++ /dev/null @@ -1,32 +0,0 @@ -// swiftlint:disable all -import Amplify -import Foundation - -public struct Team1: Model { - public let teamId: String - public let name: String - public var project: Project1? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(teamId: String, - name: String, - project: Project1? = nil) { - self.init(teamId: teamId, - name: name, - project: project, - createdAt: nil, - updatedAt: nil) - } - internal init(teamId: String, - name: String, - project: Project1? = nil, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.teamId = teamId - self.name = name - self.project = project - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index 33c611ce7b..2fbd3aa02a 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -217,6 +217,7 @@ 21801D3329006DB500FFA37E /* Team5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3129006DB500FFA37E /* Team5.swift */; }; 21801D3629006DC200FFA37E /* Project5+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3429006DC000FFA37E /* Project5+Schema.swift */; }; 21801D3729006DC200FFA37E /* Project5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3529006DC200FFA37E /* Project5.swift */; }; + 21801D3E2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3D2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift */; }; 219253BE28BFE84100820737 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 219253BD28BFE84000820737 /* XCTest.framework */; }; 21977DBF289C171A005B49D6 /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21977DBE289C1719005B49D6 /* TestConfigHelper.swift */; }; 219B518528E3A4B00080EDCC /* DataStoreConnectionOptionalAssociations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA00289BFE3400B32A39 /* DataStoreConnectionOptionalAssociations.swift */; }; @@ -779,6 +780,7 @@ 21801D3129006DB500FFA37E /* Team5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Team5.swift; sourceTree = ""; }; 21801D3429006DC000FFA37E /* Project5+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Project5+Schema.swift"; sourceTree = ""; }; 21801D3529006DC200FFA37E /* Project5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project5.swift; sourceTree = ""; }; + 21801D3D2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadProjectTeam1Tests.swift; sourceTree = ""; }; 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 = ""; }; @@ -1422,6 +1424,7 @@ children = ( 21801D3C2900730B00FFA37E /* LL1 */, 21801D3A29006F8600FFA37E /* LL3 */, + 21801D3829006F7500FFA37E /* LL5 */, 21801CA228F9A78F00FFA37E /* Models */, 21801C8628F9A37F00FFA37E /* TestConfigHelper.swift */, 21801C8528F9A36D00FFA37E /* lazyload-schema.graphql */, @@ -1448,7 +1451,6 @@ 21801CCF28F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift */, 21801CBF28F9A86700FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift */, 21801D3929006F7E00FFA37E /* LL2 */, - 21801D3829006F7500FFA37E /* LL5 */, 21801D3B2900709200FFA37E /* LL8 */, 21801CCC28F9A86800FFA37E /* MyCustomModel8.swift */, 21801CAE28F9A86600FFA37E /* MyCustomModel8+Schema.swift */, @@ -1485,6 +1487,7 @@ 21801D3829006F7500FFA37E /* LL5 */ = { isa = PBXGroup; children = ( + 21801D3D2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift */, 21801D2829006DA100FFA37E /* Project1.swift */, 21801D2929006DA300FFA37E /* Project1+Schema.swift */, 21801D2D29006DA800FFA37E /* Team1.swift */, @@ -3126,6 +3129,7 @@ 21801CE428F9A86800FFA37E /* Blog8V2.swift in Sources */, 21801D3629006DC200FFA37E /* Project5+Schema.swift in Sources */, 21801CE028F9A86800FFA37E /* Post8V2.swift in Sources */, + 21801D3E2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift in Sources */, 21801C7D28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift in Sources */, 21801CFF28F9A86800FFA37E /* Team2.swift in Sources */, 21801D0228F9A86800FFA37E /* Comment8+Schema.swift in Sources */, From b26516a68337458366540e1436e7379f0b3ede63 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Fri, 21 Oct 2022 10:28:44 -0400 Subject: [PATCH 09/18] reorganize and update many-to-many required association with require() call --- .../LL1/Comment4V2.swift | 4 + .../{Models => LL10}/Comment7+Schema.swift | 0 .../{Models => LL10}/Comment7.swift | 0 .../{Models => LL10}/Post7+Schema.swift | 0 .../{Models => LL10}/Post7.swift | 0 .../{Models => LL11}/Comment8+Schema.swift | 0 .../{Models => LL11}/Comment8.swift | 0 .../{Models => LL11}/Post8+Schema.swift | 0 .../{Models => LL11}/Post8.swift | 0 .../{Models => LL2}/Blog8V2+Schema.swift | 0 .../{Models => LL2}/Blog8V2.swift | 0 .../{Models => LL2}/Comment8V2+Schema.swift | 0 .../LL2/Comment8V2.swift | 59 ++++++ .../MyCustomModel8+Schema.swift | 0 .../{Models => LL2}/MyCustomModel8.swift | 0 .../MyNestedModel8+Schema.swift | 0 .../{Models => LL2}/MyNestedModel8.swift | 0 .../{Models => LL2}/Post8V2+Schema.swift | 0 .../LL2/Post8V2.swift | 74 ++++++++ .../PostTagsWithCompositeKey+Schema.swift | 0 .../LL4/PostTagsWithCompositeKey.swift | 68 +++++++ .../PostWithTagsCompositeKey+Schema.swift | 0 .../PostWithTagsCompositeKey.swift | 0 .../TagWithCompositeKey+Schema.swift | 0 .../{Models => LL4}/TagWithCompositeKey.swift | 0 .../{Models => LL6}/Project2+Schema.swift | 0 .../{Models => LL6}/Project2.swift | 0 .../{Models => LL6}/Team2+Schema.swift | 0 .../{Models => LL6}/Team2.swift | 0 .../{Models => LL7}/Comment4+Schema.swift | 0 .../{Models => LL7}/Comment4.swift | 0 .../{Models => LL7}/Post4+Schema.swift | 0 .../{Models => LL7}/Post4.swift | 0 .../{Models => }/LL8/Project5+Schema.swift | 0 .../{Models => }/LL8/Project5.swift | 0 .../{Models => }/LL8/Team5+Schema.swift | 0 .../{Models => }/LL8/Team5.swift | 0 .../{Models => LL9}/Project6+Schema.swift | 0 .../{Models => LL9}/Project6.swift | 0 .../{Models => LL9}/Team6+Schema.swift | 0 .../{Models => LL9}/Team6.swift | 0 .../AWSDataStoreLazyLoadBaseTest.swift | 0 .../AmplifyModels.swift | 0 .../{ => LazyLoadBase}/README.md | 0 .../{ => LazyLoadBase}/TestConfigHelper.swift | 0 .../lazyload-schema.graphql | 0 .../Models/Comment8V2.swift | 32 ---- ...mmentWithCompositeKeyAndIndex+Schema.swift | 49 ----- .../CommentWithCompositeKeyAndIndex.swift | 32 ---- .../Models/Post8V2.swift | 42 ----- .../Models/PostTagsWithCompositeKey.swift | 32 ---- .../PostWithCompositeKeyAndIndex+Schema.swift | 48 ----- .../Models/PostWithCompositeKeyAndIndex.swift | 32 ---- .../project.pbxproj | 178 +++++++++++------- 54 files changed, 310 insertions(+), 340 deletions(-) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL10}/Comment7+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL10}/Comment7.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL10}/Post7+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL10}/Post7.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL11}/Comment8+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL11}/Comment8.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL11}/Post8+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL11}/Post8.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL2}/Blog8V2+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL2}/Blog8V2.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL2}/Comment8V2+Schema.swift (100%) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Comment8V2.swift rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL2}/MyCustomModel8+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL2}/MyCustomModel8.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL2}/MyNestedModel8+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL2}/MyNestedModel8.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL2}/Post8V2+Schema.swift (100%) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Post8V2.swift rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL4}/PostTagsWithCompositeKey+Schema.swift (100%) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostTagsWithCompositeKey.swift rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL4}/PostWithTagsCompositeKey+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL4}/PostWithTagsCompositeKey.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL4}/TagWithCompositeKey+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL4}/TagWithCompositeKey.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL6}/Project2+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL6}/Project2.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL6}/Team2+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL6}/Team2.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL7}/Comment4+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL7}/Comment4.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL7}/Post4+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL7}/Post4.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL8/Project5+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL8/Project5.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL8/Team5+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => }/LL8/Team5.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL9}/Project6+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL9}/Project6.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL9}/Team6+Schema.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LL9}/Team6.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{ => LazyLoadBase}/AWSDataStoreLazyLoadBaseTest.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{Models => LazyLoadBase}/AmplifyModels.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{ => LazyLoadBase}/README.md (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{ => LazyLoadBase}/TestConfigHelper.swift (100%) rename AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/{ => LazyLoadBase}/lazyload-schema.graphql (100%) delete mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2.swift delete mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex+Schema.swift delete mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex.swift delete mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2.swift delete mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey.swift delete mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex+Schema.swift delete mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift index ee136f9708..55293f1ad4 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift @@ -44,6 +44,8 @@ public struct Comment4V2: Model { id = try values.decode(String.self, forKey: .id) content = try values.decode(String.self, forKey: .content) _post = try values.decode(LazyModel.self, forKey: .post) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) } public func encode(to encoder: Encoder) throws { @@ -51,5 +53,7 @@ public struct Comment4V2: Model { try container.encode(id, forKey: .id) try container.encode(content, forKey: .content) try container.encode(_post, forKey: .post) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Comment7+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Comment7+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Comment7.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment7.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Comment7.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Post7+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Post7+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Post7.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post7.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Post7.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/Comment8+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/Comment8+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/Comment8.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/Comment8.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/Post8+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/Post8+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/Post8.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/Post8.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Blog8V2+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Blog8V2+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Blog8V2.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Blog8V2.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Blog8V2.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Comment8V2+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Comment8V2+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Comment8V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Comment8V2.swift new file mode 100644 index 0000000000..1407b12b0f --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Comment8V2.swift @@ -0,0 +1,59 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Comment8V2: Model { + public let id: String + public var content: String? + internal var _post: LazyModel + public var post: Post8V2? { + get async throws { + try await _post.get() + } + } + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String? = nil, + post: Post8V2? = nil) { + self.init(id: id, + content: content, + post: post, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String? = nil, + post: Post8V2? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self._post = LazyModel(element: post) + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public mutating func setPost(_ post: Post8V2) { + self._post = LazyModel(element: post) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + id = try values.decode(String.self, forKey: .id) + content = try values.decode(String.self, forKey: .content) + _post = try values.decode(LazyModel.self, forKey: .post) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(id, forKey: .id) + try container.encode(content, forKey: .content) + try container.encode(_post, forKey: .post) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/MyCustomModel8+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/MyCustomModel8+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/MyCustomModel8.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyCustomModel8.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/MyCustomModel8.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/MyNestedModel8+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/MyNestedModel8+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/MyNestedModel8.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/MyNestedModel8.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/MyNestedModel8.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Post8V2+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Post8V2+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Post8V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Post8V2.swift new file mode 100644 index 0000000000..81f834dd4e --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL2/Post8V2.swift @@ -0,0 +1,74 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct Post8V2: Model { + public let id: String + public var name: String + public var randomId: String? + internal var _blog: LazyModel + public var blog: Blog8V2? { + get async throws { + try await _blog.get() + } + } + public var comments: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + name: String, + randomId: String? = nil, + blog: Blog8V2? = nil, + comments: List? = []) { + self.init(id: id, + name: name, + randomId: randomId, + blog: blog, + comments: comments, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + name: String, + randomId: String? = nil, + blog: Blog8V2? = nil, + comments: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.name = name + self.randomId = randomId + self._blog = LazyModel(element: blog) + self.comments = comments + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public mutating func setBlog(_ blog: Blog8V2) { + self._blog = LazyModel(element: blog) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + id = try values.decode(String.self, forKey: .id) + name = try values.decode(String.self, forKey: .name) + randomId = try values.decode(String.self, forKey: .randomId) + _blog = try values.decode(LazyModel.self, forKey: .blog) + comments = try values.decode(List?.self, forKey: .comments) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(id, forKey: .id) + try container.encode(name, forKey: .name) + try container.encode(randomId, forKey: .randomId) + try container.encode(_blog, forKey: .blog) + try container.encode(comments, forKey: .comments) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + } + +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostTagsWithCompositeKey+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostTagsWithCompositeKey+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostTagsWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostTagsWithCompositeKey.swift new file mode 100644 index 0000000000..b4288ea812 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostTagsWithCompositeKey.swift @@ -0,0 +1,68 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct PostTagsWithCompositeKey: Model { + public let id: String + internal var _postWithTagsCompositeKey: LazyModel + public var postWithTagsCompositeKey: PostWithTagsCompositeKey { + get async throws { + try await _postWithTagsCompositeKey.require() + } + } + internal var _tagWithCompositeKey: LazyModel + public var tagWithCompositeKey: TagWithCompositeKey { + get async throws { + try await _tagWithCompositeKey.require() + } + } + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + postWithTagsCompositeKey: PostWithTagsCompositeKey, + tagWithCompositeKey: TagWithCompositeKey) { + self.init(id: id, + postWithTagsCompositeKey: postWithTagsCompositeKey, + tagWithCompositeKey: tagWithCompositeKey, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + postWithTagsCompositeKey: PostWithTagsCompositeKey, + tagWithCompositeKey: TagWithCompositeKey, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self._postWithTagsCompositeKey = LazyModel(element: postWithTagsCompositeKey) + self._tagWithCompositeKey = LazyModel(element: tagWithCompositeKey) + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public mutating func setPostWithTagsCompositeKey(_ postWithTagsCompositeKey: PostWithTagsCompositeKey) { + self._postWithTagsCompositeKey = LazyModel(element: postWithTagsCompositeKey) + } + + public mutating func setTagWithCompositeKey(_ tagWithCompositeKey: TagWithCompositeKey) { + self._tagWithCompositeKey = LazyModel(element: tagWithCompositeKey) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + id = try values.decode(String.self, forKey: .id) + _postWithTagsCompositeKey = try values.decode(LazyModel.self, forKey: .postWithTagsCompositeKey) + _tagWithCompositeKey = try values.decode(LazyModel.self, forKey: .tagWithCompositeKey) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(id, forKey: .id) + try container.encode(_postWithTagsCompositeKey, forKey: .postWithTagsCompositeKey) + try container.encode(_tagWithCompositeKey, forKey: .tagWithCompositeKey) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostWithTagsCompositeKey+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostWithTagsCompositeKey+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostWithTagsCompositeKey.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithTagsCompositeKey.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/PostWithTagsCompositeKey.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/TagWithCompositeKey+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/TagWithCompositeKey+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/TagWithCompositeKey.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/TagWithCompositeKey.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/TagWithCompositeKey.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project2.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Team2+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Team2+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Team2.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team2.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Team2.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/Comment4+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/Comment4+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/Comment4.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment4.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/Comment4.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/Post4+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/Post4+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/Post4.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post4.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/Post4.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Project5+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Project5+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Project5.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Project5.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Project5.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Team5+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Team5+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Team5.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/LL8/Team5.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Team5.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Project6+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Project6+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Project6.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Project6.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Project6.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Team6+Schema.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6+Schema.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Team6+Schema.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Team6.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Team6.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Team6.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/AWSDataStoreLazyLoadBaseTest.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AmplifyModels.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/AmplifyModels.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AmplifyModels.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/README.md b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/README.md similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/README.md rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/README.md diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/TestConfigHelper.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/TestConfigHelper.swift similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/TestConfigHelper.swift rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/TestConfigHelper.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/lazyload-schema.graphql similarity index 100% rename from AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/lazyload-schema.graphql rename to AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/lazyload-schema.graphql diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2.swift deleted file mode 100644 index 08fdfdafa1..0000000000 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Comment8V2.swift +++ /dev/null @@ -1,32 +0,0 @@ -// swiftlint:disable all -import Amplify -import Foundation - -public struct Comment8V2: Model { - public let id: String - public var content: String? - public var post: Post8V2? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(id: String = UUID().uuidString, - content: String? = nil, - post: Post8V2? = nil) { - self.init(id: id, - content: content, - post: post, - createdAt: nil, - updatedAt: nil) - } - internal init(id: String = UUID().uuidString, - content: String? = nil, - post: Post8V2? = nil, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.id = id - self.content = content - self.post = post - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex+Schema.swift deleted file mode 100644 index 777e8fe158..0000000000 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex+Schema.swift +++ /dev/null @@ -1,49 +0,0 @@ -// swiftlint:disable all -import Amplify -import Foundation - -extension CommentWithCompositeKeyAndIndex { - // MARK: - CodingKeys - public enum CodingKeys: String, ModelKey { - case id - case content - case post - case createdAt - case updatedAt - } - - public static let keys = CodingKeys.self - // MARK: - ModelSchema - - public static let schema = defineSchema { model in - let commentWithCompositeKeyAndIndex = CommentWithCompositeKeyAndIndex.keys - - model.pluralName = "CommentWithCompositeKeyAndIndices" - - model.attributes( - .index(fields: ["id", "content"], name: nil), - .index(fields: ["postID", "postTitle"], name: "byPost"), - .primaryKey(fields: [commentWithCompositeKeyAndIndex.id, commentWithCompositeKeyAndIndex.content]) - ) - - model.fields( - .field(commentWithCompositeKeyAndIndex.id, is: .required, ofType: .string), - .field(commentWithCompositeKeyAndIndex.content, is: .required, ofType: .string), - .belongsTo(commentWithCompositeKeyAndIndex.post, is: .optional, ofType: PostWithCompositeKeyAndIndex.self, targetNames: ["postID", "postTitle"]), - .field(commentWithCompositeKeyAndIndex.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), - .field(commentWithCompositeKeyAndIndex.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) - ) - } -} - -extension CommentWithCompositeKeyAndIndex: ModelIdentifiable { - public typealias IdentifierFormat = ModelIdentifierFormat.Custom - public typealias IdentifierProtocol = ModelIdentifier -} - -extension CommentWithCompositeKeyAndIndex.IdentifierProtocol { - public static func identifier(id: String, - content: String) -> Self { - .make(fields:[(name: "id", value: id), (name: "content", value: content)]) - } -} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex.swift deleted file mode 100644 index 8f3562e1e0..0000000000 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/CommentWithCompositeKeyAndIndex.swift +++ /dev/null @@ -1,32 +0,0 @@ -// swiftlint:disable all -import Amplify -import Foundation - -public struct CommentWithCompositeKeyAndIndex: Model { - public let id: String - public let content: String - public var post: PostWithCompositeKeyAndIndex? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(id: String = UUID().uuidString, - content: String, - post: PostWithCompositeKeyAndIndex? = nil) { - self.init(id: id, - content: content, - post: post, - createdAt: nil, - updatedAt: nil) - } - internal init(id: String = UUID().uuidString, - content: String, - post: PostWithCompositeKeyAndIndex? = nil, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.id = id - self.content = content - self.post = post - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2.swift deleted file mode 100644 index 032848ac65..0000000000 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/Post8V2.swift +++ /dev/null @@ -1,42 +0,0 @@ -// swiftlint:disable all -import Amplify -import Foundation - -public struct Post8V2: Model { - public let id: String - public var name: String - public var randomId: String? - public var blog: Blog8V2? - public var comments: List? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(id: String = UUID().uuidString, - name: String, - randomId: String? = nil, - blog: Blog8V2? = nil, - comments: List? = []) { - self.init(id: id, - name: name, - randomId: randomId, - blog: blog, - comments: comments, - createdAt: nil, - updatedAt: nil) - } - internal init(id: String = UUID().uuidString, - name: String, - randomId: String? = nil, - blog: Blog8V2? = nil, - comments: List? = [], - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.id = id - self.name = name - self.randomId = randomId - self.blog = blog - self.comments = comments - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey.swift deleted file mode 100644 index d03e2b5e42..0000000000 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostTagsWithCompositeKey.swift +++ /dev/null @@ -1,32 +0,0 @@ -// swiftlint:disable all -import Amplify -import Foundation - -public struct PostTagsWithCompositeKey: Model { - public let id: String - public var postWithTagsCompositeKey: PostWithTagsCompositeKey - public var tagWithCompositeKey: TagWithCompositeKey - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(id: String = UUID().uuidString, - postWithTagsCompositeKey: PostWithTagsCompositeKey, - tagWithCompositeKey: TagWithCompositeKey) { - self.init(id: id, - postWithTagsCompositeKey: postWithTagsCompositeKey, - tagWithCompositeKey: tagWithCompositeKey, - createdAt: nil, - updatedAt: nil) - } - internal init(id: String = UUID().uuidString, - postWithTagsCompositeKey: PostWithTagsCompositeKey, - tagWithCompositeKey: TagWithCompositeKey, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.id = id - self.postWithTagsCompositeKey = postWithTagsCompositeKey - self.tagWithCompositeKey = tagWithCompositeKey - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex+Schema.swift deleted file mode 100644 index 0f13a541b9..0000000000 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex+Schema.swift +++ /dev/null @@ -1,48 +0,0 @@ -// swiftlint:disable all -import Amplify -import Foundation - -extension PostWithCompositeKeyAndIndex { - // MARK: - CodingKeys - public enum CodingKeys: String, ModelKey { - case id - case title - case comments - case createdAt - case updatedAt - } - - public static let keys = CodingKeys.self - // MARK: - ModelSchema - - public static let schema = defineSchema { model in - let postWithCompositeKeyAndIndex = PostWithCompositeKeyAndIndex.keys - - model.pluralName = "PostWithCompositeKeyAndIndices" - - model.attributes( - .index(fields: ["id", "title"], name: nil), - .primaryKey(fields: [postWithCompositeKeyAndIndex.id, postWithCompositeKeyAndIndex.title]) - ) - - model.fields( - .field(postWithCompositeKeyAndIndex.id, is: .required, ofType: .string), - .field(postWithCompositeKeyAndIndex.title, is: .required, ofType: .string), - .hasMany(postWithCompositeKeyAndIndex.comments, is: .optional, ofType: CommentWithCompositeKeyAndIndex.self, associatedWith: CommentWithCompositeKeyAndIndex.keys.post), - .field(postWithCompositeKeyAndIndex.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), - .field(postWithCompositeKeyAndIndex.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) - ) - } -} - -extension PostWithCompositeKeyAndIndex: ModelIdentifiable { - public typealias IdentifierFormat = ModelIdentifierFormat.Custom - public typealias IdentifierProtocol = ModelIdentifier -} - -extension PostWithCompositeKeyAndIndex.IdentifierProtocol { - public static func identifier(id: String, - title: String) -> Self { - .make(fields:[(name: "id", value: id), (name: "title", value: title)]) - } -} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex.swift deleted file mode 100644 index 02bf0180d9..0000000000 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/Models/PostWithCompositeKeyAndIndex.swift +++ /dev/null @@ -1,32 +0,0 @@ -// swiftlint:disable all -import Amplify -import Foundation - -public struct PostWithCompositeKeyAndIndex: Model { - public let id: String - public let title: String - public var comments: List? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(id: String = UUID().uuidString, - title: String, - comments: List? = []) { - self.init(id: id, - title: title, - comments: comments, - createdAt: nil, - updatedAt: nil) - } - internal init(id: String = UUID().uuidString, - title: String, - comments: List? = [], - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.id = id - self.title = title - self.comments = comments - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index 2fbd3aa02a..a666e25bba 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -168,8 +168,6 @@ 21801CDE28F9A86800FFA37E /* Post4+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CAD28F9A86600FFA37E /* Post4+Schema.swift */; }; 21801CDF28F9A86800FFA37E /* MyCustomModel8+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CAE28F9A86600FFA37E /* MyCustomModel8+Schema.swift */; }; 21801CE028F9A86800FFA37E /* Post8V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CAF28F9A86600FFA37E /* Post8V2.swift */; }; - 21801CE128F9A86800FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB028F9A86600FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift */; }; - 21801CE228F9A86800FFA37E /* PostWithCompositeKeyAndIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB128F9A86600FFA37E /* PostWithCompositeKeyAndIndex.swift */; }; 21801CE328F9A86800FFA37E /* Project6.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB228F9A86600FFA37E /* Project6.swift */; }; 21801CE428F9A86800FFA37E /* Blog8V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB328F9A86700FFA37E /* Blog8V2.swift */; }; 21801CE528F9A86800FFA37E /* PostTagsWithCompositeKey+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CB428F9A86700FFA37E /* PostTagsWithCompositeKey+Schema.swift */; }; @@ -183,7 +181,6 @@ 21801CED28F9A86800FFA37E /* Post4.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBC28F9A86700FFA37E /* Post4.swift */; }; 21801CEE28F9A86800FFA37E /* Comment4.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBD28F9A86700FFA37E /* Comment4.swift */; }; 21801CEF28F9A86800FFA37E /* Blog8V2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBE28F9A86700FFA37E /* Blog8V2+Schema.swift */; }; - 21801CF028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CBF28F9A86700FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift */; }; 21801CF128F9A86800FFA37E /* Project2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC028F9A86700FFA37E /* Project2+Schema.swift */; }; 21801CF228F9A86800FFA37E /* Post4V2+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC128F9A86700FFA37E /* Post4V2+Schema.swift */; }; 21801CF328F9A86800FFA37E /* Project6+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CC228F9A86700FFA37E /* Project6+Schema.swift */; }; @@ -199,7 +196,6 @@ 21801CFD28F9A86800FFA37E /* MyCustomModel8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCC28F9A86800FFA37E /* MyCustomModel8.swift */; }; 21801CFE28F9A86800FFA37E /* Comment8V2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCD28F9A86800FFA37E /* Comment8V2.swift */; }; 21801CFF28F9A86800FFA37E /* Team2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCE28F9A86800FFA37E /* Team2.swift */; }; - 21801D0028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CCF28F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift */; }; 21801D0128F9A86800FFA37E /* AmplifyModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD028F9A86800FFA37E /* AmplifyModels.swift */; }; 21801D0228F9A86800FFA37E /* Comment8+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */; }; 21801D0328F9A86800FFA37E /* Post7+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CD228F9A86800FFA37E /* Post7+Schema.swift */; }; @@ -734,8 +730,6 @@ 21801CAD28F9A86600FFA37E /* Post4+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Post4+Schema.swift"; sourceTree = ""; }; 21801CAE28F9A86600FFA37E /* MyCustomModel8+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MyCustomModel8+Schema.swift"; sourceTree = ""; }; 21801CAF28F9A86600FFA37E /* Post8V2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Post8V2.swift; sourceTree = ""; }; - 21801CB028F9A86600FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PostWithCompositeKeyAndIndex+Schema.swift"; sourceTree = ""; }; - 21801CB128F9A86600FFA37E /* PostWithCompositeKeyAndIndex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostWithCompositeKeyAndIndex.swift; sourceTree = ""; }; 21801CB228F9A86600FFA37E /* Project6.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project6.swift; sourceTree = ""; }; 21801CB328F9A86700FFA37E /* Blog8V2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Blog8V2.swift; sourceTree = ""; }; 21801CB428F9A86700FFA37E /* PostTagsWithCompositeKey+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PostTagsWithCompositeKey+Schema.swift"; sourceTree = ""; }; @@ -749,7 +743,6 @@ 21801CBC28F9A86700FFA37E /* Post4.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Post4.swift; sourceTree = ""; }; 21801CBD28F9A86700FFA37E /* Comment4.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comment4.swift; sourceTree = ""; }; 21801CBE28F9A86700FFA37E /* Blog8V2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Blog8V2+Schema.swift"; sourceTree = ""; }; - 21801CBF28F9A86700FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CommentWithCompositeKeyAndIndex+Schema.swift"; sourceTree = ""; }; 21801CC028F9A86700FFA37E /* Project2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Project2+Schema.swift"; sourceTree = ""; }; 21801CC128F9A86700FFA37E /* Post4V2+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Post4V2+Schema.swift"; sourceTree = ""; }; 21801CC228F9A86700FFA37E /* Project6+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Project6+Schema.swift"; sourceTree = ""; }; @@ -765,7 +758,6 @@ 21801CCC28F9A86800FFA37E /* MyCustomModel8.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyCustomModel8.swift; sourceTree = ""; }; 21801CCD28F9A86800FFA37E /* Comment8V2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comment8V2.swift; sourceTree = ""; }; 21801CCE28F9A86800FFA37E /* Team2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Team2.swift; sourceTree = ""; }; - 21801CCF28F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommentWithCompositeKeyAndIndex.swift; sourceTree = ""; }; 21801CD028F9A86800FFA37E /* AmplifyModels.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AmplifyModels.swift; sourceTree = ""; }; 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Comment8+Schema.swift"; sourceTree = ""; }; 21801CD228F9A86800FFA37E /* Post7+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Post7+Schema.swift"; sourceTree = ""; }; @@ -1422,120 +1414,164 @@ 21801C7B28F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests */ = { isa = PBXGroup; children = ( + 21801D482902E25A00FFA37E /* LazyLoadBase */, 21801D3C2900730B00FFA37E /* LL1 */, + 21801D412902DD4900FFA37E /* LL2 */, 21801D3A29006F8600FFA37E /* LL3 */, + 21801D422902E0CD00FFA37E /* LL4 */, 21801D3829006F7500FFA37E /* LL5 */, - 21801CA228F9A78F00FFA37E /* Models */, - 21801C8628F9A37F00FFA37E /* TestConfigHelper.swift */, - 21801C8528F9A36D00FFA37E /* lazyload-schema.graphql */, - 21801C8428F9A2DC00FFA37E /* README.md */, - 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */, + 21801D432902E0D400FFA37E /* LL6 */, + 21801D442902E0DB00FFA37E /* LL7 */, + 21801D3B2900709200FFA37E /* LL8 */, + 21801D452902E0E100FFA37E /* LL9 */, + 21801D462902E0F600FFA37E /* LL10 */, + 21801D472902E0FD00FFA37E /* LL11 */, ); path = AWSDataStorePluginLazyLoadTests; sourceTree = ""; }; - 21801CA228F9A78F00FFA37E /* Models */ = { + 21801D3829006F7500FFA37E /* LL5 */ = { + isa = PBXGroup; + children = ( + 21801D3D2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift */, + 21801D2829006DA100FFA37E /* Project1.swift */, + 21801D2929006DA300FFA37E /* Project1+Schema.swift */, + 21801D2D29006DA800FFA37E /* Team1.swift */, + 21801D2C29006DA800FFA37E /* Team1+Schema.swift */, + ); + path = LL5; + sourceTree = ""; + }; + 21801D3A29006F8600FFA37E /* LL3 */ = { + isa = PBXGroup; + children = ( + 21801D2428FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift */, + 21801CA628F9A86600FFA37E /* CommentWithCompositeKey.swift */, + 21801CA428F9A86600FFA37E /* CommentWithCompositeKey+Schema.swift */, + 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */, + 21801CC728F9A86800FFA37E /* PostWithCompositeKey+Schema.swift */, + ); + path = LL3; + sourceTree = ""; + }; + 21801D3B2900709200FFA37E /* LL8 */ = { + isa = PBXGroup; + children = ( + 21801D3529006DC200FFA37E /* Project5.swift */, + 21801D3429006DC000FFA37E /* Project5+Schema.swift */, + 21801D3129006DB500FFA37E /* Team5.swift */, + 21801D3029006DB400FFA37E /* Team5+Schema.swift */, + ); + path = LL8; + sourceTree = ""; + }; + 21801D3C2900730B00FFA37E /* LL1 */ = { + isa = PBXGroup; + children = ( + 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift */, + 21801CB728F9A86700FFA37E /* Comment4V2.swift */, + 21801CCB28F9A86800FFA37E /* Comment4V2+Schema.swift */, + 21801CBA28F9A86700FFA37E /* Post4V2.swift */, + 21801CC128F9A86700FFA37E /* Post4V2+Schema.swift */, + ); + path = LL1; + sourceTree = ""; + }; + 21801D412902DD4900FFA37E /* LL2 */ = { isa = PBXGroup; children = ( - 21801CD028F9A86800FFA37E /* AmplifyModels.swift */, 21801CB328F9A86700FFA37E /* Blog8V2.swift */, 21801CBE28F9A86700FFA37E /* Blog8V2+Schema.swift */, - 21801CBD28F9A86700FFA37E /* Comment4.swift */, - 21801CC528F9A86700FFA37E /* Comment4+Schema.swift */, - 21801CC428F9A86700FFA37E /* Comment7.swift */, - 21801CA728F9A86600FFA37E /* Comment7+Schema.swift */, - 21801CB928F9A86700FFA37E /* Comment8.swift */, - 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */, 21801CCD28F9A86800FFA37E /* Comment8V2.swift */, 21801CAC28F9A86600FFA37E /* Comment8V2+Schema.swift */, - 21801CCF28F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift */, - 21801CBF28F9A86700FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift */, - 21801D3929006F7E00FFA37E /* LL2 */, - 21801D3B2900709200FFA37E /* LL8 */, 21801CCC28F9A86800FFA37E /* MyCustomModel8.swift */, 21801CAE28F9A86600FFA37E /* MyCustomModel8+Schema.swift */, 21801CD328F9A86800FFA37E /* MyNestedModel8.swift */, 21801CAA28F9A86600FFA37E /* MyNestedModel8+Schema.swift */, - 21801CBC28F9A86700FFA37E /* Post4.swift */, - 21801CAD28F9A86600FFA37E /* Post4+Schema.swift */, - 21801CC328F9A86700FFA37E /* Post7.swift */, - 21801CD228F9A86800FFA37E /* Post7+Schema.swift */, - 21801CA828F9A86600FFA37E /* Post8.swift */, - 21801CB828F9A86700FFA37E /* Post8+Schema.swift */, 21801CAF28F9A86600FFA37E /* Post8V2.swift */, 21801CC628F9A86700FFA37E /* Post8V2+Schema.swift */, + ); + path = LL2; + sourceTree = ""; + }; + 21801D422902E0CD00FFA37E /* LL4 */ = { + isa = PBXGroup; + children = ( 21801CAB28F9A86600FFA37E /* PostTagsWithCompositeKey.swift */, 21801CB428F9A86700FFA37E /* PostTagsWithCompositeKey+Schema.swift */, - 21801CB128F9A86600FFA37E /* PostWithCompositeKeyAndIndex.swift */, - 21801CB028F9A86600FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift */, 21801CA928F9A86600FFA37E /* PostWithTagsCompositeKey.swift */, 21801CA528F9A86600FFA37E /* PostWithTagsCompositeKey+Schema.swift */, - 21801CB628F9A86700FFA37E /* Project2.swift */, - 21801CC028F9A86700FFA37E /* Project2+Schema.swift */, - 21801CB228F9A86600FFA37E /* Project6.swift */, - 21801CC228F9A86700FFA37E /* Project6+Schema.swift */, 21801CC928F9A86800FFA37E /* TagWithCompositeKey.swift */, 21801CB528F9A86700FFA37E /* TagWithCompositeKey+Schema.swift */, + ); + path = LL4; + sourceTree = ""; + }; + 21801D432902E0D400FFA37E /* LL6 */ = { + isa = PBXGroup; + children = ( + 21801CB628F9A86700FFA37E /* Project2.swift */, + 21801CC028F9A86700FFA37E /* Project2+Schema.swift */, 21801CCE28F9A86800FFA37E /* Team2.swift */, 21801CCA28F9A86800FFA37E /* Team2+Schema.swift */, - 21801CC828F9A86800FFA37E /* Team6.swift */, - 21801CBB28F9A86700FFA37E /* Team6+Schema.swift */, ); - path = Models; + path = LL6; sourceTree = ""; }; - 21801D3829006F7500FFA37E /* LL5 */ = { + 21801D442902E0DB00FFA37E /* LL7 */ = { isa = PBXGroup; children = ( - 21801D3D2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift */, - 21801D2829006DA100FFA37E /* Project1.swift */, - 21801D2929006DA300FFA37E /* Project1+Schema.swift */, - 21801D2D29006DA800FFA37E /* Team1.swift */, - 21801D2C29006DA800FFA37E /* Team1+Schema.swift */, + 21801CBD28F9A86700FFA37E /* Comment4.swift */, + 21801CC528F9A86700FFA37E /* Comment4+Schema.swift */, + 21801CBC28F9A86700FFA37E /* Post4.swift */, + 21801CAD28F9A86600FFA37E /* Post4+Schema.swift */, ); - path = LL5; + path = LL7; sourceTree = ""; }; - 21801D3929006F7E00FFA37E /* LL2 */ = { + 21801D452902E0E100FFA37E /* LL9 */ = { isa = PBXGroup; children = ( + 21801CB228F9A86600FFA37E /* Project6.swift */, + 21801CC228F9A86700FFA37E /* Project6+Schema.swift */, + 21801CC828F9A86800FFA37E /* Team6.swift */, + 21801CBB28F9A86700FFA37E /* Team6+Schema.swift */, ); - path = LL2; + path = LL9; sourceTree = ""; }; - 21801D3A29006F8600FFA37E /* LL3 */ = { + 21801D462902E0F600FFA37E /* LL10 */ = { isa = PBXGroup; children = ( - 21801D2428FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift */, - 21801CA628F9A86600FFA37E /* CommentWithCompositeKey.swift */, - 21801CA428F9A86600FFA37E /* CommentWithCompositeKey+Schema.swift */, - 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */, - 21801CC728F9A86800FFA37E /* PostWithCompositeKey+Schema.swift */, + 21801CC328F9A86700FFA37E /* Post7.swift */, + 21801CD228F9A86800FFA37E /* Post7+Schema.swift */, + 21801CC428F9A86700FFA37E /* Comment7.swift */, + 21801CA728F9A86600FFA37E /* Comment7+Schema.swift */, ); - path = LL3; + path = LL10; sourceTree = ""; }; - 21801D3B2900709200FFA37E /* LL8 */ = { + 21801D472902E0FD00FFA37E /* LL11 */ = { isa = PBXGroup; children = ( - 21801D3529006DC200FFA37E /* Project5.swift */, - 21801D3429006DC000FFA37E /* Project5+Schema.swift */, - 21801D3129006DB500FFA37E /* Team5.swift */, - 21801D3029006DB400FFA37E /* Team5+Schema.swift */, + 21801CA828F9A86600FFA37E /* Post8.swift */, + 21801CB828F9A86700FFA37E /* Post8+Schema.swift */, + 21801CB928F9A86700FFA37E /* Comment8.swift */, + 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */, ); - path = LL8; + path = LL11; sourceTree = ""; }; - 21801D3C2900730B00FFA37E /* LL1 */ = { + 21801D482902E25A00FFA37E /* LazyLoadBase */ = { isa = PBXGroup; children = ( - 21801D0528F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift */, - 21801CB728F9A86700FFA37E /* Comment4V2.swift */, - 21801CCB28F9A86800FFA37E /* Comment4V2+Schema.swift */, - 21801CBA28F9A86700FFA37E /* Post4V2.swift */, - 21801CC128F9A86700FFA37E /* Post4V2+Schema.swift */, + 21801C8528F9A36D00FFA37E /* lazyload-schema.graphql */, + 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */, + 21801C8428F9A2DC00FFA37E /* README.md */, + 21801C8628F9A37F00FFA37E /* TestConfigHelper.swift */, + 21801CD028F9A86800FFA37E /* AmplifyModels.swift */, ); - path = LL1; + path = LazyLoadBase; sourceTree = ""; }; 21977D75289C161D005B49D6 /* Models */ = { @@ -3147,23 +3183,19 @@ 21801CF828F9A86800FFA37E /* PostWithCompositeKey+Schema.swift in Sources */, 21801D2E29006DA900FFA37E /* Team1+Schema.swift in Sources */, 21801CF328F9A86800FFA37E /* Project6+Schema.swift in Sources */, - 21801CE228F9A86800FFA37E /* PostWithCompositeKeyAndIndex.swift in Sources */, 21801CD728F9A86800FFA37E /* CommentWithCompositeKey.swift in Sources */, 21801CFE28F9A86800FFA37E /* Comment8V2.swift in Sources */, 21801CD928F9A86800FFA37E /* Post8.swift in Sources */, 21801CDD28F9A86800FFA37E /* Comment8V2+Schema.swift in Sources */, 21801CD428F9A86800FFA37E /* PostWithCompositeKey.swift in Sources */, 21801CD828F9A86800FFA37E /* Comment7+Schema.swift in Sources */, - 21801D0028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex.swift in Sources */, 21801D3229006DB500FFA37E /* Team5+Schema.swift in Sources */, 21801D2B29006DA300FFA37E /* Project1+Schema.swift in Sources */, - 21801CF028F9A86800FFA37E /* CommentWithCompositeKeyAndIndex+Schema.swift in Sources */, 21801D0728F9B11800FFA37E /* AsyncTesting.swift in Sources */, 21801D2A29006DA300FFA37E /* Project1.swift in Sources */, 21801CF128F9A86800FFA37E /* Project2+Schema.swift in Sources */, 21801D0428F9A86800FFA37E /* MyNestedModel8.swift in Sources */, 21801CF928F9A86800FFA37E /* Team6.swift in Sources */, - 21801CE128F9A86800FFA37E /* PostWithCompositeKeyAndIndex+Schema.swift in Sources */, 21801CD628F9A86800FFA37E /* PostWithTagsCompositeKey+Schema.swift in Sources */, 21801CDC28F9A86800FFA37E /* PostTagsWithCompositeKey.swift in Sources */, 21801CF628F9A86800FFA37E /* Comment4+Schema.swift in Sources */, From b5025b80e47de151766d85becc280d5915b5f6a6 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Tue, 25 Oct 2022 18:08:44 -0400 Subject: [PATCH 10/18] Test Updates (create without data, associate on update, reassociate on update, removal association on update) - allow updates from a model with not loaded lazy model. the identifier gets extracted out from the not loaded state and persisted in SQL. eager load on save continues to get the loaded model back for the sync to AppSync - ModelDecorator on update mutations will add `nil` for the targetName fields because updates may remove associations from models. - allow lazy model to be decoded as a notLoaded state with empty identifier. this is when there is no data to load in the associated data, and simply is not set yet. for example creating a comment and saving it, without a post attached. this is for optional associations - update some of the codegenerated types to allow setting a `nil` value to represent the removal use case. - start adding some many-to-many tests --- .../Model/Internal/ModelProvider.swift | 4 +- .../DataStore/Model/Lazy/LazyModel.swift | 13 +- .../Model/Decorator/ModelDecorator.swift | 8 +- .../GraphQLRequest+AnyModelWithSync.swift | 2 +- .../GraphQLRequest/GraphQLRequest+Model.swift | 4 +- .../Model/Support/Model+GraphQL.swift | 27 ++- .../Core/DataStoreModelDecoder.swift | 2 +- .../Core/DataStoreModelProvider.swift | 12 +- .../Storage/SQLite/Model+SQLite.swift | 4 +- ...DataStoreLazyLoadPostComment4V2Tests.swift | 193 ++++++++++------- .../LL1/Comment4V2.swift | 2 +- ...LoadPostCommentWithCompositeKeyTests.swift | 204 ++++++++++-------- .../LL3/CommentWithCompositeKey.swift | 2 +- .../AWSDataStoreLazyLoadPostTagTests.swift | 109 ++++++++++ .../AWSDataStoreLazyLoadBaseTest.swift | 66 ++++++ .../LazyLoadBase/lazyload-schema.graphql | 64 +++++- .../project.pbxproj | 4 + 17 files changed, 532 insertions(+), 188 deletions(-) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift diff --git a/Amplify/Categories/DataStore/Model/Internal/ModelProvider.swift b/Amplify/Categories/DataStore/Model/Internal/ModelProvider.swift index c054da45dd..5549df30e4 100644 --- a/Amplify/Categories/DataStore/Model/Internal/ModelProvider.swift +++ b/Amplify/Categories/DataStore/Model/Internal/ModelProvider.swift @@ -11,6 +11,8 @@ public protocol LazyModelMarker { associatedtype Element: Model var element: Element? { get } + + var identifiers: [String: String]? { get } } public struct AnyModelProvider: ModelProvider { @@ -41,6 +43,6 @@ public protocol ModelProvider { } public enum ModelProviderState { - case notLoaded(identifiers: [String: String]) + case notLoaded(identifiers: [String: String]?) case loaded(Element?) } diff --git a/Amplify/Categories/DataStore/Model/Lazy/LazyModel.swift b/Amplify/Categories/DataStore/Model/Lazy/LazyModel.swift index 726dd0e4df..c0a6854746 100644 --- a/Amplify/Categories/DataStore/Model/Lazy/LazyModel.swift +++ b/Amplify/Categories/DataStore/Model/Lazy/LazyModel.swift @@ -12,7 +12,7 @@ public class LazyModel: Codable, LazyModelMarker { /// Represents the data state of the `LazyModel`. enum LoadedState { - case notLoaded(identifiers: [String: String]) + case notLoaded(identifiers: [String: String]?) case loaded(Element?) } var loadedState: LoadedState @@ -42,6 +42,17 @@ public class LazyModel: Codable, LazyModelMarker { } } + public var identifiers: [String: String]? { + get { + switch loadedState { + case .notLoaded(let identifiers): + return identifiers + case .loaded: + return nil + } + } + } + public init(modelProvider: AnyModelProvider) { self.modelProvider = modelProvider switch self.modelProvider.getState() { diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/Decorator/ModelDecorator.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/Decorator/ModelDecorator.swift index 65cae84403..3a42420f98 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/Decorator/ModelDecorator.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/Decorator/ModelDecorator.swift @@ -14,9 +14,11 @@ import Amplify public struct ModelDecorator: ModelBasedGraphQLDocumentDecorator { private let model: Model - - public init(model: Model) { + private let mutationType: GraphQLMutationType + + public init(model: Model, mutationType: GraphQLMutationType) { self.model = model + self.mutationType = mutationType } public func decorate(_ document: SingleDirectiveGraphQLDocument, @@ -27,7 +29,7 @@ public struct ModelDecorator: ModelBasedGraphQLDocumentDecorator { public func decorate(_ document: SingleDirectiveGraphQLDocument, modelSchema: ModelSchema) -> SingleDirectiveGraphQLDocument { var inputs = document.inputs - var graphQLInput = model.graphQLInputForMutation(modelSchema) + var graphQLInput = model.graphQLInputForMutation(modelSchema, mutationType: mutationType) if !modelSchema.authRules.isEmpty { modelSchema.authRules.forEach { authRule in diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+AnyModelWithSync.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+AnyModelWithSync.swift index e983dc184f..86698e9803 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+AnyModelWithSync.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+AnyModelWithSync.swift @@ -245,7 +245,7 @@ extension GraphQLRequest: ModelSyncGraphQLRequestFactory { var documentBuilder = ModelBasedGraphQLDocumentBuilder(modelName: modelSchema.name, operationType: .mutation) documentBuilder.add(decorator: DirectiveNameDecorator(type: type)) - documentBuilder.add(decorator: ModelDecorator(model: model)) + documentBuilder.add(decorator: ModelDecorator(model: model, mutationType: type)) if let filter = filter { documentBuilder.add(decorator: FilterDecorator(filter: filter)) } diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+Model.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+Model.swift index c916046a7c..3d6b294a71 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+Model.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/GraphQLRequest/GraphQLRequest+Model.swift @@ -165,7 +165,7 @@ extension GraphQLRequest: ModelGraphQLRequestFactory { switch type { case .create: - documentBuilder.add(decorator: ModelDecorator(model: model)) + documentBuilder.add(decorator: ModelDecorator(model: model, mutationType: type)) case .delete: documentBuilder.add(decorator: ModelIdDecorator(model: model, schema: modelSchema)) @@ -173,7 +173,7 @@ extension GraphQLRequest: ModelGraphQLRequestFactory { documentBuilder.add(decorator: FilterDecorator(filter: predicate.graphQLFilter(for: modelSchema))) } case .update: - documentBuilder.add(decorator: ModelDecorator(model: model)) + documentBuilder.add(decorator: ModelDecorator(model: model, mutationType: type)) if let predicate = predicate { documentBuilder.add(decorator: FilterDecorator(filter: predicate.graphQLFilter(for: modelSchema))) } diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/Model+GraphQL.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/Model+GraphQL.swift index 60adda85f5..02deafa08c 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/Model+GraphQL.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/Model+GraphQL.swift @@ -31,7 +31,7 @@ extension Model { /// Returns the input used for mutations /// - Parameter modelSchema: model's schema /// - Returns: A key-value map of the GraphQL mutation input - func graphQLInputForMutation(_ modelSchema: ModelSchema) -> GraphQLInput { + func graphQLInputForMutation(_ modelSchema: ModelSchema, mutationType: GraphQLMutationType) -> GraphQLInput { var input: GraphQLInput = [:] // filter existing non-readonly fields @@ -84,9 +84,10 @@ extension Model { // get the associated model target names and their values let associatedModelIds = associatedModelIdentifierFields(fromModelValue: value, field: modelField, - associatedModelName: associateModelName) + associatedModelName: associateModelName, + mutationType: mutationType) for (fieldName, fieldValue) in associatedModelIds { - input[fieldName] = fieldValue + input.updateValue(fieldValue, forKey: fieldName) } case .embedded, .embeddedCollection: if let encodable = value as? Encodable { @@ -154,22 +155,28 @@ extension Model { /// and `value` its value in the associated model private func associatedModelIdentifierFields(fromModelValue value: Any, field: ModelField, - associatedModelName: String) -> [(String, Persistable)] { + associatedModelName: String, + mutationType: GraphQLMutationType) -> [(String, Persistable?)] { guard let associateModelSchema = ModelRegistry.modelSchema(from: associatedModelName) else { preconditionFailure("Associated model \(associatedModelName) not found.") } let fieldNames = getFieldNameForAssociatedModels(modelField: field) - let values = getModelIdentifierValues(from: value, modelSchema: associateModelSchema) + var values = getModelIdentifierValues(from: value, modelSchema: associateModelSchema) - // if the field is required, the associated field keys and values should match - if fieldNames.count != values.count, field.isRequired { - preconditionFailure( + if fieldNames.count != values.count { + // if the field is required, the associated field keys and values should match + if field.isRequired { + preconditionFailure( """ Associated model target names and values for field \(field.name) of model \(modelName) mismatch. There is a possibility that is an issue with the generated models. """ - ) + ) + } else if mutationType == .update { + // otherwise, pad the values with `nil` to account for removals of associations on updates. + values = [Persistable?](repeating: nil, count: fieldNames.count) + } } return Array(zip(fieldNames, values)) @@ -181,7 +188,7 @@ extension Model { /// - value: model value /// - modelSchema: model's schema /// - Returns: array of values of its primary key - private func getModelIdentifierValues(from value: Any, modelSchema: ModelSchema) -> [Persistable] { + private func getModelIdentifierValues(from value: Any, modelSchema: ModelSchema) -> [Persistable?] { if let modelValue = value as? Model { return modelValue.identifier(schema: modelSchema).values } else if let optionalModel = value as? Model?, diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Core/DataStoreModelDecoder.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Core/DataStoreModelDecoder.swift index d7cdbf8fe6..a3ed674cd4 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Core/DataStoreModelDecoder.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Core/DataStoreModelDecoder.swift @@ -54,5 +54,5 @@ public struct DataStoreModelDecoder: ModelProviderDecoder { /// Metadata that contains the primary keys and values of a model public struct DataStoreModelIdentifierMetadata: Codable { - let identifier: String + let identifier: String? } diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Core/DataStoreModelProvider.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Core/DataStoreModelProvider.swift index 7769279f01..09a870b6ff 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Core/DataStoreModelProvider.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Core/DataStoreModelProvider.swift @@ -12,22 +12,26 @@ import Combine public class DataStoreModelProvider: ModelProvider { enum LoadedState { - case notLoaded(identifiers: [String: String]) + case notLoaded(identifiers: [String: String]?) case loaded(model: ModelType?) } var loadedState: LoadedState convenience init(metadata: DataStoreModelIdentifierMetadata) { + if let identifier = metadata.identifier { + self.init(identifiers: [ModelType.schema.primaryKey.sqlName: identifier]) + } else { + self.init(identifiers: nil) + } - self.init(identifiers: [ModelType.schema.primaryKey.sqlName: metadata.identifier]) } init(model: ModelType?) { self.loadedState = .loaded(model: model) } - init(identifiers: [String: String]) { + init(identifiers: [String: String]?) { self.loadedState = .notLoaded(identifiers: identifiers) } @@ -36,7 +40,7 @@ public class DataStoreModelProvider: ModelProvider { public func load() async throws -> ModelType? { switch loadedState { case .notLoaded(let identifiers): - guard let identifier = identifiers.first else { + guard let identifiers = identifiers, let identifier = identifiers.first else { return nil } let queryPredicate: QueryPredicate = field(identifier.key).eq(identifier.value) diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Model+SQLite.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Model+SQLite.swift index 53a5cd886f..16c3f848a5 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Model+SQLite.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Model+SQLite.swift @@ -113,7 +113,9 @@ extension Model { if let associatedModelValue = value as? Model { return associatedModelValue.identifier } else if let associatedLazyModel = value as? (any LazyModelMarker) { - return associatedLazyModel.element?.identifier + // The identifier (sometimes the FK), comes from the loaded model's identifier or + // from the not loaded identifier's first and only value + return associatedLazyModel.element?.identifier ?? associatedLazyModel.identifiers?.first?.value } else if let associatedModelJSON = value as? [String: JSONValue] { return associatedPrimaryKeyValue(fromJSON: associatedModelJSON, associatedModelSchema: associatedModelSchema) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift index 4b8b8bed0e..86da16ca5a 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift @@ -17,37 +17,23 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { func testLazyLoad() async throws { await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) - let post = Post4V2(title: "title") - let comment = Comment4V2(content: "content", post: post) + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) let savedPost = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) try await assertComment(savedComment, hasEagerLoaded: savedPost) try await assertPost(savedPost, canLazyLoad: savedComment) - - guard let queriedComment = try await Amplify.DataStore.query(Comment4V2.self, - byIdentifier: savedComment.id) else { - XCTFail("Failed to query comment") - return - } + let queriedComment = try await queryComment(savedComment) try await assertComment(queriedComment, canLazyLoad: savedPost) - - guard let queriedPost = try await Amplify.DataStore.query(Post4V2.self, - byIdentifier: savedPost.id) else { - XCTFail("Failed to query post") - return - } + let queriedPost = try await queryPost(savedPost) try await assertPost(queriedPost, canLazyLoad: savedComment) } - func assertComment(_ comment: Comment4V2, - hasEagerLoaded post: Post4V2) async throws { - // assert that it is loaded - switch comment._post.modelProvider.getState() { - case .notLoaded: - XCTFail("Saving a comment should eager load the post") - case .loaded(let loadedPost): - XCTAssertEqual(loadedPost?.id, post.id) - } + func assertComment(_ comment: Comment, + hasEagerLoaded post: Post) async throws { + assertLazyModel(comment._post, + state: .loaded(model: post)) + guard let loadedPost = try await comment.post else { XCTFail("Failed to retrieve the post from the comment") return @@ -64,88 +50,120 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { try await assertPost(loadedPost, canLazyLoad: comment) } - func assertComment(_ comment: Comment4V2, - canLazyLoad post: Post4V2) async throws { - // assert that it is not loaded - switch comment._post.modelProvider.getState() { - case .notLoaded(let identifiers): - guard let identifier = identifiers.first else { - XCTFail("missing identifiers") - return - } - XCTAssertEqual(identifier.key, "id") - XCTAssertEqual(identifier.value, post.identifier) - case .loaded: - XCTFail("Should not be loaded") - } - - // lazy load + func assertComment(_ comment: Comment, + canLazyLoad post: Post) async throws { + assertLazyModel(comment._post, + state: .notLoaded(identifiers: ["id": post.identifier])) guard let loadedPost = try await comment.post else { - XCTFail("Failed to retrieve the loaded post from the comment") + XCTFail("Failed to load the post from the comment") return } XCTAssertEqual(loadedPost.id, post.id) - + assertLazyModel(comment._post, + state: .loaded(model: post)) try await assertPost(loadedPost, canLazyLoad: comment) } - func assertPost(_ post: Post4V2, - canLazyLoad comment: Comment4V2) async throws { + func assertPost(_ post: Post, + canLazyLoad comment: Comment) async throws { guard let comments = post.comments else { XCTFail("Missing comments on post") return } + assertList(comments, state: .isNotLoaded(associatedId: post.identifier, + associatedField: "post")) - // assert that it is not loaded - switch comments.listProvider.getState() { - case .notLoaded(let associatedId, let associatedField): - XCTAssertEqual(associatedId, post.identifier) - XCTAssertEqual(associatedField, "post") - case .loaded: - XCTFail("It should not be loaded") - } - - // lazy load try await comments.fetch() - switch comments.listProvider.getState() { - case .notLoaded: - XCTFail("It should be loaded after calling `fetch`") - case .loaded(let loadedComments): - XCTAssertEqual(loadedComments.count, 1) - } - + assertList(comments, state: .isLoaded(count: 1)) guard let comment = comments.first else { XCTFail("Missing lazy loaded comment from post") return } // further nested models should not be loaded - switch comment._post.modelProvider.getState() { - case .notLoaded(let identifiers): - guard let identifier = identifiers.first else { - XCTFail("missing identifiers") - return - } - XCTAssertEqual(identifier.key, "id") - XCTAssertEqual(identifier.value, post.identifier) - case .loaded: - XCTFail("Should be not loaded") - } + assertLazyModel(comment._post, + state: .notLoaded(identifiers: ["id": post.identifier])) + } + + func testSaveWithoutPost() async throws { + await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) + let comment = Comment(content: "content") + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await queryComment(savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: nil)) + let post = Post(title: "title") + let savedPost = try await saveAndWaitForSync(post) + queriedComment.setPost(savedPost) + let saveCommentWithPost = try await updateAndWaitForSync(queriedComment) + let queriedComment2 = try await queryComment(saveCommentWithPost) + try await assertComment(queriedComment2, canLazyLoad: post) + } + + func testUpdateFromQueriedComment() async throws { + await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + let queriedComment = try await queryComment(savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: ["id": post.identifier])) + let savedQueriedComment = try await updateAndWaitForSync(queriedComment) + let queriedComment2 = try await queryComment(savedQueriedComment) + try await assertComment(queriedComment2, canLazyLoad: savedPost) + } + + func testUpdateToNewPost() async throws { + await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await queryComment(savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: ["id": post.identifier])) + + let newPost = Post(title: "title") + _ = try await saveAndWaitForSync(newPost) + queriedComment.setPost(newPost) + let saveCommentWithNewPost = try await updateAndWaitForSync(queriedComment) + let queriedComment2 = try await queryComment(saveCommentWithNewPost) + try await assertComment(queriedComment2, canLazyLoad: newPost) + } + + func testUpdateRemovePost() async throws { + await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await queryComment(savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: ["id": post.identifier])) + + queriedComment.setPost(nil) + let saveCommentRemovePost = try await updateAndWaitForSync(queriedComment) + let queriedCommentNoPost = try await queryComment(saveCommentRemovePost) + assertLazyModel(queriedCommentNoPost._post, + state: .notLoaded(identifiers: nil)) } func testDelete() async throws { await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) - let post = Post4V2(title: "title") - let comment = Comment4V2(content: "content", post: post) + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) let savedPost = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) try await deleteAndWaitForSync(savedPost) - let queriedComment = try await Amplify.DataStore.query(Comment4V2.self, + let queriedComment = try await Amplify.DataStore.query(Comment.self, byIdentifier: savedComment.id) XCTAssertNil(queriedComment) - let commentMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Comment4V2.modelName, + let commentMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Comment.modelName, modelId: comment.identifier) guard let commentMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, byId: commentMetadataIdentifier) else { @@ -154,10 +172,10 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { } XCTAssertTrue(commentMetadata.deleted) - let queriedPost = try await Amplify.DataStore.query(Post4V2.self, + let queriedPost = try await Amplify.DataStore.query(Post.self, byIdentifier: savedPost.id) XCTAssertNil(queriedPost) - let postMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Post4V2.modelName, + let postMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Post.modelName, modelId: post.identifier) guard let postMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, byId: postMetadataIdentifier) else { @@ -169,6 +187,9 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { } extension AWSDataStoreLazyLoadPostComment4V2Tests { + typealias Post = Post4V2 + typealias Comment = Comment4V2 + struct PostComment4V2Models: AmplifyModelRegistration { public let version: String = "version" func registerModels(registry: ModelRegistry.Type) { @@ -176,4 +197,22 @@ extension AWSDataStoreLazyLoadPostComment4V2Tests { ModelRegistry.register(modelType: Comment4V2.self) } } + + func queryComment(_ comment: Comment) async throws -> Comment { + guard let queriedComment = try await Amplify.DataStore.query(Comment.self, + byIdentifier: comment.id) else { + XCTFail("Failed to query comment") + throw "Failed to query comment" + } + return queriedComment + } + + func queryPost(_ post: Post) async throws -> Post { + guard let queriedPost = try await Amplify.DataStore.query(Post.self, + byIdentifier: post.id) else { + XCTFail("Failed to query post") + throw "Failed to query post" + } + return queriedPost + } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift index 55293f1ad4..163c71a158 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift @@ -35,7 +35,7 @@ public struct Comment4V2: Model { self.updatedAt = updatedAt } - public mutating func setPost(_ post: Post4V2) { + public mutating func setPost(_ post: Post4V2?) { self._post = LazyModel(element: post) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift index 863efe58e9..dc158d919d 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift @@ -17,41 +17,23 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa func testLazyLoad() async throws { await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) - let post = PostWithCompositeKey(title: "title") - let comment = CommentWithCompositeKey(content: "content", post: post) + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) let savedPost = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) try await assertComment(savedComment, hasEagerLoaded: savedPost) try await assertPost(savedPost, canLazyLoad: savedComment) - - guard let queriedComment = try await Amplify.DataStore.query(CommentWithCompositeKey.self, - byIdentifier: .identifier( - id: savedComment.id, - content: savedComment.content)) else { - XCTFail("Failed to query comment") - return - } + let queriedComment = try await queryComment(savedComment) try await assertComment(queriedComment, canLazyLoad: savedPost) - - guard let queriedPost = try await Amplify.DataStore.query(PostWithCompositeKey.self, - byIdentifier: .identifier( - id: savedPost.id, - title: savedPost.title)) else { - XCTFail("Failed to query post") - return - } + let queriedPost = try await queryPost(savedPost) try await assertPost(queriedPost, canLazyLoad: savedComment) } - func assertComment(_ comment: CommentWithCompositeKey, - hasEagerLoaded post: PostWithCompositeKey) async throws { - // assert that it is loaded - switch comment._post.modelProvider.getState() { - case .notLoaded: - XCTFail("Saving a comment should eager load the post") - case .loaded(let loadedPost): - XCTAssertEqual(loadedPost?.id, post.id) - } + func assertComment(_ comment: Comment, + hasEagerLoaded post: Post) async throws { + assertLazyModel(comment._post, + state: .loaded(model: post)) + guard let loadedPost = try await comment.post else { XCTFail("Failed to retrieve the post from the comment") return @@ -68,90 +50,119 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa try await assertPost(loadedPost, canLazyLoad: comment) } - func assertComment(_ comment: CommentWithCompositeKey, - canLazyLoad post: PostWithCompositeKey) async throws { - // assert that it is not loaded - switch comment._post.modelProvider.getState() { - case .notLoaded(let identifiers): - guard let identifier = identifiers.first else { - XCTFail("missing identifiers") - return - } - XCTAssertEqual(identifier.key, "@@primaryKey") - XCTAssertEqual(identifier.value, post.identifier) - case .loaded: - XCTFail("Should not be loaded") - } - - // lazy load + func assertComment(_ comment: Comment, + canLazyLoad post: Post) async throws { + assertLazyModel(comment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) guard let loadedPost = try await comment.post else { - XCTFail("Failed to retrieve the loaded post from the comment") + XCTFail("Failed to load the post from the comment") return } XCTAssertEqual(loadedPost.id, post.id) - + assertLazyModel(comment._post, + state: .loaded(model: post)) try await assertPost(loadedPost, canLazyLoad: comment) } - func assertPost(_ post: PostWithCompositeKey, - canLazyLoad comment: CommentWithCompositeKey) async throws { + func assertPost(_ post: Post, + canLazyLoad comment: Comment) async throws { guard let comments = post.comments else { XCTFail("Missing comments on post") return } - - // assert that it is not loaded - switch comments.listProvider.getState() { - case .notLoaded(let associatedId, let associatedField): - XCTAssertEqual(associatedId, post.identifier) - XCTAssertEqual(associatedField, "post") - case .loaded: - XCTFail("It should not be loaded") - } - - // lazy load + assertList(comments, state: .isNotLoaded(associatedId: post.identifier, + associatedField: "post")) try await comments.fetch() - switch comments.listProvider.getState() { - case .notLoaded: - XCTFail("It should be loaded after calling `fetch`") - case .loaded(let loadedComments): - XCTAssertEqual(loadedComments.count, 1) - } - + assertList(comments, state: .isLoaded(count: 1)) guard let comment = comments.first else { XCTFail("Missing lazy loaded comment from post") return } + assertLazyModel(comment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + } + + func testSaveWithoutPost() async throws { + await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) + let comment = Comment(content: "content") + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await queryComment(savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: nil)) + let post = Post(title: "title") + let savedPost = try await saveAndWaitForSync(post) + queriedComment.setPost(savedPost) + let saveCommentWithPost = try await updateAndWaitForSync(queriedComment) + let queriedComment2 = try await queryComment(saveCommentWithPost) + try await assertComment(queriedComment2, canLazyLoad: post) + } + + func testUpdateFromQueriedComment() async throws { + await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + let queriedComment = try await queryComment(savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + let savedQueriedComment = try await updateAndWaitForSync(queriedComment) + let queriedComment2 = try await queryComment(savedQueriedComment) + try await assertComment(queriedComment2, canLazyLoad: savedPost) + } + + func testUpdateToNewPost() async throws { + await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) - // further nested models should not be loaded - switch comment._post.modelProvider.getState() { - case .notLoaded(let identifiers): - guard let identifier = identifiers.first else { - XCTFail("missing identifiers") - return - } - XCTAssertEqual(identifier.key, "@@primaryKey") - XCTAssertEqual(identifier.value, post.identifier) - case .loaded: - XCTFail("Should be not loaded") - } + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await queryComment(savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + + let newPost = Post(title: "title") + _ = try await saveAndWaitForSync(newPost) + queriedComment.setPost(newPost) + let saveCommentWithNewPost = try await updateAndWaitForSync(queriedComment) + let queriedComment2 = try await queryComment(saveCommentWithNewPost) + try await assertComment(queriedComment2, canLazyLoad: newPost) + } + + func testUpdateRemovePost() async throws { + await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) + + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await queryComment(savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + + queriedComment.setPost(nil) + let saveCommentRemovePost = try await updateAndWaitForSync(queriedComment) + let queriedCommentNoPost = try await queryComment(saveCommentRemovePost) + assertLazyModel(queriedCommentNoPost._post, + state: .notLoaded(identifiers: nil)) } func testDelete() async throws { await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) - let post = PostWithCompositeKey(title: "title") - let comment = CommentWithCompositeKey(content: "content", post: post) + let post = Post(title: "title") + let comment = Comment(content: "content", post: post) let savedPost = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) try await deleteAndWaitForSync(savedPost) - let queriedComment = try await Amplify.DataStore.query(CommentWithCompositeKey.self, + let queriedComment = try await Amplify.DataStore.query(Comment.self, byIdentifier: .identifier( id: savedComment.id, content: savedComment.content)) XCTAssertNil(queriedComment) - let commentMetadataIdentifier = MutationSyncMetadata.identifier(modelName: CommentWithCompositeKey.modelName, + let commentMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Comment.modelName, modelId: comment.identifier) guard let commentMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, byId: commentMetadataIdentifier) else { @@ -160,15 +171,15 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa } XCTAssertTrue(commentMetadata.deleted) - let queriedPost = try await Amplify.DataStore.query(PostWithCompositeKey.self, + let queriedPost = try await Amplify.DataStore.query(Post.self, byIdentifier: .identifier( id: savedPost.id, title: savedPost.title)) XCTAssertNil(queriedPost) let postMetadataIdentifier = MutationSyncMetadata.identifier(modelName: PostWithCompositeKey.modelName, - modelId: post.identifier) + modelId: post.identifier) guard let postMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, - byId: postMetadataIdentifier) else { + byId: postMetadataIdentifier) else { XCTFail("Could not retrieve metadata for post") return } @@ -177,6 +188,9 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa } extension AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests { + typealias Post = PostWithCompositeKey + typealias Comment = CommentWithCompositeKey + struct PostCommentWithCompositeKeyModels: AmplifyModelRegistration { public let version: String = "version" func registerModels(registry: ModelRegistry.Type) { @@ -184,4 +198,26 @@ extension AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests { ModelRegistry.register(modelType: CommentWithCompositeKey.self) } } + + func queryComment(_ comment: Comment) async throws -> Comment { + guard let queriedComment = try await Amplify.DataStore.query(Comment.self, + byIdentifier: .identifier( + id: comment.id, + content: comment.content)) else { + XCTFail("Failed to query comment") + throw "Failed to query comment" + } + return queriedComment + } + + func queryPost(_ post: Post) async throws -> Post { + guard let queriedPost = try await Amplify.DataStore.query(Post.self, + byIdentifier: .identifier( + id: post.id, + title: post.title)) else { + XCTFail("Failed to query post") + throw "Failed to query post" + } + return queriedPost + } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift index 9f08785729..d96f26ebe6 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift @@ -35,7 +35,7 @@ public struct CommentWithCompositeKey: Model { self.updatedAt = updatedAt } - public mutating func setPost(_ post: PostWithCompositeKey) { + public mutating func setPost(_ post: PostWithCompositeKey?) { self._post = LazyModel(element: post) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift new file mode 100644 index 0000000000..34973bd39c --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift @@ -0,0 +1,109 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify +import AWSPluginsCore + +final class AWSDataStoreLazyLoadPostTagTests: AWSDataStoreLazyLoadBaseTest { + + typealias Post = PostWithTagsCompositeKey + typealias Tag = TagWithCompositeKey + typealias PostTag = PostTagsWithCompositeKey + + func testLazyLoad() async throws { + await setup(withModels: PostTagModels(), logLevel: .verbose, eagerLoad: false) + let post = Post(postId: UUID().uuidString, title: "title") + let tag = Tag(name: "name") + let postTag = PostTag(postWithTagsCompositeKey: post, tagWithCompositeKey: tag) + let savedPost = try await saveAndWaitForSync(post) + let savedTag = try await saveAndWaitForSync(tag) + let savedPostTag = try await saveAndWaitForSync(postTag) + + try await assertPost(savedPost, canLazyLoad: savedPostTag) + try await assertTag(savedTag, canLazyLoad: savedPostTag) + assertLazyModel(savedPostTag._postWithTagsCompositeKey, state: .loaded(model: savedPost)) + assertLazyModel(savedPostTag._tagWithCompositeKey, state: .loaded(model: savedTag)) + + guard let queriedPost = try await Amplify.DataStore.query(Post.self, + byIdentifier: .identifier( + postId: post.postId, + title: post.title)) else { + XCTFail("Failed to query post") + return + } + try await assertPost(queriedPost, canLazyLoad: savedPostTag) + + guard let queriedTag = try await Amplify.DataStore.query(Tag.self, + byIdentifier: .identifier( + id: savedTag.id, + name: savedTag.name)) else { + XCTFail("Failed to query tag") + return + } + try await assertTag(queriedTag, canLazyLoad: savedPostTag) + + guard let queriedPostTag = try await Amplify.DataStore.query(PostTag.self, + byIdentifier: postTag.id) else { + XCTFail("Failed to query postTag") + return + } + try await assertPostTag(queriedPostTag, canLazyLoadTag: savedTag, canLazyLoadPost: savedPost) + } + + func assertPost(_ post: Post, + canLazyLoad postTag: PostTag) async throws { + guard let postTags = post.tags else { + XCTFail("Missing postTags on post") + return + } + assertList(postTags, state: .isNotLoaded(associatedId: post.identifier, + associatedField: "postWithTagsCompositeKey")) + try await postTags.fetch() + assertList(postTags, state: .isLoaded(count: 1)) + + } + + func assertTag(_ tag: Tag, + canLazyLoad postTag: PostTag) async throws { + guard let postTags = tag.posts else { + XCTFail("Missing postTags on post") + return + } + assertList(postTags, state: .isNotLoaded(associatedId: tag.identifier, + associatedField: "tagWithCompositeKey")) + try await postTags.fetch() + assertList(postTags, state: .isLoaded(count: 1)) + } + + + func assertPostTag(_ postTag: PostTag, canLazyLoadTag tag: Tag, canLazyLoadPost post: Post) async throws { + assertLazyModel(postTag._tagWithCompositeKey, state: .notLoaded(identifiers: ["@@primaryKey": tag.identifier])) + assertLazyModel(postTag._postWithTagsCompositeKey, state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + let loadedTag = try await postTag.tagWithCompositeKey + assertLazyModel(postTag._tagWithCompositeKey, state: .loaded(model: loadedTag)) + try await assertTag(loadedTag, canLazyLoad: postTag) + let loadedPost = try await postTag.postWithTagsCompositeKey + assertLazyModel(postTag._postWithTagsCompositeKey, state: .loaded(model: loadedPost)) + try await assertPost(loadedPost, canLazyLoad: postTag) + } + + +} +extension AWSDataStoreLazyLoadPostTagTests { + struct PostTagModels: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: PostTagsWithCompositeKey.self) + ModelRegistry.register(modelType: PostWithTagsCompositeKey.self) + ModelRegistry.register(modelType: TagWithCompositeKey.self) + } + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift index 89c72373da..bc283414ee 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift @@ -89,6 +89,22 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { return savedModel } + func updateAndWaitForSync(_ model: M) async throws -> M { + let modelSynced = asyncExpectation(description: "model was synced successfully") + let mutationEvents = Amplify.DataStore.observe(M.self) + Task { + for try await mutationEvent in mutationEvents { + if mutationEvent.version == 2 && mutationEvent.modelId == model.identifier { + await modelSynced.fulfill() + } + } + + } + let savedModel = try await Amplify.DataStore.save(model) + await waitForExpectations([modelSynced], timeout: 10) + return savedModel + } + func deleteAndWaitForSync(_ model: M) async throws { let modelSynced = asyncExpectation(description: "model was synced successfully") let dataStoreEvents = HubPayload.EventName.DataStore.self @@ -108,4 +124,54 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { try await Amplify.DataStore.delete(model) await waitForExpectations([modelSynced], timeout: 10) } + + enum AssertListState { + case isNotLoaded(associatedId: String, associatedField: String) + case isLoaded(count: Int) + } + + func assertList(_ list: List, state: AssertListState) { + switch state { + case .isNotLoaded(let expectedAssociatedId, let expectedAssociatedField): + if case .notLoaded(let associatedId, let associatedField) = list.listProvider.getState() { + XCTAssertEqual(associatedId, expectedAssociatedId) + XCTAssertEqual(associatedField, expectedAssociatedField) + } else { + XCTFail("It should be not loaded with expected associatedId \(expectedAssociatedId) associatedField \(expectedAssociatedField)") + } + case .isLoaded(let count): + if case .loaded(let loadedList) = list.listProvider.getState() { + XCTAssertEqual(loadedList.count, count) + } else { + XCTFail("It should be loaded with expected count \(count)") + } + } + } + + enum AssertLazyModelState { + case notLoaded(identifiers: [String: String]?) + case loaded(model: M?) + } + + func assertLazyModel(_ lazyModel: LazyModel, + state: AssertLazyModelState) { + switch state { + case .notLoaded(let expectedIdentifiers): + if case .notLoaded(let identifiers) = lazyModel.modelProvider.getState() { + XCTAssertEqual(identifiers, expectedIdentifiers) + } else { + XCTFail("Should be not loaded with identifiers \(expectedIdentifiers)") + } + case .loaded(let expectedModel): + if case .loaded(let model) = lazyModel.modelProvider.getState() { + guard let expectedModel = expectedModel, let model = model else { + XCTAssertNil(model) + return + } + XCTAssertEqual(model.identifier, expectedModel.identifier) + } else { + XCTFail("Should be loaded with model \(String(describing: expectedModel))") + } + } + } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/lazyload-schema.graphql b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/lazyload-schema.graphql index a4729b0a68..1adc3ccd47 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/lazyload-schema.graphql +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/lazyload-schema.graphql @@ -14,7 +14,7 @@ type Post4V2 @model @auth(rules: [{allow: public}]) { type Comment4V2 @model @auth(rules: [{allow: public}]) { id: ID! - postID: ID! @index(name: "byPost4", sortKeyFields: ["content"]) + postID: ID @index(name: "byPost4", sortKeyFields: ["content"]) content: String! post: Post4V2 @belongsTo(fields: ["postID"]) } @@ -196,3 +196,65 @@ type Comment8 @model { postId: ID @index(name: "byPost", sortKeyFields:["postTitle"]) # customized foreign key for parent primary key postTitle: String # customized foreign key for parent sort key } + +# LL.12. JS Schema + +type HasOneParent @model { + id: ID! @primaryKey + child: HasOneChild @hasOne +} + +type HasOneChild @model { + id: ID! @primaryKey + content: String +} + +type DefaultPKParent @model { + id: ID! @primaryKey + content: String + children: [DefaultPKChild] @hasMany +} + +type DefaultPKChild @model { + id: ID! @primaryKey + content: String + parent: DefaultPKParent @belongsTo +} + +type CompositePKParent @model { + customId: ID! @primaryKey(sortKeyFields:["content"]) + content: String! + children: [CompositePKChild] @hasMany(indexName:"byParent", fields:["customId", "content"]) + implicitChildren: [ImplicitChild] @hasMany + strangeChildren: [StrangeExplicitChild] @hasMany(indexName: "byCompositePKParentX", fields: ["customId", "content"]) + childrenSansBelongsTo: [ChildSansBelongsTo] @hasMany +} + +type CompositePKChild @model { + childId: ID! @primaryKey(sortKeyFields:["content"]) + content: String! + parent: CompositePKParent @belongsTo(fields:["parentId", "parentTitle"]) + parentId: ID @index(name: "byParent", sortKeyFields:["parentTitle"]) + parentTitle: String +} + +type ImplicitChild @model { + childId: ID! @primaryKey(sortKeyFields:["content"]) + content: String! + parent: CompositePKParent! @belongsTo +} + +type StrangeExplicitChild @model { + strangeId: ID! @primaryKey(sortKeyFields:["content"]) + content: String! + parent: CompositePKParent! @belongsTo(fields:["strangeParentId", "strangeParentTitle"]) + strangeParentId: ID @index(name: "byCompositePKParentX", sortKeyFields:["strangeParentTitle"]) + strangeParentTitle: String # customized foreign key for parent sort key +} + +type ChildSansBelongsTo @model { + childId: ID! @primaryKey(sortKeyFields:["content"]) + content: String! + compositePKParentChildrenSansBelongsToCustomId: ID! @index(name: "byParent", sortKeyFields: ["compositePKParentChildrenSansBelongsToContent"]) + compositePKParentChildrenSansBelongsToContent: String +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index a666e25bba..6f9acb2d40 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -214,6 +214,7 @@ 21801D3629006DC200FFA37E /* Project5+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3429006DC000FFA37E /* Project5+Schema.swift */; }; 21801D3729006DC200FFA37E /* Project5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3529006DC200FFA37E /* Project5.swift */; }; 21801D3E2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3D2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift */; }; + 21801D4A2906CF3B00FFA37E /* AWSDataStoreLazyLoadPostTagTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D492906CF3B00FFA37E /* AWSDataStoreLazyLoadPostTagTests.swift */; }; 219253BE28BFE84100820737 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 219253BD28BFE84000820737 /* XCTest.framework */; }; 21977DBF289C171A005B49D6 /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21977DBE289C1719005B49D6 /* TestConfigHelper.swift */; }; 219B518528E3A4B00080EDCC /* DataStoreConnectionOptionalAssociations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA00289BFE3400B32A39 /* DataStoreConnectionOptionalAssociations.swift */; }; @@ -773,6 +774,7 @@ 21801D3429006DC000FFA37E /* Project5+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Project5+Schema.swift"; sourceTree = ""; }; 21801D3529006DC200FFA37E /* Project5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project5.swift; sourceTree = ""; }; 21801D3D2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadProjectTeam1Tests.swift; sourceTree = ""; }; + 21801D492906CF3B00FFA37E /* AWSDataStoreLazyLoadPostTagTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostTagTests.swift; sourceTree = ""; }; 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 = ""; }; @@ -1497,6 +1499,7 @@ 21801D422902E0CD00FFA37E /* LL4 */ = { isa = PBXGroup; children = ( + 21801D492906CF3B00FFA37E /* AWSDataStoreLazyLoadPostTagTests.swift */, 21801CAB28F9A86600FFA37E /* PostTagsWithCompositeKey.swift */, 21801CB428F9A86700FFA37E /* PostTagsWithCompositeKey+Schema.swift */, 21801CA928F9A86600FFA37E /* PostWithTagsCompositeKey.swift */, @@ -3210,6 +3213,7 @@ 21801CE528F9A86800FFA37E /* PostTagsWithCompositeKey+Schema.swift in Sources */, 21801D2528FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift in Sources */, 21801CDE28F9A86800FFA37E /* Post4+Schema.swift in Sources */, + 21801D4A2906CF3B00FFA37E /* AWSDataStoreLazyLoadPostTagTests.swift in Sources */, 21801CDA28F9A86800FFA37E /* PostWithTagsCompositeKey.swift in Sources */, 21801D0928F9B11E00FFA37E /* XCTestCase+AsyncTesting.swift in Sources */, 21801CF428F9A86800FFA37E /* Post7.swift in Sources */, From b7b457a966c4fa2697e7c8accc8f6ddeea26e02f Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 26 Oct 2022 10:32:45 -0400 Subject: [PATCH 11/18] add many-to-many delete scenario testing --- ...DataStoreLazyLoadPostComment4V2Tests.swift | 34 +--- ...LoadPostCommentWithCompositeKeyTests.swift | 38 +--- .../AWSDataStoreLazyLoadPostTagTests.swift | 165 +++++++++++++++--- .../AWSDataStoreLazyLoadBaseTest.swift | 47 +++-- 4 files changed, 178 insertions(+), 106 deletions(-) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift index 86da16ca5a..5c7a47949c 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift @@ -95,7 +95,7 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { let post = Post(title: "title") let savedPost = try await saveAndWaitForSync(post) queriedComment.setPost(savedPost) - let saveCommentWithPost = try await updateAndWaitForSync(queriedComment) + let saveCommentWithPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) let queriedComment2 = try await queryComment(saveCommentWithPost) try await assertComment(queriedComment2, canLazyLoad: post) } @@ -109,7 +109,7 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { let queriedComment = try await queryComment(savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: ["id": post.identifier])) - let savedQueriedComment = try await updateAndWaitForSync(queriedComment) + let savedQueriedComment = try await saveAndWaitForSync(queriedComment, assertVersion: 2) let queriedComment2 = try await queryComment(savedQueriedComment) try await assertComment(queriedComment2, canLazyLoad: savedPost) } @@ -128,7 +128,7 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { let newPost = Post(title: "title") _ = try await saveAndWaitForSync(newPost) queriedComment.setPost(newPost) - let saveCommentWithNewPost = try await updateAndWaitForSync(queriedComment) + let saveCommentWithNewPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) let queriedComment2 = try await queryComment(saveCommentWithNewPost) try await assertComment(queriedComment2, canLazyLoad: newPost) } @@ -145,7 +145,7 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { state: .notLoaded(identifiers: ["id": post.identifier])) queriedComment.setPost(nil) - let saveCommentRemovePost = try await updateAndWaitForSync(queriedComment) + let saveCommentRemovePost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) let queriedCommentNoPost = try await queryComment(saveCommentRemovePost) assertLazyModel(queriedCommentNoPost._post, state: .notLoaded(identifiers: nil)) @@ -159,30 +159,8 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { let savedPost = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) try await deleteAndWaitForSync(savedPost) - - let queriedComment = try await Amplify.DataStore.query(Comment.self, - byIdentifier: savedComment.id) - XCTAssertNil(queriedComment) - let commentMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Comment.modelName, - modelId: comment.identifier) - guard let commentMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, - byId: commentMetadataIdentifier) else { - XCTFail("Could not retrieve metadata for comment") - return - } - XCTAssertTrue(commentMetadata.deleted) - - let queriedPost = try await Amplify.DataStore.query(Post.self, - byIdentifier: savedPost.id) - XCTAssertNil(queriedPost) - let postMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Post.modelName, - modelId: post.identifier) - guard let postMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, - byId: postMetadataIdentifier) else { - XCTFail("Could not retrieve metadata for post") - return - } - XCTAssertTrue(postMetadata.deleted) + try await assertModelDoesNotExist(savedComment) + try await assertModelDoesNotExist(savedPost) } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift index dc158d919d..76d19faf7e 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift @@ -92,7 +92,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa let post = Post(title: "title") let savedPost = try await saveAndWaitForSync(post) queriedComment.setPost(savedPost) - let saveCommentWithPost = try await updateAndWaitForSync(queriedComment) + let saveCommentWithPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) let queriedComment2 = try await queryComment(saveCommentWithPost) try await assertComment(queriedComment2, canLazyLoad: post) } @@ -106,7 +106,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa let queriedComment = try await queryComment(savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) - let savedQueriedComment = try await updateAndWaitForSync(queriedComment) + let savedQueriedComment = try await saveAndWaitForSync(queriedComment, assertVersion: 2) let queriedComment2 = try await queryComment(savedQueriedComment) try await assertComment(queriedComment2, canLazyLoad: savedPost) } @@ -125,7 +125,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa let newPost = Post(title: "title") _ = try await saveAndWaitForSync(newPost) queriedComment.setPost(newPost) - let saveCommentWithNewPost = try await updateAndWaitForSync(queriedComment) + let saveCommentWithNewPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) let queriedComment2 = try await queryComment(saveCommentWithNewPost) try await assertComment(queriedComment2, canLazyLoad: newPost) } @@ -142,7 +142,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) queriedComment.setPost(nil) - let saveCommentRemovePost = try await updateAndWaitForSync(queriedComment) + let saveCommentRemovePost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) let queriedCommentNoPost = try await queryComment(saveCommentRemovePost) assertLazyModel(queriedCommentNoPost._post, state: .notLoaded(identifiers: nil)) @@ -156,34 +156,8 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa let savedPost = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) try await deleteAndWaitForSync(savedPost) - - let queriedComment = try await Amplify.DataStore.query(Comment.self, - byIdentifier: .identifier( - id: savedComment.id, - content: savedComment.content)) - XCTAssertNil(queriedComment) - let commentMetadataIdentifier = MutationSyncMetadata.identifier(modelName: Comment.modelName, - modelId: comment.identifier) - guard let commentMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, - byId: commentMetadataIdentifier) else { - XCTFail("Could not retrieve metadata for comment") - return - } - XCTAssertTrue(commentMetadata.deleted) - - let queriedPost = try await Amplify.DataStore.query(Post.self, - byIdentifier: .identifier( - id: savedPost.id, - title: savedPost.title)) - XCTAssertNil(queriedPost) - let postMetadataIdentifier = MutationSyncMetadata.identifier(modelName: PostWithCompositeKey.modelName, - modelId: post.identifier) - guard let postMetadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, - byId: postMetadataIdentifier) else { - XCTFail("Could not retrieve metadata for post") - return - } - XCTAssertTrue(postMetadata.deleted) + try await assertModelDoesNotExist(savedComment) + try await assertModelDoesNotExist(savedPost) } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift index 34973bd39c..f1e3aeeafd 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift @@ -14,10 +14,6 @@ import AWSPluginsCore final class AWSDataStoreLazyLoadPostTagTests: AWSDataStoreLazyLoadBaseTest { - typealias Post = PostWithTagsCompositeKey - typealias Tag = TagWithCompositeKey - typealias PostTag = PostTagsWithCompositeKey - func testLazyLoad() async throws { await setup(withModels: PostTagModels(), logLevel: .verbose, eagerLoad: false) let post = Post(postId: UUID().uuidString, title: "title") @@ -31,30 +27,11 @@ final class AWSDataStoreLazyLoadPostTagTests: AWSDataStoreLazyLoadBaseTest { try await assertTag(savedTag, canLazyLoad: savedPostTag) assertLazyModel(savedPostTag._postWithTagsCompositeKey, state: .loaded(model: savedPost)) assertLazyModel(savedPostTag._tagWithCompositeKey, state: .loaded(model: savedTag)) - - guard let queriedPost = try await Amplify.DataStore.query(Post.self, - byIdentifier: .identifier( - postId: post.postId, - title: post.title)) else { - XCTFail("Failed to query post") - return - } + let queriedPost = try await queryPost(savedPost) try await assertPost(queriedPost, canLazyLoad: savedPostTag) - - guard let queriedTag = try await Amplify.DataStore.query(Tag.self, - byIdentifier: .identifier( - id: savedTag.id, - name: savedTag.name)) else { - XCTFail("Failed to query tag") - return - } + let queriedTag = try await queryTag(savedTag) try await assertTag(queriedTag, canLazyLoad: savedPostTag) - - guard let queriedPostTag = try await Amplify.DataStore.query(PostTag.self, - byIdentifier: postTag.id) else { - XCTFail("Failed to query postTag") - return - } + let queriedPostTag = try await queryPostTag(savedPostTag) try await assertPostTag(queriedPostTag, canLazyLoadTag: savedTag, canLazyLoadPost: savedPost) } @@ -68,7 +45,6 @@ final class AWSDataStoreLazyLoadPostTagTests: AWSDataStoreLazyLoadBaseTest { associatedField: "postWithTagsCompositeKey")) try await postTags.fetch() assertList(postTags, state: .isLoaded(count: 1)) - } func assertTag(_ tag: Tag, @@ -83,7 +59,6 @@ final class AWSDataStoreLazyLoadPostTagTests: AWSDataStoreLazyLoadBaseTest { assertList(postTags, state: .isLoaded(count: 1)) } - func assertPostTag(_ postTag: PostTag, canLazyLoadTag tag: Tag, canLazyLoadPost post: Post) async throws { assertLazyModel(postTag._tagWithCompositeKey, state: .notLoaded(identifiers: ["@@primaryKey": tag.identifier])) assertLazyModel(postTag._postWithTagsCompositeKey, state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) @@ -95,9 +70,111 @@ final class AWSDataStoreLazyLoadPostTagTests: AWSDataStoreLazyLoadBaseTest { try await assertPost(loadedPost, canLazyLoad: postTag) } + func testUpdate() async throws { + await setup(withModels: PostTagModels(), logLevel: .verbose, eagerLoad: false) + let post = Post(postId: UUID().uuidString, title: "title") + let tag = Tag(name: "name") + let postTag = PostTag(postWithTagsCompositeKey: post, tagWithCompositeKey: tag) + let savedPost = try await saveAndWaitForSync(post) + let savedTag = try await saveAndWaitForSync(tag) + let savedPostTag = try await saveAndWaitForSync(postTag) + + // update the post tag with a new post + var queriedPostTag = try await queryPostTag(savedPostTag) + let newPost = Post(postId: UUID().uuidString, title: "title") + _ = try await saveAndWaitForSync(newPost) + queriedPostTag.setPostWithTagsCompositeKey(newPost) + let savedPostTagWithNewPost = try await saveAndWaitForSync(queriedPostTag, assertVersion: 2) + assertLazyModel(savedPostTagWithNewPost._postWithTagsCompositeKey, state: .loaded(model: newPost)) + let queriedPreviousPost = try await queryPost(savedPost) + try await assertPostWithNoPostTag(queriedPreviousPost) + + // update the post tag with a new tag + var queriedPostTagWithNewPost = try await queryPostTag(savedPostTagWithNewPost) + let newTag = Tag(name: "name") + _ = try await saveAndWaitForSync(newTag) + queriedPostTagWithNewPost.setTagWithCompositeKey(newTag) + let savedPostTagWithNewTag = try await saveAndWaitForSync(queriedPostTagWithNewPost, assertVersion: 3) + assertLazyModel(savedPostTagWithNewTag._tagWithCompositeKey, state: .loaded(model: newTag)) + let queriedPreviousTag = try await queryTag(savedTag) + try await assertTagWithNoPostTag(queriedPreviousTag) + } + + func assertPostWithNoPostTag(_ post: Post) async throws { + guard let postTags = post.tags else { + XCTFail("Missing postTags on post") + return + } + assertList(postTags, state: .isNotLoaded(associatedId: post.identifier, + associatedField: "postWithTagsCompositeKey")) + try await postTags.fetch() + assertList(postTags, state: .isLoaded(count: 0)) + } + + func assertTagWithNoPostTag(_ tag: Tag) async throws { + guard let postTags = tag.posts else { + XCTFail("Missing postTags on post") + return + } + assertList(postTags, state: .isNotLoaded(associatedId: tag.identifier, + associatedField: "tagWithCompositeKey")) + try await postTags.fetch() + assertList(postTags, state: .isLoaded(count: 0)) + } + func testDeletePost() async throws { + await setup(withModels: PostTagModels(), logLevel: .verbose, eagerLoad: false) + let post = Post(postId: UUID().uuidString, title: "title") + let tag = Tag(name: "name") + let postTag = PostTag(postWithTagsCompositeKey: post, tagWithCompositeKey: tag) + let savedPost = try await saveAndWaitForSync(post) + let savedTag = try await saveAndWaitForSync(tag) + let savedPostTag = try await saveAndWaitForSync(postTag) + + try await deleteAndWaitForSync(savedPost) + + try await assertModelDoesNotExist(savedPost) + try await assertModelExists(savedTag) + try await assertModelDoesNotExist(savedPostTag) + } + + func testDeleteTag() async throws { + await setup(withModels: PostTagModels(), logLevel: .verbose, eagerLoad: false) + let post = Post(postId: UUID().uuidString, title: "title") + let tag = Tag(name: "name") + let postTag = PostTag(postWithTagsCompositeKey: post, tagWithCompositeKey: tag) + let savedPost = try await saveAndWaitForSync(post) + let savedTag = try await saveAndWaitForSync(tag) + let savedPostTag = try await saveAndWaitForSync(postTag) + + try await deleteAndWaitForSync(savedTag) + + try await assertModelExists(savedPost) + try await assertModelDoesNotExist(savedTag) + try await assertModelDoesNotExist(savedPostTag) + } + + func testDeletePostTag() async throws { + await setup(withModels: PostTagModels(), logLevel: .verbose, eagerLoad: false) + let post = Post(postId: UUID().uuidString, title: "title") + let tag = Tag(name: "name") + let postTag = PostTag(postWithTagsCompositeKey: post, tagWithCompositeKey: tag) + let savedPost = try await saveAndWaitForSync(post) + let savedTag = try await saveAndWaitForSync(tag) + let savedPostTag = try await saveAndWaitForSync(postTag) + + try await deleteAndWaitForSync(savedPostTag) + + try await assertModelExists(savedPost) + try await assertModelExists(savedTag) + try await assertModelDoesNotExist(savedPostTag) + } } extension AWSDataStoreLazyLoadPostTagTests { + typealias Post = PostWithTagsCompositeKey + typealias Tag = TagWithCompositeKey + typealias PostTag = PostTagsWithCompositeKey + struct PostTagModels: AmplifyModelRegistration { public let version: String = "version" func registerModels(registry: ModelRegistry.Type) { @@ -106,4 +183,36 @@ extension AWSDataStoreLazyLoadPostTagTests { ModelRegistry.register(modelType: TagWithCompositeKey.self) } } + + func queryPost(_ post: Post) async throws -> Post { + guard let queriedPost = try await Amplify.DataStore.query(Post.self, + byIdentifier: .identifier( + postId: post.postId, + title: post.title)) else { + XCTFail("Failed to query post") + throw "Failed to query post" + } + return queriedPost + } + + func queryTag(_ tag: Tag) async throws -> Tag { + guard let queriedTag = try await Amplify.DataStore.query(Tag.self, + byIdentifier: .identifier( + id: tag.id, + name: tag.name)) else { + XCTFail("Failed to query tag") + throw "Failed to query tag" + } + return queriedTag + } + + func queryPostTag(_ postTag: PostTag) async throws -> PostTag { + guard let queriedPostTag = try await Amplify.DataStore.query(PostTag.self, + byIdentifier: postTag.id) else { + XCTFail("Failed to query postTag") + throw "Failed to query postTag" + } + return queriedPostTag + } + } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift index bc283414ee..215547c556 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift @@ -73,28 +73,12 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { try await Amplify.DataStore.clear() } - func saveAndWaitForSync(_ model: M) async throws -> M { + func saveAndWaitForSync(_ model: M, assertVersion: Int = 1) async throws -> M { let modelSynced = asyncExpectation(description: "model was synced successfully") let mutationEvents = Amplify.DataStore.observe(M.self) Task { for try await mutationEvent in mutationEvents { - if mutationEvent.version == 1 && mutationEvent.modelId == model.identifier { - await modelSynced.fulfill() - } - } - - } - let savedModel = try await Amplify.DataStore.save(model) - await waitForExpectations([modelSynced], timeout: 10) - return savedModel - } - - func updateAndWaitForSync(_ model: M) async throws -> M { - let modelSynced = asyncExpectation(description: "model was synced successfully") - let mutationEvents = Amplify.DataStore.observe(M.self) - Task { - for try await mutationEvent in mutationEvents { - if mutationEvent.version == 2 && mutationEvent.modelId == model.identifier { + if mutationEvent.version == assertVersion && mutationEvent.modelId == model.identifier { await modelSynced.fulfill() } } @@ -174,4 +158,31 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { } } } + + func assertModelExists(_ model: M) async throws { + let modelExists = try await modelExists(model) + XCTAssertTrue(modelExists) + } + + func assertModelDoesNotExist(_ model: M) async throws { + let modelExists = try await modelExists(model) + XCTAssertFalse(modelExists) + } + + func modelExists(_ model: M) async throws -> Bool { + let identifierName = model.schema.primaryKey.sqlName + let queryPredicate: QueryPredicate = field(identifierName).eq(model.identifier) + + let queriedModels = try await Amplify.DataStore.query(M.self, + where: queryPredicate) + let metadataId = MutationSyncMetadata.identifier(modelName: model.modelName, + modelId: model.identifier) + guard let metadata = try await Amplify.DataStore.query(MutationSyncMetadata.self, + byId: metadataId) else { + XCTFail("Could not retrieve metadata for model \(model)") + throw "Could not retrieve metadata for model \(model)" + } + + return !(metadata.deleted && queriedModels.isEmpty) + } } From 7122f99eef1fffbec3765a21799592da06eb5ea2 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 26 Oct 2022 10:36:58 -0400 Subject: [PATCH 12/18] Add L12 swift files, without modifications --- .../LL12/ChildSansBelongsTo+Schema.swift | 51 ++++++++++++ .../LL12/ChildSansBelongsTo.swift | 37 +++++++++ .../LL12/CompositePKChild+Schema.swift | 49 ++++++++++++ .../LL12/CompositePKChild.swift | 32 ++++++++ .../LL12/CompositePKParent+Schema.swift | 54 +++++++++++++ .../LL12/CompositePKParent.swift | 47 +++++++++++ .../LL12/DefaultPKChild+Schema.swift | 41 ++++++++++ .../LL12/DefaultPKChild.swift | 32 ++++++++ .../LL12/DefaultPKParent+Schema.swift | 41 ++++++++++ .../LL12/DefaultPKParent.swift | 32 ++++++++ .../LL12/HasOneChild+Schema.swift | 39 +++++++++ .../LL12/HasOneChild.swift | 27 +++++++ .../LL12/HasOneParent+Schema.swift | 41 ++++++++++ .../LL12/HasOneParent.swift | 32 ++++++++ .../LL12/ImplicitChild+Schema.swift | 48 +++++++++++ .../LL12/ImplicitChild.swift | 32 ++++++++ .../LL12/StrangeExplicitChild+Schema.swift | 49 ++++++++++++ .../LL12/StrangeExplicitChild.swift | 32 ++++++++ .../project.pbxproj | 80 +++++++++++++++++++ 19 files changed, 796 insertions(+) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ChildSansBelongsTo+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ChildSansBelongsTo.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKChild+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKChild.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKParent+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKParent.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKChild+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKChild.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKParent+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKParent.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneChild+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneChild.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneParent+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneParent.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ImplicitChild+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ImplicitChild.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/StrangeExplicitChild+Schema.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/StrangeExplicitChild.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ChildSansBelongsTo+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ChildSansBelongsTo+Schema.swift new file mode 100644 index 0000000000..53befe5219 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ChildSansBelongsTo+Schema.swift @@ -0,0 +1,51 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension ChildSansBelongsTo { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case childId + case content + case compositePKParentChildrenSansBelongsToCustomId + case compositePKParentChildrenSansBelongsToContent + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let childSansBelongsTo = ChildSansBelongsTo.keys + + model.pluralName = "ChildSansBelongsTos" + + model.attributes( + .index(fields: ["childId", "content"], name: nil), + .index(fields: ["compositePKParentChildrenSansBelongsToCustomId", "compositePKParentChildrenSansBelongsToContent"], name: "byParent"), + .primaryKey(fields: [childSansBelongsTo.childId, childSansBelongsTo.content]) + ) + + model.fields( + .field(childSansBelongsTo.childId, is: .required, ofType: .string), + .field(childSansBelongsTo.content, is: .required, ofType: .string), + .field(childSansBelongsTo.compositePKParentChildrenSansBelongsToCustomId, is: .required, ofType: .string), + .field(childSansBelongsTo.compositePKParentChildrenSansBelongsToContent, is: .optional, ofType: .string), + .field(childSansBelongsTo.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(childSansBelongsTo.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension ChildSansBelongsTo: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension ChildSansBelongsTo.IdentifierProtocol { + public static func identifier(childId: String, + content: String) -> Self { + .make(fields:[(name: "childId", value: childId), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ChildSansBelongsTo.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ChildSansBelongsTo.swift new file mode 100644 index 0000000000..83d55435d1 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ChildSansBelongsTo.swift @@ -0,0 +1,37 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct ChildSansBelongsTo: Model { + public let childId: String + public let content: String + public var compositePKParentChildrenSansBelongsToCustomId: String + public var compositePKParentChildrenSansBelongsToContent: String? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(childId: String, + content: String, + compositePKParentChildrenSansBelongsToCustomId: String, + compositePKParentChildrenSansBelongsToContent: String? = nil) { + self.init(childId: childId, + content: content, + compositePKParentChildrenSansBelongsToCustomId: compositePKParentChildrenSansBelongsToCustomId, + compositePKParentChildrenSansBelongsToContent: compositePKParentChildrenSansBelongsToContent, + createdAt: nil, + updatedAt: nil) + } + internal init(childId: String, + content: String, + compositePKParentChildrenSansBelongsToCustomId: String, + compositePKParentChildrenSansBelongsToContent: String? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.childId = childId + self.content = content + self.compositePKParentChildrenSansBelongsToCustomId = compositePKParentChildrenSansBelongsToCustomId + self.compositePKParentChildrenSansBelongsToContent = compositePKParentChildrenSansBelongsToContent + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKChild+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKChild+Schema.swift new file mode 100644 index 0000000000..ebef1cc4f4 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKChild+Schema.swift @@ -0,0 +1,49 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension CompositePKChild { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case childId + case content + case parent + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let compositePKChild = CompositePKChild.keys + + model.pluralName = "CompositePKChildren" + + model.attributes( + .index(fields: ["childId", "content"], name: nil), + .index(fields: ["parentId", "parentTitle"], name: "byParent"), + .primaryKey(fields: [compositePKChild.childId, compositePKChild.content]) + ) + + model.fields( + .field(compositePKChild.childId, is: .required, ofType: .string), + .field(compositePKChild.content, is: .required, ofType: .string), + .belongsTo(compositePKChild.parent, is: .optional, ofType: CompositePKParent.self, targetNames: ["parentId", "parentTitle"]), + .field(compositePKChild.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(compositePKChild.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension CompositePKChild: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension CompositePKChild.IdentifierProtocol { + public static func identifier(childId: String, + content: String) -> Self { + .make(fields:[(name: "childId", value: childId), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKChild.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKChild.swift new file mode 100644 index 0000000000..7e4d7a335e --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKChild.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct CompositePKChild: Model { + public let childId: String + public let content: String + public var parent: CompositePKParent? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(childId: String, + content: String, + parent: CompositePKParent? = nil) { + self.init(childId: childId, + content: content, + parent: parent, + createdAt: nil, + updatedAt: nil) + } + internal init(childId: String, + content: String, + parent: CompositePKParent? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.childId = childId + self.content = content + self.parent = parent + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKParent+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKParent+Schema.swift new file mode 100644 index 0000000000..238062f901 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKParent+Schema.swift @@ -0,0 +1,54 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension CompositePKParent { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case customId + case content + case children + case implicitChildren + case strangeChildren + case childrenSansBelongsTo + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let compositePKParent = CompositePKParent.keys + + model.pluralName = "CompositePKParents" + + model.attributes( + .index(fields: ["customId", "content"], name: nil), + .primaryKey(fields: [compositePKParent.customId, compositePKParent.content]) + ) + + model.fields( + .field(compositePKParent.customId, is: .required, ofType: .string), + .field(compositePKParent.content, is: .required, ofType: .string), + .hasMany(compositePKParent.children, is: .optional, ofType: CompositePKChild.self, associatedWith: CompositePKChild.keys.parent), + .hasMany(compositePKParent.implicitChildren, is: .optional, ofType: ImplicitChild.self, associatedWith: ImplicitChild.keys.parent), + .hasMany(compositePKParent.strangeChildren, is: .optional, ofType: StrangeExplicitChild.self, associatedWith: StrangeExplicitChild.keys.parent), + .hasMany(compositePKParent.childrenSansBelongsTo, is: .optional, ofType: ChildSansBelongsTo.self, associatedWith: ChildSansBelongsTo.keys.compositePKParentChildrenSansBelongsToCustomId), + .field(compositePKParent.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(compositePKParent.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension CompositePKParent: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension CompositePKParent.IdentifierProtocol { + public static func identifier(customId: String, + content: String) -> Self { + .make(fields:[(name: "customId", value: customId), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKParent.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKParent.swift new file mode 100644 index 0000000000..1893042a74 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/CompositePKParent.swift @@ -0,0 +1,47 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct CompositePKParent: Model { + public let customId: String + public let content: String + public var children: List? + public var implicitChildren: List? + public var strangeChildren: List? + public var childrenSansBelongsTo: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(customId: String, + content: String, + children: List? = [], + implicitChildren: List? = [], + strangeChildren: List? = [], + childrenSansBelongsTo: List? = []) { + self.init(customId: customId, + content: content, + children: children, + implicitChildren: implicitChildren, + strangeChildren: strangeChildren, + childrenSansBelongsTo: childrenSansBelongsTo, + createdAt: nil, + updatedAt: nil) + } + internal init(customId: String, + content: String, + children: List? = [], + implicitChildren: List? = [], + strangeChildren: List? = [], + childrenSansBelongsTo: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.customId = customId + self.content = content + self.children = children + self.implicitChildren = implicitChildren + self.strangeChildren = strangeChildren + self.childrenSansBelongsTo = childrenSansBelongsTo + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKChild+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKChild+Schema.swift new file mode 100644 index 0000000000..e42b9b9f53 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKChild+Schema.swift @@ -0,0 +1,41 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension DefaultPKChild { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case content + case parent + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let defaultPKChild = DefaultPKChild.keys + + model.pluralName = "DefaultPKChildren" + + model.attributes( + .index(fields: ["id"], name: nil), + .primaryKey(fields: [defaultPKChild.id]) + ) + + model.fields( + .field(defaultPKChild.id, is: .required, ofType: .string), + .field(defaultPKChild.content, is: .optional, ofType: .string), + .belongsTo(defaultPKChild.parent, is: .optional, ofType: DefaultPKParent.self, targetNames: ["defaultPKParentChildrenId"]), + .field(defaultPKChild.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(defaultPKChild.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension DefaultPKChild: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKChild.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKChild.swift new file mode 100644 index 0000000000..6175242adf --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKChild.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct DefaultPKChild: Model { + public let id: String + public var content: String? + public var parent: DefaultPKParent? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String? = nil, + parent: DefaultPKParent? = nil) { + self.init(id: id, + content: content, + parent: parent, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String? = nil, + parent: DefaultPKParent? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self.parent = parent + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKParent+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKParent+Schema.swift new file mode 100644 index 0000000000..b5e0fd9884 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKParent+Schema.swift @@ -0,0 +1,41 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension DefaultPKParent { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case content + case children + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let defaultPKParent = DefaultPKParent.keys + + model.pluralName = "DefaultPKParents" + + model.attributes( + .index(fields: ["id"], name: nil), + .primaryKey(fields: [defaultPKParent.id]) + ) + + model.fields( + .field(defaultPKParent.id, is: .required, ofType: .string), + .field(defaultPKParent.content, is: .optional, ofType: .string), + .hasMany(defaultPKParent.children, is: .optional, ofType: DefaultPKChild.self, associatedWith: DefaultPKChild.keys.parent), + .field(defaultPKParent.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(defaultPKParent.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension DefaultPKParent: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKParent.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKParent.swift new file mode 100644 index 0000000000..532bbb01ff --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/DefaultPKParent.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct DefaultPKParent: Model { + public let id: String + public var content: String? + public var children: List? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String? = nil, + children: List? = []) { + self.init(id: id, + content: content, + children: children, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String? = nil, + children: List? = [], + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self.children = children + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneChild+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneChild+Schema.swift new file mode 100644 index 0000000000..00fa241c55 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneChild+Schema.swift @@ -0,0 +1,39 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension HasOneChild { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case content + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let hasOneChild = HasOneChild.keys + + model.pluralName = "HasOneChildren" + + model.attributes( + .index(fields: ["id"], name: nil), + .primaryKey(fields: [hasOneChild.id]) + ) + + model.fields( + .field(hasOneChild.id, is: .required, ofType: .string), + .field(hasOneChild.content, is: .optional, ofType: .string), + .field(hasOneChild.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(hasOneChild.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension HasOneChild: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneChild.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneChild.swift new file mode 100644 index 0000000000..c915be5997 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneChild.swift @@ -0,0 +1,27 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct HasOneChild: Model { + public let id: String + public var content: String? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(id: String = UUID().uuidString, + content: String? = nil) { + self.init(id: id, + content: content, + createdAt: nil, + updatedAt: nil) + } + internal init(id: String = UUID().uuidString, + content: String? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.id = id + self.content = content + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneParent+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneParent+Schema.swift new file mode 100644 index 0000000000..b9bff0c853 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneParent+Schema.swift @@ -0,0 +1,41 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension HasOneParent { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case id + case child + case createdAt + case updatedAt + case hasOneParentChildId + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let hasOneParent = HasOneParent.keys + + model.pluralName = "HasOneParents" + + model.attributes( + .index(fields: ["id"], name: nil), + .primaryKey(fields: [hasOneParent.id]) + ) + + model.fields( + .field(hasOneParent.id, is: .required, ofType: .string), + .hasOne(hasOneParent.child, is: .optional, ofType: HasOneChild.self, associatedWith: HasOneChild.keys.id, targetNames: ["hasOneParentChildId"]), + .field(hasOneParent.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(hasOneParent.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(hasOneParent.hasOneParentChildId, is: .optional, ofType: .string) + ) + } +} + +extension HasOneParent: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Default + public typealias IdentifierProtocol = DefaultModelIdentifier +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneParent.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneParent.swift new file mode 100644 index 0000000000..d7a724b08f --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/HasOneParent.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct HasOneParent: Model { + public let id: String + public var child: HasOneChild? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + public var hasOneParentChildId: String? + + public init(id: String = UUID().uuidString, + child: HasOneChild? = nil, + hasOneParentChildId: String? = nil) { + self.init(id: id, + child: child, + createdAt: nil, + updatedAt: nil, + hasOneParentChildId: hasOneParentChildId) + } + internal init(id: String = UUID().uuidString, + child: HasOneChild? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil, + hasOneParentChildId: String? = nil) { + self.id = id + self.child = child + self.createdAt = createdAt + self.updatedAt = updatedAt + self.hasOneParentChildId = hasOneParentChildId + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ImplicitChild+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ImplicitChild+Schema.swift new file mode 100644 index 0000000000..641193c69a --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ImplicitChild+Schema.swift @@ -0,0 +1,48 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension ImplicitChild { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case childId + case content + case parent + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let implicitChild = ImplicitChild.keys + + model.pluralName = "ImplicitChildren" + + model.attributes( + .index(fields: ["childId", "content"], name: nil), + .primaryKey(fields: [implicitChild.childId, implicitChild.content]) + ) + + model.fields( + .field(implicitChild.childId, is: .required, ofType: .string), + .field(implicitChild.content, is: .required, ofType: .string), + .belongsTo(implicitChild.parent, is: .required, ofType: CompositePKParent.self, targetNames: ["compositePKParentImplicitChildrenCustomId", "compositePKParentImplicitChildrenContent"]), + .field(implicitChild.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(implicitChild.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension ImplicitChild: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension ImplicitChild.IdentifierProtocol { + public static func identifier(childId: String, + content: String) -> Self { + .make(fields:[(name: "childId", value: childId), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ImplicitChild.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ImplicitChild.swift new file mode 100644 index 0000000000..e9a416b68e --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/ImplicitChild.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct ImplicitChild: Model { + public let childId: String + public let content: String + public var parent: CompositePKParent + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(childId: String, + content: String, + parent: CompositePKParent) { + self.init(childId: childId, + content: content, + parent: parent, + createdAt: nil, + updatedAt: nil) + } + internal init(childId: String, + content: String, + parent: CompositePKParent, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.childId = childId + self.content = content + self.parent = parent + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/StrangeExplicitChild+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/StrangeExplicitChild+Schema.swift new file mode 100644 index 0000000000..edb39234c2 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/StrangeExplicitChild+Schema.swift @@ -0,0 +1,49 @@ +// swiftlint:disable all +import Amplify +import Foundation + +extension StrangeExplicitChild { + // MARK: - CodingKeys + public enum CodingKeys: String, ModelKey { + case strangeId + case content + case parent + case createdAt + case updatedAt + } + + public static let keys = CodingKeys.self + // MARK: - ModelSchema + + public static let schema = defineSchema { model in + let strangeExplicitChild = StrangeExplicitChild.keys + + model.pluralName = "StrangeExplicitChildren" + + model.attributes( + .index(fields: ["strangeId", "content"], name: nil), + .index(fields: ["strangeParentId", "strangeParentTitle"], name: "byCompositePKParentX"), + .primaryKey(fields: [strangeExplicitChild.strangeId, strangeExplicitChild.content]) + ) + + model.fields( + .field(strangeExplicitChild.strangeId, is: .required, ofType: .string), + .field(strangeExplicitChild.content, is: .required, ofType: .string), + .belongsTo(strangeExplicitChild.parent, is: .required, ofType: CompositePKParent.self, targetNames: ["strangeParentId", "strangeParentTitle"]), + .field(strangeExplicitChild.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(strangeExplicitChild.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + ) + } +} + +extension StrangeExplicitChild: ModelIdentifiable { + public typealias IdentifierFormat = ModelIdentifierFormat.Custom + public typealias IdentifierProtocol = ModelIdentifier +} + +extension StrangeExplicitChild.IdentifierProtocol { + public static func identifier(strangeId: String, + content: String) -> Self { + .make(fields:[(name: "strangeId", value: strangeId), (name: "content", value: content)]) + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/StrangeExplicitChild.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/StrangeExplicitChild.swift new file mode 100644 index 0000000000..492bf9916d --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL12/StrangeExplicitChild.swift @@ -0,0 +1,32 @@ +// swiftlint:disable all +import Amplify +import Foundation + +public struct StrangeExplicitChild: Model { + public let strangeId: String + public let content: String + public var parent: CompositePKParent + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(strangeId: String, + content: String, + parent: CompositePKParent) { + self.init(strangeId: strangeId, + content: content, + parent: parent, + createdAt: nil, + updatedAt: nil) + } + internal init(strangeId: String, + content: String, + parent: CompositePKParent, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.strangeId = strangeId + self.content = content + self.parent = parent + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} \ No newline at end of file diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index 6f9acb2d40..dd3cf01391 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -215,6 +215,24 @@ 21801D3729006DC200FFA37E /* Project5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3529006DC200FFA37E /* Project5.swift */; }; 21801D3E2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D3D2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift */; }; 21801D4A2906CF3B00FFA37E /* AWSDataStoreLazyLoadPostTagTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D492906CF3B00FFA37E /* AWSDataStoreLazyLoadPostTagTests.swift */; }; + 21801D5E29097D5800FFA37E /* StrangeExplicitChild.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D4C29097D5400FFA37E /* StrangeExplicitChild.swift */; }; + 21801D5F29097D5800FFA37E /* HasOneChild+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D4D29097D5600FFA37E /* HasOneChild+Schema.swift */; }; + 21801D6029097D5800FFA37E /* ImplicitChild.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D4E29097D5600FFA37E /* ImplicitChild.swift */; }; + 21801D6129097D5800FFA37E /* HasOneParent+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D4F29097D5600FFA37E /* HasOneParent+Schema.swift */; }; + 21801D6229097D5800FFA37E /* CompositePKChild.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5029097D5600FFA37E /* CompositePKChild.swift */; }; + 21801D6329097D5800FFA37E /* StrangeExplicitChild+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5129097D5600FFA37E /* StrangeExplicitChild+Schema.swift */; }; + 21801D6429097D5800FFA37E /* CompositePKChild+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5229097D5600FFA37E /* CompositePKChild+Schema.swift */; }; + 21801D6529097D5800FFA37E /* DefaultPKParent+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5329097D5600FFA37E /* DefaultPKParent+Schema.swift */; }; + 21801D6629097D5800FFA37E /* DefaultPKChild+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5429097D5600FFA37E /* DefaultPKChild+Schema.swift */; }; + 21801D6729097D5800FFA37E /* CompositePKParent+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5529097D5600FFA37E /* CompositePKParent+Schema.swift */; }; + 21801D6829097D5800FFA37E /* DefaultPKChild.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5629097D5600FFA37E /* DefaultPKChild.swift */; }; + 21801D6929097D5800FFA37E /* CompositePKParent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5729097D5600FFA37E /* CompositePKParent.swift */; }; + 21801D6A29097D5800FFA37E /* ChildSansBelongsTo+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5829097D5700FFA37E /* ChildSansBelongsTo+Schema.swift */; }; + 21801D6B29097D5800FFA37E /* HasOneParent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5929097D5700FFA37E /* HasOneParent.swift */; }; + 21801D6C29097D5800FFA37E /* DefaultPKParent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5A29097D5700FFA37E /* DefaultPKParent.swift */; }; + 21801D6D29097D5800FFA37E /* ImplicitChild+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5B29097D5700FFA37E /* ImplicitChild+Schema.swift */; }; + 21801D6E29097D5800FFA37E /* HasOneChild.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5C29097D5700FFA37E /* HasOneChild.swift */; }; + 21801D6F29097D5800FFA37E /* ChildSansBelongsTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5D29097D5700FFA37E /* ChildSansBelongsTo.swift */; }; 219253BE28BFE84100820737 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 219253BD28BFE84000820737 /* XCTest.framework */; }; 21977DBF289C171A005B49D6 /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21977DBE289C1719005B49D6 /* TestConfigHelper.swift */; }; 219B518528E3A4B00080EDCC /* DataStoreConnectionOptionalAssociations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA00289BFE3400B32A39 /* DataStoreConnectionOptionalAssociations.swift */; }; @@ -775,6 +793,24 @@ 21801D3529006DC200FFA37E /* Project5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Project5.swift; sourceTree = ""; }; 21801D3D2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadProjectTeam1Tests.swift; sourceTree = ""; }; 21801D492906CF3B00FFA37E /* AWSDataStoreLazyLoadPostTagTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostTagTests.swift; sourceTree = ""; }; + 21801D4C29097D5400FFA37E /* StrangeExplicitChild.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StrangeExplicitChild.swift; sourceTree = ""; }; + 21801D4D29097D5600FFA37E /* HasOneChild+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HasOneChild+Schema.swift"; sourceTree = ""; }; + 21801D4E29097D5600FFA37E /* ImplicitChild.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImplicitChild.swift; sourceTree = ""; }; + 21801D4F29097D5600FFA37E /* HasOneParent+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HasOneParent+Schema.swift"; sourceTree = ""; }; + 21801D5029097D5600FFA37E /* CompositePKChild.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompositePKChild.swift; sourceTree = ""; }; + 21801D5129097D5600FFA37E /* StrangeExplicitChild+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "StrangeExplicitChild+Schema.swift"; sourceTree = ""; }; + 21801D5229097D5600FFA37E /* CompositePKChild+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CompositePKChild+Schema.swift"; sourceTree = ""; }; + 21801D5329097D5600FFA37E /* DefaultPKParent+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DefaultPKParent+Schema.swift"; sourceTree = ""; }; + 21801D5429097D5600FFA37E /* DefaultPKChild+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DefaultPKChild+Schema.swift"; sourceTree = ""; }; + 21801D5529097D5600FFA37E /* CompositePKParent+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CompositePKParent+Schema.swift"; sourceTree = ""; }; + 21801D5629097D5600FFA37E /* DefaultPKChild.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultPKChild.swift; sourceTree = ""; }; + 21801D5729097D5600FFA37E /* CompositePKParent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompositePKParent.swift; sourceTree = ""; }; + 21801D5829097D5700FFA37E /* ChildSansBelongsTo+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ChildSansBelongsTo+Schema.swift"; sourceTree = ""; }; + 21801D5929097D5700FFA37E /* HasOneParent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HasOneParent.swift; sourceTree = ""; }; + 21801D5A29097D5700FFA37E /* DefaultPKParent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultPKParent.swift; sourceTree = ""; }; + 21801D5B29097D5700FFA37E /* ImplicitChild+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ImplicitChild+Schema.swift"; sourceTree = ""; }; + 21801D5C29097D5700FFA37E /* HasOneChild.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HasOneChild.swift; sourceTree = ""; }; + 21801D5D29097D5700FFA37E /* ChildSansBelongsTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChildSansBelongsTo.swift; sourceTree = ""; }; 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 = ""; }; @@ -1428,6 +1464,7 @@ 21801D452902E0E100FFA37E /* LL9 */, 21801D462902E0F600FFA37E /* LL10 */, 21801D472902E0FD00FFA37E /* LL11 */, + 21801D4B29097CAB00FFA37E /* LL12 */, ); path = AWSDataStorePluginLazyLoadTests; sourceTree = ""; @@ -1577,6 +1614,31 @@ path = LazyLoadBase; sourceTree = ""; }; + 21801D4B29097CAB00FFA37E /* LL12 */ = { + isa = PBXGroup; + children = ( + 21801D5D29097D5700FFA37E /* ChildSansBelongsTo.swift */, + 21801D5829097D5700FFA37E /* ChildSansBelongsTo+Schema.swift */, + 21801D5029097D5600FFA37E /* CompositePKChild.swift */, + 21801D5229097D5600FFA37E /* CompositePKChild+Schema.swift */, + 21801D5729097D5600FFA37E /* CompositePKParent.swift */, + 21801D5529097D5600FFA37E /* CompositePKParent+Schema.swift */, + 21801D5629097D5600FFA37E /* DefaultPKChild.swift */, + 21801D5429097D5600FFA37E /* DefaultPKChild+Schema.swift */, + 21801D5A29097D5700FFA37E /* DefaultPKParent.swift */, + 21801D5329097D5600FFA37E /* DefaultPKParent+Schema.swift */, + 21801D5C29097D5700FFA37E /* HasOneChild.swift */, + 21801D4D29097D5600FFA37E /* HasOneChild+Schema.swift */, + 21801D5929097D5700FFA37E /* HasOneParent.swift */, + 21801D4F29097D5600FFA37E /* HasOneParent+Schema.swift */, + 21801D4E29097D5600FFA37E /* ImplicitChild.swift */, + 21801D5B29097D5700FFA37E /* ImplicitChild+Schema.swift */, + 21801D4C29097D5400FFA37E /* StrangeExplicitChild.swift */, + 21801D5129097D5600FFA37E /* StrangeExplicitChild+Schema.swift */, + ); + path = LL12; + sourceTree = ""; + }; 21977D75289C161D005B49D6 /* Models */ = { isa = PBXGroup; children = ( @@ -3158,26 +3220,35 @@ 21801CE328F9A86800FFA37E /* Project6.swift in Sources */, 21801CE628F9A86800FFA37E /* TagWithCompositeKey+Schema.swift in Sources */, 21801D2F29006DA900FFA37E /* Team1.swift in Sources */, + 21801D6529097D5800FFA37E /* DefaultPKParent+Schema.swift in Sources */, 21801CE728F9A86800FFA37E /* Project2.swift in Sources */, + 21801D6A29097D5800FFA37E /* ChildSansBelongsTo+Schema.swift in Sources */, 21801CF728F9A86800FFA37E /* Post8V2+Schema.swift in Sources */, 21801D0128F9A86800FFA37E /* AmplifyModels.swift in Sources */, 21801CFB28F9A86800FFA37E /* Team2+Schema.swift in Sources */, + 21801D6F29097D5800FFA37E /* ChildSansBelongsTo.swift in Sources */, + 21801D6B29097D5800FFA37E /* HasOneParent.swift in Sources */, 21801D0328F9A86800FFA37E /* Post7+Schema.swift in Sources */, 21801D3329006DB500FFA37E /* Team5.swift in Sources */, 21801CEF28F9A86800FFA37E /* Blog8V2+Schema.swift in Sources */, 21801CE428F9A86800FFA37E /* Blog8V2.swift in Sources */, 21801D3629006DC200FFA37E /* Project5+Schema.swift in Sources */, + 21801D6229097D5800FFA37E /* CompositePKChild.swift in Sources */, 21801CE028F9A86800FFA37E /* Post8V2.swift in Sources */, 21801D3E2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift in Sources */, 21801C7D28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift in Sources */, 21801CFF28F9A86800FFA37E /* Team2.swift in Sources */, 21801D0228F9A86800FFA37E /* Comment8+Schema.swift in Sources */, + 21801D5F29097D5800FFA37E /* HasOneChild+Schema.swift in Sources */, 21801CFC28F9A86800FFA37E /* Comment4V2+Schema.swift in Sources */, 21801CEC28F9A86800FFA37E /* Team6+Schema.swift in Sources */, 21801CEA28F9A86800FFA37E /* Comment8.swift in Sources */, + 21801D6329097D5800FFA37E /* StrangeExplicitChild+Schema.swift in Sources */, 21801C8728F9A38000FFA37E /* TestConfigHelper.swift in Sources */, 21801CE928F9A86800FFA37E /* Post8+Schema.swift in Sources */, + 21801D6C29097D5800FFA37E /* DefaultPKParent.swift in Sources */, 21801CF528F9A86800FFA37E /* Comment7.swift in Sources */, + 21801D5E29097D5800FFA37E /* StrangeExplicitChild.swift in Sources */, 21801CE828F9A86800FFA37E /* Comment4V2.swift in Sources */, 21801CD528F9A86800FFA37E /* CommentWithCompositeKey+Schema.swift in Sources */, 21801CED28F9A86800FFA37E /* Post4.swift in Sources */, @@ -3191,9 +3262,12 @@ 21801CD928F9A86800FFA37E /* Post8.swift in Sources */, 21801CDD28F9A86800FFA37E /* Comment8V2+Schema.swift in Sources */, 21801CD428F9A86800FFA37E /* PostWithCompositeKey.swift in Sources */, + 21801D6D29097D5800FFA37E /* ImplicitChild+Schema.swift in Sources */, + 21801D6E29097D5800FFA37E /* HasOneChild.swift in Sources */, 21801CD828F9A86800FFA37E /* Comment7+Schema.swift in Sources */, 21801D3229006DB500FFA37E /* Team5+Schema.swift in Sources */, 21801D2B29006DA300FFA37E /* Project1+Schema.swift in Sources */, + 21801D6629097D5800FFA37E /* DefaultPKChild+Schema.swift in Sources */, 21801D0728F9B11800FFA37E /* AsyncTesting.swift in Sources */, 21801D2A29006DA300FFA37E /* Project1.swift in Sources */, 21801CF128F9A86800FFA37E /* Project2+Schema.swift in Sources */, @@ -3201,19 +3275,25 @@ 21801CF928F9A86800FFA37E /* Team6.swift in Sources */, 21801CD628F9A86800FFA37E /* PostWithTagsCompositeKey+Schema.swift in Sources */, 21801CDC28F9A86800FFA37E /* PostTagsWithCompositeKey.swift in Sources */, + 21801D6129097D5800FFA37E /* HasOneParent+Schema.swift in Sources */, 21801CF628F9A86800FFA37E /* Comment4+Schema.swift in Sources */, 21801CEB28F9A86800FFA37E /* Post4V2.swift in Sources */, 21801CDF28F9A86800FFA37E /* MyCustomModel8+Schema.swift in Sources */, 21801D0828F9B11B00FFA37E /* AsyncExpectation.swift in Sources */, + 21801D6429097D5800FFA37E /* CompositePKChild+Schema.swift in Sources */, 21801D3729006DC200FFA37E /* Project5.swift in Sources */, + 21801D6029097D5800FFA37E /* ImplicitChild.swift in Sources */, 21801CFD28F9A86800FFA37E /* MyCustomModel8.swift in Sources */, + 21801D6729097D5800FFA37E /* CompositePKParent+Schema.swift in Sources */, 21801CEE28F9A86800FFA37E /* Comment4.swift in Sources */, 21801D0628F9AE9400FFA37E /* AWSDataStoreLazyLoadPostComment4V2Tests.swift in Sources */, 21801CDB28F9A86800FFA37E /* MyNestedModel8+Schema.swift in Sources */, 21801CE528F9A86800FFA37E /* PostTagsWithCompositeKey+Schema.swift in Sources */, + 21801D6929097D5800FFA37E /* CompositePKParent.swift in Sources */, 21801D2528FDA5E700FFA37E /* AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift in Sources */, 21801CDE28F9A86800FFA37E /* Post4+Schema.swift in Sources */, 21801D4A2906CF3B00FFA37E /* AWSDataStoreLazyLoadPostTagTests.swift in Sources */, + 21801D6829097D5800FFA37E /* DefaultPKChild.swift in Sources */, 21801CDA28F9A86800FFA37E /* PostWithTagsCompositeKey.swift in Sources */, 21801D0928F9B11E00FFA37E /* XCTestCase+AsyncTesting.swift in Sources */, 21801CF428F9A86800FFA37E /* Post7.swift in Sources */, From 1be5581baf873fb9ca67578092066eca8eee95f0 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 26 Oct 2022 14:36:39 -0400 Subject: [PATCH 13/18] one-to-one initial decoding implementation and partial tests --- .../Schema/ModelField+Association.swift | 9 + .../Model/Lazy/DefaultModelProvider.swift | 25 +- .../DataStore/Model/Lazy/LazyModel.swift | 9 +- .../Model/Support/ModelSchema+GraphQL.swift | 2 +- .../Model/Support/SelectionSet.swift | 21 +- .../Storage/SQLite/Statement+Model.swift | 3 +- ...DataStoreLazyLoadPostComment4V2Tests.swift | 44 ++-- ...LoadPostCommentWithCompositeKeyTests.swift | 43 +--- .../AWSDataStoreLazyLoadPostTagTests.swift | 46 +--- ...WSDataStoreLazyLoadProjectTeam1Tests.swift | 84 ++++++- .../LL5/Project1.swift | 8 +- .../LL5/Team1.swift | 6 +- ...WSDataStoreLazyLoadProjectTeam2Tests.swift | 233 ++++++++++++++++++ .../LL6/Project2+Schema.swift | 61 ++++- .../LL6/Project2.swift | 171 ++++++++++--- .../AWSDataStoreLazyLoadBaseTest.swift | 95 ++++++- .../project.pbxproj | 4 + 17 files changed, 693 insertions(+), 171 deletions(-) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift diff --git a/Amplify/Categories/DataStore/Model/Internal/Schema/ModelField+Association.swift b/Amplify/Categories/DataStore/Model/Internal/Schema/ModelField+Association.swift index b9019598f1..bbcb4a5fcf 100644 --- a/Amplify/Categories/DataStore/Model/Internal/Schema/ModelField+Association.swift +++ b/Amplify/Categories/DataStore/Model/Internal/Schema/ModelField+Association.swift @@ -225,6 +225,15 @@ extension ModelField { } return true } + + public var isBelongsToOrHasOne: Bool { + switch association { + case .belongsTo, .hasOne: + return true + case .hasMany, .none: + return false + } + } /// - Warning: Although this has `public` access, it is intended for internal & codegen use and should not be used /// directly by host applications. The behavior of this may change without warning. Though it is not used by host diff --git a/Amplify/Categories/DataStore/Model/Lazy/DefaultModelProvider.swift b/Amplify/Categories/DataStore/Model/Lazy/DefaultModelProvider.swift index 57bf07365e..6418ea4f8b 100644 --- a/Amplify/Categories/DataStore/Model/Lazy/DefaultModelProvider.swift +++ b/Amplify/Categories/DataStore/Model/Lazy/DefaultModelProvider.swift @@ -10,18 +10,31 @@ import Foundation // MARK: - DefaultModelProvider public struct DefaultModelProvider: ModelProvider { - - let element: Element? + enum LoadedState { + case notLoaded(identifiers: [String: String]?) + case loaded(model: Element?) + } + + var loadedState: LoadedState + public init(element: Element? = nil) { - self.element = element + self.loadedState = .loaded(model: element) + } + + public init(identifiers: [String: String]?) { + self.loadedState = .notLoaded(identifiers: identifiers) } public func load() async throws -> Element? { - return element + return Fatal.preconditionFailure("DefaultModelProvider does not provide loading capabilities") } public func getState() -> ModelProviderState { - return .loaded(element) + switch loadedState { + case .notLoaded(let identifiers): + return .notLoaded(identifiers: identifiers) + case .loaded(let model): + return .loaded(model) + } } - } diff --git a/Amplify/Categories/DataStore/Model/Lazy/LazyModel.swift b/Amplify/Categories/DataStore/Model/Lazy/LazyModel.swift index c0a6854746..b312072052 100644 --- a/Amplify/Categories/DataStore/Model/Lazy/LazyModel.swift +++ b/Amplify/Categories/DataStore/Model/Lazy/LazyModel.swift @@ -63,11 +63,16 @@ public class LazyModel: Codable, LazyModelMarker { } } - public convenience init(element: Element? = nil) { + public convenience init(element: Element?) { let modelProvider = DefaultModelProvider(element: element).eraseToAnyModelProvider() self.init(modelProvider: modelProvider) } + public convenience init(identifiers: [String: String]?) { + let modelProvider = DefaultModelProvider(identifiers: identifiers).eraseToAnyModelProvider() + self.init(modelProvider: modelProvider) + } + required convenience public init(from decoder: Decoder) throws { for modelDecoder in ModelProviderRegistry.decoders.get() { if modelDecoder.shouldDecode(modelType: Element.self, decoder: decoder) { @@ -81,7 +86,7 @@ public class LazyModel: Codable, LazyModelMarker { let element = try Element(from: decoder) self.init(element: element) } else { - self.init() + self.init(identifiers: nil) } } diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/ModelSchema+GraphQL.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/ModelSchema+GraphQL.swift index 38cf7f44a2..9f39a859dd 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/ModelSchema+GraphQL.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/ModelSchema+GraphQL.swift @@ -49,7 +49,7 @@ extension ModelSchema { /// The list of fields formatted for GraphQL usage. var graphQLFields: [ModelField] { sortedFields.filter { field in - !field.hasAssociation || field.isAssociationOwner + !field.hasAssociation || field.isBelongsToOrHasOne } } } diff --git a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/SelectionSet.swift b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/SelectionSet.swift index 3afe5020b9..81e7a72fd0 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/SelectionSet.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/Model/Support/SelectionSet.swift @@ -34,18 +34,25 @@ extension SelectionSet { withModelFields(fields) } - func withModelFields(_ fields: [ModelField]) { + func withModelFields(_ fields: [ModelField], recursive: Bool = true) { fields.forEach { field in if field.isEmbeddedType, let embeddedTypeSchema = field.embeddedTypeSchema { let child = SelectionSet(value: .init(name: field.name, fieldType: .embedded)) child.withEmbeddableFields(embeddedTypeSchema.sortedFields) self.addChild(settingParentOf: child) - } else if field.isAssociationOwner, - let associatedModelName = field.associatedModelName, - let schema = ModelRegistry.modelSchema(from: associatedModelName) { - let child = SelectionSet(value: .init(name: field.name, fieldType: .model)) - child.withModelFields(schema.graphQLFields) - self.addChild(settingParentOf: child) + } else if field.isBelongsToOrHasOne, + let associatedModelName = field.associatedModelName, + let schema = ModelRegistry.modelSchema(from: associatedModelName) { + if recursive { + var recursive = recursive + if field.isBelongsToOrHasOne { + recursive = false + } + + let child = SelectionSet(value: .init(name: field.name, fieldType: .model)) + child.withModelFields(schema.graphQLFields, recursive: recursive) + self.addChild(settingParentOf: child) + } } else { self.addChild(settingParentOf: .init(value: .init(name: field.graphQLName, fieldType: .value))) } diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift index 089a6d1568..9d631dea72 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift @@ -90,6 +90,7 @@ extension Statement: StatementModelConvertible { let modelDictionary = ([:] as ModelValues).mutableCopy() var skipColumns = Set() var foreignKeyValues = [(String, Binding?)]() + print("============= lawmicha convert \(modelSchema.name)=======================") for (index, value) in row.enumerated() { let column = columnNames[index] guard let (schema, field) = columnMapping[column] else { @@ -102,7 +103,7 @@ extension Statement: StatementModelConvertible { from: value, fieldType: field.type ) - + print("lawmicha \(field.name) \(modelValue)") // Check if the value for the primary key is `nil`. This is when an associated model does not exist. // To create a decodable `modelDictionary` that can be decoded to the Model types, the entire // object at this particular key should be set to `nil`. The following code does that by dropping the last diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift index 5c7a47949c..aa59441cf5 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/AWSDataStoreLazyLoadPostComment4V2Tests.swift @@ -14,6 +14,12 @@ import AWSPluginsCore class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { + func testStart() async throws { + await setup(withModels: PostComment4V2Models(), eagerLoad: false, clearOnTearDown: false) + try await startAndWaitForReady() + printDBPath() + } + func testLazyLoad() async throws { await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) @@ -23,9 +29,9 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { let savedComment = try await saveAndWaitForSync(comment) try await assertComment(savedComment, hasEagerLoaded: savedPost) try await assertPost(savedPost, canLazyLoad: savedComment) - let queriedComment = try await queryComment(savedComment) + let queriedComment = try await query(for: savedComment) try await assertComment(queriedComment, canLazyLoad: savedPost) - let queriedPost = try await queryPost(savedPost) + let queriedPost = try await query(for: savedPost) try await assertPost(queriedPost, canLazyLoad: savedComment) } @@ -89,14 +95,14 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { await setup(withModels: PostComment4V2Models(), logLevel: .verbose, eagerLoad: false) let comment = Comment(content: "content") let savedComment = try await saveAndWaitForSync(comment) - var queriedComment = try await queryComment(savedComment) + var queriedComment = try await query(for: savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: nil)) let post = Post(title: "title") let savedPost = try await saveAndWaitForSync(post) queriedComment.setPost(savedPost) let saveCommentWithPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) - let queriedComment2 = try await queryComment(saveCommentWithPost) + let queriedComment2 = try await query(for: saveCommentWithPost) try await assertComment(queriedComment2, canLazyLoad: post) } @@ -106,11 +112,11 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { let comment = Comment(content: "content", post: post) let savedPost = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) - let queriedComment = try await queryComment(savedComment) + let queriedComment = try await query(for: savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: ["id": post.identifier])) let savedQueriedComment = try await saveAndWaitForSync(queriedComment, assertVersion: 2) - let queriedComment2 = try await queryComment(savedQueriedComment) + let queriedComment2 = try await query(for: savedQueriedComment) try await assertComment(queriedComment2, canLazyLoad: savedPost) } @@ -121,7 +127,7 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { let comment = Comment(content: "content", post: post) _ = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) - var queriedComment = try await queryComment(savedComment) + var queriedComment = try await query(for: savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: ["id": post.identifier])) @@ -129,7 +135,7 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { _ = try await saveAndWaitForSync(newPost) queriedComment.setPost(newPost) let saveCommentWithNewPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) - let queriedComment2 = try await queryComment(saveCommentWithNewPost) + let queriedComment2 = try await query(for: saveCommentWithNewPost) try await assertComment(queriedComment2, canLazyLoad: newPost) } @@ -140,13 +146,13 @@ class AWSDataStoreLazyLoadPostComment4V2Tests: AWSDataStoreLazyLoadBaseTest { let comment = Comment(content: "content", post: post) _ = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) - var queriedComment = try await queryComment(savedComment) + var queriedComment = try await query(for: savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: ["id": post.identifier])) queriedComment.setPost(nil) let saveCommentRemovePost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) - let queriedCommentNoPost = try await queryComment(saveCommentRemovePost) + let queriedCommentNoPost = try await query(for: saveCommentRemovePost) assertLazyModel(queriedCommentNoPost._post, state: .notLoaded(identifiers: nil)) } @@ -175,22 +181,4 @@ extension AWSDataStoreLazyLoadPostComment4V2Tests { ModelRegistry.register(modelType: Comment4V2.self) } } - - func queryComment(_ comment: Comment) async throws -> Comment { - guard let queriedComment = try await Amplify.DataStore.query(Comment.self, - byIdentifier: comment.id) else { - XCTFail("Failed to query comment") - throw "Failed to query comment" - } - return queriedComment - } - - func queryPost(_ post: Post) async throws -> Post { - guard let queriedPost = try await Amplify.DataStore.query(Post.self, - byIdentifier: post.id) else { - XCTFail("Failed to query post") - throw "Failed to query post" - } - return queriedPost - } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift index 76d19faf7e..74576248cd 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift @@ -23,10 +23,11 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa let savedComment = try await saveAndWaitForSync(comment) try await assertComment(savedComment, hasEagerLoaded: savedPost) try await assertPost(savedPost, canLazyLoad: savedComment) - let queriedComment = try await queryComment(savedComment) + let queriedComment = try await query(for: savedComment) try await assertComment(queriedComment, canLazyLoad: savedPost) - let queriedPost = try await queryPost(savedPost) + let queriedPost = try await query(for: savedPost) try await assertPost(queriedPost, canLazyLoad: savedComment) + printDBPath() } func assertComment(_ comment: Comment, @@ -86,14 +87,14 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa await setup(withModels: PostCommentWithCompositeKeyModels(), logLevel: .verbose, eagerLoad: false) let comment = Comment(content: "content") let savedComment = try await saveAndWaitForSync(comment) - var queriedComment = try await queryComment(savedComment) + var queriedComment = try await query(for: savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: nil)) let post = Post(title: "title") let savedPost = try await saveAndWaitForSync(post) queriedComment.setPost(savedPost) let saveCommentWithPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) - let queriedComment2 = try await queryComment(saveCommentWithPost) + let queriedComment2 = try await query(for: saveCommentWithPost) try await assertComment(queriedComment2, canLazyLoad: post) } @@ -103,11 +104,11 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa let comment = Comment(content: "content", post: post) let savedPost = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) - let queriedComment = try await queryComment(savedComment) + let queriedComment = try await query(for: savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) let savedQueriedComment = try await saveAndWaitForSync(queriedComment, assertVersion: 2) - let queriedComment2 = try await queryComment(savedQueriedComment) + let queriedComment2 = try await query(for: savedQueriedComment) try await assertComment(queriedComment2, canLazyLoad: savedPost) } @@ -118,7 +119,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa let comment = Comment(content: "content", post: post) _ = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) - var queriedComment = try await queryComment(savedComment) + var queriedComment = try await query(for: savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) @@ -126,7 +127,7 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa _ = try await saveAndWaitForSync(newPost) queriedComment.setPost(newPost) let saveCommentWithNewPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) - let queriedComment2 = try await queryComment(saveCommentWithNewPost) + let queriedComment2 = try await query(for: saveCommentWithNewPost) try await assertComment(queriedComment2, canLazyLoad: newPost) } @@ -137,13 +138,13 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa let comment = Comment(content: "content", post: post) _ = try await saveAndWaitForSync(post) let savedComment = try await saveAndWaitForSync(comment) - var queriedComment = try await queryComment(savedComment) + var queriedComment = try await query(for: savedComment) assertLazyModel(queriedComment._post, state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) queriedComment.setPost(nil) let saveCommentRemovePost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) - let queriedCommentNoPost = try await queryComment(saveCommentRemovePost) + let queriedCommentNoPost = try await query(for: saveCommentRemovePost) assertLazyModel(queriedCommentNoPost._post, state: .notLoaded(identifiers: nil)) } @@ -172,26 +173,4 @@ extension AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests { ModelRegistry.register(modelType: CommentWithCompositeKey.self) } } - - func queryComment(_ comment: Comment) async throws -> Comment { - guard let queriedComment = try await Amplify.DataStore.query(Comment.self, - byIdentifier: .identifier( - id: comment.id, - content: comment.content)) else { - XCTFail("Failed to query comment") - throw "Failed to query comment" - } - return queriedComment - } - - func queryPost(_ post: Post) async throws -> Post { - guard let queriedPost = try await Amplify.DataStore.query(Post.self, - byIdentifier: .identifier( - id: post.id, - title: post.title)) else { - XCTFail("Failed to query post") - throw "Failed to query post" - } - return queriedPost - } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift index f1e3aeeafd..86f3e7dd0e 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL4/AWSDataStoreLazyLoadPostTagTests.swift @@ -27,11 +27,11 @@ final class AWSDataStoreLazyLoadPostTagTests: AWSDataStoreLazyLoadBaseTest { try await assertTag(savedTag, canLazyLoad: savedPostTag) assertLazyModel(savedPostTag._postWithTagsCompositeKey, state: .loaded(model: savedPost)) assertLazyModel(savedPostTag._tagWithCompositeKey, state: .loaded(model: savedTag)) - let queriedPost = try await queryPost(savedPost) + let queriedPost = try await query(for: savedPost) try await assertPost(queriedPost, canLazyLoad: savedPostTag) - let queriedTag = try await queryTag(savedTag) + let queriedTag = try await query(for: savedTag) try await assertTag(queriedTag, canLazyLoad: savedPostTag) - let queriedPostTag = try await queryPostTag(savedPostTag) + let queriedPostTag = try await query(for: savedPostTag) try await assertPostTag(queriedPostTag, canLazyLoadTag: savedTag, canLazyLoadPost: savedPost) } @@ -80,23 +80,23 @@ final class AWSDataStoreLazyLoadPostTagTests: AWSDataStoreLazyLoadBaseTest { let savedPostTag = try await saveAndWaitForSync(postTag) // update the post tag with a new post - var queriedPostTag = try await queryPostTag(savedPostTag) + var queriedPostTag = try await query(for: savedPostTag) let newPost = Post(postId: UUID().uuidString, title: "title") _ = try await saveAndWaitForSync(newPost) queriedPostTag.setPostWithTagsCompositeKey(newPost) let savedPostTagWithNewPost = try await saveAndWaitForSync(queriedPostTag, assertVersion: 2) assertLazyModel(savedPostTagWithNewPost._postWithTagsCompositeKey, state: .loaded(model: newPost)) - let queriedPreviousPost = try await queryPost(savedPost) + let queriedPreviousPost = try await query(for: savedPost) try await assertPostWithNoPostTag(queriedPreviousPost) // update the post tag with a new tag - var queriedPostTagWithNewPost = try await queryPostTag(savedPostTagWithNewPost) + var queriedPostTagWithNewPost = try await query(for: savedPostTagWithNewPost) let newTag = Tag(name: "name") _ = try await saveAndWaitForSync(newTag) queriedPostTagWithNewPost.setTagWithCompositeKey(newTag) let savedPostTagWithNewTag = try await saveAndWaitForSync(queriedPostTagWithNewPost, assertVersion: 3) assertLazyModel(savedPostTagWithNewTag._tagWithCompositeKey, state: .loaded(model: newTag)) - let queriedPreviousTag = try await queryTag(savedTag) + let queriedPreviousTag = try await query(for: savedTag) try await assertTagWithNoPostTag(queriedPreviousTag) } @@ -183,36 +183,4 @@ extension AWSDataStoreLazyLoadPostTagTests { ModelRegistry.register(modelType: TagWithCompositeKey.self) } } - - func queryPost(_ post: Post) async throws -> Post { - guard let queriedPost = try await Amplify.DataStore.query(Post.self, - byIdentifier: .identifier( - postId: post.postId, - title: post.title)) else { - XCTFail("Failed to query post") - throw "Failed to query post" - } - return queriedPost - } - - func queryTag(_ tag: Tag) async throws -> Tag { - guard let queriedTag = try await Amplify.DataStore.query(Tag.self, - byIdentifier: .identifier( - id: tag.id, - name: tag.name)) else { - XCTFail("Failed to query tag") - throw "Failed to query tag" - } - return queriedTag - } - - func queryPostTag(_ postTag: PostTag) async throws -> PostTag { - guard let queriedPostTag = try await Amplify.DataStore.query(PostTag.self, - byIdentifier: postTag.id) else { - XCTFail("Failed to query postTag") - throw "Failed to query postTag" - } - return queriedPostTag - } - } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift index f551051fea..a4d1f32a61 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift @@ -10,25 +10,103 @@ import Combine import XCTest @testable import Amplify -import AWSPluginsCore +@testable import AWSPluginsCore class AWSDataStoreLazyLoadProjectTeam1Tests: AWSDataStoreLazyLoadBaseTest { + func testAPISyncQuery() async throws { + await setupAPIOnly(withModels: ProjectTeam1Models()) + + // The selection set of project should include "hasOne" team, and no further + let projectRequest = GraphQLRequest.syncQuery(modelType: Project.self) + let projectDocument = """ + query SyncProject1s($limit: Int) { + syncProject1s(limit: $limit) { + items { + projectId + name + createdAt + project1TeamName + project1TeamTeamId + updatedAt + team { + teamId + name + createdAt + updatedAt + __typename + _version + _deleted + _lastChangedAt + } + __typename + _version + _deleted + _lastChangedAt + } + nextToken + startedAt + } + } + """ + XCTAssertEqual(projectRequest.document, projectDocument) + + // The selection set of team should include "belongsTo" project, and no further. + let teamRequest = GraphQLRequest.syncQuery(modelType: Team.self) + let teamDocument = """ + query SyncTeam1s($limit: Int) { + syncTeam1s(limit: $limit) { + items { + teamId + name + createdAt + updatedAt + project { + projectId + name + createdAt + project1TeamName + project1TeamTeamId + updatedAt + __typename + _version + _deleted + _lastChangedAt + } + __typename + _version + _deleted + _lastChangedAt + } + nextToken + startedAt + } + } + """ + XCTAssertEqual(teamRequest.document, teamDocument) + // Making the actual requests and ensuring they can decode to the Model types. + _ = try await Amplify.API.query(request: projectRequest) + _ = try await Amplify.API.query(request: teamRequest) + } + func testSaveTeam() async throws { await setup(withModels: ProjectTeam1Models(), eagerLoad: false) let team = Team1(teamId: UUID().uuidString, name: "name") - let savedTeam = try await saveAndWaitForSync(team) - let project = Project1(projectId: UUID().uuidString, name: "name", team: team, project1TeamTeamId: team.teamId, project1TeamName: team.name) + + let savedTeam = try await saveAndWaitForSync(team) let savedProject = try await saveAndWaitForSync(project) } } extension AWSDataStoreLazyLoadProjectTeam1Tests { + typealias Project = Project1 + typealias Team = Team1 + struct ProjectTeam1Models: AmplifyModelRegistration { public let version: String = "version" func registerModels(registry: ModelRegistry.Type) { diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Project1.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Project1.swift index 9187833c85..a80cbb1437 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Project1.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Project1.swift @@ -45,7 +45,7 @@ public struct Project1: Model { self.project1TeamName = project1TeamName } - public mutating func setTeam(_ team: Team1) { + public mutating func setTeam(_ team: Team1?) { self._team = LazyModel(element: team) } @@ -53,7 +53,11 @@ public struct Project1: Model { let values = try decoder.container(keyedBy: CodingKeys.self) projectId = try values.decode(String.self, forKey: .projectId) name = try values.decode(String.self, forKey: .name) - _team = try values.decode(LazyModel.self, forKey: .team) + do { + _team = try values.decode(LazyModel.self, forKey: .team) + } catch { + _team = LazyModel(identifiers: nil) + } createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) project1TeamTeamId = try values.decode(String?.self, forKey: .project1TeamTeamId) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift index 2b8ba89ea6..2ff1fc475e 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift @@ -39,7 +39,11 @@ public struct Team1: Model { let values = try decoder.container(keyedBy: CodingKeys.self) teamId = try values.decode(String.self, forKey: .teamId) name = try values.decode(String.self, forKey: .name) - _project = try values.decode(LazyModel.self, forKey: .project) + do { + _project = try values.decode(LazyModel.self, forKey: .project) + } catch { + _project = LazyModel(identifiers: nil) + } createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift new file mode 100644 index 0000000000..8d14b39a60 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift @@ -0,0 +1,233 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify +import AWSPluginsCore + +class AWSDataStoreLazyLoadProjectTeam2Tests: AWSDataStoreLazyLoadBaseTest { + + func testStart() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false, clearOnTearDown: false) + try await startAndWaitForReady() + printDBPath() + } + + func testAPISyncQuery() async throws { + await setupAPIOnly(withModels: ProjectTeam2Models()) + + // The selection set of project should include "hasOne" team, and no further + let projectRequest = GraphQLRequest.syncQuery(modelType: Project.self) + let projectDocument = """ + query SyncProject2s($limit: Int) { + syncProject2s(limit: $limit) { + items { + projectId + name + createdAt + project2TeamName + project2TeamTeamId + updatedAt + team { + teamId + name + createdAt + updatedAt + __typename + _version + _deleted + _lastChangedAt + } + __typename + _version + _deleted + _lastChangedAt + } + nextToken + startedAt + } + } + """ + XCTAssertEqual(projectRequest.document, projectDocument) + + // In this "Implicit Uni-directional Has One", only project hasOne team, team does not reference the project + // So, the selection set of team does not include project + let teamRequest = GraphQLRequest.syncQuery(modelType: Team.self) + let teamDocument = """ + query SyncTeam2s($limit: Int) { + syncTeam2s(limit: $limit) { + items { + teamId + name + createdAt + updatedAt + __typename + _version + _deleted + _lastChangedAt + } + nextToken + startedAt + } + } + """ + XCTAssertEqual(teamRequest.document, teamDocument) + // Making the actual requests and ensuring they can decode to the Model types. + _ = try await Amplify.API.query(request: projectRequest) + _ = try await Amplify.API.query(request: teamRequest) + } + + func testSaveTeam() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + try await assertModelExists(savedTeam) + } + + func testSaveProject() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + + let project = Project(projectId: UUID().uuidString, + name: "name") + let savedProject = try await saveAndWaitForSync(project) + try await assertModelExists(savedProject) + assertLazyModel(savedProject._team, state: .notLoaded(identifiers: nil)) + } + + func testSaveProjectWithTeam() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + +// let project = Project(projectId: UUID().uuidString, +// name: "name", +// team: team, +// project2TeamTeamId: team.teamId, +// project2TeamName: team.name) + let project = Project(projectId: UUID().uuidString, + name: "name", + team: team) + let savedProject = try await saveAndWaitForSync(project) + switch savedProject._team.modelProvider.getState() { + case .notLoaded: + print("Not LOADED - should be loaded") + case .loaded: + print("LOADED") + } + printDBPath() + // try await assertProject(savedProject, hasEagerLoaded: savedTeam) + +// let queriedProject = try await query(for: savedProject) +// switch queriedProject._team.modelProvider.getState() { +// case .notLoaded: +// print("Not LOADED") +// case .loaded: +// print("LOADED") +// } + + // TODO: why is this eager loaded? + //try await assertProject(queriedProject, hasEagerLoaded: savedTeam) + //try await assertProject(queriedProject, canLazyLoad: savedTeam) + } + + func assertProject(_ project: Project, hasEagerLoaded team: Team) async throws { + assertLazyModel(project._team, + state: .loaded(model: team)) + } + + func assertProject(_ project: Project, canLazyLoad team: Team) async throws { + assertLazyModel(project._team, + state: .notLoaded(identifiers: ["@@primaryKey": team.identifier])) +// guard let loadedTeam = try await project.team else { +// XCTFail("Failed to load the team from the project") +// return +// } +// XCTAssertEqual(loadedTeam.identifier, team.identifier) +// assertLazyModel(project._team, +// state: .loaded(model: team)) + } + + func testSaveProjectWithTeamThenUpdate() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + + let project = Project(projectId: UUID().uuidString, + name: "name", + team: team) + let savedProject = try await saveAndWaitForSync(project) + let queriedProject = try await query(for: savedProject) + let updatedProject = try await saveAndWaitForSync(project, assertVersion: 2) + // TODO: why is this eager loaded? + try await assertProject(queriedProject, hasEagerLoaded: savedTeam) + //try await assertProject(queriedProject, canLazyLoad: savedTeam) + } + + func testSaveProjectWithoutTeamUpdateProjectWithTeam() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, name: "name") + let savedProject = try await saveAndWaitForSync(project) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + var queriedProject = try await query(for: savedProject) + queriedProject.setTeam(team) + let savedProjectWithNewTeam = try await saveAndWaitForSync(project, assertVersion: 2) + + // TODO: why is this eager loaded? + try await assertProject(queriedProject, hasEagerLoaded: savedTeam) + //try await assertProject(queriedProject, canLazyLoad: savedTeam) + } + + func testSaveTeamSaveProjectWithTeamUpdateProjectToNoTeam() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = Project(projectId: UUID().uuidString, + name: "name", + team: team) + let savedProject = try await saveAndWaitForSync(project) + var queriedProject = try await query(for: savedProject) + queriedProject.setTeam(nil) + let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertLazyModel(project._team, state: .notLoaded(identifiers: nil)) + } + + func testSaveProjectWithTeamUpdateProjectToNewTeam() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = Project(projectId: UUID().uuidString, + name: "name", + team: team) + let savedProject = try await saveAndWaitForSync(project) + let newTeam = Team(teamId: UUID().uuidString, name: "name") + let savedNewTeam = try await saveAndWaitForSync(newTeam) + var queriedProject = try await query(for: savedProject) + queriedProject.setTeam(newTeam) + let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertLazyModel(project._team, state: .notLoaded(identifiers: nil)) + } + + +} + +extension AWSDataStoreLazyLoadProjectTeam2Tests { + + typealias Project = Project2 + typealias Team = Team2 + + struct ProjectTeam2Models: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Project2.self) + ModelRegistry.register(modelType: Team2.self) + } + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift index 2ca9794b8d..4e3a8000b5 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift @@ -2,20 +2,67 @@ import Amplify import Foundation +//extension Project2 { +// // MARK: - CodingKeys +// public enum CodingKeys: String, ModelKey { +// case projectId +// case name +// case team +// case createdAt +// case updatedAt +// case project2TeamTeamId +// case project2TeamName +// } +// +// public static let keys = CodingKeys.self +// // MARK: - ModelSchema +// +// public static let schema = defineSchema { model in +// let project2 = Project2.keys +// +// model.pluralName = "Project2s" +// +// model.attributes( +// .index(fields: ["projectId", "name"], name: nil), +// .primaryKey(fields: [project2.projectId, project2.name]) +// ) +// +// model.fields( +// .field(project2.projectId, is: .required, ofType: .string), +// .field(project2.name, is: .required, ofType: .string), +// .hasOne(project2.team, is: .optional, ofType: Team2.self, associatedWith: Team2.keys.teamId, targetNames: ["project2TeamTeamId", "project2TeamName"]), +// .field(project2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), +// .field(project2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime), +// .field(project2.project2TeamTeamId, is: .optional, ofType: .string), +// .field(project2.project2TeamName, is: .optional, ofType: .string) +// ) +// } +//} +// +//extension Project2: ModelIdentifiable { +// public typealias IdentifierFormat = ModelIdentifierFormat.Custom +// public typealias IdentifierProtocol = ModelIdentifier +//} +// +//extension Project2.IdentifierProtocol { +// public static func identifier(projectId: String, +// name: String) -> Self { +// .make(fields:[(name: "projectId", value: projectId), (name: "name", value: name)]) +// } +//} + extension Project2 { - // MARK: - CodingKeys + // MARK: - CodingKeys public enum CodingKeys: String, ModelKey { case projectId case name case team case createdAt case updatedAt - case project2TeamTeamId - case project2TeamName } public static let keys = CodingKeys.self - // MARK: - ModelSchema + // MARK: - ModelSchema public static let schema = defineSchema { model in let project2 = Project2.keys @@ -32,9 +79,7 @@ extension Project2 { .field(project2.name, is: .required, ofType: .string), .hasOne(project2.team, is: .optional, ofType: Team2.self, associatedWith: Team2.keys.teamId, targetNames: ["project2TeamTeamId", "project2TeamName"]), .field(project2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), - .field(project2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime), - .field(project2.project2TeamTeamId, is: .optional, ofType: .string), - .field(project2.project2TeamName, is: .optional, ofType: .string) + .field(project2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) ) } } @@ -49,4 +94,4 @@ extension Project2.IdentifierProtocol { name: String) -> Self { .make(fields:[(name: "projectId", value: projectId), (name: "name", value: name)]) } -} \ No newline at end of file +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift index 29e0c614bb..e5b9ac804b 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift @@ -2,41 +2,138 @@ import Amplify import Foundation +//public struct Project2: Model { +// public let projectId: String +// public let name: String +// internal var _team: LazyModel +// public var team: Team2? { +// get async throws { +// try await _team.get() +// } +// } +// public var createdAt: Temporal.DateTime? +// public var updatedAt: Temporal.DateTime? +// public var project2TeamTeamId: String? +// public var project2TeamName: String? +// +// public init(projectId: String, +// name: String, +// team: Team2? = nil, +// project2TeamTeamId: String? = nil, +// project2TeamName: String? = nil) { +// self.init(projectId: projectId, +// name: name, +// team: team, +// createdAt: nil, +// updatedAt: nil, +// project2TeamTeamId: project2TeamTeamId, +// project2TeamName: project2TeamName) +// } +// internal init(projectId: String, +// name: String, +// team: Team2? = nil, +// createdAt: Temporal.DateTime? = nil, +// updatedAt: Temporal.DateTime? = nil, +// project2TeamTeamId: String? = nil, +// project2TeamName: String? = nil) { +// self.projectId = projectId +// self.name = name +// self._team = LazyModel(element: team) +// self.createdAt = createdAt +// self.updatedAt = updatedAt +// self.project2TeamTeamId = project2TeamTeamId +// self.project2TeamName = project2TeamName +// } +// +// public mutating func setTeam(_ team: Team2?) { +// self._team = LazyModel(element: team) +// } +// +// public init(from decoder: Decoder) throws { +// let values = try decoder.container(keyedBy: CodingKeys.self) +// projectId = try values.decode(String.self, forKey: .projectId) +// name = try values.decode(String.self, forKey: .name) +// do { +// _team = try values.decode(LazyModel.self, forKey: .team) +// } catch { +// _team = LazyModel(identifiers: nil) +// } +// +// createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) +// updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) +// project2TeamTeamId = try values.decode(String?.self, forKey: .project2TeamTeamId) +// project2TeamName = try values.decode(String?.self, forKey: .project2TeamName) +// } +// +// public func encode(to encoder: Encoder) throws { +// var container = encoder.container(keyedBy: CodingKeys.self) +// try container.encode(projectId, forKey: .projectId) +// try container.encode(name, forKey: .name) +// try container.encode(_team, forKey: .team) +// try container.encode(createdAt, forKey: .createdAt) +// try container.encode(updatedAt, forKey: .updatedAt) +// try container.encode(project2TeamTeamId, forKey: .project2TeamTeamId) +// try container.encode(project2TeamName, forKey: .project2TeamName) +// } +//} + public struct Project2: Model { - public let projectId: String - public let name: String - public var team: Team2? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - public var project2TeamTeamId: String? - public var project2TeamName: String? - - public init(projectId: String, - name: String, - team: Team2? = nil, - project2TeamTeamId: String? = nil, - project2TeamName: String? = nil) { - self.init(projectId: projectId, - name: name, - team: team, - createdAt: nil, - updatedAt: nil, - project2TeamTeamId: project2TeamTeamId, - project2TeamName: project2TeamName) - } - internal init(projectId: String, - name: String, - team: Team2? = nil, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil, - project2TeamTeamId: String? = nil, - project2TeamName: String? = nil) { - self.projectId = projectId - self.name = name - self.team = team - self.createdAt = createdAt - self.updatedAt = updatedAt - self.project2TeamTeamId = project2TeamTeamId - self.project2TeamName = project2TeamName - } -} \ No newline at end of file + public let projectId: String + public let name: String + internal var _team: LazyModel + public var team: Team2? { + get async throws { + try await _team.get() + } + } + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(projectId: String, + name: String, + team: Team2? = nil) { + self.init(projectId: projectId, + name: name, + team: team, + createdAt: nil, + updatedAt: nil) + } + internal init(projectId: String, + name: String, + team: Team2? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.projectId = projectId + self.name = name + self._team = LazyModel(element: team) + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public mutating func setTeam(_ team: Team2?) { + self._team = LazyModel(element: team) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + projectId = try values.decode(String.self, forKey: .projectId) + name = try values.decode(String.self, forKey: .name) + do { + _team = try values.decode(LazyModel.self, forKey: .team) + } catch { + _team = LazyModel(identifiers: nil) + } + + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(projectId, forKey: .projectId) + try container.encode(name, forKey: .name) + try container.encode(_team, forKey: .team) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift index 215547c556..828500a2c2 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift @@ -8,7 +8,7 @@ import Foundation import XCTest import Combine -import AWSDataStorePlugin +@testable import AWSDataStorePlugin import AWSPluginsCore import AWSAPIPlugin @@ -19,12 +19,18 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { var amplifyConfig: AmplifyConfiguration! + var apiOnly: Bool = false + var clearOnTearDown: Bool = false + override func setUp() { continueAfterFailure = false } override func tearDown() async throws { - try await clearDataStore() + if !apiOnly && clearOnTearDown { + try await clearDataStore() + } + requests = [] await Amplify.reset() } @@ -53,7 +59,9 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { /// - Parameter models: DataStore models func setup(withModels models: AmplifyModelRegistration, logLevel: LogLevel = .verbose, - eagerLoad: Bool = true) async { + eagerLoad: Bool = true, + clearOnTearDown: Bool = true) async { + self.clearOnTearDown = clearOnTearDown do { setupConfig() Amplify.Logging.logLevel = logLevel @@ -69,10 +77,49 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { } } + func setupAPIOnly(withModels models: AmplifyModelRegistration, logLevel: LogLevel = .verbose) async { + apiOnly = true + do { + setupConfig() + Amplify.Logging.logLevel = logLevel + try Amplify.add(plugin: AWSAPIPlugin(modelRegistration: models)) + try Amplify.configure(amplifyConfig) + } catch { + XCTFail("Error during setup: \(error)") + } + } + func clearDataStore() async throws { try await Amplify.DataStore.clear() } + func startAndWaitForReady() async throws { + let dataStoreReady = asyncExpectation(description: "DataStore `ready` event received") + let dataStoreEvents = HubPayload.EventName.DataStore.self + Amplify + .Hub + .publisher(for: .dataStore) + .sink { event in + if event.eventName == dataStoreEvents.ready { + Task { + await dataStoreReady.fulfill() + } + } + } + .store(in: &requests) + try await startDataStore() + await waitForExpectations([dataStoreReady], timeout: 60) + } + + func startDataStore() async throws { + try await Amplify.DataStore.start() + } + + func printDBPath() { + let dbPath = DataStoreDebugger.dbFilePath + print("DBPath: \(dbPath)") + } + func saveAndWaitForSync(_ model: M, assertVersion: Int = 1) async throws -> M { let modelSynced = asyncExpectation(description: "model was synced successfully") let mutationEvents = Amplify.DataStore.observe(M.self) @@ -82,7 +129,6 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { await modelSynced.fulfill() } } - } let savedModel = try await Amplify.DataStore.save(model) await waitForExpectations([modelSynced], timeout: 10) @@ -185,4 +231,45 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { return !(metadata.deleted && queriedModels.isEmpty) } + + func query(for model: M) async throws -> M { + let identifierName = model.schema.primaryKey.sqlName + let queryPredicate: QueryPredicate = field(identifierName).eq(model.identifier) + + let queriedModels = try await Amplify.DataStore.query(M.self, + where: queryPredicate) + if queriedModels.count > 1 { + XCTFail("Expected to find one model, found \(queriedModels.count). \(queriedModels)") + throw "Expected to find one model, found \(queriedModels.count). \(queriedModels)" + } + if let queriedModel = queriedModels.first { + return queriedModel + } else { + throw "Expected to find one model, found none" + } + } +} + +struct DataStoreDebugger { + + static var dbFilePath: URL? { getAdapter()?.dbFilePath } + + static func getAdapter() -> SQLiteStorageEngineAdapter? { + if let dataStorePlugin = tryGetPlugin(), + let storageEngine = dataStorePlugin.storageEngine as? StorageEngine, + let adapter = storageEngine.storageAdapter as? SQLiteStorageEngineAdapter { + return adapter + } + + print("Could not get `SQLiteStorageEngineAdapter` from DataStore") + return nil + } + + static func tryGetPlugin() -> AWSDataStorePlugin? { + do { + return try Amplify.DataStore.getPlugin(for: "awsDataStorePlugin") as? AWSDataStorePlugin + } catch { + return nil + } + } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index dd3cf01391..2a3c26959e 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -233,6 +233,7 @@ 21801D6D29097D5800FFA37E /* ImplicitChild+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5B29097D5700FFA37E /* ImplicitChild+Schema.swift */; }; 21801D6E29097D5800FFA37E /* HasOneChild.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5C29097D5700FFA37E /* HasOneChild.swift */; }; 21801D6F29097D5800FFA37E /* ChildSansBelongsTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D5D29097D5700FFA37E /* ChildSansBelongsTo.swift */; }; + 21801D7129097E9400FFA37E /* AWSDataStoreLazyLoadProjectTeam2Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801D7029097E9200FFA37E /* AWSDataStoreLazyLoadProjectTeam2Tests.swift */; }; 219253BE28BFE84100820737 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 219253BD28BFE84000820737 /* XCTest.framework */; }; 21977DBF289C171A005B49D6 /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21977DBE289C1719005B49D6 /* TestConfigHelper.swift */; }; 219B518528E3A4B00080EDCC /* DataStoreConnectionOptionalAssociations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA00289BFE3400B32A39 /* DataStoreConnectionOptionalAssociations.swift */; }; @@ -811,6 +812,7 @@ 21801D5B29097D5700FFA37E /* ImplicitChild+Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ImplicitChild+Schema.swift"; sourceTree = ""; }; 21801D5C29097D5700FFA37E /* HasOneChild.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HasOneChild.swift; sourceTree = ""; }; 21801D5D29097D5700FFA37E /* ChildSansBelongsTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChildSansBelongsTo.swift; sourceTree = ""; }; + 21801D7029097E9200FFA37E /* AWSDataStoreLazyLoadProjectTeam2Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadProjectTeam2Tests.swift; sourceTree = ""; }; 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 = ""; }; @@ -1550,6 +1552,7 @@ 21801D432902E0D400FFA37E /* LL6 */ = { isa = PBXGroup; children = ( + 21801D7029097E9200FFA37E /* AWSDataStoreLazyLoadProjectTeam2Tests.swift */, 21801CB628F9A86700FFA37E /* Project2.swift */, 21801CC028F9A86700FFA37E /* Project2+Schema.swift */, 21801CCE28F9A86800FFA37E /* Team2.swift */, @@ -3296,6 +3299,7 @@ 21801D6829097D5800FFA37E /* DefaultPKChild.swift in Sources */, 21801CDA28F9A86800FFA37E /* PostWithTagsCompositeKey.swift in Sources */, 21801D0928F9B11E00FFA37E /* XCTestCase+AsyncTesting.swift in Sources */, + 21801D7129097E9400FFA37E /* AWSDataStoreLazyLoadProjectTeam2Tests.swift in Sources */, 21801CF428F9A86800FFA37E /* Post7.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From 5c0a13588a94be45f152c0a2608906e2bf3ff1fc Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 26 Oct 2022 15:26:10 -0400 Subject: [PATCH 14/18] finish off project2 tests --- ...WSDataStoreLazyLoadProjectTeam2Tests.swift | 155 +++++++++++------- .../LL6/Project2+Schema.swift | 65 ++------ .../LL6/Project2.swift | 97 ++--------- 3 files changed, 126 insertions(+), 191 deletions(-) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift index 8d14b39a60..1a488ea965 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift @@ -93,65 +93,57 @@ class AWSDataStoreLazyLoadProjectTeam2Tests: AWSDataStoreLazyLoadBaseTest { func testSaveProject() async throws { await setup(withModels: ProjectTeam2Models(), eagerLoad: false) - let project = Project(projectId: UUID().uuidString, name: "name") let savedProject = try await saveAndWaitForSync(project) try await assertModelExists(savedProject) - assertLazyModel(savedProject._team, state: .notLoaded(identifiers: nil)) + assertProjectDoesNotContainTeam(savedProject) } func testSaveProjectWithTeam() async throws { await setup(withModels: ProjectTeam2Models(), eagerLoad: false) let team = Team(teamId: UUID().uuidString, name: "name") let savedTeam = try await saveAndWaitForSync(team) - -// let project = Project(projectId: UUID().uuidString, -// name: "name", -// team: team, -// project2TeamTeamId: team.teamId, -// project2TeamName: team.name) + + // Project initializer variation #1 (pass both team reference and fields in) let project = Project(projectId: UUID().uuidString, name: "name", - team: team) + team: team, + project2TeamTeamId: team.teamId, + project2TeamName: team.name) let savedProject = try await saveAndWaitForSync(project) - switch savedProject._team.modelProvider.getState() { - case .notLoaded: - print("Not LOADED - should be loaded") - case .loaded: - print("LOADED") - } - printDBPath() - // try await assertProject(savedProject, hasEagerLoaded: savedTeam) + let queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) -// let queriedProject = try await query(for: savedProject) -// switch queriedProject._team.modelProvider.getState() { -// case .notLoaded: -// print("Not LOADED") -// case .loaded: -// print("LOADED") -// } + // Project initializer variation #2 (pass only team reference) + let project2 = Project(projectId: UUID().uuidString, + name: "name", + team: team) + let savedProject2 = try await saveAndWaitForSync(project2) + let queriedProject2 = try await query(for: savedProject2) + assertProjectDoesNotContainTeam(queriedProject2) - // TODO: why is this eager loaded? - //try await assertProject(queriedProject, hasEagerLoaded: savedTeam) - //try await assertProject(queriedProject, canLazyLoad: savedTeam) + // Project initializer variation #3 (pass fields in) + let project3 = Project(projectId: UUID().uuidString, + name: "name", + project2TeamTeamId: team.teamId, + project2TeamName: team.name) + let savedProject3 = try await saveAndWaitForSync(project3) + let queriedProject3 = try await query(for: savedProject3) + assertProject(queriedProject3, hasTeam: savedTeam) } - func assertProject(_ project: Project, hasEagerLoaded team: Team) async throws { - assertLazyModel(project._team, - state: .loaded(model: team)) + // One-to-One relationships do not create a foreign key for the Team or Project table + // So the LazyModel does not have the FK value to be instantiated as metadata for lazy loading. + // We only assert the FK fields on the Project exist and are equal to the Team's PK. + func assertProject(_ project: Project, hasTeam team: Team) { + XCTAssertEqual(project.project2TeamTeamId, team.teamId) + XCTAssertEqual(project.project2TeamName, team.name) } - func assertProject(_ project: Project, canLazyLoad team: Team) async throws { - assertLazyModel(project._team, - state: .notLoaded(identifiers: ["@@primaryKey": team.identifier])) -// guard let loadedTeam = try await project.team else { -// XCTFail("Failed to load the team from the project") -// return -// } -// XCTAssertEqual(loadedTeam.identifier, team.identifier) -// assertLazyModel(project._team, -// state: .loaded(model: team)) + func assertProjectDoesNotContainTeam(_ project: Project) { + XCTAssertNil(project.project2TeamTeamId) + XCTAssertNil(project.project2TeamName) } func testSaveProjectWithTeamThenUpdate() async throws { @@ -161,28 +153,30 @@ class AWSDataStoreLazyLoadProjectTeam2Tests: AWSDataStoreLazyLoadBaseTest { let project = Project(projectId: UUID().uuidString, name: "name", - team: team) + team: team, + project2TeamTeamId: team.teamId, + project2TeamName: team.name) let savedProject = try await saveAndWaitForSync(project) + assertProject(savedProject, hasTeam: savedTeam) let queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) let updatedProject = try await saveAndWaitForSync(project, assertVersion: 2) - // TODO: why is this eager loaded? - try await assertProject(queriedProject, hasEagerLoaded: savedTeam) - //try await assertProject(queriedProject, canLazyLoad: savedTeam) + assertProject(updatedProject, hasTeam: savedTeam) } func testSaveProjectWithoutTeamUpdateProjectWithTeam() async throws { await setup(withModels: ProjectTeam2Models(), eagerLoad: false) let project = Project(projectId: UUID().uuidString, name: "name") let savedProject = try await saveAndWaitForSync(project) + assertProjectDoesNotContainTeam(savedProject) + let team = Team(teamId: UUID().uuidString, name: "name") let savedTeam = try await saveAndWaitForSync(team) var queriedProject = try await query(for: savedProject) - queriedProject.setTeam(team) - let savedProjectWithNewTeam = try await saveAndWaitForSync(project, assertVersion: 2) - - // TODO: why is this eager loaded? - try await assertProject(queriedProject, hasEagerLoaded: savedTeam) - //try await assertProject(queriedProject, canLazyLoad: savedTeam) + queriedProject.project2TeamTeamId = team.teamId + queriedProject.project2TeamName = team.name + let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProject(savedProjectWithNewTeam, hasTeam: savedTeam) } func testSaveTeamSaveProjectWithTeamUpdateProjectToNoTeam() async throws { @@ -191,12 +185,16 @@ class AWSDataStoreLazyLoadProjectTeam2Tests: AWSDataStoreLazyLoadBaseTest { let savedTeam = try await saveAndWaitForSync(team) let project = Project(projectId: UUID().uuidString, name: "name", - team: team) + team: team, + project2TeamTeamId: team.teamId, + project2TeamName: team.name) let savedProject = try await saveAndWaitForSync(project) var queriedProject = try await query(for: savedProject) - queriedProject.setTeam(nil) - let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) - assertLazyModel(project._team, state: .notLoaded(identifiers: nil)) + assertProject(queriedProject, hasTeam: savedTeam) + queriedProject.project2TeamTeamId = nil + queriedProject.project2TeamName = nil + let savedProjectWithNoTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProjectDoesNotContainTeam(savedProjectWithNoTeam) } func testSaveProjectWithTeamUpdateProjectToNewTeam() async throws { @@ -205,17 +203,60 @@ class AWSDataStoreLazyLoadProjectTeam2Tests: AWSDataStoreLazyLoadBaseTest { let savedTeam = try await saveAndWaitForSync(team) let project = Project(projectId: UUID().uuidString, name: "name", - team: team) + team: team, + project2TeamTeamId: team.teamId, + project2TeamName: team.name) let savedProject = try await saveAndWaitForSync(project) let newTeam = Team(teamId: UUID().uuidString, name: "name") let savedNewTeam = try await saveAndWaitForSync(newTeam) var queriedProject = try await query(for: savedProject) - queriedProject.setTeam(newTeam) + assertProject(queriedProject, hasTeam: savedTeam) + queriedProject.project2TeamTeamId = newTeam.teamId + queriedProject.project2TeamName = newTeam.name let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) - assertLazyModel(project._team, state: .notLoaded(identifiers: nil)) + assertProject(queriedProject, hasTeam: savedNewTeam) } + func testDeleteTeam() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + try await assertModelExists(savedTeam) + try await deleteAndWaitForSync(savedTeam) + try await assertModelDoesNotExist(savedTeam) + } + func testDeleteProject() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, name: "name") + let savedProject = try await saveAndWaitForSync(project) + try await assertModelExists(savedProject) + try await deleteAndWaitForSync(savedProject) + try await assertModelDoesNotExist(savedProject) + } + + func testDeleteProjectWithTeam() async throws { + await setup(withModels: ProjectTeam2Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = Project(projectId: UUID().uuidString, + name: "name", + team: team, + project2TeamTeamId: team.teamId, + project2TeamName: team.name) + let savedProject = try await saveAndWaitForSync(project) + + try await assertModelExists(savedProject) + try await assertModelExists(savedTeam) + + try await deleteAndWaitForSync(savedProject) + + try await assertModelDoesNotExist(savedProject) + try await assertModelExists(savedTeam) + + try await deleteAndWaitForSync(savedTeam) + try await assertModelDoesNotExist(savedTeam) + } } extension AWSDataStoreLazyLoadProjectTeam2Tests { diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift index 4e3a8000b5..c3693a6421 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2+Schema.swift @@ -2,55 +2,6 @@ import Amplify import Foundation -//extension Project2 { -// // MARK: - CodingKeys -// public enum CodingKeys: String, ModelKey { -// case projectId -// case name -// case team -// case createdAt -// case updatedAt -// case project2TeamTeamId -// case project2TeamName -// } -// -// public static let keys = CodingKeys.self -// // MARK: - ModelSchema -// -// public static let schema = defineSchema { model in -// let project2 = Project2.keys -// -// model.pluralName = "Project2s" -// -// model.attributes( -// .index(fields: ["projectId", "name"], name: nil), -// .primaryKey(fields: [project2.projectId, project2.name]) -// ) -// -// model.fields( -// .field(project2.projectId, is: .required, ofType: .string), -// .field(project2.name, is: .required, ofType: .string), -// .hasOne(project2.team, is: .optional, ofType: Team2.self, associatedWith: Team2.keys.teamId, targetNames: ["project2TeamTeamId", "project2TeamName"]), -// .field(project2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), -// .field(project2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime), -// .field(project2.project2TeamTeamId, is: .optional, ofType: .string), -// .field(project2.project2TeamName, is: .optional, ofType: .string) -// ) -// } -//} -// -//extension Project2: ModelIdentifiable { -// public typealias IdentifierFormat = ModelIdentifierFormat.Custom -// public typealias IdentifierProtocol = ModelIdentifier -//} -// -//extension Project2.IdentifierProtocol { -// public static func identifier(projectId: String, -// name: String) -> Self { -// .make(fields:[(name: "projectId", value: projectId), (name: "name", value: name)]) -// } -//} - extension Project2 { // MARK: - CodingKeys public enum CodingKeys: String, ModelKey { @@ -59,27 +10,31 @@ extension Project2 { case team case createdAt case updatedAt + case project2TeamTeamId + case project2TeamName } - + public static let keys = CodingKeys.self // MARK: - ModelSchema - + public static let schema = defineSchema { model in let project2 = Project2.keys - + model.pluralName = "Project2s" - + model.attributes( .index(fields: ["projectId", "name"], name: nil), .primaryKey(fields: [project2.projectId, project2.name]) ) - + model.fields( .field(project2.projectId, is: .required, ofType: .string), .field(project2.name, is: .required, ofType: .string), .hasOne(project2.team, is: .optional, ofType: Team2.self, associatedWith: Team2.keys.teamId, targetNames: ["project2TeamTeamId", "project2TeamName"]), .field(project2.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime), - .field(project2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime) + .field(project2.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime), + .field(project2.project2TeamTeamId, is: .optional, ofType: .string), + .field(project2.project2TeamName, is: .optional, ofType: .string) ) } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift index e5b9ac804b..3cca46d19b 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/Project2.swift @@ -2,81 +2,6 @@ import Amplify import Foundation -//public struct Project2: Model { -// public let projectId: String -// public let name: String -// internal var _team: LazyModel -// public var team: Team2? { -// get async throws { -// try await _team.get() -// } -// } -// public var createdAt: Temporal.DateTime? -// public var updatedAt: Temporal.DateTime? -// public var project2TeamTeamId: String? -// public var project2TeamName: String? -// -// public init(projectId: String, -// name: String, -// team: Team2? = nil, -// project2TeamTeamId: String? = nil, -// project2TeamName: String? = nil) { -// self.init(projectId: projectId, -// name: name, -// team: team, -// createdAt: nil, -// updatedAt: nil, -// project2TeamTeamId: project2TeamTeamId, -// project2TeamName: project2TeamName) -// } -// internal init(projectId: String, -// name: String, -// team: Team2? = nil, -// createdAt: Temporal.DateTime? = nil, -// updatedAt: Temporal.DateTime? = nil, -// project2TeamTeamId: String? = nil, -// project2TeamName: String? = nil) { -// self.projectId = projectId -// self.name = name -// self._team = LazyModel(element: team) -// self.createdAt = createdAt -// self.updatedAt = updatedAt -// self.project2TeamTeamId = project2TeamTeamId -// self.project2TeamName = project2TeamName -// } -// -// public mutating func setTeam(_ team: Team2?) { -// self._team = LazyModel(element: team) -// } -// -// public init(from decoder: Decoder) throws { -// let values = try decoder.container(keyedBy: CodingKeys.self) -// projectId = try values.decode(String.self, forKey: .projectId) -// name = try values.decode(String.self, forKey: .name) -// do { -// _team = try values.decode(LazyModel.self, forKey: .team) -// } catch { -// _team = LazyModel(identifiers: nil) -// } -// -// createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) -// updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) -// project2TeamTeamId = try values.decode(String?.self, forKey: .project2TeamTeamId) -// project2TeamName = try values.decode(String?.self, forKey: .project2TeamName) -// } -// -// public func encode(to encoder: Encoder) throws { -// var container = encoder.container(keyedBy: CodingKeys.self) -// try container.encode(projectId, forKey: .projectId) -// try container.encode(name, forKey: .name) -// try container.encode(_team, forKey: .team) -// try container.encode(createdAt, forKey: .createdAt) -// try container.encode(updatedAt, forKey: .updatedAt) -// try container.encode(project2TeamTeamId, forKey: .project2TeamTeamId) -// try container.encode(project2TeamName, forKey: .project2TeamName) -// } -//} - public struct Project2: Model { public let projectId: String public let name: String @@ -88,26 +13,36 @@ public struct Project2: Model { } public var createdAt: Temporal.DateTime? public var updatedAt: Temporal.DateTime? + public var project2TeamTeamId: String? + public var project2TeamName: String? public init(projectId: String, name: String, - team: Team2? = nil) { + team: Team2? = nil, + project2TeamTeamId: String? = nil, + project2TeamName: String? = nil) { self.init(projectId: projectId, name: name, team: team, createdAt: nil, - updatedAt: nil) + updatedAt: nil, + project2TeamTeamId: project2TeamTeamId, + project2TeamName: project2TeamName) } internal init(projectId: String, name: String, team: Team2? = nil, createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { + updatedAt: Temporal.DateTime? = nil, + project2TeamTeamId: String? = nil, + project2TeamName: String? = nil) { self.projectId = projectId self.name = name self._team = LazyModel(element: team) self.createdAt = createdAt self.updatedAt = updatedAt + self.project2TeamTeamId = project2TeamTeamId + self.project2TeamName = project2TeamName } public mutating func setTeam(_ team: Team2?) { @@ -123,9 +58,11 @@ public struct Project2: Model { } catch { _team = LazyModel(identifiers: nil) } - + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + project2TeamTeamId = try values.decode(String?.self, forKey: .project2TeamTeamId) + project2TeamName = try values.decode(String?.self, forKey: .project2TeamName) } public func encode(to encoder: Encoder) throws { @@ -135,5 +72,7 @@ public struct Project2: Model { try container.encode(_team, forKey: .team) try container.encode(createdAt, forKey: .createdAt) try container.encode(updatedAt, forKey: .updatedAt) + try container.encode(project2TeamTeamId, forKey: .project2TeamTeamId) + try container.encode(project2TeamName, forKey: .project2TeamName) } } From f49355fe52ed271a6a7e48b0fb1d9f40da3d3df9 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 26 Oct 2022 15:59:17 -0400 Subject: [PATCH 15/18] almost test complete for ProjectTeam tests --- ...WSDataStoreLazyLoadProjectTeam1Tests.swift | 164 +++++++++- ...WSDataStoreLazyLoadProjectTeam2Tests.swift | 32 +- ...WSDataStoreLazyLoadProjectTeam5Tests.swift | 281 ++++++++++++++++++ .../LL8/Project5.swift | 6 +- .../LL8/Team5.swift | 81 +++-- ...WSDataStoreLazyLoadProjectTeam6Tests.swift | 266 +++++++++++++++++ .../LL9/Project6.swift | 109 ++++--- .../AWSDataStoreLazyLoadBaseTest.swift | 4 + .../project.pbxproj | 8 + 9 files changed, 863 insertions(+), 88 deletions(-) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/AWSDataStoreLazyLoadProjectTeam5Tests.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/AWSDataStoreLazyLoadProjectTeam6Tests.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift index a4d1f32a61..416b7fb70b 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift @@ -14,6 +14,12 @@ import XCTest class AWSDataStoreLazyLoadProjectTeam1Tests: AWSDataStoreLazyLoadBaseTest { + func testStart() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false, clearOnTearDown: false) + try await startAndWaitForReady() + printDBPath() + } + func testAPISyncQuery() async throws { await setupAPIOnly(withModels: ProjectTeam1Models()) @@ -91,15 +97,159 @@ class AWSDataStoreLazyLoadProjectTeam1Tests: AWSDataStoreLazyLoadBaseTest { func testSaveTeam() async throws { await setup(withModels: ProjectTeam1Models(), eagerLoad: false) - let team = Team1(teamId: UUID().uuidString, name: "name") - let project = Project1(projectId: UUID().uuidString, + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + try await assertModelExists(savedTeam) + } + + func testSaveProject() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, + name: "name") + let savedProject = try await saveAndWaitForSync(project) + try await assertModelExists(savedProject) + assertProjectDoesNotContainTeam(savedProject) + } + + func testSaveProjectWithTeam() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + + // Project initializer variation #1 (pass both team reference and fields in) + let project = Project(projectId: UUID().uuidString, + name: "name", + team: team, + project1TeamTeamId: team.teamId, + project1TeamName: team.name) + let savedProject = try await saveAndWaitForSync(project) + let queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + + // Project initializer variation #2 (pass only team reference) + let project2 = Project(projectId: UUID().uuidString, + name: "name", + team: team) + let savedProject2 = try await saveAndWaitForSync(project2) + let queriedProject2 = try await query(for: savedProject2) + assertProjectDoesNotContainTeam(queriedProject2) + + // Project initializer variation #3 (pass fields in) + let project3 = Project(projectId: UUID().uuidString, name: "name", - team: team, project1TeamTeamId: team.teamId, project1TeamName: team.name) + let savedProject3 = try await saveAndWaitForSync(project3) + let queriedProject3 = try await query(for: savedProject3) + assertProject(queriedProject3, hasTeam: savedTeam) + } + + // One-to-One relationships do not create a foreign key for the Team or Project table + // So the LazyModel does not have the FK value to be instantiated as metadata for lazy loading. + // We only assert the FK fields on the Project exist and are equal to the Team's PK. + func assertProject(_ project: Project, hasTeam team: Team) { + XCTAssertEqual(project.project1TeamTeamId, team.teamId) + XCTAssertEqual(project.project1TeamName, team.name) + } + + func assertProjectDoesNotContainTeam(_ project: Project) { + XCTAssertNil(project.project1TeamTeamId) + XCTAssertNil(project.project1TeamName) + } + + func testSaveProjectWithTeamThenUpdate() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + assertProject(savedProject, hasTeam: savedTeam) + let queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + let updatedProject = try await saveAndWaitForSync(project, assertVersion: 2) + assertProject(updatedProject, hasTeam: savedTeam) + } + + func testSaveProjectWithoutTeamUpdateProjectWithTeam() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, name: "name") + let savedProject = try await saveAndWaitForSync(project) + assertProjectDoesNotContainTeam(savedProject) + let team = Team(teamId: UUID().uuidString, name: "name") let savedTeam = try await saveAndWaitForSync(team) + var queriedProject = try await query(for: savedProject) + queriedProject.project1TeamTeamId = team.teamId + queriedProject.project1TeamName = team.name + let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProject(savedProjectWithNewTeam, hasTeam: savedTeam) + } + + func testSaveTeamSaveProjectWithTeamUpdateProjectToNoTeam() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + var queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + queriedProject.project1TeamTeamId = nil + queriedProject.project1TeamName = nil + let savedProjectWithNoTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProjectDoesNotContainTeam(savedProjectWithNoTeam) + } + + func testSaveProjectWithTeamUpdateProjectToNewTeam() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + let newTeam = Team(teamId: UUID().uuidString, name: "name") + let savedNewTeam = try await saveAndWaitForSync(newTeam) + var queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + queriedProject.project1TeamTeamId = newTeam.teamId + queriedProject.project1TeamName = newTeam.name + let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProject(queriedProject, hasTeam: savedNewTeam) + } + + func testDeleteTeam() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + try await assertModelExists(savedTeam) + try await deleteAndWaitForSync(savedTeam) + try await assertModelDoesNotExist(savedTeam) + } + + func testDeleteProject() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, name: "name") + let savedProject = try await saveAndWaitForSync(project) + try await assertModelExists(savedProject) + try await deleteAndWaitForSync(savedProject) + try await assertModelDoesNotExist(savedProject) + } + + func testDeleteProjectWithTeam() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(team) let savedProject = try await saveAndWaitForSync(project) + + try await assertModelExists(savedProject) + try await assertModelExists(savedTeam) + + try await deleteAndWaitForSync(savedProject) + + try await assertModelDoesNotExist(savedProject) + try await assertModelExists(savedTeam) + + try await deleteAndWaitForSync(savedTeam) + try await assertModelDoesNotExist(savedTeam) } } @@ -114,4 +264,12 @@ extension AWSDataStoreLazyLoadProjectTeam1Tests { ModelRegistry.register(modelType: Team1.self) } } + + func initializeProjectWithTeam(_ team: Team) -> Project { + return Project(projectId: UUID().uuidString, + name: "name", + team: team, + project1TeamTeamId: team.teamId, + project1TeamName: team.name) + } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift index 1a488ea965..06681dbe1c 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL6/AWSDataStoreLazyLoadProjectTeam2Tests.swift @@ -151,11 +151,7 @@ class AWSDataStoreLazyLoadProjectTeam2Tests: AWSDataStoreLazyLoadBaseTest { let team = Team(teamId: UUID().uuidString, name: "name") let savedTeam = try await saveAndWaitForSync(team) - let project = Project(projectId: UUID().uuidString, - name: "name", - team: team, - project2TeamTeamId: team.teamId, - project2TeamName: team.name) + let project = initializeProjectWithTeam(team) let savedProject = try await saveAndWaitForSync(project) assertProject(savedProject, hasTeam: savedTeam) let queriedProject = try await query(for: savedProject) @@ -183,11 +179,7 @@ class AWSDataStoreLazyLoadProjectTeam2Tests: AWSDataStoreLazyLoadBaseTest { await setup(withModels: ProjectTeam2Models(), eagerLoad: false) let team = Team(teamId: UUID().uuidString, name: "name") let savedTeam = try await saveAndWaitForSync(team) - let project = Project(projectId: UUID().uuidString, - name: "name", - team: team, - project2TeamTeamId: team.teamId, - project2TeamName: team.name) + let project = initializeProjectWithTeam(team) let savedProject = try await saveAndWaitForSync(project) var queriedProject = try await query(for: savedProject) assertProject(queriedProject, hasTeam: savedTeam) @@ -201,11 +193,7 @@ class AWSDataStoreLazyLoadProjectTeam2Tests: AWSDataStoreLazyLoadBaseTest { await setup(withModels: ProjectTeam2Models(), eagerLoad: false) let team = Team(teamId: UUID().uuidString, name: "name") let savedTeam = try await saveAndWaitForSync(team) - let project = Project(projectId: UUID().uuidString, - name: "name", - team: team, - project2TeamTeamId: team.teamId, - project2TeamName: team.name) + let project = initializeProjectWithTeam(team) let savedProject = try await saveAndWaitForSync(project) let newTeam = Team(teamId: UUID().uuidString, name: "name") let savedNewTeam = try await saveAndWaitForSync(newTeam) @@ -239,11 +227,7 @@ class AWSDataStoreLazyLoadProjectTeam2Tests: AWSDataStoreLazyLoadBaseTest { await setup(withModels: ProjectTeam2Models(), eagerLoad: false) let team = Team(teamId: UUID().uuidString, name: "name") let savedTeam = try await saveAndWaitForSync(team) - let project = Project(projectId: UUID().uuidString, - name: "name", - team: team, - project2TeamTeamId: team.teamId, - project2TeamName: team.name) + let project = initializeProjectWithTeam(team) let savedProject = try await saveAndWaitForSync(project) try await assertModelExists(savedProject) @@ -271,4 +255,12 @@ extension AWSDataStoreLazyLoadProjectTeam2Tests { ModelRegistry.register(modelType: Team2.self) } } + + func initializeProjectWithTeam(_ team: Team) -> Project { + return Project(projectId: UUID().uuidString, + name: "name", + team: team, + project2TeamTeamId: team.teamId, + project2TeamName: team.name) + } } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/AWSDataStoreLazyLoadProjectTeam5Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/AWSDataStoreLazyLoadProjectTeam5Tests.swift new file mode 100644 index 0000000000..aa5e066a8a --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/AWSDataStoreLazyLoadProjectTeam5Tests.swift @@ -0,0 +1,281 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify +import AWSPluginsCore + +class AWSDataStoreLazyLoadProjectTeam5Tests: AWSDataStoreLazyLoadBaseTest { + + func testStart() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false, clearOnTearDown: false) + try await startAndWaitForReady() + printDBPath() + } + + func testAPISyncQuery() async throws { + await setupAPIOnly(withModels: ProjectTeam5Models()) + + // The selection set of project should include "hasOne" team, and no further + let projectRequest = GraphQLRequest.syncQuery(modelType: Project.self) + let projectDocument = """ + query SyncProject5s($limit: Int) { + syncProject5s(limit: $limit) { + items { + projectId + name + createdAt + teamId + teamName + updatedAt + team { + teamId + name + createdAt + updatedAt + __typename + _version + _deleted + _lastChangedAt + } + __typename + _version + _deleted + _lastChangedAt + } + nextToken + startedAt + } + } + """ + XCTAssertEqual(projectRequest.document, projectDocument) + + // In this "Explicit bi-directional Has One", team "belongsTo" so it should include the project. + let teamRequest = GraphQLRequest.syncQuery(modelType: Team.self) + let teamDocument = """ + query SyncTeam5s($limit: Int) { + syncTeam5s(limit: $limit) { + items { + teamId + name + createdAt + updatedAt + project { + projectId + name + createdAt + teamId + teamName + updatedAt + __typename + _version + _deleted + _lastChangedAt + } + __typename + _version + _deleted + _lastChangedAt + } + nextToken + startedAt + } + } + """ + XCTAssertEqual(teamRequest.document, teamDocument) + // Making the actual requests and ensuring they can decode to the Model types. + _ = try await Amplify.API.query(request: projectRequest) + _ = try await Amplify.API.query(request: teamRequest) + } + + func testSaveTeam() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + try await assertModelExists(savedTeam) + } + + func testSaveProject() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, + name: "name") + let savedProject = try await saveAndWaitForSync(project) + try await assertModelExists(savedProject) + assertProjectDoesNotContainTeam(savedProject) + } + + func testSaveProjectWithTeam() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + + // Project initializer variation #1 (pass both team reference and fields in) + let project = Project(projectId: UUID().uuidString, + name: "name", + team: team, + teamId: team.teamId, + teamName: team.name) + let savedProject = try await saveAndWaitForSync(project) + let queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + + // Project initializer variation #2 (pass only team reference) + let project2 = Project(projectId: UUID().uuidString, + name: "name", + team: team) + let savedProject2 = try await saveAndWaitForSync(project2) + let queriedProject2 = try await query(for: savedProject2) + assertProjectDoesNotContainTeam(queriedProject2) + + // Project initializer variation #3 (pass fields in) + let project3 = Project(projectId: UUID().uuidString, + name: "name", + teamId: team.teamId, + teamName: team.name) + let savedProject3 = try await saveAndWaitForSync(project3) + let queriedProject3 = try await query(for: savedProject3) + assertProject(queriedProject3, hasTeam: savedTeam) + } + + // One-to-One relationships do not create a foreign key for the Team or Project table + // So the LazyModel does not have the FK value to be instantiated as metadata for lazy loading. + // We only assert the FK fields on the Project exist and are equal to the Team's PK. + func assertProject(_ project: Project, hasTeam team: Team) { + XCTAssertEqual(project.teamId, team.teamId) + XCTAssertEqual(project.teamName, team.name) + } + + func assertProjectDoesNotContainTeam(_ project: Project) { + XCTAssertNil(project.teamId) + XCTAssertNil(project.teamName) + } + + func testSaveProjectWithTeamThenUpdate() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + assertProject(savedProject, hasTeam: savedTeam) + let queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + let updatedProject = try await saveAndWaitForSync(project, assertVersion: 2) + assertProject(updatedProject, hasTeam: savedTeam) + } + + func testSaveProjectWithoutTeamUpdateProjectWithTeam() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, name: "name") + let savedProject = try await saveAndWaitForSync(project) + assertProjectDoesNotContainTeam(savedProject) + + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + var queriedProject = try await query(for: savedProject) + queriedProject.teamId = team.teamId + queriedProject.teamName = team.name + let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProject(savedProjectWithNewTeam, hasTeam: savedTeam) + } + + func testSaveTeamSaveProjectWithTeamUpdateProjectToNoTeam() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + var queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + queriedProject.teamId = nil + queriedProject.teamName = nil + let savedProjectWithNoTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProjectDoesNotContainTeam(savedProjectWithNoTeam) + } + + func testSaveProjectWithTeamUpdateProjectToNewTeam() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + let newTeam = Team(teamId: UUID().uuidString, name: "name") + let savedNewTeam = try await saveAndWaitForSync(newTeam) + var queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + queriedProject.teamId = newTeam.teamId + queriedProject.teamName = newTeam.name + let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProject(queriedProject, hasTeam: savedNewTeam) + } + + func testDeleteTeam() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + try await assertModelExists(savedTeam) + try await deleteAndWaitForSync(savedTeam) + try await assertModelDoesNotExist(savedTeam) + } + + func testDeleteProject() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, name: "name") + let savedProject = try await saveAndWaitForSync(project) + try await assertModelExists(savedProject) + try await deleteAndWaitForSync(savedProject) + try await assertModelDoesNotExist(savedProject) + } + + func testDeleteProjectWithTeam() async throws { + await setup(withModels: ProjectTeam5Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = Project(projectId: UUID().uuidString, + name: "name", + team: team, + teamId: team.teamId, + teamName: team.name) + let savedProject = try await saveAndWaitForSync(project) + + try await assertModelExists(savedProject) + try await assertModelExists(savedTeam) + + try await deleteAndWaitForSync(savedProject) + + try await assertModelDoesNotExist(savedProject) + try await assertModelExists(savedTeam) + + try await deleteAndWaitForSync(savedTeam) + try await assertModelDoesNotExist(savedTeam) + } +} + +extension AWSDataStoreLazyLoadProjectTeam5Tests { + + typealias Project = Project5 + typealias Team = Team5 + + struct ProjectTeam5Models: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Project5.self) + ModelRegistry.register(modelType: Team5.self) + } + } + + func initializeProjectWithTeam(_ team: Team) -> Project { + return Project(projectId: UUID().uuidString, + name: "name", + team: team, + teamId: team.teamId, + teamName: team.name) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Project5.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Project5.swift index b7bbbd2d86..0d819c3382 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Project5.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Project5.swift @@ -53,7 +53,11 @@ public struct Project5: Model { let values = try decoder.container(keyedBy: CodingKeys.self) projectId = try values.decode(String.self, forKey: .projectId) name = try values.decode(String.self, forKey: .name) - _team = try values.decode(LazyModel.self, forKey: .team) + do { + _team = try values.decode(LazyModel.self, forKey: .team) + } catch { + _team = LazyModel(identifiers: nil) + } teamId = try values.decode(String?.self, forKey: .teamId) teamName = try values.decode(String?.self, forKey: .teamName) createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Team5.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Team5.swift index 10f8f9084b..a021677757 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Team5.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL8/Team5.swift @@ -3,30 +3,57 @@ import Amplify import Foundation public struct Team5: Model { - public let teamId: String - public let name: String - public var project: Project5? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(teamId: String, - name: String, - project: Project5? = nil) { - self.init(teamId: teamId, - name: name, - project: project, - createdAt: nil, - updatedAt: nil) - } - internal init(teamId: String, - name: String, - project: Project5? = nil, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.teamId = teamId - self.name = name - self.project = project - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file + public let teamId: String + public let name: String + internal var _project: LazyModel + public var project: Project5? { + get async throws { + try await _project.get() + } + } + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(teamId: String, + name: String, + project: Project5? = nil) { + self.init(teamId: teamId, + name: name, + project: project, + createdAt: nil, + updatedAt: nil) + } + internal init(teamId: String, + name: String, + project: Project5? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.teamId = teamId + self.name = name + self._project = LazyModel(element: project) + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + teamId = try values.decode(String.self, forKey: .teamId) + name = try values.decode(String.self, forKey: .name) + do { + _project = try values.decode(LazyModel.self, forKey: .project) + } catch { + _project = LazyModel(identifiers: nil) + } + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(teamId, forKey: .teamId) + try container.encode(name, forKey: .name) + try container.encode(_project, forKey: .project) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/AWSDataStoreLazyLoadProjectTeam6Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/AWSDataStoreLazyLoadProjectTeam6Tests.swift new file mode 100644 index 0000000000..33fc3af9e3 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/AWSDataStoreLazyLoadProjectTeam6Tests.swift @@ -0,0 +1,266 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify +import AWSPluginsCore + +class AWSDataStoreLazyLoadProjectTeam6Tests: AWSDataStoreLazyLoadBaseTest { + + func testStart() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false, clearOnTearDown: false) + try await startAndWaitForReady() + printDBPath() + } + + func testAPISyncQuery() async throws { + await setupAPIOnly(withModels: ProjectTeam6Models()) + + // The selection set of project should include "hasOne" team, and no further + let projectRequest = GraphQLRequest.syncQuery(modelType: Project.self) + let projectDocument = """ + query SyncProject6s($limit: Int) { + syncProject6s(limit: $limit) { + items { + projectId + name + createdAt + teamId + teamName + updatedAt + team { + teamId + name + createdAt + updatedAt + __typename + _version + _deleted + _lastChangedAt + } + __typename + _version + _deleted + _lastChangedAt + } + nextToken + startedAt + } + } + """ + XCTAssertEqual(projectRequest.document, projectDocument) + + // In this "Explicit Uni-directional Has One", only project hasOne team, team does not reference the project + // So, the selection set of team does not include project + let teamRequest = GraphQLRequest.syncQuery(modelType: Team.self) + let teamDocument = """ + query SyncTeam6s($limit: Int) { + syncTeam6s(limit: $limit) { + items { + teamId + name + createdAt + updatedAt + __typename + _version + _deleted + _lastChangedAt + } + nextToken + startedAt + } + } + """ + XCTAssertEqual(teamRequest.document, teamDocument) + // Making the actual requests and ensuring they can decode to the Model types. + _ = try await Amplify.API.query(request: projectRequest) + _ = try await Amplify.API.query(request: teamRequest) + } + + func testSaveTeam() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + try await assertModelExists(savedTeam) + } + + func testSaveProject() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, + name: "name") + let savedProject = try await saveAndWaitForSync(project) + try await assertModelExists(savedProject) + assertProjectDoesNotContainTeam(savedProject) + } + + func testSaveProjectWithTeam() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + + // Project initializer variation #1 (pass both team reference and fields in) + let project = Project(projectId: UUID().uuidString, + name: "name", + team: team, + teamId: team.teamId, + teamName: team.name) + let savedProject = try await saveAndWaitForSync(project) + let queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + + // Project initializer variation #2 (pass only team reference) + let project2 = Project(projectId: UUID().uuidString, + name: "name", + team: team) + let savedProject2 = try await saveAndWaitForSync(project2) + let queriedProject2 = try await query(for: savedProject2) + assertProjectDoesNotContainTeam(queriedProject2) + + // Project initializer variation #3 (pass fields in) + let project3 = Project(projectId: UUID().uuidString, + name: "name", + teamId: team.teamId, + teamName: team.name) + let savedProject3 = try await saveAndWaitForSync(project3) + let queriedProject3 = try await query(for: savedProject3) + assertProject(queriedProject3, hasTeam: savedTeam) + } + + // One-to-One relationships do not create a foreign key for the Team or Project table + // So the LazyModel does not have the FK value to be instantiated as metadata for lazy loading. + // We only assert the FK fields on the Project exist and are equal to the Team's PK. + func assertProject(_ project: Project, hasTeam team: Team) { + XCTAssertEqual(project.teamId, team.teamId) + XCTAssertEqual(project.teamName, team.name) + } + + func assertProjectDoesNotContainTeam(_ project: Project) { + XCTAssertNil(project.teamId) + XCTAssertNil(project.teamName) + } + + func testSaveProjectWithTeamThenUpdate() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + assertProject(savedProject, hasTeam: savedTeam) + let queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + let updatedProject = try await saveAndWaitForSync(project, assertVersion: 2) + assertProject(updatedProject, hasTeam: savedTeam) + } + + func testSaveProjectWithoutTeamUpdateProjectWithTeam() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, name: "name") + let savedProject = try await saveAndWaitForSync(project) + assertProjectDoesNotContainTeam(savedProject) + + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + var queriedProject = try await query(for: savedProject) + queriedProject.teamId = team.teamId + queriedProject.teamName = team.name + let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProject(savedProjectWithNewTeam, hasTeam: savedTeam) + } + + func testSaveTeamSaveProjectWithTeamUpdateProjectToNoTeam() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + var queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + queriedProject.teamId = nil + queriedProject.teamName = nil + let savedProjectWithNoTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProjectDoesNotContainTeam(savedProjectWithNoTeam) + } + + func testSaveProjectWithTeamUpdateProjectToNewTeam() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + let newTeam = Team(teamId: UUID().uuidString, name: "name") + let savedNewTeam = try await saveAndWaitForSync(newTeam) + var queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + queriedProject.teamId = newTeam.teamId + queriedProject.teamName = newTeam.name + let savedProjectWithNewTeam = try await saveAndWaitForSync(queriedProject, assertVersion: 2) + assertProject(queriedProject, hasTeam: savedNewTeam) + } + + func testDeleteTeam() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + try await assertModelExists(savedTeam) + try await deleteAndWaitForSync(savedTeam) + try await assertModelDoesNotExist(savedTeam) + } + + func testDeleteProject() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let project = Project(projectId: UUID().uuidString, name: "name") + let savedProject = try await saveAndWaitForSync(project) + try await assertModelExists(savedProject) + try await deleteAndWaitForSync(savedProject) + try await assertModelDoesNotExist(savedProject) + } + + func testDeleteProjectWithTeam() async throws { + await setup(withModels: ProjectTeam6Models(), eagerLoad: false) + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(team) + let savedProject = try await saveAndWaitForSync(project) + + try await assertModelExists(savedProject) + try await assertModelExists(savedTeam) + + try await deleteAndWaitForSync(savedProject) + + try await assertModelDoesNotExist(savedProject) + try await assertModelExists(savedTeam) + + try await deleteAndWaitForSync(savedTeam) + try await assertModelDoesNotExist(savedTeam) + } +} + +extension AWSDataStoreLazyLoadProjectTeam6Tests { + + typealias Project = Project6 + typealias Team = Team6 + + struct ProjectTeam6Models: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Project6.self) + ModelRegistry.register(modelType: Team6.self) + } + } + + func initializeProjectWithTeam(_ team: Team) -> Project { + return Project(projectId: UUID().uuidString, + name: "name", + team: team, + teamId: team.teamId, + teamName: team.name) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Project6.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Project6.swift index 346cb44d71..fe89dcd9e4 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Project6.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL9/Project6.swift @@ -3,40 +3,75 @@ import Amplify import Foundation public struct Project6: Model { - public let projectId: String - public let name: String - public var team: Team6? - public var teamId: String? - public var teamName: String? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(projectId: String, - name: String, - team: Team6? = nil, - teamId: String? = nil, - teamName: String? = nil) { - self.init(projectId: projectId, - name: name, - team: team, - teamId: teamId, - teamName: teamName, - createdAt: nil, - updatedAt: nil) - } - internal init(projectId: String, - name: String, - team: Team6? = nil, - teamId: String? = nil, - teamName: String? = nil, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.projectId = projectId - self.name = name - self.team = team - self.teamId = teamId - self.teamName = teamName - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file + public let projectId: String + public let name: String + internal var _team: LazyModel + public var team: Team6? { + get async throws { + try await _team.get() + } + } + public var teamId: String? + public var teamName: String? + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(projectId: String, + name: String, + team: Team6? = nil, + teamId: String? = nil, + teamName: String? = nil) { + self.init(projectId: projectId, + name: name, + team: team, + teamId: teamId, + teamName: teamName, + createdAt: nil, + updatedAt: nil) + } + internal init(projectId: String, + name: String, + team: Team6? = nil, + teamId: String? = nil, + teamName: String? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.projectId = projectId + self.name = name + self._team = LazyModel(element: team) + self.teamId = teamId + self.teamName = teamName + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public mutating func setTeam(_ team: Team6?) { + self._team = LazyModel(element: team) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + projectId = try values.decode(String.self, forKey: .projectId) + name = try values.decode(String.self, forKey: .name) + do { + _team = try values.decode(LazyModel.self, forKey: .team) + } catch { + _team = LazyModel(identifiers: nil) + } + teamId = try values.decode(String?.self, forKey: .teamId) + teamName = try values.decode(String?.self, forKey: .teamName) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(projectId, forKey: .projectId) + try container.encode(name, forKey: .name) + try container.encode(_team, forKey: .team) + try container.encode(teamId, forKey: .teamId) + try container.encode(teamName, forKey: .teamName) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift index 828500a2c2..97e92793c7 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift @@ -72,6 +72,10 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { loadingStrategy: eagerLoad ? .eagerLoad : .lazyLoad))) try Amplify.add(plugin: AWSAPIPlugin()) try Amplify.configure(amplifyConfig) + + if clearOnTearDown { + try await clearDataStore() + } } catch { XCTFail("Error during setup: \(error)") } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index 2a3c26959e..727db1cd5f 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -153,6 +153,8 @@ 213DBC6128A5808400B30280 /* TodoIAMPrivate+Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA8B289BFE4E00B32A39 /* TodoIAMPrivate+Schema.swift */; }; 213DBC6228A5808400B30280 /* TodoIAMPublic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFA8D289BFE4E00B32A39 /* TodoIAMPublic.swift */; }; 213DBC6328A5841400B30280 /* HubListenerTestUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFE13289C073100B32A39 /* HubListenerTestUtilities.swift */; }; + 217AA7BD2909C1D00042CD5D /* AWSDataStoreLazyLoadProjectTeam5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 217AA7BC2909C1D00042CD5D /* AWSDataStoreLazyLoadProjectTeam5Tests.swift */; }; + 217AA7BF2909C6330042CD5D /* AWSDataStoreLazyLoadProjectTeam6Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 217AA7BE2909C6330042CD5D /* AWSDataStoreLazyLoadProjectTeam6Tests.swift */; }; 21801C7D28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */; }; 21801C8728F9A38000FFA37E /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801C8628F9A37F00FFA37E /* TestConfigHelper.swift */; }; 21801CD428F9A86800FFA37E /* PostWithCompositeKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */; }; @@ -732,6 +734,8 @@ 213DBC5828A57FFE00B30280 /* TestConfigHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = ""; }; 213DBC5A28A5800F00B30280 /* TestConfigHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = ""; }; 213DBC5C28A5801900B30280 /* TestConfigHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = ""; }; + 217AA7BC2909C1D00042CD5D /* AWSDataStoreLazyLoadProjectTeam5Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadProjectTeam5Tests.swift; sourceTree = ""; }; + 217AA7BE2909C6330042CD5D /* AWSDataStoreLazyLoadProjectTeam6Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadProjectTeam6Tests.swift; sourceTree = ""; }; 21801C7A28F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AWSDataStorePluginLazyLoadTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadBaseTest.swift; sourceTree = ""; }; 21801C8428F9A2DC00FFA37E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; @@ -1498,6 +1502,7 @@ 21801D3B2900709200FFA37E /* LL8 */ = { isa = PBXGroup; children = ( + 217AA7BC2909C1D00042CD5D /* AWSDataStoreLazyLoadProjectTeam5Tests.swift */, 21801D3529006DC200FFA37E /* Project5.swift */, 21801D3429006DC000FFA37E /* Project5+Schema.swift */, 21801D3129006DB500FFA37E /* Team5.swift */, @@ -1575,6 +1580,7 @@ 21801D452902E0E100FFA37E /* LL9 */ = { isa = PBXGroup; children = ( + 217AA7BE2909C6330042CD5D /* AWSDataStoreLazyLoadProjectTeam6Tests.swift */, 21801CB228F9A86600FFA37E /* Project6.swift */, 21801CC228F9A86700FFA37E /* Project6+Schema.swift */, 21801CC828F9A86800FFA37E /* Team6.swift */, @@ -3241,6 +3247,7 @@ 21801D3E2900A10600FFA37E /* AWSDataStoreLazyLoadProjectTeam1Tests.swift in Sources */, 21801C7D28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift in Sources */, 21801CFF28F9A86800FFA37E /* Team2.swift in Sources */, + 217AA7BF2909C6330042CD5D /* AWSDataStoreLazyLoadProjectTeam6Tests.swift in Sources */, 21801D0228F9A86800FFA37E /* Comment8+Schema.swift in Sources */, 21801D5F29097D5800FFA37E /* HasOneChild+Schema.swift in Sources */, 21801CFC28F9A86800FFA37E /* Comment4V2+Schema.swift in Sources */, @@ -3254,6 +3261,7 @@ 21801D5E29097D5800FFA37E /* StrangeExplicitChild.swift in Sources */, 21801CE828F9A86800FFA37E /* Comment4V2.swift in Sources */, 21801CD528F9A86800FFA37E /* CommentWithCompositeKey+Schema.swift in Sources */, + 217AA7BD2909C1D00042CD5D /* AWSDataStoreLazyLoadProjectTeam5Tests.swift in Sources */, 21801CED28F9A86800FFA37E /* Post4.swift in Sources */, 21801CF228F9A86800FFA37E /* Post4V2+Schema.swift in Sources */, 21801CFA28F9A86800FFA37E /* TagWithCompositeKey.swift in Sources */, From df222d072b48550c15ee7bb42d9f52ce09dae0de Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 26 Oct 2022 16:19:57 -0400 Subject: [PATCH 16/18] WIP team testing in ProjectTeam1 --- .../Storage/SQLite/Statement+Model.swift | 2 - ...WSDataStoreLazyLoadProjectTeam1Tests.swift | 43 +++++++++++++++++++ .../LL5/Team1.swift | 4 ++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift index 9d631dea72..76271d3688 100644 --- a/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift +++ b/AmplifyPlugins/DataStore/Sources/AWSDataStorePlugin/Storage/SQLite/Statement+Model.swift @@ -90,7 +90,6 @@ extension Statement: StatementModelConvertible { let modelDictionary = ([:] as ModelValues).mutableCopy() var skipColumns = Set() var foreignKeyValues = [(String, Binding?)]() - print("============= lawmicha convert \(modelSchema.name)=======================") for (index, value) in row.enumerated() { let column = columnNames[index] guard let (schema, field) = columnMapping[column] else { @@ -103,7 +102,6 @@ extension Statement: StatementModelConvertible { from: value, fieldType: field.type ) - print("lawmicha \(field.name) \(modelValue)") // Check if the value for the primary key is `nil`. This is when an associated model does not exist. // To create a decodable `modelDictionary` that can be decoded to the Model types, the entire // object at this particular key should be set to `nil`. The following code does that by dropping the last diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift index 416b7fb70b..2cba5311af 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/AWSDataStoreLazyLoadProjectTeam1Tests.swift @@ -144,6 +144,49 @@ class AWSDataStoreLazyLoadProjectTeam1Tests: AWSDataStoreLazyLoadBaseTest { assertProject(queriedProject3, hasTeam: savedTeam) } + func testSaveProjectWithTeamThenAccessProjectFromTeam() async throws { + await setup(withModels: ProjectTeam1Models(), eagerLoad: false, clearOnTearDown: false) + + let team = Team(teamId: UUID().uuidString, name: "name") + let savedTeam = try await saveAndWaitForSync(team) + let project = initializeProjectWithTeam(savedTeam) + let savedProject = try await saveAndWaitForSync(project) + let queriedProject = try await query(for: savedProject) + assertProject(queriedProject, hasTeam: savedTeam) + var queriedTeam = try await query(for: savedTeam) + + // The team has a FK referencing the Project. Updating the project with team + // does not reflect the team, which is why the queried team does not have the project + // to load. + // Project (Parent) hasOne Team + // Team (Child) belongsTo Project + // Team has the FK of Project. + switch queriedTeam._project.modelProvider.getState() { + case .notLoaded(let identifiers): + print("NOT LOADED \(identifiers)") + case .loaded(let model): + print("LOADED \(model)") + } + + queriedTeam.setProject(queriedProject) + let savedTeamWithProject = try await saveAndWaitForSync(queriedTeam, assertVersion: 2) + // Now the FK in the Team should be populated with Project's PK + switch savedTeamWithProject._project.modelProvider.getState() { + case .notLoaded(let identifiers): + print("NOT LOADED \(identifiers)") + case .loaded(let model): + print("LOADED \(model)") + } + var queriedTeamWithProject = try await query(for: savedTeamWithProject) + switch savedTeamWithProject._project.modelProvider.getState() { + case .notLoaded(let identifiers): + print("NOT LOADED \(identifiers)") + case .loaded(let model): + print("LOADED \(model)") + } + printDBPath() + } + // One-to-One relationships do not create a foreign key for the Team or Project table // So the LazyModel does not have the FK value to be instantiated as metadata for lazy loading. // We only assert the FK fields on the Project exist and are equal to the Team's PK. diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift index 2ff1fc475e..59c6b0edb3 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL5/Team1.swift @@ -35,6 +35,10 @@ public struct Team1: Model { self.updatedAt = updatedAt } + public mutating func setProject(_ project: Project1?) { + self._project = LazyModel(element: project) + } + public init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) teamId = try values.decode(String.self, forKey: .teamId) From 865da637309522913c3f0f8e4791b395ec6a59e0 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 26 Oct 2022 20:13:20 -0400 Subject: [PATCH 17/18] finish off PostComment tests --- ...WSDataStoreLazyLoadPostComment7Tests.swift | 175 +++++++++++++++++ .../LL10/Comment7.swift | 81 +++++--- ...WSDataStoreLazyLoadPostComment8Tests.swift | 185 ++++++++++++++++++ ...LoadPostCommentWithCompositeKeyTests.swift | 1 - ...WSDataStoreLazyLoadPostComment4Tests.swift | 183 +++++++++++++++++ .../AWSDataStoreLazyLoadBaseTest.swift | 8 +- .../project.pbxproj | 20 +- .../AWSDataStorePluginLazyLoadTests.xcscheme | 14 ++ 8 files changed, 632 insertions(+), 35 deletions(-) create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/AWSDataStoreLazyLoadPostComment7Tests.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/AWSDataStoreLazyLoadPostComment8Tests.swift create mode 100644 AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/AWSDataStoreLazyLoadPostComment4Tests.swift diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/AWSDataStoreLazyLoadPostComment7Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/AWSDataStoreLazyLoadPostComment7Tests.swift new file mode 100644 index 0000000000..0bb1b4653e --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/AWSDataStoreLazyLoadPostComment7Tests.swift @@ -0,0 +1,175 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify +import AWSPluginsCore + +final class AWSDataStoreLazyLoadPostComment7Tests: AWSDataStoreLazyLoadBaseTest { + + func testLazyLoad() async throws { + await setup(withModels: PostComment7Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, content: "content", post: post) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + try await assertComment(savedComment, hasEagerLoaded: savedPost) + try await assertPost(savedPost, canLazyLoad: savedComment) + let queriedComment = try await query(for: savedComment) + try await assertComment(queriedComment, canLazyLoad: savedPost) + let queriedPost = try await query(for: savedPost) + try await assertPost(queriedPost, canLazyLoad: savedComment) + } + + func assertComment(_ comment: Comment, + hasEagerLoaded post: Post) async throws { + assertLazyModel(comment._post, + state: .loaded(model: post)) + + guard let loadedPost = try await comment.post else { + XCTFail("Failed to retrieve the post from the comment") + return + } + XCTAssertEqual(loadedPost.postId, post.postId) + + // retrieve loaded model + guard let loadedPost = try await comment.post else { + XCTFail("Failed to retrieve the loaded post from the comment") + return + } + XCTAssertEqual(loadedPost.postId, post.postId) + + try await assertPost(loadedPost, canLazyLoad: comment) + } + + func assertComment(_ comment: Comment, + canLazyLoad post: Post) async throws { + assertLazyModel(comment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + guard let loadedPost = try await comment.post else { + XCTFail("Failed to load the post from the comment") + return + } + XCTAssertEqual(loadedPost.postId, post.postId) + assertLazyModel(comment._post, + state: .loaded(model: post)) + try await assertPost(loadedPost, canLazyLoad: comment) + } + + func assertPost(_ post: Post, + canLazyLoad comment: Comment) async throws { + guard let comments = post.comments else { + XCTFail("Missing comments on post") + return + } + assertList(comments, state: .isNotLoaded(associatedId: post.identifier, + associatedField: "post")) + try await comments.fetch() + assertList(comments, state: .isLoaded(count: 1)) + guard let comment = comments.first else { + XCTFail("Missing lazy loaded comment from post") + return + } + assertLazyModel(comment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + } + + func testSaveWithoutPost() async throws { + await setup(withModels: PostComment7Models(), logLevel: .verbose, eagerLoad: false) + let comment = Comment(commentId: UUID().uuidString, content: "content") + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await query(for: savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: nil)) + let post = Post(postId: UUID().uuidString, title: "title") + let savedPost = try await saveAndWaitForSync(post) + queriedComment.setPost(savedPost) + let saveCommentWithPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedComment2 = try await query(for: saveCommentWithPost) + try await assertComment(queriedComment2, canLazyLoad: post) + } + + func testUpdateFromQueriedComment() async throws { + await setup(withModels: PostComment7Models(), logLevel: .verbose, eagerLoad: false) + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, content: "content", post: post) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + let queriedComment = try await query(for: savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + let savedQueriedComment = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedComment2 = try await query(for: savedQueriedComment) + try await assertComment(queriedComment2, canLazyLoad: savedPost) + } + + func testUpdateToNewPost() async throws { + await setup(withModels: PostComment7Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, content: "content", post: post) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await query(for: savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + + let newPost = Post(postId: UUID().uuidString, title: "title") + _ = try await saveAndWaitForSync(newPost) + queriedComment.setPost(newPost) + let saveCommentWithNewPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedComment2 = try await query(for: saveCommentWithNewPost) + try await assertComment(queriedComment2, canLazyLoad: newPost) + } + + func testUpdateRemovePost() async throws { + await setup(withModels: PostComment7Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, content: "content", post: post) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await query(for: savedComment) + assertLazyModel(queriedComment._post, + state: .notLoaded(identifiers: ["@@primaryKey": post.identifier])) + + queriedComment.setPost(nil) + let saveCommentRemovePost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedCommentNoPost = try await query(for: saveCommentRemovePost) + assertLazyModel(queriedCommentNoPost._post, + state: .notLoaded(identifiers: nil)) + } + + func testDelete() async throws { + await setup(withModels: PostComment7Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, content: "content", post: post) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + try await deleteAndWaitForSync(savedPost) + try await assertModelDoesNotExist(savedComment) + try await assertModelDoesNotExist(savedPost) + } +} + +extension AWSDataStoreLazyLoadPostComment7Tests { + typealias Post = Post7 + typealias Comment = Comment7 + + struct PostComment7Models: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Post7.self) + ModelRegistry.register(modelType: Comment7.self) + } + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Comment7.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Comment7.swift index bdf2ed40ce..5dbc7294de 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Comment7.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL10/Comment7.swift @@ -3,30 +3,57 @@ import Amplify import Foundation public struct Comment7: Model { - public let commentId: String - public let content: String - public var post: Post7? - public var createdAt: Temporal.DateTime? - public var updatedAt: Temporal.DateTime? - - public init(commentId: String, - content: String, - post: Post7? = nil) { - self.init(commentId: commentId, - content: content, - post: post, - createdAt: nil, - updatedAt: nil) - } - internal init(commentId: String, - content: String, - post: Post7? = nil, - createdAt: Temporal.DateTime? = nil, - updatedAt: Temporal.DateTime? = nil) { - self.commentId = commentId - self.content = content - self.post = post - self.createdAt = createdAt - self.updatedAt = updatedAt - } -} \ No newline at end of file + public let commentId: String + public let content: String + internal var _post: LazyModel + public var post: Post7? { + get async throws { + try await _post.get() + } + } + public var createdAt: Temporal.DateTime? + public var updatedAt: Temporal.DateTime? + + public init(commentId: String, + content: String, + post: Post7? = nil) { + self.init(commentId: commentId, + content: content, + post: post, + createdAt: nil, + updatedAt: nil) + } + internal init(commentId: String, + content: String, + post: Post7? = nil, + createdAt: Temporal.DateTime? = nil, + updatedAt: Temporal.DateTime? = nil) { + self.commentId = commentId + self.content = content + self._post = LazyModel(element: post) + self.createdAt = createdAt + self.updatedAt = updatedAt + } + + public mutating func setPost(_ post: Post7?) { + self._post = LazyModel(element: post) + } + + public init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + commentId = try values.decode(String.self, forKey: .commentId) + content = try values.decode(String.self, forKey: .content) + _post = try values.decode(LazyModel.self, forKey: .post) + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) + updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(commentId, forKey: .commentId) + try container.encode(content, forKey: .content) + try container.encode(_post, forKey: .post) + try container.encode(createdAt, forKey: .createdAt) + try container.encode(updatedAt, forKey: .updatedAt) + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/AWSDataStoreLazyLoadPostComment8Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/AWSDataStoreLazyLoadPostComment8Tests.swift new file mode 100644 index 0000000000..4773cb9e5b --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL11/AWSDataStoreLazyLoadPostComment8Tests.swift @@ -0,0 +1,185 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify +import AWSPluginsCore + +final class AWSDataStoreLazyLoadPostComment8Tests: AWSDataStoreLazyLoadBaseTest { + + func testLazyLoad() async throws { + await setup(withModels: PostComment8Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + postId: post.postId, + postTitle: post.title) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + assertComment(savedComment, contains: savedPost) + try await assertPost(savedPost, canLazyLoad: savedComment) + let queriedComment = try await query(for: savedComment) + assertComment(queriedComment, contains: savedPost) + let queriedPost = try await query(for: savedPost) + try await assertPost(queriedPost, canLazyLoad: savedComment) + } + + func assertComment(_ comment: Comment, contains post: Post) { + XCTAssertEqual(comment.postId, post.postId) + XCTAssertEqual(comment.postTitle, post.title) + } + + func assertCommentDoesNotContainPost(_ comment: Comment) { + XCTAssertNil(comment.postId) + XCTAssertNil(comment.postTitle) + } + + func assertPost(_ post: Post, + canLazyLoad comment: Comment) async throws { + guard let comments = post.comments else { + XCTFail("Missing comments on post") + return + } + // This is a bit off, the post.identifier is the CPK while the associated field is just "postId", + // Loading the comments by the post identifier should be + // "query all comments where the predicate is field("@@postForeignKey") == "[postId]#[title]" + // List fetching is broken for this use case "uni directional has-many" + assertList(comments, state: .isNotLoaded(associatedId: post.identifier, + associatedField: "postId")) + try await comments.fetch() + assertList(comments, state: .isLoaded(count: 1)) + guard let comment = comments.first else { + XCTFail("Missing lazy loaded comment from post") + return + } + assertComment(comment, contains: post) + } + + /* + This test fails when the create mutation contains Null values for the foreign keys. On create mutation, we should + be able to detect that the values being set are foreign key fields and remove them from the input + { + "variables" : { + "input" : { + "content" : "content", + "postId" : null, + "commentId" : "532C8869-FD00-4694-A2DE-38223E080206", + "postTitle" : null + } + }, + "query" : "mutation CreateComment8($input: CreateComment8Input!) {\n createComment8(input: $input) {\n commentId\n content\n createdAt\n postId\n postTitle\n updatedAt\n __typename\n _version\n _deleted\n _lastChangedAt\n }\n}" + } + */ + func testSaveWithoutPost() async throws { + await setup(withModels: PostComment8Models(), logLevel: .verbose, eagerLoad: false) + let comment = Comment(commentId: UUID().uuidString, content: "content") + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await query(for: savedComment) + assertCommentDoesNotContainPost(queriedComment) + let post = Post(postId: UUID().uuidString, title: "title") + let savedPost = try await saveAndWaitForSync(post) + queriedComment.postId = savedPost.postId + queriedComment.postTitle = savedPost.title + let saveCommentWithPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedComment2 = try await query(for: saveCommentWithPost) + assertComment(queriedComment2, contains: post) + } + + func testUpdateFromQueriedComment() async throws { + await setup(withModels: PostComment8Models(), logLevel: .verbose, eagerLoad: false) + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + postId: post.postId, + postTitle: post.title) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + let queriedComment = try await query(for: savedComment) + assertComment(queriedComment, contains: post) + let savedQueriedComment = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedComment2 = try await query(for: savedQueriedComment) + assertComment(queriedComment2, contains: savedPost) + } + + func testUpdateToNewPost() async throws { + await setup(withModels: PostComment8Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + postId: post.postId, + postTitle: post.title) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await query(for: savedComment) + assertComment(queriedComment, contains: post) + let newPost = Post(postId: UUID().uuidString, title: "title") + _ = try await saveAndWaitForSync(newPost) + queriedComment.postId = newPost.postId + queriedComment.postTitle = newPost.title + let saveCommentWithNewPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedComment2 = try await query(for: saveCommentWithNewPost) + assertComment(queriedComment2, contains: newPost) + } + + func testUpdateRemovePost() async throws { + await setup(withModels: PostComment8Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + postId: post.postId, + postTitle: post.title) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await query(for: savedComment) + assertComment(queriedComment, contains: post) + + queriedComment.postId = nil + queriedComment.postTitle = nil + + let saveCommentRemovePost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedCommentNoPost = try await query(for: saveCommentRemovePost) + assertCommentDoesNotContainPost(queriedCommentNoPost) + } + + func testDelete() async throws { + await setup(withModels: PostComment8Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + postId: post.postId, + postTitle: post.title) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + try await deleteAndWaitForSync(savedPost) + + // The expected behavior when deleting a post should be that the + // child models are deleted (comment) followed by the parent model (post). + try await assertModelDoesNotExist(savedPost) + // Is there a way to delete the children models in uni directional relationships? + try await assertModelExists(savedComment) + } +} + +extension AWSDataStoreLazyLoadPostComment8Tests { + typealias Post = Post8 + typealias Comment = Comment8 + + struct PostComment8Models: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Post8.self) + ModelRegistry.register(modelType: Comment8.self) + } + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift index 74576248cd..ebe9c06537 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests.swift @@ -27,7 +27,6 @@ final class AWSDataStoreLazyLoadPostCommentWithCompositeKeyTests: AWSDataStoreLa try await assertComment(queriedComment, canLazyLoad: savedPost) let queriedPost = try await query(for: savedPost) try await assertPost(queriedPost, canLazyLoad: savedComment) - printDBPath() } func assertComment(_ comment: Comment, diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/AWSDataStoreLazyLoadPostComment4Tests.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/AWSDataStoreLazyLoadPostComment4Tests.swift new file mode 100644 index 0000000000..2b16946342 --- /dev/null +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL7/AWSDataStoreLazyLoadPostComment4Tests.swift @@ -0,0 +1,183 @@ +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +import Foundation +import Combine +import XCTest + +@testable import Amplify +import AWSPluginsCore + +final class AWSDataStoreLazyLoadPostComment4Tests: AWSDataStoreLazyLoadBaseTest { + + // This is broken for the same reason described in Comment8 tests + func testLazyLoad() async throws { + await setup(withModels: PostComment4Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + post4CommentsPostId: post.postId, + post4CommentsTitle: post.title) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + assertComment(savedComment, contains: savedPost) + try await assertPost(savedPost, canLazyLoad: savedComment) + let queriedComment = try await query(for: savedComment) + assertComment(queriedComment, contains: savedPost) + let queriedPost = try await query(for: savedPost) + try await assertPost(queriedPost, canLazyLoad: savedComment) + } + + func assertComment(_ comment: Comment, contains post: Post) { + XCTAssertEqual(comment.post4CommentsPostId, post.postId) + XCTAssertEqual(comment.post4CommentsTitle, post.title) + } + + func assertCommentDoesNotContainPost(_ comment: Comment) { + XCTAssertNil(comment.post4CommentsPostId) + XCTAssertNil(comment.post4CommentsTitle) + } + + func assertPost(_ post: Post, + canLazyLoad comment: Comment) async throws { + guard let comments = post.comments else { + XCTFail("Missing comments on post") + return + } + assertList(comments, state: .isNotLoaded(associatedId: post.identifier, + associatedField: "post")) + try await comments.fetch() + assertList(comments, state: .isLoaded(count: 1)) + guard let comment = comments.first else { + XCTFail("Missing lazy loaded comment from post") + return + } + assertComment(comment, contains: post) + } + + /* + This test fails when the create mutation contains Null values for the foreign keys. On create mutation, we should + be able to detect that the values being set are foreign key fields and remove them from the input + { + "variables" : { + "input" : { + "post4CommentsPostId" : null, + "post4CommentsTitle" : null, + "commentId" : "A3C577B3-7CAD-4603-947A-FB1EBEC0E8CE", + "content" : "content" + } + }, + "query" : "mutation CreateComment4($input: CreateComment4Input!) {\n createComment4(input: $input) {\n commentId\n content\n createdAt\n post4CommentsPostId\n post4CommentsTitle\n updatedAt\n __typename\n _version\n _deleted\n _lastChangedAt\n }\n}" + } + One or more parameter values were invalid: Type mismatch for Index Key post4CommentsPostId Expected: S Actual: NULL IndexName: gsi-Post4.comments + */ + func testSaveWithoutPost() async throws { + await setup(withModels: PostComment4Models(), logLevel: .verbose, eagerLoad: false) + let comment = Comment(commentId: UUID().uuidString, content: "content") + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await query(for: savedComment) + assertCommentDoesNotContainPost(queriedComment) + let post = Post(postId: UUID().uuidString, title: "title") + let savedPost = try await saveAndWaitForSync(post) + queriedComment.post4CommentsPostId = savedPost.postId + queriedComment.post4CommentsTitle = savedPost.title + let saveCommentWithPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedComment2 = try await query(for: saveCommentWithPost) + assertComment(queriedComment2, contains: post) + } + + func testUpdateFromQueriedComment() async throws { + await setup(withModels: PostComment4Models(), logLevel: .verbose, eagerLoad: false) + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + post4CommentsPostId: post.postId, + post4CommentsTitle: post.title) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + let queriedComment = try await query(for: savedComment) + assertComment(queriedComment, contains: post) + let savedQueriedComment = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedComment2 = try await query(for: savedQueriedComment) + assertComment(queriedComment2, contains: savedPost) + } + + func testUpdateToNewPost() async throws { + await setup(withModels: PostComment4Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + post4CommentsPostId: post.postId, + post4CommentsTitle: post.title) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await query(for: savedComment) + assertComment(queriedComment, contains: post) + let newPost = Post(postId: UUID().uuidString, title: "title") + _ = try await saveAndWaitForSync(newPost) + queriedComment.post4CommentsPostId = newPost.postId + queriedComment.post4CommentsTitle = newPost.title + let saveCommentWithNewPost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedComment2 = try await query(for: saveCommentWithNewPost) + assertComment(queriedComment2, contains: newPost) + } + + func testUpdateRemovePost() async throws { + await setup(withModels: PostComment4Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + post4CommentsPostId: post.postId, + post4CommentsTitle: post.title) + _ = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + var queriedComment = try await query(for: savedComment) + assertComment(queriedComment, contains: post) + + queriedComment.post4CommentsPostId = nil + queriedComment.post4CommentsTitle = nil + + let saveCommentRemovePost = try await saveAndWaitForSync(queriedComment, assertVersion: 2) + let queriedCommentNoPost = try await query(for: saveCommentRemovePost) + assertCommentDoesNotContainPost(queriedCommentNoPost) + } + + func testDelete() async throws { + await setup(withModels: PostComment4Models(), logLevel: .verbose, eagerLoad: false) + + let post = Post(postId: UUID().uuidString, title: "title") + let comment = Comment(commentId: UUID().uuidString, + content: "content", + post4CommentsPostId: post.postId, + post4CommentsTitle: post.title) + let savedPost = try await saveAndWaitForSync(post) + let savedComment = try await saveAndWaitForSync(comment) + try await deleteAndWaitForSync(savedPost) + + // The expected behavior when deleting a post should be that the + // child models are deleted (comment) followed by the parent model (post). + try await assertModelDoesNotExist(savedPost) + // Is there a way to delete the children models in uni directional relationships? + try await assertModelExists(savedComment) + } +} + +extension AWSDataStoreLazyLoadPostComment4Tests { + typealias Post = Post4 + typealias Comment = Comment4 + + struct PostComment4Models: AmplifyModelRegistration { + public let version: String = "version" + func registerModels(registry: ModelRegistry.Type) { + ModelRegistry.register(modelType: Post4.self) + ModelRegistry.register(modelType: Comment4.self) + } + } +} diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift index 97e92793c7..1bf57c9bd4 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LazyLoadBase/AWSDataStoreLazyLoadBaseTest.swift @@ -73,9 +73,7 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { try Amplify.add(plugin: AWSAPIPlugin()) try Amplify.configure(amplifyConfig) - if clearOnTearDown { - try await clearDataStore() - } + try await deleteMutationEvents() } catch { XCTFail("Error during setup: \(error)") } @@ -93,6 +91,10 @@ class AWSDataStoreLazyLoadBaseTest: XCTestCase { } } + func deleteMutationEvents() async throws { + try await Amplify.DataStore.delete(MutationEvent.self, where: QueryPredicateConstant.all) + } + func clearDataStore() async throws { try await Amplify.DataStore.clear() } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj index 727db1cd5f..09e9c58f5c 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/project.pbxproj @@ -155,6 +155,9 @@ 213DBC6328A5841400B30280 /* HubListenerTestUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21BBFE13289C073100B32A39 /* HubListenerTestUtilities.swift */; }; 217AA7BD2909C1D00042CD5D /* AWSDataStoreLazyLoadProjectTeam5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 217AA7BC2909C1D00042CD5D /* AWSDataStoreLazyLoadProjectTeam5Tests.swift */; }; 217AA7BF2909C6330042CD5D /* AWSDataStoreLazyLoadProjectTeam6Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 217AA7BE2909C6330042CD5D /* AWSDataStoreLazyLoadProjectTeam6Tests.swift */; }; + 217AA7C12909ED420042CD5D /* AWSDataStoreLazyLoadPostComment7Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 217AA7C02909ED420042CD5D /* AWSDataStoreLazyLoadPostComment7Tests.swift */; }; + 217AA7C32909EF050042CD5D /* AWSDataStoreLazyLoadPostComment8Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 217AA7C22909EF050042CD5D /* AWSDataStoreLazyLoadPostComment8Tests.swift */; }; + 217AA7C52909F6730042CD5D /* AWSDataStoreLazyLoadPostComment4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 217AA7C42909F6730042CD5D /* AWSDataStoreLazyLoadPostComment4Tests.swift */; }; 21801C7D28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */; }; 21801C8728F9A38000FFA37E /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801C8628F9A37F00FFA37E /* TestConfigHelper.swift */; }; 21801CD428F9A86800FFA37E /* PostWithCompositeKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21801CA328F9A86600FFA37E /* PostWithCompositeKey.swift */; }; @@ -736,6 +739,9 @@ 213DBC5C28A5801900B30280 /* TestConfigHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = ""; }; 217AA7BC2909C1D00042CD5D /* AWSDataStoreLazyLoadProjectTeam5Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadProjectTeam5Tests.swift; sourceTree = ""; }; 217AA7BE2909C6330042CD5D /* AWSDataStoreLazyLoadProjectTeam6Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadProjectTeam6Tests.swift; sourceTree = ""; }; + 217AA7C02909ED420042CD5D /* AWSDataStoreLazyLoadPostComment7Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostComment7Tests.swift; sourceTree = ""; }; + 217AA7C22909EF050042CD5D /* AWSDataStoreLazyLoadPostComment8Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostComment8Tests.swift; sourceTree = ""; }; + 217AA7C42909F6730042CD5D /* AWSDataStoreLazyLoadPostComment4Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadPostComment4Tests.swift; sourceTree = ""; }; 21801C7A28F9A22900FFA37E /* AWSDataStorePluginLazyLoadTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AWSDataStorePluginLazyLoadTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 21801C7C28F9A22900FFA37E /* AWSDataStoreLazyLoadBaseTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSDataStoreLazyLoadBaseTest.swift; sourceTree = ""; }; 21801C8428F9A2DC00FFA37E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; @@ -1569,6 +1575,7 @@ 21801D442902E0DB00FFA37E /* LL7 */ = { isa = PBXGroup; children = ( + 217AA7C42909F6730042CD5D /* AWSDataStoreLazyLoadPostComment4Tests.swift */, 21801CBD28F9A86700FFA37E /* Comment4.swift */, 21801CC528F9A86700FFA37E /* Comment4+Schema.swift */, 21801CBC28F9A86700FFA37E /* Post4.swift */, @@ -1592,10 +1599,11 @@ 21801D462902E0F600FFA37E /* LL10 */ = { isa = PBXGroup; children = ( - 21801CC328F9A86700FFA37E /* Post7.swift */, - 21801CD228F9A86800FFA37E /* Post7+Schema.swift */, + 217AA7C02909ED420042CD5D /* AWSDataStoreLazyLoadPostComment7Tests.swift */, 21801CC428F9A86700FFA37E /* Comment7.swift */, 21801CA728F9A86600FFA37E /* Comment7+Schema.swift */, + 21801CC328F9A86700FFA37E /* Post7.swift */, + 21801CD228F9A86800FFA37E /* Post7+Schema.swift */, ); path = LL10; sourceTree = ""; @@ -1603,10 +1611,11 @@ 21801D472902E0FD00FFA37E /* LL11 */ = { isa = PBXGroup; children = ( - 21801CA828F9A86600FFA37E /* Post8.swift */, - 21801CB828F9A86700FFA37E /* Post8+Schema.swift */, + 217AA7C22909EF050042CD5D /* AWSDataStoreLazyLoadPostComment8Tests.swift */, 21801CB928F9A86700FFA37E /* Comment8.swift */, 21801CD128F9A86800FFA37E /* Comment8+Schema.swift */, + 21801CA828F9A86600FFA37E /* Post8.swift */, + 21801CB828F9A86700FFA37E /* Post8+Schema.swift */, ); path = LL11; sourceTree = ""; @@ -3231,6 +3240,7 @@ 21801D2F29006DA900FFA37E /* Team1.swift in Sources */, 21801D6529097D5800FFA37E /* DefaultPKParent+Schema.swift in Sources */, 21801CE728F9A86800FFA37E /* Project2.swift in Sources */, + 217AA7C32909EF050042CD5D /* AWSDataStoreLazyLoadPostComment8Tests.swift in Sources */, 21801D6A29097D5800FFA37E /* ChildSansBelongsTo+Schema.swift in Sources */, 21801CF728F9A86800FFA37E /* Post8V2+Schema.swift in Sources */, 21801D0128F9A86800FFA37E /* AmplifyModels.swift in Sources */, @@ -3289,10 +3299,12 @@ 21801D6129097D5800FFA37E /* HasOneParent+Schema.swift in Sources */, 21801CF628F9A86800FFA37E /* Comment4+Schema.swift in Sources */, 21801CEB28F9A86800FFA37E /* Post4V2.swift in Sources */, + 217AA7C52909F6730042CD5D /* AWSDataStoreLazyLoadPostComment4Tests.swift in Sources */, 21801CDF28F9A86800FFA37E /* MyCustomModel8+Schema.swift in Sources */, 21801D0828F9B11B00FFA37E /* AsyncExpectation.swift in Sources */, 21801D6429097D5800FFA37E /* CompositePKChild+Schema.swift in Sources */, 21801D3729006DC200FFA37E /* Project5.swift in Sources */, + 217AA7C12909ED420042CD5D /* AWSDataStoreLazyLoadPostComment7Tests.swift in Sources */, 21801D6029097D5800FFA37E /* ImplicitChild.swift in Sources */, 21801CFD28F9A86800FFA37E /* MyCustomModel8.swift in Sources */, 21801D6729097D5800FFA37E /* CompositePKParent+Schema.swift in Sources */, diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/AWSDataStorePluginLazyLoadTests.xcscheme b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/AWSDataStorePluginLazyLoadTests.xcscheme index 7b04b96766..68ce0eaa9a 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/AWSDataStorePluginLazyLoadTests.xcscheme +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/DataStoreHostApp.xcodeproj/xcshareddata/xcschemes/AWSDataStorePluginLazyLoadTests.xcscheme @@ -37,6 +37,20 @@ BlueprintName = "AWSDataStorePluginLazyLoadTests" ReferencedContainer = "container:DataStoreHostApp.xcodeproj"> + + + + + + + + + + From 8e55e6a3aa2cf8710de9924379f69253326deaa2 Mon Sep 17 00:00:00 2001 From: Michael Law <1365977+lawmicha@users.noreply.github.com> Date: Wed, 2 Nov 2022 10:44:15 -0400 Subject: [PATCH 18/18] additional codegen updates on Comment4V2 --- .../AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift | 7 ++++++- .../LL3/CommentWithCompositeKey.swift | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift index 163c71a158..fd61e8a54d 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL1/Comment4V2.swift @@ -43,7 +43,12 @@ public struct Comment4V2: Model { let values = try decoder.container(keyedBy: CodingKeys.self) id = try values.decode(String.self, forKey: .id) content = try values.decode(String.self, forKey: .content) - _post = try values.decode(LazyModel.self, forKey: .post) + do { + _post = try values.decode(LazyModel.self, forKey: .post) + } catch { + _post = LazyModel(identifiers: nil) + } + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) } diff --git a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift index d96f26ebe6..21d686d868 100644 --- a/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift +++ b/AmplifyPlugins/DataStore/Tests/DataStoreHostApp/AWSDataStorePluginLazyLoadTests/LL3/CommentWithCompositeKey.swift @@ -43,7 +43,12 @@ public struct CommentWithCompositeKey: Model { let values = try decoder.container(keyedBy: CodingKeys.self) id = try values.decode(String.self, forKey: .id) content = try values.decode(String.self, forKey: .content) - _post = try values.decode(LazyModel.self, forKey: .post) + do { + _post = try values.decode(LazyModel.self, forKey: .post) + } catch { + _post = LazyModel(identifiers: nil) + } + createdAt = try values.decode(Temporal.DateTime?.self, forKey: .createdAt) updatedAt = try values.decode(Temporal.DateTime?.self, forKey: .updatedAt) }