97 lines
2.9 KiB
Python
97 lines
2.9 KiB
Python
|
|
"""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"
|
||
|
|
]
|