async def validate_input(hass: core.HomeAssistant, data): """ Validate the user input allows us to connect. Data has the keys from DATA_SCHEMA with values provided by the user. """ session = async_get_clientsession(hass) client = WebServiceAPI(data[CONF_API_KEY], session=session) lat = data[CONF_LATITUDE] lng = data[CONF_LONGITUDE] distance = data[CONF_RADIUS] # Check that the provided latitude/longitude provide a response try: test_data = await client.observations.latLong(lat, lng, distance=distance) except InvalidKeyError as exc: raise InvalidAuth from exc except AirNowError as exc: raise CannotConnect from exc if not test_data: raise InvalidLocation # Validation Succeeded return True
async def get_current_ll(args: argparse.Namespace) -> None: '''Print current observation information for a latitude and longitude''' client = WebServiceAPI(args.api_key) data = await client.observations.latLong( *llArgs(args), **optionalArgs(args), ) print(data)
async def get_current_zip(args: argparse.Namespace) -> None: '''Print current observation information for a zip code''' client = WebServiceAPI(args.api_key) data = await client.observations.zipCode( args.zipcode, **optionalArgs(args), ) print(data)
def __init__( self, hass, session, api_key, latitude, longitude, distance, update_interval ): """Initialize.""" self.latitude = latitude self.longitude = longitude self.distance = distance self.airnow = WebServiceAPI(api_key, session=session) super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=update_interval)
async def test_api_observations_zipcode(mock_airnowapi): client = WebServiceAPI(MOCK_API_KEY) data = await client.observations.zipCode(90001) assert isinstance(data, list) assert len(data) == 1 assert data[0]['type'] == 'observation' assert data[0]['mode'] == 'zipCode' assert data[0]['when'] == 'current' assert 'zipCode' in data[0]['query'] assert data[0]['query']['zipCode'] == '90001'
async def test_api_forecast_zipcode(mock_airnowapi): client = WebServiceAPI(MOCK_API_KEY) data = await client.forecast.zipCode(90001) assert isinstance(data, list) assert len(data) == 1 assert data[0]['type'] == 'forecast' assert data[0]['mode'] == 'zipCode' assert data[0]['when'] is None assert 'zipCode' in data[0]['query'] assert data[0]['query']['zipCode'] == '90001'
async def test_api_observations_ll(mock_airnowapi): client = WebServiceAPI(MOCK_API_KEY) data = await client.observations.latLong(34.053718, -118.244842) assert isinstance(data, list) assert len(data) == 1 assert data[0]['type'] == 'observation' assert data[0]['mode'] == 'latLong' assert data[0]['when'] == 'current' assert 'latitude' in data[0]['query'] assert data[0]['query']['latitude'] == '34.053718' assert 'longitude' in data[0]['query'] assert data[0]['query']['longitude'] == '-118.244842'
async def test_api_forecast_zipcode_date_datetime(mock_airnowapi): client = WebServiceAPI(MOCK_API_KEY) data = await client.forecast.zipCode(90001, date=datetime.datetime( 2020, 9, 1, 11, 45, 1)) assert isinstance(data, list) assert len(data) == 1 assert data[0]['type'] == 'forecast' assert data[0]['mode'] == 'zipCode' assert data[0]['when'] is None assert 'zipCode' in data[0]['query'] assert data[0]['query']['zipCode'] == '90001' assert 'date' in data[0]['query'] assert data[0]['query']['date'] == '2020-09-01'
async def test_api_forecast_ll_distance(mock_airnowapi): client = WebServiceAPI(MOCK_API_KEY) data = await client.forecast.latLong(34.053718, -118.244842, distance=120) assert isinstance(data, list) assert len(data) == 1 assert data[0]['type'] == 'forecast' assert data[0]['mode'] == 'latLong' assert data[0]['when'] is None assert 'latitude' in data[0]['query'] assert data[0]['query']['latitude'] == '34.053718' assert 'longitude' in data[0]['query'] assert data[0]['query']['longitude'] == '-118.244842' assert 'distance' in data[0]['query'] assert data[0]['query']['distance'] == '120'
async def test_api_forecast_ll_date_datetime(mock_airnowapi): client = WebServiceAPI(MOCK_API_KEY) data = await client.forecast.latLong(34.053718, -118.244842, date=datetime.datetime( 2020, 9, 1, 11, 45, 0)) assert isinstance(data, list) assert len(data) == 1 assert data[0]['type'] == 'forecast' assert data[0]['mode'] == 'latLong' assert data[0]['when'] is None assert 'latitude' in data[0]['query'] assert data[0]['query']['latitude'] == '34.053718' assert 'longitude' in data[0]['query'] assert data[0]['query']['longitude'] == '-118.244842' assert 'date' in data[0]['query'] assert data[0]['query']['date'] == '2020-09-01'
async def test_api_unexpected_error_2(mock_airnowapi): client = WebServiceAPI(MOCK_API_KEY) with pytest.raises(AirNowError) as exc_info: await client.forecast.zipCode('error2') assert 'Internal Server Error' in str(exc_info.value)
async def test_api_empty_response(mock_airnowapi): client = WebServiceAPI(MOCK_API_KEY) with pytest.raises(EmptyResponseError): await client.forecast.zipCode('empty')
async def test_api_bad_json_2(mock_airnowapi): client = WebServiceAPI(MOCK_API_KEY) with pytest.raises(InvalidJsonError): await client.forecast.zipCode('dict')
async def test_api_invalid_key(mock_airnowapi): client = WebServiceAPI('123ABC') with pytest.raises(InvalidKeyError) as exc_info: await client.forecast.zipCode(90001) assert 'Invalid API key' in str(exc_info.value)
async def test_api_not_authenticated(mock_airnowapi): client = WebServiceAPI('') with pytest.raises(InvalidKeyError) as exc_info: await client.forecast.zipCode(90001) assert 'not authenticated' in str(exc_info.value)
async def get_forecast_zip(args: argparse.Namespace) -> None: '''Print forecast information for a zip code''' client = WebServiceAPI(args.api_key) data = await client.forecast.zipCode(args.zipcode, **optionalArgs(args)) print(data)
async def get_forecast_ll(args: argparse.Namespace) -> None: '''Print forecast information for a latitude and longitude''' client = WebServiceAPI(args.api_key) data = await client.forecast.latLong(*llArgs(args), **optionalArgs(args)) print(data)