@@ -1167,6 +1167,47 @@ async def test_auth_flow_with_no_tokens(self, oauth_provider: OAuthClientProvide
11671167 assert oauth_provider.context.current_tokens.access_token == "new_access_token"
11681168 assert oauth_provider.context.token_expiry_time is not None
11691169
1170+ @pytest.mark.anyio
1171+ async def test_authorization_endpoint_preserves_existing_query(self, oauth_provider: OAuthClientProvider):
1172+ captured_auth_url: str | None = None
1173+ captured_state: str | None = None
1174+
1175+ async def redirect_handler(url: str) -> None:
1176+ nonlocal captured_auth_url, captured_state
1177+ captured_auth_url = url
1178+ captured_state = parse_qs(urlparse(url).query)["state"][0]
1179+
1180+ async def callback_handler() -> tuple[str, str | None]:
1181+ return "test_auth_code", captured_state
1182+
1183+ oauth_provider.context.redirect_handler = redirect_handler
1184+ oauth_provider.context.callback_handler = callback_handler
1185+ oauth_provider.context.oauth_metadata = OAuthMetadata(
1186+ issuer=AnyHttpUrl("https://test.salesforce.com"),
1187+ authorization_endpoint=AnyHttpUrl(
1188+ "https://test.salesforce.com/services/oauth2/authorize?prompt=select_account"
1189+ ),
1190+ token_endpoint=AnyHttpUrl("https://test.salesforce.com/services/oauth2/token"),
1191+ )
1192+ oauth_provider.context.client_info = OAuthClientInformationFull(
1193+ client_id="test_client",
1194+ client_secret="test_secret",
1195+ redirect_uris=[AnyUrl("http://localhost:3030/callback")],
1196+ )
1197+
1198+ auth_code, _ = await oauth_provider._perform_authorization_code_grant()
1199+
1200+ assert auth_code == "test_auth_code"
1201+ assert captured_auth_url is not None
1202+ parsed = urlparse(captured_auth_url)
1203+ params = parse_qs(parsed.query)
1204+ assert parsed.path == "/services/oauth2/authorize"
1205+ assert "?" not in parsed.query
1206+ assert params["prompt"] == ["select_account"]
1207+ assert params["response_type"] == ["code"]
1208+ assert params["client_id"] == ["test_client"]
1209+ assert params["redirect_uri"] == ["http://localhost:3030/callback"]
1210+
11701211 @pytest.mark.anyio
11711212 async def test_auth_flow_no_unnecessary_retry_after_oauth(
11721213 self, oauth_provider: OAuthClientProvider, mock_storage: MockTokenStorage, valid_tokens: OAuthToken
0 commit comments