mirror of
http://88.130.71.182:3000/BlitTech/badoHair_be.git
synced 2026-06-12 23:23:22 +00:00
Fix 2 broken test assertions, add 22 new tests for register flow, booking email resilience, settings, and customers
This commit is contained in:
128
tests/test_admin_settings_customers.py
Normal file
128
tests/test_admin_settings_customers.py
Normal file
@@ -0,0 +1,128 @@
|
||||
"""
|
||||
Tests for admin settings and admin customers endpoints.
|
||||
"""
|
||||
from unittest.mock import AsyncMock
|
||||
from tests.conftest import USER_ID
|
||||
|
||||
|
||||
SAMPLE_SETTING = {
|
||||
"key": "default_booking_price",
|
||||
"value": 0,
|
||||
"updated_at": "2026-01-01T00:00:00",
|
||||
}
|
||||
|
||||
SAMPLE_CUSTOMER = {
|
||||
"id": USER_ID,
|
||||
"email": "client@test.com",
|
||||
"full_name": "Marie Dupont",
|
||||
"phone": "+49123456789",
|
||||
"is_blocked": False,
|
||||
"created_at": "2026-01-01T00:00:00",
|
||||
"orders_count": 2,
|
||||
"bookings_count": 1,
|
||||
"total_spent": 378.0,
|
||||
}
|
||||
|
||||
|
||||
# ── Admin settings ────────────────────────────────────────────────────────────
|
||||
|
||||
async def test_get_settings_returns_list(admin_client, mock_db):
|
||||
mock_db.fetch = AsyncMock(return_value=[SAMPLE_SETTING])
|
||||
r = await admin_client.get("/api/v1/admin/settings")
|
||||
assert r.status_code == 200
|
||||
body = r.json()
|
||||
assert body["success"] is True
|
||||
assert isinstance(body["data"], list)
|
||||
assert body["data"][0]["key"] == "default_booking_price"
|
||||
|
||||
|
||||
async def test_get_settings_empty_table(admin_client, mock_db):
|
||||
"""Frontend must handle an empty settings list gracefully."""
|
||||
mock_db.fetch = AsyncMock(return_value=[])
|
||||
r = await admin_client.get("/api/v1/admin/settings")
|
||||
assert r.status_code == 200
|
||||
assert r.json()["data"] == []
|
||||
|
||||
|
||||
async def test_update_setting_upsert(admin_client, mock_db):
|
||||
saved = {**SAMPLE_SETTING, "value": 50, "updated_at": "2026-05-21T10:00:00"}
|
||||
mock_db.fetchrow = AsyncMock(return_value=saved)
|
||||
r = await admin_client.put("/api/v1/admin/settings/default_booking_price", json={"value": 50})
|
||||
assert r.status_code == 200
|
||||
body = r.json()
|
||||
assert body["success"] is True
|
||||
assert body["data"]["key"] == "default_booking_price"
|
||||
|
||||
|
||||
async def test_update_setting_zero_value(admin_client, mock_db):
|
||||
"""0 is a valid value (= free appointments)."""
|
||||
saved = {**SAMPLE_SETTING, "value": 0}
|
||||
mock_db.fetchrow = AsyncMock(return_value=saved)
|
||||
r = await admin_client.put("/api/v1/admin/settings/default_booking_price", json={"value": 0})
|
||||
assert r.status_code == 200
|
||||
|
||||
|
||||
async def test_settings_requires_admin(auth_client):
|
||||
r = await auth_client.get("/api/v1/admin/settings")
|
||||
assert r.status_code == 403
|
||||
|
||||
|
||||
async def test_settings_requires_auth(anon_client):
|
||||
r = await anon_client.get("/api/v1/admin/settings")
|
||||
assert r.status_code == 401
|
||||
|
||||
|
||||
# ── Admin customers ───────────────────────────────────────────────────────────
|
||||
|
||||
async def test_list_customers(admin_client, mock_db):
|
||||
mock_db.fetchval = AsyncMock(return_value=1)
|
||||
mock_db.fetch = AsyncMock(return_value=[SAMPLE_CUSTOMER])
|
||||
r = await admin_client.get("/api/v1/admin/customers")
|
||||
assert r.status_code == 200
|
||||
body = r.json()
|
||||
assert body["success"] is True
|
||||
data = body["data"]
|
||||
assert len(data) == 1
|
||||
assert data[0]["full_name"] == "Marie Dupont"
|
||||
assert data[0]["orders_count"] == 2
|
||||
|
||||
|
||||
async def test_list_customers_empty(admin_client, mock_db):
|
||||
mock_db.fetchval = AsyncMock(return_value=0)
|
||||
mock_db.fetch = AsyncMock(return_value=[])
|
||||
r = await admin_client.get("/api/v1/admin/customers")
|
||||
assert r.status_code == 200
|
||||
assert r.json()["data"] == []
|
||||
|
||||
|
||||
async def test_list_customers_search(admin_client, mock_db):
|
||||
mock_db.fetchval = AsyncMock(return_value=1)
|
||||
mock_db.fetch = AsyncMock(return_value=[SAMPLE_CUSTOMER])
|
||||
r = await admin_client.get("/api/v1/admin/customers?search=marie")
|
||||
assert r.status_code == 200
|
||||
|
||||
|
||||
async def test_block_customer(admin_client, mock_db):
|
||||
blocked = {**SAMPLE_CUSTOMER, "is_blocked": True}
|
||||
mock_db.fetchrow = AsyncMock(return_value=blocked)
|
||||
r = await admin_client.patch(f"/api/v1/admin/customers/{USER_ID}", json={"is_blocked": True})
|
||||
assert r.status_code == 200
|
||||
assert r.json()["data"]["is_blocked"] is True
|
||||
|
||||
|
||||
async def test_unblock_customer(admin_client, mock_db):
|
||||
unblocked = {**SAMPLE_CUSTOMER, "is_blocked": False}
|
||||
mock_db.fetchrow = AsyncMock(return_value=unblocked)
|
||||
r = await admin_client.patch(f"/api/v1/admin/customers/{USER_ID}", json={"is_blocked": False})
|
||||
assert r.status_code == 200
|
||||
assert r.json()["data"]["is_blocked"] is False
|
||||
|
||||
|
||||
async def test_customers_requires_admin(auth_client):
|
||||
r = await auth_client.get("/api/v1/admin/customers")
|
||||
assert r.status_code == 403
|
||||
|
||||
|
||||
async def test_customers_requires_auth(anon_client):
|
||||
r = await anon_client.get("/api/v1/admin/customers")
|
||||
assert r.status_code == 401
|
||||
Reference in New Issue
Block a user