الميزات: إضافة صفحات الأسعار والمدونة، وتفعيل ميزة تقييم الأدوات
- إضافة روابط جديدة في تذييل صفحات الأسعار والمدونة. - إنشاء مكون صفحة الأسعار لعرض تفاصيل الخطط ومقارنة الميزات. - تطوير مكون صفحة المدونة لعرض منشورات المدونة مع روابط للمقالات الفردية. - تقديم مكون تقييم الأدوات لتلقي ملاحظات المستخدمين حول الأدوات، بما في ذلك التقييم بالنجوم والتعليقات الاختيارية. - تفعيل وظيفة useToolRating لجلب وعرض تقييمات الأدوات. - تحديث أدوات تحسين محركات البحث لتضمين بيانات التقييم في البيانات المنظمة للأدوات. - تحسين ملفات i18n بترجمات للميزات والصفحات الجديدة. - دمج إدارة الموافقة على ملفات تعريف الارتباط لتتبع التحليلات.
This commit is contained in:
@@ -6,6 +6,8 @@ import pytest
|
||||
from unittest.mock import patch, MagicMock
|
||||
from app import create_app
|
||||
from app.services.account_service import init_account_db
|
||||
from app.services.rating_service import init_ratings_db
|
||||
from app.services.ai_cost_service import init_ai_cost_db
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -29,6 +31,8 @@ def app():
|
||||
})
|
||||
with app.app_context():
|
||||
init_account_db()
|
||||
init_ratings_db()
|
||||
init_ai_cost_db()
|
||||
|
||||
# Create temp directories
|
||||
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
|
||||
|
||||
89
backend/tests/test_rating.py
Normal file
89
backend/tests/test_rating.py
Normal 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
|
||||
Reference in New Issue
Block a user