func testUpdateRegistrationToAnotherAttendee()

in AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginIntegrationTests/TransformerV2/DataStoreConnectionScenario8V2Tests.swift [121:218]


    func testUpdateRegistrationToAnotherAttendee() throws {
        try startAmplifyAndWaitForSync()
        guard let attendee = saveAttendee(),
              let attendee2 = saveAttendee(),
              let meeting = saveMeeting(),
              var registration = saveRegistration(meeting: meeting, attendee: attendee) else {
                  XCTFail("Could not create attendee, meeting, registration")
                  return
              }
        let createReceived = expectation(description: "Create notification received")
        createReceived.expectedFulfillmentCount = 4 // 4 models (2 attendees and 1 meeting and 1 registration)
        let updateReceived = expectation(description: "Update notification received")

        let hubListener = Amplify.Hub.listen(
            to: .dataStore,
            eventName: HubPayload.EventName.DataStore.syncReceived) { payload in
                guard let mutationEvent = payload.data as? MutationEvent
                else {
                    XCTFail("Can't cast payload as mutation event")
                    return
                }
                if let attendeeEvent = try? mutationEvent.decodeModel() as? Attendee8V2,
                   attendeeEvent.id == attendee.id || attendeeEvent.id == attendee2.id {
                    if mutationEvent.mutationType == GraphQLMutationType.create.rawValue {
                        XCTAssertEqual(mutationEvent.version, 1)
                        createReceived.fulfill()
                        return
                    }

                }

                if let meetingEvent = try? mutationEvent.decodeModel() as? Meeting8V2, meetingEvent.id == meeting.id {
                    if mutationEvent.mutationType == GraphQLMutationType.create.rawValue {
                        XCTAssertEqual(meetingEvent.title, meeting.title)
                        XCTAssertEqual(mutationEvent.version, 1)
                        createReceived.fulfill()
                        return
                    }
                }
                if let registrationEvent = try? mutationEvent.decodeModel() as? Registration8V2,
                   registrationEvent.id == registration.id {
                    if mutationEvent.mutationType == GraphQLMutationType.create.rawValue {
                        XCTAssertEqual(mutationEvent.version, 1)
                        createReceived.fulfill()
                        return
                    } else if mutationEvent.mutationType == GraphQLMutationType.update.rawValue {
                        XCTAssertEqual(mutationEvent.version, 2)
                        updateReceived.fulfill()
                        return
                    }
                }
            }
        guard try HubListenerTestUtilities.waitForListener(with: hubListener, timeout: 5.0) else {
            XCTFail("Listener not registered for hub")
            return
        }
        wait(for: [createReceived], timeout: TestCommonConstants.networkTimeout)

        let updateRegistrationCompleted = expectation(description: "update registration completed")
        registration.attendee = attendee2
        Amplify.DataStore.save(registration) { result in
            switch result {
            case .success(let updatedRegistration):
                XCTAssertEqual(updatedRegistration.attendee.id, attendee2.id)
                updateRegistrationCompleted.fulfill()
            case .failure(let response): XCTFail("Failed with: \(response)")
            }
        }
        wait(for: [updateRegistrationCompleted, updateReceived], timeout: TestCommonConstants.networkTimeout)

        let getAttendeesCompleted = expectation(description: "get attendees completed")
        getAttendeesCompleted.expectedFulfillmentCount = 2
        Amplify.DataStore.query(Attendee8V2.self, byId: attendee.id) { result in
            switch result {
            case .success(let queriedAttendeeOptional):
                guard let queriedAttendee = queriedAttendeeOptional else {
                    XCTFail("Could not get attendee")
                    return
                }
                XCTAssertEqual(queriedAttendee.meetings?.count, 0)
                getAttendeesCompleted.fulfill()
            case .failure(let response): XCTFail("Failed with: \(response)")
            }
        }
        Amplify.DataStore.query(Attendee8V2.self, byId: attendee2.id) { result in
            switch result {
            case .success(let queriedAttendeeOptional):
                guard let queriedAttendee = queriedAttendeeOptional else {
                    XCTFail("Could not get attendee")
                    return
                }
                XCTAssertEqual(queriedAttendee.meetings?.count, 1)
                getAttendeesCompleted.fulfill()
            case .failure(let response): XCTFail("Failed with: \(response)")
            }
        }
        wait(for: [getAttendeesCompleted], timeout: TestCommonConstants.networkTimeout)
    }