Skip to content

Commit a583189

Browse files
committed
catch pyodk error
1 parent 4614e82 commit a583189

File tree

2 files changed

+37
-15
lines changed

2 files changed

+37
-15
lines changed

odk-central-sync/src/download_results_forms.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import click
55
import pandas as pd
66
from pyodk.client import Client
7+
from pyodk.errors import PyODKError
78
from requests.exceptions import ConnectionError, Timeout
89
from rich.console import Console
910
from rich.progress import Progress
@@ -173,22 +174,25 @@ def main(project_id: int, center_ids: tuple[int, ...], output_dir: Path, config:
173174
output_dir.mkdir(parents=True, exist_ok=True)
174175
output_csv = output_dir / "candidate_results.csv"
175176

176-
with Client(config_path=str(config)) as client:
177-
if not center_ids:
178-
forms = client.forms.list(project_id=project_id)
179-
center_ids = tuple(
180-
int(f.xmlFormId.removeprefix("results_"))
181-
for f in forms
182-
if f.xmlFormId.startswith("results_")
177+
try:
178+
with Client(config_path=str(config)) as client:
179+
if not center_ids:
180+
forms = client.forms.list(project_id=project_id)
181+
center_ids = tuple(
182+
int(f.xmlFormId.removeprefix("results_"))
183+
for f in forms
184+
if f.xmlFormId.startswith("results_")
185+
)
186+
console.log(f"Discovered {len(center_ids)} results forms")
187+
188+
results_df = export_center_candidate_results(
189+
client=client,
190+
project_id=project_id,
191+
center_ids=list(center_ids),
192+
output_dir=output_dir,
183193
)
184-
console.log(f"Discovered {len(center_ids)} results forms")
185-
186-
results_df = export_center_candidate_results(
187-
client=client,
188-
project_id=project_id,
189-
center_ids=list(center_ids),
190-
output_dir=output_dir,
191-
)
194+
except PyODKError as exc:
195+
raise click.ClickException(str(exc)) from exc
192196

193197
results_df.to_csv(output_csv, index=False)
194198
console.log(f"Saved {len(results_df)} rows to {output_csv}")

odk-central-sync/tests/test_download_results_forms.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import pytest
66
from click.testing import CliRunner
77

8+
from pyodk.errors import PyODKError
9+
810
from src.download_results_forms import (
911
export_center_candidate_results,
1012
export_form_submissions,
@@ -269,3 +271,19 @@ def test_auto_discovers_centers(self, output_dir):
269271
assert result.exit_code == 0
270272
mock_client.forms.list.assert_called_once_with(project_id=1)
271273
assert (output_dir / "candidate_results.csv").exists()
274+
275+
def test_pyodk_error_exits_gracefully(self, output_dir):
276+
mock_client = MagicMock()
277+
mock_client.__enter__ = MagicMock(return_value=mock_client)
278+
mock_client.__exit__ = MagicMock(return_value=False)
279+
mock_client.forms.list.side_effect = PyODKError("auth failed")
280+
281+
runner = CliRunner()
282+
with patch("src.download_results_forms.Client", return_value=mock_client):
283+
result = runner.invoke(
284+
main,
285+
["--project-id=1", "--output-dir", str(output_dir)],
286+
)
287+
288+
assert result.exit_code == 1
289+
assert "auth failed" in result.output

0 commit comments

Comments
 (0)