# -*- coding: utf-8 -*- from unittest.mock import MagicMock import pytest def test_ensure_logged_in_dispatches_password_auto(monkeypatch): from service.rpa_helpers import auth_flows monkeypatch.setattr(auth_flows, "_is_already_logged_in", lambda p, a: False) monkeypatch.setattr(auth_flows, "_poll_until", lambda *a, **k: True) loc = MagicMock() page = MagicMock() page.url = "http://example.com" page.locator.return_value.first = loc account = {"auth_strategy": "password_auto", "login_id": "u", "url": "http://x"} r = auth_flows.ensure_logged_in(page, account, credentials={"plaintext": "pw"}) assert r.ok is True page.goto.assert_called() assert loc.type.call_count >= 2 loc.click.assert_called() def test_ensure_logged_in_dispatches_qr_code_manual(monkeypatch): from service.rpa_helpers import auth_flows monkeypatch.setattr(auth_flows, "_is_already_logged_in", lambda p, a: True) page = MagicMock() account = {"auth_strategy": "qr_code_manual", "url": "http://x"} r = auth_flows.ensure_logged_in(page, account) assert r.ok is True def test_ensure_logged_in_client_certificate_raises(): from service.rpa_helpers.auth_flows import AuthStrategyError, ensure_logged_in page = MagicMock() account = {"auth_strategy": "client_certificate"} with pytest.raises(AuthStrategyError) as ei: ensure_logged_in(page, account) assert ei.value.code == "ERR_AUTH_STRATEGY_NOT_AUTOMATABLE" def test_ensure_logged_in_api_token_no_op(): from service.rpa_helpers.auth_flows import ensure_logged_in page = MagicMock() account = {"auth_strategy": "api_token"} r = ensure_logged_in(page, account) assert r.ok is True page.goto.assert_not_called() def test_ensure_logged_in_missing_credentials(): from service.rpa_helpers.auth_flows import AuthStrategyError, ensure_logged_in page = MagicMock() account = {"auth_strategy": "password_auto", "login_id": "u"} with pytest.raises(AuthStrategyError) as ei: ensure_logged_in(page, account, credentials=None) assert ei.value.code == "ERR_CREDENTIAL_MISSING" def test_ensure_logged_in_unknown_strategy(): from service.rpa_helpers.auth_flows import AuthStrategyError, ensure_logged_in page = MagicMock() account = {"auth_strategy": "bogus"} with pytest.raises(AuthStrategyError) as ei: ensure_logged_in(page, account) assert ei.value.code == "ERR_AUTH_STRATEGY_NOT_SUPPORTED" def test_ensure_logged_in_no_strategy(): from service.rpa_helpers.auth_flows import AuthStrategyError, ensure_logged_in page = MagicMock() account = {"auth_strategy": ""} with pytest.raises(AuthStrategyError) as ei: ensure_logged_in(page, account) assert ei.value.code == "ERR_AUTH_STRATEGY_NOT_SUPPORTED" def test_device_bound_fingerprint_mismatch(monkeypatch): from service.rpa_helpers.auth_flows import AuthStrategyError, ensure_logged_in monkeypatch.setattr( "service.rpa_helpers.auth_flows._current_machine_fingerprint", lambda: "right_fp", ) page = MagicMock() account = { "auth_strategy": "device_bound", "device_fingerprint": "wrong_fp", "login_id": "u", "url": "http://x", } with pytest.raises(AuthStrategyError) as ei: ensure_logged_in(page, account, credentials={"plaintext": "pw"}) assert ei.value.code == "ERR_DEVICE_FINGERPRINT_MISMATCH"