182 lines
5.4 KiB
Python
182 lines
5.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
统计API测试
|
|
测试数据统计功能
|
|
"""
|
|
|
|
import pytest
|
|
import requests
|
|
from conftest import API_BASE_URL, ADMIN_TOKEN
|
|
|
|
|
|
class TestTodayStats:
|
|
"""今日统计测试"""
|
|
|
|
def test_get_today_stats(self, admin_headers):
|
|
"""测试获取今日统计"""
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/admin/stats/today",
|
|
headers=admin_headers
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
result = response.json()
|
|
assert result['code'] == 200
|
|
|
|
data = result['data']
|
|
assert 'total_users' in data
|
|
assert 'checkin_count' in data
|
|
assert 'feature_usage_count' in data
|
|
assert 'vip_count' in data
|
|
|
|
# 验证数据类型
|
|
assert isinstance(data['total_users'], int)
|
|
assert isinstance(data['checkin_count'], int)
|
|
assert isinstance(data['feature_usage_count'], int)
|
|
assert isinstance(data['vip_count'], int)
|
|
|
|
# 验证数据合理性
|
|
assert data['total_users'] >= 0
|
|
assert data['checkin_count'] >= 0
|
|
assert data['checkin_count'] <= data['total_users']
|
|
|
|
def test_stats_unauthorized(self):
|
|
"""测试未授权访问统计"""
|
|
response = requests.get(f"{API_BASE_URL}/admin/stats/today")
|
|
|
|
assert response.status_code in [401, 422]
|
|
|
|
|
|
class TestFeatureUsageStats:
|
|
"""功能使用排行测试"""
|
|
|
|
def test_get_feature_usage_stats(self, admin_headers):
|
|
"""测试获取功能使用排行"""
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/admin/stats/feature-usage",
|
|
params={'days': 7},
|
|
headers=admin_headers
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
result = response.json()
|
|
assert result['code'] == 200
|
|
|
|
data = result['data']
|
|
assert isinstance(data, list)
|
|
|
|
# 如果有数据,验证结构
|
|
if len(data) > 0:
|
|
item = data[0]
|
|
assert 'feature_key' in item
|
|
assert 'feature_name' in item
|
|
assert 'usage_count' in item
|
|
assert isinstance(item['usage_count'], int)
|
|
|
|
def test_feature_usage_stats_different_days(self, admin_headers):
|
|
"""测试不同天数的统计"""
|
|
days_list = [7, 30, 90]
|
|
|
|
for days in days_list:
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/admin/stats/feature-usage",
|
|
params={'days': days},
|
|
headers=admin_headers
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
assert response.json()['code'] == 200
|
|
|
|
|
|
class TestPointsTrend:
|
|
"""积分趋势测试"""
|
|
|
|
def test_get_points_trend(self, admin_headers):
|
|
"""测试获取积分趋势"""
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/admin/stats/points-trend",
|
|
params={'days': 7},
|
|
headers=admin_headers
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
result = response.json()
|
|
assert result['code'] == 200
|
|
|
|
data = result['data']
|
|
assert isinstance(data, list)
|
|
|
|
# 如果有数据,验证结构
|
|
if len(data) > 0:
|
|
item = data[0]
|
|
assert 'date' in item
|
|
assert 'earned' in item
|
|
assert 'consumed' in item
|
|
|
|
# 验证数据类型
|
|
assert isinstance(item['earned'], (int, float, type(None)))
|
|
assert isinstance(item['consumed'], (int, float, type(None)))
|
|
|
|
def test_points_trend_date_format(self, admin_headers):
|
|
"""测试日期格式"""
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/admin/stats/points-trend",
|
|
params={'days': 7},
|
|
headers=admin_headers
|
|
)
|
|
|
|
data = response.json()['data']
|
|
|
|
if len(data) > 0:
|
|
# 验证日期格式 (YYYY-MM-DD)
|
|
import re
|
|
date_pattern = r'^\d{4}-\d{2}-\d{2}$'
|
|
assert re.match(date_pattern, data[0]['date'])
|
|
|
|
|
|
class TestStatsIntegration:
|
|
"""统计集成测试"""
|
|
|
|
def test_stats_after_operations(self, test_user, test_feature, admin_headers, db_cursor):
|
|
"""测试操作后统计数据变化"""
|
|
# 获取操作前统计
|
|
response_before = requests.get(
|
|
f"{API_BASE_URL}/admin/stats/today",
|
|
headers=admin_headers
|
|
)
|
|
stats_before = response_before.json()['data']
|
|
|
|
# 执行签到
|
|
requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': test_user['username']}
|
|
)
|
|
|
|
# 使用功能
|
|
requests.post(
|
|
f"{API_BASE_URL}/feature/use",
|
|
json={
|
|
'username': test_user['username'],
|
|
'feature_key': test_feature['feature_key'],
|
|
'device_id': 'test'
|
|
}
|
|
)
|
|
|
|
# 获取操作后统计
|
|
response_after = requests.get(
|
|
f"{API_BASE_URL}/admin/stats/today",
|
|
headers=admin_headers
|
|
)
|
|
stats_after = response_after.json()['data']
|
|
|
|
# 验证签到数增加
|
|
assert stats_after['checkin_count'] >= stats_before['checkin_count']
|
|
|
|
# 验证功能使用数增加
|
|
assert stats_after['feature_usage_count'] >= stats_before['feature_usage_count']
|
|
|
|
|
|
if __name__ == '__main__':
|
|
pytest.main([__file__, '-v'])
|
|
|