feat: улучшить agentic-readiness — добавить CI, проверки конфигурации и тесты
This commit is contained in:
@@ -109,60 +109,76 @@ class TestPaginationE2e:
|
||||
"""End-to-end tests for pagination functionality."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_e2e_scans_pagination(self, e2e_client):
|
||||
async def test_e2e_scans_pagination(self, e2e_client, sample_e2e_scan):
|
||||
"""Verify that scan list pagination works."""
|
||||
# First page
|
||||
resp1 = await e2e_client.get("/api/v1/scans?limit=10&offset=0")
|
||||
assert resp1.status_code == 200
|
||||
data1 = resp1.json()
|
||||
assert data1["limit"] == 10
|
||||
assert data1["offset"] == 0
|
||||
assert data1["total"] >= 1
|
||||
assert len(data1["scans"]) >= 1
|
||||
assert any(p["package_name"] == "test-e2e-pkg" for p in data1["scans"])
|
||||
|
||||
# Second page
|
||||
resp2 = await e2e_client.get("/api/v1/scans?limit=10&offset=10")
|
||||
assert resp2.status_code == 200
|
||||
data2 = resp2.json()
|
||||
assert data2["limit"] == 10
|
||||
assert data2["offset"] == 10
|
||||
assert data2["total"] >= 0
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_e2e_packages_pagination(self, e2e_client):
|
||||
async def test_e2e_packages_pagination(self, e2e_client, sample_e2e_scan):
|
||||
"""Verify that package list pagination works."""
|
||||
resp1 = await e2e_client.get("/api/v1/packages?limit=5&offset=0")
|
||||
assert resp1.status_code == 200
|
||||
data1 = resp1.json()
|
||||
assert data1["limit"] == 5
|
||||
assert data1["offset"] == 0
|
||||
assert data1["total"] >= 1
|
||||
assert any(p["name"] == "test-e2e-pkg" for p in data1["packages"])
|
||||
|
||||
|
||||
class TestFilteringE2e:
|
||||
"""End-to-end tests for filtering functionality."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_e2e_scan_filter_by_status(self, e2e_client):
|
||||
async def test_e2e_scan_filter_by_status(self, e2e_client, sample_e2e_scan):
|
||||
"""Verify that scans can be filtered by status."""
|
||||
resp = await e2e_client.get("/api/v1/scans?status=completed")
|
||||
assert resp.status_code == 200
|
||||
data = resp.json()
|
||||
assert data["total"] >= 1
|
||||
assert all(s["status"] == "completed" for s in data["scans"])
|
||||
assert any(s["package_name"] == "test-e2e-pkg" for s in data["scans"])
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_e2e_scan_filter_by_flagged(self, e2e_client):
|
||||
async def test_e2e_scan_filter_by_flagged(self, e2e_client, sample_e2e_scan):
|
||||
"""Verify that scans can be filtered by flagged status."""
|
||||
resp = await e2e_client.get("/api/v1/scans?flagged=true")
|
||||
assert resp.status_code == 200
|
||||
data = resp.json()
|
||||
assert data["total"] >= 1
|
||||
assert all(s["flagged"] is True for s in data["scans"])
|
||||
assert any(s["package_name"] == "test-e2e-pkg" for s in data["scans"])
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_e2e_scan_filter_by_search(self, e2e_client):
|
||||
async def test_e2e_scan_filter_by_search(self, e2e_client, e2e_db_session, sample_e2e_scan):
|
||||
"""Verify that scans can be filtered by search term."""
|
||||
resp = await e2e_client.get("/api/v1/scans?search=e2e")
|
||||
assert resp.status_code == 200
|
||||
data = resp.json()
|
||||
# If there are matching scans, they should contain the search term
|
||||
if data["scans"]:
|
||||
assert any("e2e" in s["package_name"] for s in data["scans"])
|
||||
assert data["total"] >= 1
|
||||
assert all("e2e" in scan["package_name"] for scan in data["scans"])
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_e2e_scan_filter_no_match_returns_empty(self, e2e_client, e2e_db_session):
|
||||
"""Verify that filter with no matches returns empty list."""
|
||||
resp = await e2e_client.get("/api/v1/scans?search=zzznotfound")
|
||||
assert resp.status_code == 200
|
||||
data = resp.json()
|
||||
assert data["total"] == 0
|
||||
assert data["scans"] == []
|
||||
|
||||
|
||||
class TestErrorHandlingE2e:
|
||||
@@ -220,16 +236,21 @@ class TestWebsocketFragmentE2e:
|
||||
"""E2E tests for HTMX fragment responses."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_e2e_scans_fragment_response(self, e2e_client):
|
||||
async def test_e2e_scans_fragment_response(self, e2e_client, sample_e2e_scan):
|
||||
"""Verify that scans page returns fragment when HX-Request header is set."""
|
||||
resp = await e2e_client.get("/scans", headers={"HX-Request": "true"})
|
||||
assert resp.status_code == 200
|
||||
# Fragment should not include full HTML structure
|
||||
assert "<!DOCTYPE" not in resp.text
|
||||
assert "<table" in resp.text
|
||||
assert "scans-table-container" in resp.text
|
||||
assert "test-e2e-pkg" in resp.text
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_e2e_packages_fragment_response(self, e2e_client):
|
||||
async def test_e2e_packages_fragment_response(self, e2e_client, sample_e2e_scan):
|
||||
"""Verify that packages page returns fragment when HX-Request header is set."""
|
||||
resp = await e2e_client.get("/packages", headers={"HX-Request": "true"})
|
||||
assert resp.status_code == 200
|
||||
assert "<!DOCTYPE" not in resp.text
|
||||
assert "<table" in resp.text
|
||||
assert "packages-table-container" in resp.text
|
||||
assert "test-e2e-pkg" in resp.text
|
||||
|
||||
Reference in New Issue
Block a user