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
예제 #2
0
파일: cli.py 프로젝트: asymworks/pyairnow
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)
예제 #3
0
파일: cli.py 프로젝트: asymworks/pyairnow
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)
예제 #4
0
    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)
예제 #5
0
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'
예제 #6
0
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'
예제 #7
0
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'
예제 #8
0
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'
예제 #9
0
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'
예제 #10
0
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'
예제 #11
0
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)
예제 #12
0
async def test_api_empty_response(mock_airnowapi):
    client = WebServiceAPI(MOCK_API_KEY)
    with pytest.raises(EmptyResponseError):
        await client.forecast.zipCode('empty')
예제 #13
0
async def test_api_bad_json_2(mock_airnowapi):
    client = WebServiceAPI(MOCK_API_KEY)
    with pytest.raises(InvalidJsonError):
        await client.forecast.zipCode('dict')
예제 #14
0
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)
예제 #15
0
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)
예제 #16
0
파일: cli.py 프로젝트: asymworks/pyairnow
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)
예제 #17
0
파일: cli.py 프로젝트: asymworks/pyairnow
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)