from __future__ import annotations import pytest from investibook.api import feedback as feedback_api from investibook.db import queries as dbq from investibook.models.requests import WorkspaceFeedbackPayload @pytest.fixture def feedback_workspace(tmp_path, monkeypatch): monkeypatch.setattr(dbq, "DB_PATH", tmp_path / "feedback.db") dbq._db_init() user = dbq._db_get_or_create_user("feedback-user@example.com") now = dbq._utc_now() dbq._db_upsert_workspace( "ws-feedback", user["id"], "Feedback workspace", "", False, now, now, ) return user @pytest.mark.asyncio async def test_web_feedback_metric_only_counts_rating_changes( feedback_workspace, monkeypatch ): metric_calls: list[dict[str, str | None]] = [] monkeypatch.setattr( feedback_api, "record_feedback_mark", lambda **kwargs: metric_calls.append(kwargs), ) await feedback_api.put_feedback( "ws-feedback", WorkspaceFeedbackPayload(rating="failure", failure_reason=None), feedback_workspace, ) await feedback_api.put_feedback( "ws-feedback", WorkspaceFeedbackPayload( rating="failure", failure_reason="Missing key evidence" ), feedback_workspace, ) await feedback_api.put_feedback( "ws-feedback", WorkspaceFeedbackPayload(rating="success", failure_reason=None), feedback_workspace, ) assert metric_calls == [ { "source": "web", "rating": "failure", "interaction_scene": "workspace", "user_email": "feedback-user@example.com", }, { "source": "web", "rating": "success", "interaction_scene": "workspace", "user_email": "feedback-user@example.com", }, ] feedback = dbq._db_get_feedback( "ws-feedback", feedback_workspace["id"], source="web" ) assert feedback is not None assert feedback["rating"] == "success" assert feedback["failure_reason"] is None