"""Tests for the App API parser.""" from __future__ import annotations from copy import deepcopy import pytest from custom_components.solaredge_optimizers.api import ( SolarEdgeOptimizerInvalidResponseError, normalize_base_url, parse_snapshot, ) from .sample_data import SAMPLE_PAYLOAD def test_parse_snapshot() -> None: """Parse a valid snapshot.""" snapshot = parse_snapshot(SAMPLE_PAYLOAD) assert snapshot.site_id == "4886699" assert snapshot.optimizer_count == 2 assert snapshot.optimizers[0].optimizer_id == "1.1.1" assert snapshot.optimizers[0].daily_energy_wh == 1234.5 @pytest.mark.parametrize( ("value", "expected"), [ ("http://app:8099/", "http://app:8099"), ("http://app:8099/api/optimizers", "http://app:8099"), ("https://example.test/prefix/", "https://example.test/prefix"), ], ) def test_normalize_base_url(value: str, expected: str) -> None: """Normalize supported URLs.""" assert normalize_base_url(value) == expected @pytest.mark.parametrize( "value", ["app:8099", "ftp://app/data", "http://user:password@app:8099"] ) def test_reject_invalid_url(value: str) -> None: """Reject invalid or credential-bearing URLs.""" with pytest.raises(ValueError): normalize_base_url(value) def test_reject_duplicate_serial() -> None: """Reject ambiguous optimizer records.""" payload = deepcopy(SAMPLE_PAYLOAD) payload["optimizers"][1]["serial"] = payload["optimizers"][0]["serial"] with pytest.raises(SolarEdgeOptimizerInvalidResponseError): parse_snapshot(payload)