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()
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
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
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)
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
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
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)
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
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
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
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
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
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)
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