Files
site_aegisone/max_bot/tests/test_webhook.py
T

184 lines
6.1 KiB
Python

import json
import pytest
class TestWebhook:
@pytest.mark.asyncio
async def test_health_endpoint(self, client):
response = await client.get("/health")
assert response.status_code == 200
data = response.json()
assert data["status"] == "ok"
assert data["bot"] == "София"
@pytest.mark.asyncio
async def test_webhook_missing_secret(self, client):
payload = {"update_type": "bot_started", "user": {"user_id": 123}}
response = await client.post(
"/webhook",
content=json.dumps(payload),
headers={"Content-Type": "application/json"},
)
assert response.status_code == 403
@pytest.mark.asyncio
async def test_webhook_with_secret(self, client):
payload = {"update_type": "bot_started", "user": {"user_id": 12345}}
response = await client.post(
"/webhook",
content=json.dumps(payload),
headers={
"Content-Type": "application/json",
"X-Max-Bot-Api-Secret": "test-secret",
},
)
assert response.status_code == 200
data = response.json()
assert data["ok"] is True
@pytest.mark.asyncio
async def test_webhook_message_created(self, client):
payload = {
"update_type": "message_created",
"user": {"user_id": 99999, "first_name": "Тест"},
"message": {"body": {"text": "Привет"}},
}
response = await client.post(
"/webhook",
content=json.dumps(payload),
headers={
"Content-Type": "application/json",
"X-Max-Bot-Api-Secret": "test-secret",
},
)
assert response.status_code == 200
data = response.json()
assert data["ok"] is True
@pytest.mark.asyncio
async def test_webhook_invalid_json(self, client):
response = await client.post(
"/webhook",
content="not json",
headers={
"Content-Type": "application/json",
"X-Max-Bot-Api-Secret": "test-secret",
},
)
assert response.status_code == 200
data = response.json()
assert data["ok"] is False
@pytest.mark.asyncio
async def test_webhook_message_callback(self, client):
payload = {
"update_type": "message_callback",
"user": {"user_id": 88888},
"callback": {"payload": "cancel", "id": "cb_001"},
}
response = await client.post(
"/webhook",
content=json.dumps(payload),
headers={
"Content-Type": "application/json",
"X-Max-Bot-Api-Secret": "test-secret",
},
)
assert response.status_code == 200
data = response.json()
assert data["ok"] is True
class TestAPI:
@pytest.mark.asyncio
async def test_api_settings(self, client):
response = await client.get("/api/bot/settings")
assert response.status_code == 200
@pytest.mark.asyncio
async def test_api_features(self, client):
response = await client.get("/api/bot/features")
assert response.status_code == 200
data = response.json()
assert isinstance(data, list)
@pytest.mark.asyncio
async def test_api_categories(self, client):
response = await client.get("/api/bot/categories")
assert response.status_code == 200
@pytest.mark.asyncio
async def test_api_templates(self, client):
response = await client.get("/api/bot/templates")
assert response.status_code == 200
@pytest.mark.asyncio
async def test_api_users(self, client):
response = await client.get("/api/bot/users")
assert response.status_code == 200
data = response.json()
assert "total" in data
assert "users" in data
@pytest.mark.asyncio
async def test_api_conversations(self, client):
response = await client.get("/api/bot/conversations")
assert response.status_code == 200
data = response.json()
assert isinstance(data, list)
@pytest.mark.asyncio
async def test_api_analytics(self, client):
response = await client.get("/api/bot/analytics")
assert response.status_code == 200
data = response.json()
assert "total_users" in data
@pytest.mark.asyncio
async def test_api_test_run(self, client):
response = await client.post(
"/api/bot/test-run",
content=json.dumps({"scenario": "new_dialog", "messages": []}),
headers={"Content-Type": "application/json"},
)
assert response.status_code == 200
data = response.json()
assert data["scenario"] == "new_dialog"
@pytest.mark.asyncio
async def test_api_test_run_out_of_hours(self, client):
response = await client.post(
"/api/bot/test-run",
content=json.dumps({"scenario": "out_of_hours", "messages": []}),
headers={"Content-Type": "application/json"},
)
assert response.status_code == 200
data = response.json()
assert data["scenario"] == "out_of_hours"
# Should have at least a bot response and mention out_of_hours template
assert len(data.get("conversation", [])) >= 1
@pytest.mark.asyncio
async def test_api_broadcast_recipients(self, client):
response = await client.get("/api/bot/broadcast/recipients")
assert response.status_code == 200
data = response.json()
assert "total" in data
assert "users" in data
@pytest.mark.asyncio
async def test_api_broadcast_history(self, client):
response = await client.get("/api/bot/broadcast/history")
assert response.status_code == 200
data = response.json()
assert "total" in data
assert "broadcasts" in data
@pytest.mark.asyncio
async def test_api_kb(self, client):
response = await client.get("/api/bot/kb")
assert response.status_code == 200
data = response.json()
assert isinstance(data, list)