mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2026-08-19 01:15:04 -05:00
CI runs the python test suite with SERVER_MODE=False (DESKTOP) which explicitly skips OAuth2 / LDAP / Kerberos / change-password / forgot- password tests via runtime guards. Running the suite with SERVER_MODE=True surfaced two real pgAdmin endpoint regressions and a batch of stale test fixtures that this commit addresses. Test-infra fixes (regression/python_test_utils/csrf_test_client.py): * fetch_csrf was looking for <input id="csrf_token" ...> which the React SPA login no longer renders. The token is exposed as "csrfToken": "..." in a JSON config block embedded in /login HTML (camelCase) and as "csrf_token": "..." in JSON API responses (snake_case). Match both, fall back to the legacy hidden-input form. * login() captured the CSRF from GET /login, but Flask-Paranoid regenerates the session on login (anti-fixation), which drops the csrf_token from the new session. Subsequent state-changing API calls failed with "The CSRF session token is missing." Refresh the token from a post-login GET /browser/ when SERVER_MODE is True. Endpoint regressions (web/pgadmin/browser/__init__.py): * change_password JSON path: bad_request(list(form.errors.values())[0][0]) passed a Babel LazyString (LazyProxy) to the JSON encoder, producing 500 with "Circular reference detected." Force resolution to plain str. * forgot_password JSON path: default_render_json(form, include_user= False) used a Flask-Security API that no longer accepts include_user, yielding 500 on every JSON POST. Replace with pgAdmin's standard make_json_response/bad_request envelope. Test-fixture maintenance: * test_change_password.py / browser/tests/utils.py: send JSON to the JSON-only change_password endpoint (was sending form data, which the endpoint silently ignored); use DELETE /user_management/save/<id> for cleanup; update respdata strings to match current pgAdmin output. * test_login.py, test_gravatar_image_display.py, test_ldap_with_mocking.py, test_kerberos_with_mocking.py, test_webserver_with_mocking.py: drop the 'Gravatar image for X' assertion (server-rendered HTML no longer exists; React renders the gravatar client-side) and verify successful authentication via session._user_id instead. * test_ldap_login.py: skip when LDAP config is template placeholders (no live LDAP server reachable in dev/CI). * test_kerberos_with_mocking.py: skip when authenticate.kerberos_login is not registered (the blueprint loads only when KERBEROS is in AUTHENTICATION_SOURCES at app-init time). * test_reset_password.py: switch to JSON POST against the JSON-only forgot_password endpoint; parametrize expected status; drop HTML pre-check. * test_validate_email.py: drop pg@postgres.local (modern email- validator rejects RFC 6761 special-use TLDs); switch deliverability scenario to .invalid/.test domains for stable DNS. Net result: 296 tests pass, 0 failures, 12 skipped (LDAP/Kerberos require infra; 1 pgcrypto scenario; cloud-wizard real-credential tests).