def testRegisterForConference(self):
        """ TEST: Register user for selected conference."""
        self.initDatabase()

        # verify database fixture
        self.login()
        prof = ndb.Key(Profile, self.getUserId()).get()
        conf = Conference.query(Conference.name == 'room #2').get()
        assert conf and conf.seatsAvailable == 1 and len(prof.conferenceKeysToAttend) == 0, \
            "This shouldn't fail. Maybe someone messed with database fixture"

        container = CONF_GET_REQUEST.combined_message_class(
            websafeConferenceKey=conf.key.urlsafe(),
        )

        # register to conference
        r = self.api.registerForConference(container)

        # re-fetch profile and conference, then check if user was properly registered
        prof = prof.key.get()
        conf = conf.key.get()
        assert r.data, 'Returned an invalid response'
        assert len(prof.conferenceKeysToAttend) == 1, "Failed to add conference to user's conferenceKeysToAttend"
        assert conf.seatsAvailable == 0, 'Failed to decrement available seats'

        # Verify users cant re-register to conferences that are already in user's conferenceKeysToAttend.
        container = CONF_GET_REQUEST.combined_message_class(
            websafeConferenceKey=conf.key.urlsafe(),
        )
        try:
            r = self.api.registerForConference(container)
            assert False, 'ConflictException should of been thrown...'
        except ConflictException:
            pass
        # re-fetch profile and check that the user wasn't re-registered
        prof = prof.key.get()
        assert len(prof.conferenceKeysToAttend) == 1, "User's can't registered to the same conference"

        # Login as a different user and attempt to register a conference with zero seats available
        self.login(email='*****@*****.**')
        prof = ndb.Key(Profile, self.getUserId()).get()
        assert len(prof.conferenceKeysToAttend) == 0, "This shouldn't fail. Maybe someone messed with database fixture"
        try:
            r = self.api.registerForConference(container)
            assert False, 'ConflictException should of been thrown...'
        except ConflictException:
            pass
        # re-fetch profile and conference
        prof = prof.key.get()
        conf = conf.key.get()
        assert len(prof.conferenceKeysToAttend) == 0, "User's can't register to a conference with zero seats available."
        assert conf.seatsAvailable == 0, "seatsAvailable shouldn't have changed since user never registered..."
    def testUnregisterFromConference(self):
        """ TEST: Unregister user for selected conference."""
        self.initDatabase()

        # verify database fixture
        self.login()
        prof = ndb.Key(Profile, self.getUserId()).get()
        conf = Conference.query(Conference.name == 'room #2').get()
        assert conf and conf.seatsAvailable == 1 and len(prof.conferenceKeysToAttend) == 0, \
            "This shouldn't fail. Maybe someone messed with database fixture"

        prof.conferenceKeysToAttend.append(conf.key)
        prof.put()

        container = CONF_GET_REQUEST.combined_message_class(
            websafeConferenceKey=conf.key.urlsafe(),
        )

        # unregister conference
        r = self.api.unregisterFromConference(container)

        # re-fetch profile and conference, then check if user was properly unregistered
        prof = prof.key.get()
        conf = conf.key.get()
        assert r.data, 'Returned an invalid response'
        assert len(prof.conferenceKeysToAttend) == 0, "Failed to remove conference from user's conferenceKeysToAttend"
        assert conf.seatsAvailable == 2, 'Failed to increment available seats'
    def testGetConference(self):
        """ TEST: Return requested conference (by websafeConferenceKey) """
        self.initDatabase()

        self.login()
        conf = Conference.query(ancestor=ndb.Key(Profile, self.getUserId())).get()

        container = CONF_GET_REQUEST.combined_message_class(
            websafeConferenceKey=conf.key.urlsafe(),
        )

        r = self.api.getConference(container)
        assert r.websafeKey == conf.key.urlsafe(), 'Returned an invalid conference'
    def testGetConferenceSessions(self):
        """ TEST: Return all sessions for a given conference"""
        self.initDatabase()

        conf = Conference.query(Conference.name == 'room #1').fetch(1)[0]
        container = CONF_GET_REQUEST.combined_message_class(websafeConferenceKey=conf.key.urlsafe())
        # manually fetch conference sessions and compare it against response
        sessions = {str(s.key.urlsafe()): s for s in conf.sessions.fetch()}

        r = self.api.getConferenceSessions(container)
        r_sessions = r.items

        assert len(r_sessions) == len(sessions), 'returned an invalid number of sessions'
        for r_session in r_sessions:
            assert sessions[r_session.websafeKey], 'returned an invalid session websafeKey'