1"""tests for user-agent parsing and span enrichment.""" 2 3import pytest 4 5from backend.main import parse_plyrfm_user_agent 6 7 8class TestParsePlyrfmUserAgent: 9 """tests for parse_plyrfm_user_agent function.""" 10 11 def test_sdk_user_agent(self) -> None: 12 """sdk user-agent returns client_type=sdk with version.""" 13 result = parse_plyrfm_user_agent("plyrfm/0.1.0") 14 assert result == {"client_type": "sdk", "client_version": "0.1.0"} 15 16 def test_mcp_user_agent(self) -> None: 17 """mcp user-agent returns client_type=mcp with version.""" 18 result = parse_plyrfm_user_agent("plyrfm-mcp/0.2.1") 19 assert result == {"client_type": "mcp", "client_version": "0.2.1"} 20 21 def test_browser_user_agent(self) -> None: 22 """standard browser user-agent returns client_type=browser.""" 23 result = parse_plyrfm_user_agent( 24 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " 25 "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" 26 ) 27 assert result == {"client_type": "browser"} 28 assert "client_version" not in result 29 30 def test_none_user_agent(self) -> None: 31 """missing user-agent returns client_type=browser.""" 32 result = parse_plyrfm_user_agent(None) 33 assert result == {"client_type": "browser"} 34 35 def test_empty_user_agent(self) -> None: 36 """empty string user-agent returns client_type=browser.""" 37 result = parse_plyrfm_user_agent("") 38 assert result == {"client_type": "browser"} 39 40 def test_curl_user_agent(self) -> None: 41 """curl user-agent returns client_type=browser (generic fallback).""" 42 result = parse_plyrfm_user_agent("curl/8.4.0") 43 assert result == {"client_type": "browser"} 44 45 @pytest.mark.parametrize( 46 ("user_agent", "expected_type", "expected_version"), 47 [ 48 ("plyrfm/1.0.0", "sdk", "1.0.0"), 49 ("plyrfm/0.0.1", "sdk", "0.0.1"), 50 ("plyrfm/10.20.30", "sdk", "10.20.30"), 51 ("plyrfm-mcp/1.0.0", "mcp", "1.0.0"), 52 ("plyrfm-mcp/0.0.1", "mcp", "0.0.1"), 53 ], 54 ) 55 def test_version_variations( 56 self, user_agent: str, expected_type: str, expected_version: str 57 ) -> None: 58 """various version formats are parsed correctly.""" 59 result = parse_plyrfm_user_agent(user_agent) 60 assert result["client_type"] == expected_type 61 assert result["client_version"] == expected_version 62 63 def test_plyrfm_prefix_not_at_start(self) -> None: 64 """plyrfm in middle of string is not matched (browser fallback).""" 65 result = parse_plyrfm_user_agent("Mozilla/5.0 plyrfm/1.0.0") 66 assert result == {"client_type": "browser"} 67 68 def test_invalid_version_format(self) -> None: 69 """invalid version format falls back to browser.""" 70 result = parse_plyrfm_user_agent("plyrfm/v1.0") 71 assert result == {"client_type": "browser"}