diff --git a/tests/store/crud/test_update.py b/tests/store/crud/test_update.py index 736cb77a..c0e8d515 100644 --- a/tests/store/crud/test_update.py +++ b/tests/store/crud/test_update.py @@ -482,3 +482,39 @@ def test_update_run_status_using_tower( # THEN the status is unchanged, and no database errors were raised assert analysis.status == status assert analysis.progress == progress + + +def test_update_analysis_with_comment(analysis_store: MockStore, case_id: str): + # GIVEN an analysis without a comment + analysis: Analysis = analysis_store.get_latest_analysis_for_case(case_id) + analysis.comment = "" + + # WHEN updating the analysis with a comment + analysis_store.update_analysis(analysis_id=analysis.id, comment="test") + + # THEN the comment should be set + assert analysis.comment == "test" + + +def test_update_analysis_status(analysis_store: MockStore, case_id: str): + # GIVEN an analysis with a non failed status + analysis: Analysis = analysis_store.get_latest_analysis_for_case(case_id) + assert analysis.status != "failed" + + # WHEN giving the analysis a status + analysis_store.update_analysis(analysis_id=analysis.id, status="failed") + + # THEN the status should be set + assert analysis.status == "failed" + + +def test_update_analysis_visibility(analysis_store: MockStore, case_id: str): + # GIVEN an analysis which is not visible + analysis: Analysis = analysis_store.get_latest_analysis_for_case(case_id) + analysis.is_visible = False + + # WHEN making the analysis visible + analysis_store.update_analysis(analysis_id=analysis.id, is_visible=True) + + # THEN the analysis should be visible + assert analysis.is_visible diff --git a/trailblazer/server/api.py b/trailblazer/server/api.py index 78868ae0..2be62280 100644 --- a/trailblazer/server/api.py +++ b/trailblazer/server/api.py @@ -78,7 +78,12 @@ def analysis(analysis_id): return abort(404) if request.method == "PUT": - store.update_analysis(analysis_id=analysis_id, data=request.json) + status: Optional[str] = request.json.get("status", type=str) + comment: Optional[str] = request.json.get("comment", type=str) + is_visible: Optional[bool] = request.json.get("is_visible", type=bool) + store.update_analysis( + analysis_id=analysis_id, comment=comment, status=status, is_visible=is_visible + ) data = analysis.to_dict() data["jobs"] = [job.to_dict() for job in analysis.jobs] diff --git a/trailblazer/store/crud/update.py b/trailblazer/store/crud/update.py index 44ad50a8..5dbf1976 100644 --- a/trailblazer/store/crud/update.py +++ b/trailblazer/store/crud/update.py @@ -222,20 +222,24 @@ def update_analysis_comment(self, case_id: str, comment: str) -> None: ) LOG.info(f"Adding comment {comment} to analysis {analysis.family}") - def update_analysis(self, analysis_id: int, data: dict) -> Analysis: + def update_analysis( + self, + analysis_id: int, + status: Optional[str] = None, + comment: Optional[str] = None, + is_visible: Optional[bool] = None, + ) -> Analysis: """Update an analysis.""" analysis: Analysis = self.get_analysis_with_id(analysis_id) - if "comment" in data: - comment = str(data["comment"]) + if comment: LOG.info(f"Adding comment {comment} to analysis {analysis.family}") analysis.comment = comment - if "is_visible" in data: - is_visible = bool(data["is_visible"]) + if is_visible: LOG.info(f"Setting visibility to {is_visible} for analysis {analysis.family}") analysis.is_visible = is_visible - if "status" in data: - self.update_analysis_status(case_id=analysis.family, status=data["status"]) + if status: + self.update_analysis_status(case_id=analysis.family, status=status) return analysis