// // 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 extension GraphQLLazyLoadCompositePKTests { // MARK: - CompositePKParent / StrangeExplicitChild func initStrangeExplicitChild(with parent: CompositePKParent) -> StrangeExplicitChild { StrangeExplicitChild(strangeId: UUID().uuidString, content: "content", parent: parent) } func testSaveStrangeExplicitChild() async throws { await setup(withModels: CompositePKModels()) let parent = initParent() let savedParent = try await mutate(.create(parent)) let child = initStrangeExplicitChild(with: savedParent) try await mutate(.create(child)) } func testUpdateStrangeExplicitChild() async throws { await setup(withModels: CompositePKModels()) let parent = initParent() let savedParent = try await mutate(.create(parent)) let child = initStrangeExplicitChild(with: parent) var savedChild = try await mutate(.create(child)) let loadedParent = try await savedChild.parent XCTAssertEqual(loadedParent.identifier, savedParent.identifier) // update the child to a new parent let newParent = initParent() let savedNewParent = try await mutate(.create(newParent)) savedChild.setParent(savedNewParent) let updatedChild = try await mutate(.update(savedChild)) let loadedNewParent = try await updatedChild.parent XCTAssertEqual(loadedNewParent.identifier, savedNewParent.identifier) } func testDeleteStrangeExplicitChild() async throws { await setup(withModels: CompositePKModels()) let parent = initParent() let savedParent = try await mutate(.create(parent)) let child = initStrangeExplicitChild(with: parent) let savedChild = try await mutate(.create(child)) try await mutate(.delete(savedChild)) try await assertModelDoesNotExist(savedChild) try await mutate(.delete(savedParent)) try await assertModelDoesNotExist(savedParent) } func testGetStrangeExplicitChild() async throws { await setup(withModels: CompositePKModels()) let parent = initParent() let savedParent = try await mutate(.create(parent)) let child = initStrangeExplicitChild(with: parent) let savedChild = try await mutate(.create(child)) // query parent and load the children let queriedParent = try await query(.get(CompositePKParent.self, byIdentifier: .identifier(customId: savedParent.customId, content: savedParent.content)))! assertList(queriedParent.strangeChildren!, state: .isNotLoaded(associatedIdentifiers: [queriedParent.customId, queriedParent.content], associatedFields: ["parent"])) try await queriedParent.strangeChildren?.fetch() assertList(queriedParent.strangeChildren!, state: .isLoaded(count: 1)) // query children and load the parent - StrangeExplicitChild let queriedStrangeImplicitChild = try await query(.get(StrangeExplicitChild.self, byIdentifier: .identifier(strangeId: savedChild.strangeId, content: savedChild.content)))! assertLazyReference(queriedStrangeImplicitChild._parent, state: .notLoaded(identifiers: [.init(name: "customId", value: savedParent.customId), .init(name: "content", value: savedParent.content)])) let loadedParent3 = try await queriedStrangeImplicitChild.parent assertLazyReference(queriedStrangeImplicitChild._parent, state: .loaded(model: loadedParent3)) } func testListStrangeExplicitChild() async throws { await setup(withModels: CompositePKModels()) let parent = initParent() let savedParent = try await mutate(.create(parent)) let child = initStrangeExplicitChild(with: savedParent) try await mutate(.create(child)) var queriedChild = try await listQuery( .list(StrangeExplicitChild.self, where: StrangeExplicitChild.keys.strangeId == child.strangeId && StrangeExplicitChild.keys.content == child.content)) while queriedChild.hasNextPage() { queriedChild = try await queriedChild.getNextPage() } assertList(queriedChild, state: .isLoaded(count: 1)) } }