func testDeleteParentEmitsMutationEventsForParentAndChild()

in AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginTests/Storage/StorageEngineTestsHasMany.swift [53:114]


    func testDeleteParentEmitsMutationEventsForParentAndChild() {
        let dreamRestaurant = Restaurant(restaurantName: "Dream Cafe")
        let lunchSpecialMenu = Menu(name: "Specials", menuType: .lunch, restaurant: dreamRestaurant)
        let lunchStandardMenu = Menu(name: "Standard", menuType: .lunch, restaurant: dreamRestaurant)
        let oysters = Dish(dishName: "Fried oysters", menu: lunchSpecialMenu)
        let katsuCurry = Dish(dishName: "Katsu Curry", menu: lunchStandardMenu)
        let uniPasta = Dish(dishName: "Uni Pasta", menu: lunchStandardMenu)

        let smoneysRestaurant = Restaurant(restaurantName: "Smoney's")
        let smoneysMenu = Menu(name: "official menu", menuType: .breakfast, restaurant: smoneysRestaurant)
        let eggsAndSausage = Dish(dishName: "Eggs and Sausage", menu: smoneysMenu)

        let mkDonaldsRestaurant = Restaurant(restaurantName: "MkDonald's")
        let mkDonaldsMenu = Menu(name: "All day", menuType: .lunch, restaurant: mkDonaldsRestaurant)
        let szechuanSauce = Dish(dishName: "10-piece MkNugget and a bunch of the Szechuan Sauce", menu: mkDonaldsMenu)

        guard case .success = saveModelSynchronous(model: dreamRestaurant),
            case .success = saveModelSynchronous(model: lunchSpecialMenu),
            case .success = saveModelSynchronous(model: lunchStandardMenu),
            case .success = saveModelSynchronous(model: oysters),
            case .success = saveModelSynchronous(model: katsuCurry),
            case .success = saveModelSynchronous(model: uniPasta),
            case .success = saveModelSynchronous(model: smoneysRestaurant),
            case .success = saveModelSynchronous(model: smoneysMenu),
            case .success = saveModelSynchronous(model: eggsAndSausage),
            case .success = saveModelSynchronous(model: mkDonaldsRestaurant),
            case .success = saveModelSynchronous(model: mkDonaldsMenu),
            case .success = saveModelSynchronous(model: szechuanSauce) else {
                XCTFail("Failed to save hierarchy")
                return
        }

        guard case .success =
            querySingleModelSynchronous(modelType: Restaurant.self,
                                        predicate: Restaurant.keys.id == dreamRestaurant.id) else {
                XCTFail("Failed to query Restaurant")
                return
        }
        guard case .success =
            queryModelSynchronous(modelType: Menu.self, predicate: Menu.keys.restaurant == dreamRestaurant.id) else {
                XCTFail("Failed to query Menu")
                return
        }
        guard case .success(let dishes) =
            queryModelSynchronous(modelType: Dish.self, predicate: Dish.keys.menu == lunchStandardMenu.id) else {
                XCTFail("Failed to query Dishes")
                return
        }
        XCTAssertEqual(dishes.count, 2)

        let receivedMutationEvent = expectation(description: "Mutation Events submitted to sync engine")
        receivedMutationEvent.expectedFulfillmentCount = 6
        syncEngine.setCallbackOnSubmit(callback: { _ in
            receivedMutationEvent.fulfill()
        })
        guard case .success = deleteModelSynchronousOrFailOtherwise(modelType: Restaurant.self,
                                                                    withId: dreamRestaurant.id) else {
            XCTFail("Failed to delete restaurant")
            return
        }
        wait(for: [receivedMutationEvent], timeout: defaultTimeout)
    }