Esempio n. 1
0
def test_add_symbol(hass):
    """Test check for existing symbols."""
    coordinator = YahooSymbolUpdateCoordinator([], hass, DEFAULT_SCAN_INTERVAL)

    with patch(f"{YSUC}.async_request_refresh"):
        assert coordinator.add_symbol(TEST_SYMBOL) is True
        assert TEST_SYMBOL in coordinator.get_symbols()
Esempio n. 2
0
async def test_add_symbol(hass):
    """Add symbol for load."""
    mock_coordinator = YahooSymbolUpdateCoordinator([], hass,
                                                    DEFAULT_SCAN_INTERVAL)

    with patch(
            "homeassistant.helpers.event.async_call_later") as mock_call_later:
        assert mock_coordinator.add_symbol(TEST_SYMBOL) is True
        assert TEST_SYMBOL in mock_coordinator.get_symbols()
        assert len(mock_call_later.mock_calls) == 1
Esempio n. 3
0
async def test_update_interval_when_update_fails(hass):
    """Update interval for the next async_track_point_in_utc_time call."""
    mock_coordinator = YahooSymbolUpdateCoordinator([TEST_SYMBOL], hass,
                                                    DEFAULT_SCAN_INTERVAL)

    # update_interval is DEFAULT_SCAN_INTERVAL
    assert mock_coordinator.get_next_update_interval() is DEFAULT_SCAN_INTERVAL

    # update_interval is FAILURE_ASYNC_REQUEST_REFRESH if update failed
    mock_coordinator.last_update_success = False
    assert mock_coordinator.get_next_update_interval() == timedelta(
        seconds=FAILURE_ASYNC_REQUEST_REFRESH)
async def test_json_download_failure(hass, raised_exception):
    """Existing data is not updated if exception enocuntered while downloading json."""

    coordinator = YahooSymbolUpdateCoordinator([TEST_SYMBOL], hass,
                                               DEFAULT_SCAN_INTERVAL)
    coordinator.websession.get = AsyncMock(side_effect=raised_exception)

    existing_data = {TEST_SYMBOL: {DATA_REGULAR_MARKET_PRICE: random.random()}}
    coordinator.data = existing_data

    await coordinator.async_refresh()
    await hass.async_block_till_done()

    assert coordinator.data is existing_data
    assert coordinator.last_update_success is False
Esempio n. 5
0
def build_mock_symbol_data(symbol, market_price):
    """Build mock data for a symbol."""
    source_data = {
        DATA_SHORT_NAME: f"Symbol {symbol}",
        DATA_REGULAR_MARKET_PRICE: market_price,
    }
    return YahooSymbolUpdateCoordinator.parse_symbol_data(source_data)
Esempio n. 6
0
async def test_logging_when_process_json_result_reports_error(hass, mock_json):
    """Tests call to logger.info() when process_json_result reports an error."""
    mock_coordinator = YahooSymbolUpdateCoordinator([TEST_SYMBOL], hass,
                                                    DEFAULT_SCAN_INTERVAL)

    mock_response = Mock()
    mock_response.json = AsyncMock(return_value=mock_json)

    mock_coordinator.websession.get = AsyncMock(return_value=mock_response)
    mock_coordinator.process_json_result = Mock(return_value=(True, None))

    with patch.object(coordinator, "_LOGGER") as mock_logger:
        await mock_coordinator.async_refresh()
        await hass.async_block_till_done()

        # There is one info() call from _async_update and one more conditionally
        assert mock_logger.info.call_count == 2
Esempio n. 7
0
def test_process_json_result(hass, symbols, result, expected_error_encountered,
                             expected_conversion_count):
    """No update is performed if update_interval is None."""
    mock_coordinator = YahooSymbolUpdateCoordinator(symbols, hass, None)

    def prefix_conversion_symbol(symbol: str, symbol_data: any):
        return f"USD{symbol}"

    mock_fix_conversion_symbol = Mock(side_effect=prefix_conversion_symbol)
    mock_coordinator.fix_conversion_symbol = mock_fix_conversion_symbol

    (error_encountered, data) = mock_coordinator.process_json_result(result)

    assert len(
        mock_fix_conversion_symbol.mock_calls) == expected_conversion_count
    assert error_encountered is expected_error_encountered
    assert data is not None
Esempio n. 8
0
def build_mock_symbol_data(symbol, market_price, currency="USD"):
    """Build mock data for a symbol."""
    source_data = {
        DATA_FINANCIAL_CURRENCY: currency,
        DATA_SHORT_NAME: f"Symbol {symbol}",
        DATA_REGULAR_MARKET_PRICE: market_price,
    }
    return YahooSymbolUpdateCoordinator.parse_symbol_data(source_data)
