Add ops feedback reward grants

This commit is contained in:
2569718930@qq.com
2026-06-08 20:54:20 +08:00
parent 7d1bfea8da
commit 6273921005
9 changed files with 514 additions and 43 deletions
+80
View File
@@ -5,6 +5,7 @@ from fastapi import HTTPException
from src.database.db_manager import DBManager
from web.services import feedback_api
from web.services import ops_api
def test_user_feedback_round_trip_includes_context_and_status(tmp_path):
@@ -93,6 +94,85 @@ def test_user_feedback_reward_metadata_round_trip(tmp_path):
assert row["rewarded_at"] == rewarded["rewarded_at"]
def test_feedback_reward_grant_adds_points_and_marks_feedback(tmp_path):
db = DBManager(str(tmp_path / "polyweather-feedback-grant.db"))
db.upsert_user(1001, "pilot")
with db._get_connection() as conn: # noqa: SLF001
conn.execute(
"""
UPDATE users
SET points = ?, supabase_email = ?
WHERE telegram_id = ?
""",
(50, "pilot@example.com", 1001),
)
conn.commit()
created = db.append_user_feedback(
category="data",
message="Amsterdam METAR stale.",
user_id="user-1001",
user_email="pilot@example.com",
)
result = db.grant_feedback_reward(
created["id"],
points=300,
reason="Valid stale METAR report",
)
assert result["ok"] is True
assert result["points_before"] == 50
assert result["points_added"] == 300
assert result["points_after"] == 350
assert result["feedback"]["reward_points"] == 300
assert result["feedback"]["reward_reason"] == "Valid stale METAR report"
assert result["feedback"]["reward_status"] == "granted"
assert db.get_points_by_supabase_email("pilot@example.com") == 350
duplicate = db.grant_feedback_reward(
created["id"],
points=300,
reason="Duplicate grant should not apply",
)
assert duplicate["ok"] is False
assert duplicate["reason"] == "already_rewarded"
assert duplicate["points_after"] == 350
def test_ops_feedback_reward_service_returns_operator(monkeypatch):
class FakeDB:
def grant_feedback_reward(self, feedback_id, *, points, reason):
return {
"ok": True,
"feedback_id": feedback_id,
"points_added": points,
"points_after": 900,
"feedback": {
"id": feedback_id,
"reward_points": points,
"reward_reason": reason,
"reward_status": "granted",
},
}
monkeypatch.setattr(ops_api, "_require_ops", lambda request: {"email": "ops@example.com"})
monkeypatch.setattr(ops_api, "DBManager", lambda: FakeDB())
payload = ops_api.grant_ops_feedback_reward(
object(),
feedback_id=42,
points=500,
reason="High impact chart bug",
)
assert payload["ok"] is True
assert payload["operator_email"] == "ops@example.com"
assert payload["feedback"]["reward_points"] == 500
assert payload["feedback"]["reward_reason"] == "High impact chart bug"
def test_user_feedback_identity_filter_returns_only_matching_user(tmp_path):
db = DBManager(str(tmp_path / "polyweather-feedback-identity.db"))
mine_by_user_id = db.append_user_feedback(