296 lines
8.5 KiB
Python
296 lines
8.5 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
管理员配置API测试
|
||
测试功能配置、VIP配置、签到配置的CRUD操作
|
||
"""
|
||
|
||
import pytest
|
||
import requests
|
||
from conftest import API_BASE_URL, ADMIN_TOKEN
|
||
|
||
|
||
class TestFeaturesConfig:
|
||
"""功能配置测试"""
|
||
|
||
def test_get_features_config(self, admin_headers):
|
||
"""测试获取功能配置列表"""
|
||
response = requests.get(
|
||
f"{API_BASE_URL}/admin/config/features",
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
data = response.json()
|
||
assert isinstance(data, list)
|
||
assert len(data) > 0
|
||
|
||
# 验证数据结构
|
||
feature = data[0]
|
||
assert 'feature_key' in feature
|
||
assert 'feature_name' in feature
|
||
assert 'points_cost' in feature
|
||
assert 'enabled' in feature
|
||
|
||
def test_create_feature_config(self, admin_headers):
|
||
"""测试创建功能配置"""
|
||
feature_data = {
|
||
'feature_key': 'test_feature_api',
|
||
'feature_name': 'API测试功能',
|
||
'category': 'test',
|
||
'points_cost': 60,
|
||
'vip_points_cost': 0,
|
||
'svip_points_cost': 0,
|
||
'description': '这是一个API测试功能'
|
||
}
|
||
|
||
response = requests.post(
|
||
f"{API_BASE_URL}/admin/config/features",
|
||
json=feature_data,
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
result = response.json()
|
||
assert result['code'] == 200
|
||
assert result['message'] == '创建成功'
|
||
|
||
# 清理
|
||
requests.delete(
|
||
f"{API_BASE_URL}/admin/config/features/test_feature_api",
|
||
headers=admin_headers
|
||
)
|
||
|
||
def test_update_feature_config(self, admin_headers, test_feature):
|
||
"""测试更新功能配置"""
|
||
feature_key = test_feature['feature_key']
|
||
|
||
update_data = {
|
||
'points_cost': 80,
|
||
'enabled': True
|
||
}
|
||
|
||
response = requests.put(
|
||
f"{API_BASE_URL}/admin/config/features/{feature_key}",
|
||
json=update_data,
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
result = response.json()
|
||
assert result['code'] == 200
|
||
|
||
def test_update_nonexistent_feature(self, admin_headers):
|
||
"""测试更新不存在的功能"""
|
||
response = requests.put(
|
||
f"{API_BASE_URL}/admin/config/features/nonexistent_feature",
|
||
json={'points_cost': 100},
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 404
|
||
|
||
def test_delete_feature_config(self, admin_headers):
|
||
"""测试删除功能配置"""
|
||
# 先创建
|
||
feature_key = 'test_delete_feature'
|
||
requests.post(
|
||
f"{API_BASE_URL}/admin/config/features",
|
||
json={
|
||
'feature_key': feature_key,
|
||
'feature_name': '待删除功能',
|
||
'category': 'test',
|
||
'points_cost': 50,
|
||
'vip_points_cost': 0,
|
||
'svip_points_cost': 0
|
||
},
|
||
headers=admin_headers
|
||
)
|
||
|
||
# 删除
|
||
response = requests.delete(
|
||
f"{API_BASE_URL}/admin/config/features/{feature_key}",
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
result = response.json()
|
||
assert result['code'] == 200
|
||
|
||
|
||
class TestVIPConfig:
|
||
"""VIP配置测试"""
|
||
|
||
def test_get_vip_config(self, admin_headers):
|
||
"""测试获取VIP配置"""
|
||
response = requests.get(
|
||
f"{API_BASE_URL}/admin/config/vip",
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
data = response.json()
|
||
assert isinstance(data, list)
|
||
assert len(data) == 2 # VIP和SVIP
|
||
|
||
# 验证数据结构
|
||
vip = next((v for v in data if v['vip_type'] == 'vip'), None)
|
||
assert vip is not None
|
||
assert 'price' in vip
|
||
assert 'daily_quota' in vip
|
||
assert 'points_multiplier' in vip
|
||
|
||
def test_update_vip_config(self, admin_headers):
|
||
"""测试更新VIP配置"""
|
||
update_data = {
|
||
'price': 35.00,
|
||
'daily_quota': 25
|
||
}
|
||
|
||
response = requests.put(
|
||
f"{API_BASE_URL}/admin/config/vip/vip",
|
||
json=update_data,
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
result = response.json()
|
||
assert result['code'] == 200
|
||
|
||
# 恢复原值
|
||
requests.put(
|
||
f"{API_BASE_URL}/admin/config/vip/vip",
|
||
json={'price': 30.00, 'daily_quota': 20},
|
||
headers=admin_headers
|
||
)
|
||
|
||
def test_update_invalid_vip_type(self, admin_headers):
|
||
"""测试更新无效的VIP类型"""
|
||
response = requests.put(
|
||
f"{API_BASE_URL}/admin/config/vip/invalid",
|
||
json={'price': 100},
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 400
|
||
|
||
|
||
class TestCheckInConfig:
|
||
"""签到配置测试"""
|
||
|
||
def test_get_checkin_config(self, admin_headers):
|
||
"""测试获取签到配置"""
|
||
response = requests.get(
|
||
f"{API_BASE_URL}/admin/config/checkin",
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
data = response.json()
|
||
assert isinstance(data, list)
|
||
assert len(data) > 0
|
||
|
||
# 验证数据结构
|
||
config = data[0]
|
||
assert 'consecutive_days' in config
|
||
assert 'base_points' in config
|
||
assert 'bonus_points' in config
|
||
assert 'total_points' in config
|
||
|
||
def test_create_checkin_config(self, admin_headers):
|
||
"""测试创建签到档位"""
|
||
config_data = {
|
||
'consecutive_days': 99,
|
||
'base_points': 10,
|
||
'bonus_points': 200,
|
||
'total_points': 210
|
||
}
|
||
|
||
response = requests.post(
|
||
f"{API_BASE_URL}/admin/config/checkin",
|
||
json=config_data,
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code == 200
|
||
result = response.json()
|
||
assert result['code'] == 200
|
||
|
||
# 清理
|
||
requests.delete(
|
||
f"{API_BASE_URL}/admin/config/checkin/99",
|
||
headers=admin_headers
|
||
)
|
||
|
||
def test_update_checkin_config(self, admin_headers):
|
||
"""测试更新签到档位"""
|
||
# 假设第7天的配置存在
|
||
update_data = {
|
||
'bonus_points': 25,
|
||
'total_points': 35
|
||
}
|
||
|
||
response = requests.put(
|
||
f"{API_BASE_URL}/admin/config/checkin/7",
|
||
json=update_data,
|
||
headers=admin_headers
|
||
)
|
||
|
||
# 可能成功也可能404(取决于是否存在)
|
||
assert response.status_code in [200, 404]
|
||
|
||
if response.status_code == 200:
|
||
# 恢复原值
|
||
requests.put(
|
||
f"{API_BASE_URL}/admin/config/checkin/7",
|
||
json={'bonus_points': 20, 'total_points': 30},
|
||
headers=admin_headers
|
||
)
|
||
|
||
def test_delete_checkin_config(self, admin_headers):
|
||
"""测试删除签到档位"""
|
||
# 先创建
|
||
requests.post(
|
||
f"{API_BASE_URL}/admin/config/checkin",
|
||
json={
|
||
'consecutive_days': 88,
|
||
'base_points': 10,
|
||
'bonus_points': 150,
|
||
'total_points': 160
|
||
},
|
||
headers=admin_headers
|
||
)
|
||
|
||
# 删除
|
||
response = requests.delete(
|
||
f"{API_BASE_URL}/admin/config/checkin/88",
|
||
headers=admin_headers
|
||
)
|
||
|
||
assert response.status_code in [200, 404]
|
||
|
||
|
||
class TestAdminAuth:
|
||
"""管理员权限测试"""
|
||
|
||
def test_unauthorized_access(self):
|
||
"""测试未授权访问"""
|
||
response = requests.get(
|
||
f"{API_BASE_URL}/admin/config/features",
|
||
headers={'x-admin-token': 'invalid_token'}
|
||
)
|
||
|
||
assert response.status_code == 401
|
||
|
||
def test_missing_token(self):
|
||
"""测试缺少token"""
|
||
response = requests.get(
|
||
f"{API_BASE_URL}/admin/config/features"
|
||
)
|
||
|
||
assert response.status_code in [401, 422] # FastAPI可能返回422
|
||
|
||
|
||
if __name__ == '__main__':
|
||
pytest.main([__file__, '-v'])
|
||
|