- Backend: alembic env, config manager/models, dependencies, translate plugin - Backend tests: async_sync_regression, integration tests, git services, test_agent - Docker: docker-compose.yml updates - Agent: qa-tester.md update, semantics-testing SKILL.md update - Frontend: TopNavbar, sidebarNavigation, FeaturesSettings, FeatureGate - i18n: assistant.json en/ru locale updates - New: frontend/src/lib/components/agent/ directory
107 lines
4.6 KiB
Python
107 lines
4.6 KiB
Python
# #region TestAgentChat.ApiFixtures [C:2] [TYPE Module] [SEMANTICS test,agent,fixtures,api]
|
|
# @BRIEF Materialize API fixtures from JSON — verify fixture structure matches expected API contracts.
|
|
# @RELATION BINDS_TO -> [AgentChat.Api.Conversations]
|
|
import json
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
FIXTURES_DIR = Path(__file__).resolve().parent.parent.parent.parent / "specs" / "033-gradio-agent-chat" / "fixtures" / "api"
|
|
|
|
|
|
# #region TestAgentChat.ApiFixtures.Load [C:2] [TYPE Function] [SEMANTICS test,fixture,load]
|
|
# @BRIEF All 9 API fixture files load without parse errors.
|
|
def test_all_api_fixtures_load():
|
|
"""Verify all API fixture files exist and load as valid JSON."""
|
|
expected_fixtures = [
|
|
"conversations_list_valid.json",
|
|
"conversations_list_empty.json",
|
|
"conversations_list_missing_auth.json",
|
|
"conversations_list_invalid_page.json",
|
|
"conversations_list_external_fail.json",
|
|
"history_valid.json",
|
|
"history_not_found.json",
|
|
"service_token_valid.json",
|
|
"service_token_invalid_secret.json",
|
|
]
|
|
for name in expected_fixtures:
|
|
path = FIXTURES_DIR / name
|
|
assert path.exists(), f"Fixture not found: {name}"
|
|
with open(path) as f:
|
|
data = json.load(f)
|
|
assert "fixture_id" in data, f"{name}: missing fixture_id"
|
|
assert "verifies" in data, f"{name}: missing verifies"
|
|
assert "input" in data, f"{name}: missing input"
|
|
assert "expected" in data, f"{name}: missing expected"
|
|
# #endregion TestAgentChat.ApiFixtures.Load
|
|
|
|
|
|
# #region TestAgentChat.ApiFixtures.ConversationsList [C:2] [TYPE Function] [SEMANTICS test,fixture,conversations]
|
|
# @BRIEF Conversations list fixtures have correct structure: valid returns 200+items, empty returns 200+[].
|
|
def test_conversations_list_valid():
|
|
"""FX_AgentChat.Conversations.ListValid → 200 with items array."""
|
|
with open(FIXTURES_DIR / "conversations_list_valid.json") as f:
|
|
fixture = json.load(f)
|
|
assert fixture["fixture_id"] == "FX_AgentChat.Conversations.ListValid"
|
|
assert fixture["expected"]["status"] == 200
|
|
assert "items" in fixture["expected"]["body"]
|
|
assert fixture["input"]["method"] == "GET"
|
|
|
|
|
|
def test_conversations_list_empty():
|
|
"""FX_AgentChat.Conversations.ListEmpty → 200 with empty items."""
|
|
with open(FIXTURES_DIR / "conversations_list_empty.json") as f:
|
|
fixture = json.load(f)
|
|
assert fixture["fixture_id"] == "FX_AgentChat.Conversations.ListEmpty"
|
|
assert fixture["expected"]["status"] == 200
|
|
assert fixture["expected"]["body"]["items"] == []
|
|
|
|
|
|
def test_conversations_list_missing_auth():
|
|
"""FX_AgentChat.Conversations.ListMissingAuth → 401."""
|
|
with open(FIXTURES_DIR / "conversations_list_missing_auth.json") as f:
|
|
fixture = json.load(f)
|
|
assert fixture["fixture_id"] == "FX_AgentChat.Conversations.ListMissingAuth"
|
|
assert fixture["expected"]["status"] == 401
|
|
# #endregion TestAgentChat.ApiFixtures.ConversationsList
|
|
|
|
|
|
# #region TestAgentChat.ApiFixtures.History [C:2] [TYPE Function] [SEMANTICS test,fixture,history]
|
|
# @BRIEF History fixtures have correct structure.
|
|
def test_history_valid():
|
|
"""FX_AgentChat.History.Valid → 200 with messages."""
|
|
with open(FIXTURES_DIR / "history_valid.json") as f:
|
|
fixture = json.load(f)
|
|
assert fixture["fixture_id"] == "FX_AgentChat.History.Valid"
|
|
assert fixture["expected"]["status"] == 200
|
|
assert "items" in fixture["expected"]["body"]
|
|
|
|
|
|
def test_history_not_found():
|
|
"""FX_AgentChat.History.NotFound → 404."""
|
|
with open(FIXTURES_DIR / "history_not_found.json") as f:
|
|
fixture = json.load(f)
|
|
assert fixture["fixture_id"] == "FX_AgentChat.History.NotFound"
|
|
assert fixture["expected"]["status"] == 404
|
|
# #endregion TestAgentChat.ApiFixtures.History
|
|
|
|
|
|
# #region TestAgentChat.ApiFixtures.ServiceToken [C:2] [TYPE Function] [SEMANTICS test,fixture,service-token]
|
|
# @BRIEF Service token fixtures.
|
|
def test_service_token_valid():
|
|
"""FX_AgentChat.ServiceToken.Valid → 200 with token."""
|
|
with open(FIXTURES_DIR / "service_token_valid.json") as f:
|
|
fixture = json.load(f)
|
|
assert fixture["fixture_id"] == "FX_AgentChat.ServiceToken.Valid"
|
|
assert fixture["expected"]["status"] == 200
|
|
|
|
|
|
def test_service_token_invalid():
|
|
"""FX_AgentChat.ServiceToken.InvalidSecret → 401."""
|
|
with open(FIXTURES_DIR / "service_token_invalid_secret.json") as f:
|
|
fixture = json.load(f)
|
|
assert fixture["fixture_id"] == "FX_AgentChat.ServiceToken.InvalidSecret"
|
|
assert fixture["expected"]["status"] == 401
|
|
# #endregion TestAgentChat.ApiFixtures.ServiceToken
|
|
# #endregion TestAgentChat.ApiFixtures
|