263 lines
7.9 KiB
Python
263 lines
7.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
签到API测试
|
|
测试签到功能、连续天数计算、VIP倍数
|
|
"""
|
|
|
|
import pytest
|
|
import requests
|
|
from datetime import date
|
|
from conftest import API_BASE_URL
|
|
|
|
|
|
class TestDailyCheckIn:
|
|
"""每日签到测试"""
|
|
|
|
def test_first_checkin(self, test_user):
|
|
"""测试首次签到"""
|
|
request_data = {'username': test_user['username']}
|
|
|
|
response = requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json=request_data
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
result = response.json()
|
|
assert result['code'] == 200
|
|
|
|
data = result['data']
|
|
assert data['success'] is True
|
|
assert data['consecutive_days'] == 1
|
|
assert data['points_earned'] > 0
|
|
assert '签到成功' in data['message']
|
|
|
|
def test_duplicate_checkin(self, test_user, db_cursor):
|
|
"""测试重复签到"""
|
|
# 先签到一次
|
|
requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': test_user['username']}
|
|
)
|
|
|
|
# 再次签到
|
|
response = requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': test_user['username']}
|
|
)
|
|
|
|
assert response.status_code == 400
|
|
assert '已签到' in response.json()['detail']
|
|
|
|
def test_consecutive_checkin_calculation(self, test_user, db_cursor):
|
|
"""测试连续天数计算"""
|
|
from datetime import timedelta
|
|
|
|
# 设置昨天签到
|
|
yesterday = date.today() - timedelta(days=1)
|
|
db_cursor.execute("""
|
|
UPDATE users
|
|
SET last_check_in_date = %s, consecutive_check_in = 5
|
|
WHERE username = %s
|
|
""", (yesterday, test_user['username']))
|
|
db_cursor.connection.commit()
|
|
|
|
# 今天签到
|
|
response = requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': test_user['username']}
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()['data']
|
|
|
|
# 连续天数应该+1
|
|
assert data['consecutive_days'] == 6
|
|
|
|
def test_broken_consecutive_checkin(self, test_user, db_cursor):
|
|
"""测试中断连续签到"""
|
|
from datetime import timedelta
|
|
|
|
# 设置3天前签到
|
|
three_days_ago = date.today() - timedelta(days=3)
|
|
db_cursor.execute("""
|
|
UPDATE users
|
|
SET last_check_in_date = %s, consecutive_check_in = 10
|
|
WHERE username = %s
|
|
""", (three_days_ago, test_user['username']))
|
|
db_cursor.connection.commit()
|
|
|
|
# 今天签到
|
|
response = requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': test_user['username']}
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()['data']
|
|
|
|
# 连续天数应该归零重新开始
|
|
assert data['consecutive_days'] == 1
|
|
|
|
def test_vip_multiplier(self, vip_user):
|
|
"""测试VIP倍数"""
|
|
response = requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': vip_user['username']}
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()['data']
|
|
|
|
# VIP应该有倍数
|
|
assert data['vip_multiplier'] >= 1.0
|
|
if vip_user['vip_type'] == 'vip':
|
|
assert data['vip_multiplier'] == 1.5
|
|
|
|
def test_checkin_nonexistent_user(self):
|
|
"""测试不存在的用户签到"""
|
|
response = requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': 'nonexistent_user'}
|
|
)
|
|
|
|
assert response.status_code == 404
|
|
|
|
|
|
class TestCheckInStatus:
|
|
"""签到状态测试"""
|
|
|
|
def test_get_checkin_status(self, test_user):
|
|
"""测试获取签到状态"""
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/checkin/status",
|
|
params={'username': test_user['username']}
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
result = response.json()
|
|
assert result['code'] == 200
|
|
|
|
data = result['data']
|
|
assert 'today_checked' in data
|
|
assert 'consecutive_days' in data
|
|
assert 'total_days' in data
|
|
|
|
def test_status_after_checkin(self, test_user):
|
|
"""测试签到后状态更新"""
|
|
# 签到
|
|
requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': test_user['username']}
|
|
)
|
|
|
|
# 查询状态
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/checkin/status",
|
|
params={'username': test_user['username']}
|
|
)
|
|
|
|
data = response.json()['data']
|
|
assert data['today_checked'] is True
|
|
|
|
|
|
class TestCheckInCalendar:
|
|
"""签到日历测试"""
|
|
|
|
def test_get_checkin_calendar(self, test_user):
|
|
"""测试获取签到日历"""
|
|
today = date.today()
|
|
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/checkin/calendar/{today.year}/{today.month}",
|
|
params={'username': test_user['username']}
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
result = response.json()
|
|
assert result['code'] == 200
|
|
|
|
data = result['data']
|
|
assert data['year'] == today.year
|
|
assert data['month'] == today.month
|
|
assert isinstance(data['checked_dates'], list)
|
|
|
|
def test_calendar_after_checkin(self, test_user, db_cursor):
|
|
"""测试签到后日历更新"""
|
|
today = date.today()
|
|
|
|
# 签到
|
|
requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': test_user['username']}
|
|
)
|
|
|
|
# 查询日历
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/checkin/calendar/{today.year}/{today.month}",
|
|
params={'username': test_user['username']}
|
|
)
|
|
|
|
data = response.json()['data']
|
|
assert today.day in data['checked_dates']
|
|
|
|
|
|
class TestCheckInHistory:
|
|
"""签到历史测试"""
|
|
|
|
def test_get_checkin_history(self, test_user):
|
|
"""测试获取签到历史"""
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/checkin/history",
|
|
params={'username': test_user['username'], 'page': 1, 'limit': 10}
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
result = response.json()
|
|
assert result['code'] == 200
|
|
|
|
data = result['data']
|
|
assert 'total' in data
|
|
assert 'records' in data
|
|
assert isinstance(data['records'], list)
|
|
|
|
def test_history_after_checkin(self, test_user):
|
|
"""测试签到后历史记录增加"""
|
|
# 获取签到前记录数
|
|
response_before = requests.get(
|
|
f"{API_BASE_URL}/checkin/history",
|
|
params={'username': test_user['username']}
|
|
)
|
|
total_before = response_before.json()['data']['total']
|
|
|
|
# 签到
|
|
requests.post(
|
|
f"{API_BASE_URL}/checkin/daily",
|
|
json={'username': test_user['username']}
|
|
)
|
|
|
|
# 获取签到后记录数
|
|
response_after = requests.get(
|
|
f"{API_BASE_URL}/checkin/history",
|
|
params={'username': test_user['username']}
|
|
)
|
|
total_after = response_after.json()['data']['total']
|
|
|
|
assert total_after == total_before + 1
|
|
|
|
def test_history_pagination(self, test_user):
|
|
"""测试分页"""
|
|
response = requests.get(
|
|
f"{API_BASE_URL}/checkin/history",
|
|
params={'username': test_user['username'], 'page': 1, 'limit': 5}
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()['data']
|
|
assert len(data['records']) <= 5
|
|
|
|
|
|
if __name__ == '__main__':
|
|
pytest.main([__file__, '-v'])
|
|
|