def login_user(osm_user_details, redirect_to, user_element='user') -> str: """ Generates authentication details for user, creating in DB if user is unknown to us :param osm_user_details: XML response from OSM :param redirect_to: Route to redirect user to, from callback url :param user_element: Exists for unit testing :raises AuthServiceError :returns Authorized URL with authentication details in query string """ osm_user = osm_user_details.find(user_element) if osm_user is None: raise AuthServiceError('User element not found in OSM response') osm_id = int(osm_user.attrib['id']) username = osm_user.attrib['display_name'] try: UserService.get_user_by_id(osm_id) except NotFound: # User not found, so must be new user changesets = osm_user.find('changesets') changeset_count = int(changesets.attrib['count']) new_user = UserService.register_user(osm_id, username, changeset_count) MessageService.send_welcome_message(new_user) session_token = AuthenticationService.generate_session_token_for_user( osm_id) authorized_url = AuthenticationService.generate_authorized_url( username, session_token, redirect_to) return authorized_url
def test_welcome_message_sent(self): if self.skip_tests: return # Act message_id = MessageService.send_welcome_message(self.test_user) message = MessageService.get_message(message_id, self.test_user.id) # Assert self.assertTrue(message, 'Message should be saved to DB') # Tidyup MessageService.delete_message(message_id, self.test_user.id)