Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to mock a sendgrid web api v.3 method in python

I'm trying to test that a SendGrid method was called without sending an email. When I run my test, the method is not patched and instead runs the original method which sends an email. I'm not sure why my patch is not working. This question is similar to How to mock a SendGrid method in Python but using a different version of SendGrid.

# api/Login/utils_test.py
from .utils import send_email
from unittest.mock import patch

@patch('api.Login.utils.sg.client.mail.send.post')
def test_send_email(mock_mail_send):
    send_email(email, subject, html)
    assert mock_mail_send.called

# api/Login/utils.py
from api import sg

def send_email(email, subject, html):
    msg = create_email(email, subject, html)
    request_body = msg.get()
    response = sg.client.mail.send.post(request_body=request_body)

# api/__init__.py
from server import sg

# server.py
import sendgrid
import os
sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))

Currently when I run pytest Login/utils_test.py from inside the api directory, I get an AssertionError:

assert False
+  where False = <MagicMock name='post' id='4370000808'>.called

I expect the test to pass with no output.

like image 721
happysachan Avatar asked Aug 03 '26 02:08

happysachan


2 Answers

Found a workaround from the sendgrid-python repo issues https://github.com/sendgrid/sendgrid-python/issues/293

Going to wrap the call because patch doesn't seem to be working with SendGrid web api v.3 and it doesn't look like they are going to support it.

Updating to the following:

# api/utils.py
def send_email(email, subject, html):
    msg = create_email(email, subject, html)
    request_body = msg.get()
    response = _send_email(request_body)
    print(response.status_code)
    print(response.body)
    print(response.headers)


def _send_email(request_body):
    """Wrapping the SendGrid mail sending method in order to patch it
    while testing. https://github.com/sendgrid/sendgrid-
    python/issues/293"""
    response = sg.client.mail.send.post(request_body=request_body)
    return response

# api/utils_test.py
@patch('api.Login.utils._send_email')
def test_send_email(mock_mail_send):
    send_email(email, subject, html)
    assert mock_mail_send.called
like image 82
happysachan Avatar answered Aug 05 '26 19:08

happysachan


Not on the Python side, but on the SendGrid side, have you tried using sandbox mode?

like image 23
jacobmovingfwd Avatar answered Aug 05 '26 18:08

jacobmovingfwd



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!