music on atproto
plyr.fm
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"}