"""The tests for the webhook automation trigger."""
import pytest

from homeassistant.core import callback
from homeassistant.setup import async_setup_component


@pytest.fixture(autouse=True)
async def setup_http(hass):
    """Set up http."""
    assert await async_setup_component(hass, 'http', {})
    assert await async_setup_component(hass, 'webhook', {})


async def test_webhook_json(hass, aiohttp_client):
    """Test triggering with a JSON webhook."""
    events = []

    @callback
    def store_event(event):
        """Helepr to store events."""
        events.append(event)

    hass.bus.async_listen('test_success', store_event)

    assert await async_setup_component(hass, 'automation', {
        'automation': {
            'trigger': {
                'platform': 'webhook',
                'webhook_id': 'json_webhook'
            },
            'action': {
                'event': 'test_success',
                'event_data_template': {
                    'hello': 'yo {{ trigger.json.hello }}',
                }
            }
        }
    })

    client = await aiohttp_client(hass.http.app)

    await client.post('/api/webhook/json_webhook', json={
        'hello': 'world'
    })

    assert len(events) == 1
    assert events[0].data['hello'] == 'yo world'


async def test_webhook_post(hass, aiohttp_client):
    """Test triggering with a POST webhook."""
    events = []

    @callback
    def store_event(event):
        """Helepr to store events."""
        events.append(event)

    hass.bus.async_listen('test_success', store_event)

    assert await async_setup_component(hass, 'automation', {
        'automation': {
            'trigger': {
                'platform': 'webhook',
                'webhook_id': 'post_webhook'
            },
            'action': {
                'event': 'test_success',
                'event_data_template': {
                    'hello': 'yo {{ trigger.data.hello }}',
                }
            }
        }
    })

    client = await aiohttp_client(hass.http.app)

    await client.post('/api/webhook/post_webhook', data={
        'hello': 'world'
    })

    assert len(events) == 1
    assert events[0].data['hello'] == 'yo world'


async def test_webhook_query(hass, aiohttp_client):
    """Test triggering with a query POST webhook."""
    events = []

    @callback
    def store_event(event):
        """Helepr to store events."""
        events.append(event)

    hass.bus.async_listen('test_success', store_event)

    assert await async_setup_component(hass, 'automation', {
        'automation': {
            'trigger': {
                'platform': 'webhook',
                'webhook_id': 'query_webhook'
            },
            'action': {
                'event': 'test_success',
                'event_data_template': {
                    'hello': 'yo {{ trigger.query.hello }}',
                }
            }
        }
    })

    client = await aiohttp_client(hass.http.app)

    await client.post('/api/webhook/query_webhook?hello=world')

    assert len(events) == 1
    assert events[0].data['hello'] == 'yo world'