110 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
"""The tests for the BOM Weather sensor platform."""
 | 
						|
import json
 | 
						|
import re
 | 
						|
import unittest
 | 
						|
from unittest.mock import patch
 | 
						|
from urllib.parse import urlparse
 | 
						|
 | 
						|
import requests
 | 
						|
 | 
						|
from homeassistant.components import sensor
 | 
						|
from homeassistant.components.bom.sensor import BOMCurrentData
 | 
						|
from homeassistant.setup import setup_component
 | 
						|
from tests.common import (
 | 
						|
    assert_setup_component, get_test_home_assistant, load_fixture)
 | 
						|
 | 
						|
VALID_CONFIG = {
 | 
						|
    'platform': 'bom',
 | 
						|
    'station': 'IDN60901.94767',
 | 
						|
    'name': 'Fake',
 | 
						|
    'monitored_conditions': [
 | 
						|
        'apparent_t',
 | 
						|
        'press',
 | 
						|
        'weather'
 | 
						|
    ]
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
def mocked_requests(*args, **kwargs):
 | 
						|
    """Mock requests.get invocations."""
 | 
						|
    class MockResponse:
 | 
						|
        """Class to represent a mocked response."""
 | 
						|
 | 
						|
        def __init__(self, json_data, status_code):
 | 
						|
            """Initialize the mock response class."""
 | 
						|
            self.json_data = json_data
 | 
						|
            self.status_code = status_code
 | 
						|
 | 
						|
        def json(self):
 | 
						|
            """Return the json of the response."""
 | 
						|
            return self.json_data
 | 
						|
 | 
						|
        @property
 | 
						|
        def content(self):
 | 
						|
            """Return the content of the response."""
 | 
						|
            return self.json()
 | 
						|
 | 
						|
        def raise_for_status(self):
 | 
						|
            """Raise an HTTPError if status is not 200."""
 | 
						|
            if self.status_code != 200:
 | 
						|
                raise requests.HTTPError(self.status_code)
 | 
						|
 | 
						|
    url = urlparse(args[0])
 | 
						|
    if re.match(r'^/fwo/[\w]+/[\w.]+\.json', url.path):
 | 
						|
        return MockResponse(json.loads(load_fixture('bom_weather.json')), 200)
 | 
						|
 | 
						|
    raise NotImplementedError('Unknown route {}'.format(url.path))
 | 
						|
 | 
						|
 | 
						|
class TestBOMWeatherSensor(unittest.TestCase):
 | 
						|
    """Test the BOM Weather sensor."""
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        """Set up things to be run when tests are started."""
 | 
						|
        self.hass = get_test_home_assistant()
 | 
						|
        self.config = VALID_CONFIG
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        """Stop everything that was started."""
 | 
						|
        self.hass.stop()
 | 
						|
 | 
						|
    @patch('requests.get', side_effect=mocked_requests)
 | 
						|
    def test_setup(self, mock_get):
 | 
						|
        """Test the setup with custom settings."""
 | 
						|
        with assert_setup_component(1, sensor.DOMAIN):
 | 
						|
            assert setup_component(self.hass, sensor.DOMAIN, {
 | 
						|
                'sensor': VALID_CONFIG})
 | 
						|
 | 
						|
        fake_entities = [
 | 
						|
            'bom_fake_feels_like_c',
 | 
						|
            'bom_fake_pressure_mb',
 | 
						|
            'bom_fake_weather']
 | 
						|
 | 
						|
        for entity_id in fake_entities:
 | 
						|
            state = self.hass.states.get('sensor.{}'.format(entity_id))
 | 
						|
            assert state is not None
 | 
						|
 | 
						|
    @patch('requests.get', side_effect=mocked_requests)
 | 
						|
    def test_sensor_values(self, mock_get):
 | 
						|
        """Test retrieval of sensor values."""
 | 
						|
        assert setup_component(
 | 
						|
            self.hass, sensor.DOMAIN, {'sensor': VALID_CONFIG})
 | 
						|
 | 
						|
        weather = self.hass.states.get('sensor.bom_fake_weather').state
 | 
						|
        assert 'Fine' == weather
 | 
						|
 | 
						|
        pressure = self.hass.states.get('sensor.bom_fake_pressure_mb').state
 | 
						|
        assert '1021.7' == pressure
 | 
						|
 | 
						|
        feels_like = self.hass.states.get('sensor.bom_fake_feels_like_c').state
 | 
						|
        assert '25.0' == feels_like
 | 
						|
 | 
						|
 | 
						|
class TestBOMCurrentData(unittest.TestCase):
 | 
						|
    """Test the BOM data container."""
 | 
						|
 | 
						|
    def test_should_update_initial(self):
 | 
						|
        """Test that the first update always occurs."""
 | 
						|
        bom_data = BOMCurrentData('IDN60901.94767')
 | 
						|
        assert bom_data.should_update() is True
 |