feat(feedback): implement ChipDip-style floating dev feedback & bug report widget with markdown sync

This commit is contained in:
Antigravity committed 2026-10-08 11:53:18 +03:00
1 parent e1cacde543
commit 8cffae46fa
11 files changed
+1104 -3

No files matched your search

+80
View File
@@ -2556,6 +2556,86 @@ def test_wikipedia_parsoid_html_cleaning():
assert "Clean Cell" in content
def test_feedback_endpoints_workflow():
from fastapi.testclient import TestClient
from pathlib import Path
# 1. Unauthenticated access blocked
unauth_client = TestClient(app)
resp = unauth_client.get("/api/feedback")
assert resp.status_code == 401
resp = unauth_client.post("/api/feedback", json={"message": "Test bug"})
assert resp.status_code == 401
# 2. Authenticated login
login_resp = client.post("/api/login", json={"username": "testadmin", "password": "testpass12345"})
assert login_resp.status_code == 200
# 3. Create a bug report
bug_payload = {
"category": "bug",
"message": "Кнопка в читалке не нажимается на мобилке",
"context_url": "#reader/book/1/ch/2",
"context_data": {"screen": "390x844", "device": "Mobile"}
}
create_resp = client.post("/api/feedback", json=bug_payload)
assert create_resp.status_code == 201
c_data = create_resp.json()
assert c_data["ok"] is True
report_id = c_data["id"]
assert c_data["category"] == "bug"
assert c_data["status"] == "new"
# 4. Create a feature request
feat_payload = {
"category": "feature",
"message": "Добавить темную тему OLED",
"context_url": "#reader",
"context_data": {"screen": "1920x1080", "device": "Desktop"}
}
create_resp2 = client.post("/api/feedback", json=feat_payload)
assert create_resp2.status_code == 201
report_id2 = create_resp2.json()["id"]
# 5. List reports
list_resp = client.get("/api/feedback")
assert list_resp.status_code == 200
reports = list_resp.json()
assert len(reports) >= 2
r_ids = [r["id"] for r in reports]
assert report_id in r_ids
assert report_id2 in r_ids
# 6. Filter by category
bugs_resp = client.get("/api/feedback?category=bug")
assert bugs_resp.status_code == 200
assert all(r["category"] == "bug" for r in bugs_resp.json())
# 7. Update status to resolved
patch_resp = client.patch(f"/api/feedback/{report_id}", json={"status": "resolved"})
assert patch_resp.status_code == 200
assert patch_resp.json()["status"] == "resolved"
# Verify updated
get_updated = client.get("/api/feedback?status=resolved")
assert get_updated.status_code == 200
assert any(r["id"] == report_id and r["status"] == "resolved" for r in get_updated.json())
# 8. Delete report
del_resp = client.delete(f"/api/feedback/{report_id2}")
assert del_resp.status_code == 200
assert del_resp.json()["ok"] is True
# 9. Verify markdown sync file exists and has content
reports_md = Path("/home/ai-projects/memory/USER_REPORTS.md")
assert reports_md.exists()
content = reports_md.read_text(encoding="utf-8")
assert "Пользовательские репорты" in content
assert "Кнопка в читалке не нажимается" in content