def test_host_request_email(db): with session_scope() as session: to_user, api_token_to = generate_user() # little trick here to get the upload correctly without invalidating users key = random_hex(32) filename = random_hex(32) + ".jpg" session.add( Upload( key=key, filename=filename, creator_user_id=to_user.id, )) session.commit() from_user, api_token_from = generate_user(avatar_key=key) from_date = "2020-01-01" to_date = "2020-01-05" conversation = Conversation() message = Message( conversation=conversation, author_id=from_user.id, text=random_hex(64), message_type=MessageType.text, ) host_request = HostRequest( conversation=conversation, from_user=from_user, to_user=to_user, from_date=from_date, to_date=to_date, status=HostRequestStatus.pending, from_last_seen_message_id=message.id, ) session.add(host_request) with patch("couchers.email.queue_email") as mock: send_host_request_email(host_request) assert mock.call_count == 1 (sender_name, sender_email, recipient, subject, plain, html), _ = mock.call_args assert recipient == to_user.email assert "host request" in subject.lower() assert to_user.name in plain assert to_user.name in html assert from_user.name in plain assert from_user.name in html assert from_date in plain assert from_date in html assert to_date in plain assert to_date in html assert from_user.avatar.thumbnail_url not in plain assert from_user.avatar.thumbnail_url in html assert f"{config['BASE_URL']}/messages/hosting/" in plain assert f"{config['BASE_URL']}/messages/hosting/" in html
def test_host_request_email(db): with session_scope(db) as session: from_user, api_token_from = generate_user(db) to_user, api_token_to = generate_user(db) from_date = "2020-01-01" to_date = "2020-01-05" conversation = Conversation() message = Message() message.conversation_id = conversation.id message.author_id = from_user.id message.text = random_hex(64) host_request = HostRequest( conversation_id=conversation.id, from_user=from_user, to_user=to_user, from_date=from_date, to_date=to_date, status=HostRequestStatus.pending, from_last_seen_message_id=message.id, ) message_id = random_hex(64) @create_autospec def mock_send_email(sender_name, sender_email, recipient, subject, plain, html): assert recipient == to_user.email assert "host request" in subject.lower() assert to_user.name in plain assert to_user.name in html assert from_user.name in plain assert from_user.name in html assert from_date in plain assert from_date in html assert to_date in plain assert to_date in html assert from_user.avatar_url not in plain assert from_user.avatar_url in html assert f"{config['BASE_URL']}/hostrequests/" in plain assert f"{config['BASE_URL']}/hostrequests/" in html return message_id with patch("couchers.email.send_email", mock_send_email) as mock: send_host_request_email(host_request) assert mock.call_count == 1
def GetHostRequest(self, request, context): with session_scope(self._Session) as session: host_request = ( session.query(HostRequest) .filter(HostRequest.conversation_id == request.host_request_id) .filter(or_(HostRequest.from_user_id == context.user_id, HostRequest.to_user_id == context.user_id)) .one_or_none() ) if not host_request: context.abort(grpc.StatusCode.NOT_FOUND, errors.HOST_REQUEST_NOT_FOUND) initial_message = ( session.query(Message.time) .filter(Message.conversation_id == host_request.conversation_id) .order_by(Message.id.asc()) .limit(1) .one() ) latest_message = ( session.query(Message) .filter(Message.conversation_id == host_request.conversation_id) .order_by(Message.id.desc()) .limit(1) .one() ) send_host_request_email(host_request) return requests_pb2.HostRequest( host_request_id=host_request.conversation_id, from_user_id=host_request.from_user_id, to_user_id=host_request.to_user_id, status=hostrequeststatus2api[host_request.status], created=Timestamp_from_datetime(initial_message.time), from_date=host_request.from_date, to_date=host_request.to_date, last_seen_message_id=host_request.from_last_seen_message_id if context.user_id == host_request.from_user_id else host_request.to_last_seen_message_id, latest_message=message_to_pb(latest_message), )
def CreateHostRequest(self, request, context): with session_scope() as session: if request.to_user_id == context.user_id: context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.CANT_REQUEST_SELF) # just to check the host exists host = session.query(User).filter( User.id == request.to_user_id).one_or_none() if not host: context.abort(grpc.StatusCode.NOT_FOUND, errors.USER_NOT_FOUND) from_date = parse_date(request.from_date) to_date = parse_date(request.to_date) if not from_date or not to_date: context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.INVALID_DATE) today = today_in_timezone(host.timezone) # request starts from the past if from_date < today: context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.DATE_FROM_BEFORE_TODAY) # from_date is not >= to_date if from_date >= to_date: context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.DATE_FROM_AFTER_TO) # No need to check today > to_date if from_date - today > timedelta(days=365): context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.DATE_FROM_AFTER_ONE_YEAR) if to_date - from_date > timedelta(days=365): context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.DATE_TO_AFTER_ONE_YEAR) conversation = Conversation() session.add(conversation) session.flush() session.add( Message( conversation_id=conversation.id, author_id=context.user_id, message_type=MessageType.chat_created, )) message = Message( conversation_id=conversation.id, author_id=context.user_id, text=request.text, message_type=MessageType.text, ) session.add(message) session.flush() host_request = HostRequest( conversation_id=conversation.id, from_user_id=context.user_id, to_user_id=host.id, from_date=from_date, to_date=to_date, status=HostRequestStatus.pending, from_last_seen_message_id=message.id, # TODO: tz # timezone=host.timezone, ) session.add(host_request) session.flush() send_host_request_email(host_request) return requests_pb2.CreateHostRequestRes( host_request_id=host_request.conversation_id)
def CreateHostRequest(self, request, context): with session_scope() as session: if request.to_user_id == context.user_id: context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.CANT_REQUEST_SELF) # just to check the host exists host = session.query(User).filter( User.id == request.to_user_id).one_or_none() if not host: context.abort(grpc.StatusCode.NOT_FOUND, errors.USER_NOT_FOUND) if not is_valid_date(request.from_date) or not is_valid_date( request.to_date): context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.INVALID_DATE) # today is not > from_date if least_current_date() > request.from_date: context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.DATE_FROM_BEFORE_TODAY) # from_date is not >= to_date if request.from_date >= request.to_date: context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.DATE_FROM_AFTER_TO) # No need to check today > to_date today = date.fromisoformat(largest_current_date()) today_plus_one_year = today.replace(year=today.year + 1).isoformat() if request.from_date > today_plus_one_year: context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.DATE_FROM_AFTER_ONE_YEAR) from_date = date.fromisoformat(request.from_date) from_date_plus_one_year = (from_date.replace(year=from_date.year + 1)).isoformat() if request.to_date > from_date_plus_one_year: context.abort(grpc.StatusCode.INVALID_ARGUMENT, errors.DATE_TO_AFTER_ONE_YEAR) conversation = Conversation() session.add(conversation) session.flush() created_message = Message() created_message.conversation_id = conversation.id created_message.author_id = context.user_id created_message.message_type = MessageType.chat_created session.add(created_message) session.commit() message = Message() message.conversation_id = conversation.id message.author_id = context.user_id message.text = request.text message.message_type = MessageType.text session.add(message) session.flush() host_request = HostRequest() host_request.conversation_id = conversation.id host_request.from_user_id = context.user_id host_request.to_user_id = host.id host_request.from_date = request.from_date host_request.to_date = request.to_date host_request.status = HostRequestStatus.pending host_request.from_last_seen_message_id = message.id session.add(host_request) session.flush() send_host_request_email(host_request) return requests_pb2.CreateHostRequestRes( host_request_id=host_request.conversation_id)