137 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
"""The test for the Facebook notify module."""
 | 
						|
 | 
						|
from http import HTTPStatus
 | 
						|
 | 
						|
import pytest
 | 
						|
import requests_mock
 | 
						|
 | 
						|
import homeassistant.components.facebook.notify as fb
 | 
						|
from homeassistant.core import HomeAssistant
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def facebook() -> fb.FacebookNotificationService:
 | 
						|
    """Fixture for facebook."""
 | 
						|
    access_token = "page-access-token"
 | 
						|
    return fb.FacebookNotificationService(access_token)
 | 
						|
 | 
						|
 | 
						|
async def test_send_simple_message(
 | 
						|
    hass: HomeAssistant, facebook: fb.FacebookNotificationService
 | 
						|
) -> None:
 | 
						|
    """Test sending a simple message with success."""
 | 
						|
    with requests_mock.Mocker() as mock:
 | 
						|
        mock.register_uri(requests_mock.POST, fb.BASE_URL, status_code=HTTPStatus.OK)
 | 
						|
 | 
						|
        message = "This is just a test"
 | 
						|
        target = ["+15555551234"]
 | 
						|
 | 
						|
        facebook.send_message(message=message, target=target)
 | 
						|
        assert mock.called
 | 
						|
        assert mock.call_count == 1
 | 
						|
 | 
						|
        expected_body = {
 | 
						|
            "recipient": {"phone_number": target[0]},
 | 
						|
            "message": {"text": message},
 | 
						|
            "messaging_type": "MESSAGE_TAG",
 | 
						|
            "tag": "ACCOUNT_UPDATE",
 | 
						|
        }
 | 
						|
        assert mock.last_request.json() == expected_body
 | 
						|
 | 
						|
        expected_params = {"access_token": ["page-access-token"]}
 | 
						|
        assert mock.last_request.qs == expected_params
 | 
						|
 | 
						|
 | 
						|
async def test_send_multiple_message(
 | 
						|
    hass: HomeAssistant, facebook: fb.FacebookNotificationService
 | 
						|
) -> None:
 | 
						|
    """Test sending a message to multiple targets."""
 | 
						|
    with requests_mock.Mocker() as mock:
 | 
						|
        mock.register_uri(requests_mock.POST, fb.BASE_URL, status_code=HTTPStatus.OK)
 | 
						|
 | 
						|
        message = "This is just a test"
 | 
						|
        targets = ["+15555551234", "+15555551235"]
 | 
						|
 | 
						|
        facebook.send_message(message=message, target=targets)
 | 
						|
        assert mock.called
 | 
						|
        assert mock.call_count == 2
 | 
						|
 | 
						|
        for idx, target in enumerate(targets):
 | 
						|
            request = mock.request_history[idx]
 | 
						|
            expected_body = {
 | 
						|
                "recipient": {"phone_number": target},
 | 
						|
                "message": {"text": message},
 | 
						|
                "messaging_type": "MESSAGE_TAG",
 | 
						|
                "tag": "ACCOUNT_UPDATE",
 | 
						|
            }
 | 
						|
            assert request.json() == expected_body
 | 
						|
 | 
						|
            expected_params = {"access_token": ["page-access-token"]}
 | 
						|
            assert request.qs == expected_params
 | 
						|
 | 
						|
 | 
						|
async def test_send_message_attachment(
 | 
						|
    hass: HomeAssistant, facebook: fb.FacebookNotificationService
 | 
						|
) -> None:
 | 
						|
    """Test sending a message with a remote attachment."""
 | 
						|
    with requests_mock.Mocker() as mock:
 | 
						|
        mock.register_uri(requests_mock.POST, fb.BASE_URL, status_code=HTTPStatus.OK)
 | 
						|
 | 
						|
        message = "This will be thrown away."
 | 
						|
        data = {
 | 
						|
            "attachment": {
 | 
						|
                "type": "image",
 | 
						|
                "payload": {"url": "http://www.example.com/image.jpg"},
 | 
						|
            }
 | 
						|
        }
 | 
						|
        target = ["+15555551234"]
 | 
						|
 | 
						|
        facebook.send_message(message=message, data=data, target=target)
 | 
						|
        assert mock.called
 | 
						|
        assert mock.call_count == 1
 | 
						|
 | 
						|
        expected_body = {
 | 
						|
            "recipient": {"phone_number": target[0]},
 | 
						|
            "message": data,
 | 
						|
            "messaging_type": "MESSAGE_TAG",
 | 
						|
            "tag": "ACCOUNT_UPDATE",
 | 
						|
        }
 | 
						|
        assert mock.last_request.json() == expected_body
 | 
						|
 | 
						|
        expected_params = {"access_token": ["page-access-token"]}
 | 
						|
        assert mock.last_request.qs == expected_params
 | 
						|
 | 
						|
 | 
						|
async def test_send_targetless_message(
 | 
						|
    hass: HomeAssistant, facebook: fb.FacebookNotificationService
 | 
						|
) -> None:
 | 
						|
    """Test sending a message without a target."""
 | 
						|
    with requests_mock.Mocker() as mock:
 | 
						|
        mock.register_uri(requests_mock.POST, fb.BASE_URL, status_code=HTTPStatus.OK)
 | 
						|
 | 
						|
        facebook.send_message(message="going nowhere")
 | 
						|
        assert not mock.called
 | 
						|
 | 
						|
 | 
						|
async def test_send_message_with_400(
 | 
						|
    hass: HomeAssistant, facebook: fb.FacebookNotificationService
 | 
						|
) -> None:
 | 
						|
    """Test sending a message with a 400 from Facebook."""
 | 
						|
    with requests_mock.Mocker() as mock:
 | 
						|
        mock.register_uri(
 | 
						|
            requests_mock.POST,
 | 
						|
            fb.BASE_URL,
 | 
						|
            status_code=HTTPStatus.BAD_REQUEST,
 | 
						|
            json={
 | 
						|
                "error": {
 | 
						|
                    "message": "Invalid OAuth access token.",
 | 
						|
                    "type": "OAuthException",
 | 
						|
                    "code": 190,
 | 
						|
                    "fbtrace_id": "G4Da2pFp2Dp",
 | 
						|
                }
 | 
						|
            },
 | 
						|
        )
 | 
						|
        facebook.send_message(message="nope!", target=["+15555551234"])
 | 
						|
        assert mock.called
 | 
						|
        assert mock.call_count == 1
 |