Esempio n. 9
0
async def test_incomplete_json(hass, parsed_json, message):
    """Existing data is not updated if JSON is invalid."""

    print(message)
    coordinator = YahooSymbolUpdateCoordinator(None, hass, DEFAULT_SCAN_INTERVAL)
    coordinator.get_json = AsyncMock(return_value=parsed_json)

    existing_data = {TEST_SYMBOL: {DATA_REGULAR_MARKET_PRICE: random.random()}}
    coordinator.data = existing_data

    # last_update_success is initially True
    assert coordinator.last_update_success is True

    await coordinator.async_refresh()
    await hass.async_block_till_done()

    # Data was invalid, existing data was left unchanged and last_update_success becomes False
    assert coordinator.data is existing_data
    assert coordinator.last_update_success is False
Esempio n. 10
0
async def test_data_from_json(hass, mock_json):
    """Tests data update all the way from from json."""
    symbol = "BABA"
    coordinator = YahooSymbolUpdateCoordinator([symbol], hass,
                                               DEFAULT_SCAN_INTERVAL)
    coordinator.get_json = AsyncMock(return_value=mock_json)

    await coordinator.async_refresh()
    await hass.async_block_till_done()

    sensor = YahooFinanceSensor(hass, coordinator, symbol, SAMPLE_VALID_CONFIG)

    # Accessing `available` triggers data population
    assert sensor.available is True

    attributes = sensor.device_state_attributes

    assert sensor.state == 232.73
    assert attributes["regularMarketChange"] == -5.66
    assert attributes["twoHundredDayAverageChangePercent"] == -0.13
Esempio n. 11
0
async def test_json_download_failure(hass, raised_exception):
    """Existing data is not updated if exception enocuntered while downloading json."""

    mock_coordinator = YahooSymbolUpdateCoordinator([TEST_SYMBOL], hass,
                                                    DEFAULT_SCAN_INTERVAL)
    mock_coordinator.websession.get = AsyncMock(side_effect=raised_exception)

    existing_data = {TEST_SYMBOL: {DATA_REGULAR_MARKET_PRICE: random.random()}}
    mock_coordinator.data = existing_data

    mock_coordinator_listener = Mock()
    mock_coordinator.async_add_listener(mock_coordinator_listener)

    with patch.object(mock_coordinator,
                      "_schedule_refresh") as mock_schedule_refresh:

        await mock_coordinator.async_refresh()
        await hass.async_block_till_done()

        assert mock_coordinator.data is existing_data
        assert mock_coordinator.last_update_success is False

        assert len(mock_coordinator_listener.mock_calls) == 1
        assert len(mock_schedule_refresh.mock_calls) == 1
Esempio n. 12
0
async def test_update_when_update_is_disabled(hass):
    """No update is performed if update_interval is None."""
    mock_coordinator = YahooSymbolUpdateCoordinator([TEST_SYMBOL], hass, None)

    mock_coordinator.last_update_success = False
    assert mock_coordinator.get_next_update_interval() == timedelta(
        seconds=FAILURE_ASYNC_REQUEST_REFRESH)

    mock_coordinator.last_update_success = True
    assert mock_coordinator.get_next_update_interval() is None
Esempio n. 13
0
async def test_successful_data_parsing(hass, mock_json):
    """Tests successful data parsing."""

    mock_coordinator = YahooSymbolUpdateCoordinator([TEST_SYMBOL], hass,
                                                    DEFAULT_SCAN_INTERVAL)

    mock_response = Mock()
    mock_response.json = AsyncMock(return_value=mock_json)

    mock_coordinator.websession.get = AsyncMock(return_value=mock_response)

    await mock_coordinator.async_refresh()
    await hass.async_block_till_done()

    assert mock_coordinator.data is not None
    assert TEST_SYMBOL in mock_coordinator.data
    assert mock_coordinator.last_update_success is True
Esempio n. 14
0
def test_fix_conversion_symbol(hass, symbol, symbol_data, expected_symbol):
    """Test conversion symbol correction."""
    mock_coordinator = YahooSymbolUpdateCoordinator([TEST_SYMBOL], hass, None)
    assert (mock_coordinator.fix_conversion_symbol(
        symbol, symbol_data) == expected_symbol)
Esempio n. 15
0
async def test_add_symbol_existing(hass):
    """Test check for existing symbols."""
    mock_coordinator = YahooSymbolUpdateCoordinator([TEST_SYMBOL], hass,
                                                    DEFAULT_SCAN_INTERVAL)
    assert mock_coordinator.add_symbol(TEST_SYMBOL) is False