الميزات: إضافة صفحات الأسعار والمدونة، وتفعيل ميزة تقييم الأدوات

- إضافة روابط جديدة في تذييل صفحات الأسعار والمدونة.

- إنشاء مكون صفحة الأسعار لعرض تفاصيل الخطط ومقارنة الميزات.

- تطوير مكون صفحة المدونة لعرض منشورات المدونة مع روابط للمقالات الفردية.

- تقديم مكون تقييم الأدوات لتلقي ملاحظات المستخدمين حول الأدوات، بما في ذلك التقييم بالنجوم والتعليقات الاختيارية.

- تفعيل وظيفة useToolRating لجلب وعرض تقييمات الأدوات.

- تحديث أدوات تحسين محركات البحث لتضمين بيانات التقييم في البيانات المنظمة للأدوات.

- تحسين ملفات i18n بترجمات للميزات والصفحات الجديدة.

- دمج إدارة الموافقة على ملفات تعريف الارتباط لتتبع التحليلات.
This commit is contained in:
Your Name
2026-03-10 15:16:28 +02:00
parent 75e11df5fb
commit a14c31c594
25 changed files with 2194 additions and 16 deletions

View File

@@ -0,0 +1,89 @@
"""Tests for the rating API endpoints."""
import json
import pytest
class TestRatingRoutes:
"""Tests for /api/ratings endpoints."""
def test_submit_rating_success(self, client):
"""POST /api/ratings/submit — valid rating."""
resp = client.post(
"/api/ratings/submit",
json={"tool": "compress-pdf", "rating": 5, "tag": "fast"},
)
assert resp.status_code == 201
data = resp.get_json()
assert "message" in data
def test_submit_rating_missing_tool(self, client):
"""POST /api/ratings/submit — missing tool."""
resp = client.post(
"/api/ratings/submit",
json={"rating": 4},
)
assert resp.status_code == 400
def test_submit_rating_invalid_score(self, client):
"""POST /api/ratings/submit — score out of range."""
resp = client.post(
"/api/ratings/submit",
json={"tool": "merge-pdf", "rating": 0},
)
assert resp.status_code == 400
def test_submit_rating_score_too_high(self, client):
"""POST /api/ratings/submit — score > 5."""
resp = client.post(
"/api/ratings/submit",
json={"tool": "merge-pdf", "rating": 6},
)
assert resp.status_code == 400
def test_get_tool_rating(self, client):
"""GET /api/ratings/tool/<slug> — returns summary."""
# Submit a rating first
client.post(
"/api/ratings/submit",
json={"tool": "split-pdf", "rating": 4},
)
resp = client.get("/api/ratings/tool/split-pdf")
assert resp.status_code == 200
data = resp.get_json()
assert data["tool"] == "split-pdf"
assert data["count"] >= 1
assert 1 <= data["average"] <= 5
def test_get_all_ratings(self, client):
"""GET /api/ratings/all — returns all tool summaries."""
client.post(
"/api/ratings/submit",
json={"tool": "ocr", "rating": 5},
)
resp = client.get("/api/ratings/all")
assert resp.status_code == 200
data = resp.get_json()
assert "tools" in data
assert len(data["tools"]) >= 1
def test_get_tool_rating_no_data(self, client):
"""GET /api/ratings/tool/<slug> — tool with no ratings."""
resp = client.get("/api/ratings/tool/nonexistent-tool")
assert resp.status_code == 200
data = resp.get_json()
assert data["count"] == 0
assert data["average"] == 0
def test_submit_rating_with_feedback(self, client):
"""POST /api/ratings/submit — with text feedback."""
resp = client.post(
"/api/ratings/submit",
json={
"tool": "pdf-editor",
"rating": 3,
"tag": "issue",
"feedback": "The editor was a bit slow but worked.",
},
)
assert resp.status_code == 201