From 965362f5e34f9dc16010b7331c0ba78657329505 Mon Sep 17 00:00:00 2001 From: pyr0ball Date: Wed, 4 Mar 2026 12:04:42 -0800 Subject: [PATCH] feat: add POST /api/accounts/test endpoint --- app/api.py | 11 +++++++++++ tests/test_api.py | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/app/api.py b/app/api.py index aff2cb0..15c6de9 100644 --- a/app/api.py +++ b/app/api.py @@ -273,6 +273,17 @@ def download_stats(): ) +class AccountTestRequest(BaseModel): + account: dict + + +@app.post("/api/accounts/test") +def test_account(req: AccountTestRequest): + from app.imap_fetch import test_connection + ok, message, count = test_connection(req.account) + return {"ok": ok, "message": message, "count": count} + + # Static SPA — MUST be last (catches all unmatched paths) _DIST = _ROOT / "web" / "dist" if _DIST.exists(): diff --git a/tests/test_api.py b/tests/test_api.py index 7665c3b..c609530 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -251,3 +251,28 @@ def test_stats_download_returns_file(client, score_with_labels): def test_stats_download_404_when_no_file(client, data_dir): r = client.get("/api/stats/download") assert r.status_code == 404 + + +# ── /api/accounts/test ─────────────────────────────────────────────────────── + +def test_account_test_missing_fields(client): + r = client.post("/api/accounts/test", json={"account": {"host": "", "username": "", "password": ""}}) + assert r.status_code == 200 + data = r.json() + assert data["ok"] is False + assert "required" in data["message"].lower() + + +def test_account_test_success(client): + from unittest.mock import MagicMock, patch + mock_conn = MagicMock() + mock_conn.select.return_value = ("OK", [b"99"]) + with patch("app.imap_fetch.imaplib.IMAP4_SSL", return_value=mock_conn): + r = client.post("/api/accounts/test", json={"account": { + "host": "imap.example.com", "port": 993, "use_ssl": True, + "username": "u@example.com", "password": "pw", "folder": "INBOX", + }}) + assert r.status_code == 200 + data = r.json() + assert data["ok"] is True + assert data["count"] == 99