"""Retry, attribute-corruption, and skip-path edges for the Mailu sync job.""" from test_mailu_sync import _FakeResponse, _FakeSession, load_sync_module def test_retry_helpers_with_zero_attempts_do_nothing(monkeypatch): sync = load_sync_module(monkeypatch) monkeypatch.setattr( sync.psycopg2, "connect", lambda **kwargs: (_ for _ in ()).throw(AssertionError("must not connect")), ) assert sync.retry_request( "request", lambda: (_ for _ in ()).throw(AssertionError("must not run")), attempts=0, ) is None assert sync.retry_db_connect(attempts=0) is None def test_kc_update_attributes_replaces_a_corrupt_attribute_map(monkeypatch): sync = load_sync_module(monkeypatch) current_resp = _FakeResponse({"username": "u1", "attributes": "corrupt"}) ok_resp = _FakeResponse({"attributes": {"mailu_app_password": ["abc"]}}) sync.SESSION = _FakeSession(_FakeResponse({}), [current_resp, ok_resp]) sync.kc_update_attributes( "token", {"id": "u1", "username": "u1"}, {"mailu_app_password": "abc"}, ) assert sync.SESSION.put_called and sync.SESSION.get_calls == 2 def test_main_skips_disabled_users_and_settled_attribute_sets(monkeypatch): sync = load_sync_module(monkeypatch) monkeypatch.setattr(sync.bcrypt_sha256, "hash", lambda password: f"hash:{password}") users = [ { "id": "u_disabled", "username": "disabled", "email": "disabled@example.com", "enabled": False, "attributes": {"mailu_enabled": ["true"]}, }, { "id": "u_settled", "username": "settled", "email": "settled@example.com", "attributes": { "mailu_enabled": ["true"], "mailu_email": ["settled@example.com"], "mailu_app_password": ["keepme"], }, }, ] updated = [] class _Cursor: def __init__(self): self.executions = [] def execute(self, sql, params): self.executions.append(params) def close(self): return None class _Conn: def __init__(self): self.autocommit = False self._cursor = _Cursor() def cursor(self, cursor_factory=None): return self._cursor def close(self): return None conn = _Conn() monkeypatch.setattr(sync, "get_kc_token", lambda: "tok") monkeypatch.setattr(sync, "kc_get_users", lambda token: users) monkeypatch.setattr( sync, "kc_update_attributes", lambda token, user, attrs: updated.append(user["id"]), ) monkeypatch.setattr(sync.psycopg2, "connect", lambda **kwargs: conn) sync.main() assert updated == [] assert [params["email"] for params in conn._cursor.executions] == [ "settled@example.com" ]