/
/
/
1"""Tests for redirect URL validation and auth-code redirect building."""
2
3from __future__ import annotations
4
5from music_assistant.helpers.redirect_validation import build_code_redirect_url
6
7
8def test_build_code_redirect_url_plain() -> None:
9 """A code query param is appended to a URL without an existing query or fragment."""
10 assert (
11 build_code_redirect_url("https://example.com/cb", "tok")
12 == "https://example.com/cb?code=tok"
13 )
14
15
16def test_build_code_redirect_url_existing_query() -> None:
17 """The code param is joined with & when the URL already has a query string."""
18 assert (
19 build_code_redirect_url("https://example.com/cb?foo=bar", "tok")
20 == "https://example.com/cb?foo=bar&code=tok"
21 )
22
23
24def test_build_code_redirect_url_inserts_before_fragment() -> None:
25 """The code param lands in the query string, before any hash fragment."""
26 assert (
27 build_code_redirect_url("https://example.com/#/onboard", "tok")
28 == "https://example.com/?code=tok#/onboard"
29 )
30
31
32def test_build_code_redirect_url_fragment_with_existing_query() -> None:
33 """A URL with both query and fragment keeps the code param in the query part."""
34 assert (
35 build_code_redirect_url("https://example.com/?a=1#/x", "tok")
36 == "https://example.com/?a=1&code=tok#/x"
37 )
38
39
40def test_build_code_redirect_url_extra_params() -> None:
41 """Extra params are appended after the code param, with keys and values URL-encoded."""
42 assert (
43 build_code_redirect_url("https://example.com/cb", "tok", {"onboard": "true"})
44 == "https://example.com/cb?code=tok&onboard=true"
45 )
46 assert (
47 build_code_redirect_url("https://example.com/cb", "tok", {"a key": "a value"})
48 == "https://example.com/cb?code=tok&a%20key=a%20value"
49 )
50
51
52def test_build_code_redirect_url_trailing_separator() -> None:
53 """A trailing ? or & in the URL is reused instead of adding another separator."""
54 assert (
55 build_code_redirect_url("https://example.com/cb?", "tok")
56 == "https://example.com/cb?code=tok"
57 )
58 assert (
59 build_code_redirect_url("https://example.com/cb?foo=bar&", "tok")
60 == "https://example.com/cb?foo=bar&code=tok"
61 )
62
63
64def test_build_code_redirect_url_encodes_token() -> None:
65 """Reserved characters in the token are URL-encoded."""
66 assert (
67 build_code_redirect_url("https://example.com/cb", "a b/c")
68 == "https://example.com/cb?code=a%20b%2Fc"
69 )
70