chore: establish V1.1 recovery baseline
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
"""
|
||||
V1.1 活动互选二阶段同意 E2E 测试骨架
|
||||
测试项目: 活动互选流程重构(INV-014, INV-015)
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.mark.e2e
|
||||
class TestActivityMutualConsent:
|
||||
"""活动互选二阶段同意流程测试"""
|
||||
|
||||
def test_mutual_interest_does_not_create_match(self, api_client, activity_factory, user_a, user_b):
|
||||
"""Activity Mutual Interest不直接创建Match(INV-014)"""
|
||||
# TODO: P16 实现后完善
|
||||
# Given: A和B在活动后互选
|
||||
# When: 系统处理互选结果
|
||||
# Then: 不创建Match,创建MutualConnectionConsent
|
||||
pass
|
||||
|
||||
def test_one_side_confirm_no_match(self, api_client, activity_factory, user_a, user_b):
|
||||
"""一方确认不创建Match(INV-015)"""
|
||||
# TODO: P16 实现后完善
|
||||
# Given: A和B已达成Mutual Activity Interest
|
||||
# When: 只有A确认开启沟通
|
||||
# Then: 不创建Match,不创建Conversation
|
||||
pass
|
||||
|
||||
def test_both_confirm_creates_match_episode(self, api_client, activity_factory, user_a, user_b):
|
||||
"""双方确认后创建新Match Episode"""
|
||||
# TODO: P16 实现后完善
|
||||
pass
|
||||
|
||||
def test_existing_active_match_not_duplicated(self, api_client, activity_factory, user_a, user_b):
|
||||
"""已有active Match不重复创建"""
|
||||
# TODO: P16 实现后完善
|
||||
pass
|
||||
|
||||
def test_prior_unmatch_creates_new_episode(self, api_client, activity_factory, user_a, user_b):
|
||||
"""已Unmatch后重新确认创建新Episode"""
|
||||
# TODO: P16 实现后完善
|
||||
pass
|
||||
|
||||
def test_one_side_decline_no_match(self, api_client, activity_factory, user_a, user_b):
|
||||
"""一方拒绝不创建Match"""
|
||||
# TODO: P16 实现后完善
|
||||
pass
|
||||
|
||||
def test_timeout_handled(self, api_client, activity_factory, user_a, user_b):
|
||||
"""超时处理"""
|
||||
# TODO: P16 实现后完善
|
||||
pass
|
||||
|
||||
def test_single_interest_not_leaked(self, api_client, activity_factory, user_a, user_b):
|
||||
"""单向意向不泄露给对方"""
|
||||
# TODO: P16 实现后完善
|
||||
pass
|
||||
@@ -0,0 +1,73 @@
|
||||
"""
|
||||
V1.1 婚恋咨询权限 E2E 测试骨架
|
||||
测试项目: Counselor权限隔离、红娘不可见咨询正文
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.mark.e2e
|
||||
class TestCounselingPermission:
|
||||
"""咨询权限测试(INV-012, INV-013)"""
|
||||
|
||||
def test_counselor_only_sees_assigned_services(self, counselor_client, counseling_service_factory):
|
||||
"""Counselor只能看到被分配给自己的咨询(INV-012)"""
|
||||
# GET /api/v1/operator/counseling/services
|
||||
# TODO: P13A 实现后完善
|
||||
pass
|
||||
|
||||
def test_counselor_cannot_view_other_assigned(self, counselor_client, another_counselor_service_factory):
|
||||
"""Counselor不可查看其他咨询师的服务"""
|
||||
# TODO: P13A 实现后完善
|
||||
pass
|
||||
|
||||
def test_matchmaker_cannot_view_counseling_body(self, matchmaker_client, counseling_service_factory):
|
||||
"""红娘不可查看咨询正文(INV-013)"""
|
||||
# TODO: P13A 实现后完善
|
||||
pass
|
||||
|
||||
def test_platform_admin_cannot_view_sensitive_note(self, platform_admin_client, counseling_service_factory):
|
||||
"""普通管理员默认不可查看咨询敏感备注"""
|
||||
# TODO: P13A 实现后完善
|
||||
pass
|
||||
|
||||
def test_counseling_manager_can_assign(self, counseling_manager_client):
|
||||
"""咨询管理员可分配咨询人员"""
|
||||
# POST /api/v1/operator/counseling/services/{id}/assign
|
||||
# TODO: P13A 实现后完善
|
||||
pass
|
||||
|
||||
def test_counseling_risk_referral(self, counselor_client, counseling_service_factory):
|
||||
"""咨询过程中可转交风控"""
|
||||
# TODO: P13A + P17 实现后完善
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.e2e
|
||||
class TestServiceAppointmentPermission:
|
||||
"""服务站预约权限测试(INV-018)"""
|
||||
|
||||
def test_service_station_operator_cannot_browse_all_users(self, station_operator_client):
|
||||
"""服务站人员不能浏览全平台用户(INV-018)"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
def test_service_station_operator_can_process_appointments(self, station_operator_client, appointment_factory):
|
||||
"""服务站人员可处理本服务站预约"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.e2e
|
||||
class TestContentEditorPermission:
|
||||
"""内容编辑员权限测试(INV-019)"""
|
||||
|
||||
def test_content_editor_cannot_access_user_profiles(self, content_editor_client):
|
||||
"""内容编辑员不能访问用户婚恋档案(INV-019)"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
def test_content_editor_can_manage_articles(self, content_editor_client):
|
||||
"""内容编辑员可管理文章内容"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
@@ -0,0 +1,87 @@
|
||||
"""
|
||||
V1.1 首页 E2E 测试骨架
|
||||
测试项目: 善缘丹阳 V1.1 首页结构 + Banner + 8核心入口
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.mark.e2e
|
||||
class TestHomeV11:
|
||||
"""V1.1 首页 E2E 测试"""
|
||||
|
||||
def test_home_api_returns_user_state(self, api_client, authenticated_user):
|
||||
"""GET /api/v1/home 返回 userState"""
|
||||
resp = api_client.get("/api/v1/home")
|
||||
assert resp.status_code == 200
|
||||
data = resp.json()
|
||||
assert "userState" in data
|
||||
|
||||
def test_home_banners_filtered_by_time(self, api_client, banner_factory):
|
||||
"""Banner按时间过滤:未开始和已过期的Banner不显示"""
|
||||
# TODO: P07 实现后完善
|
||||
pass
|
||||
|
||||
def test_home_banners_filtered_by_audience(self, api_client, banner_factory, user_factory):
|
||||
"""Banner按用户状态过滤:audience_scope不匹配时不显示"""
|
||||
# TODO: P07 实现后完善
|
||||
pass
|
||||
|
||||
def test_home_quick_entries_fixed_order(self, api_client):
|
||||
"""首页8核心入口顺序固定"""
|
||||
# TODO: P07 实现后完善
|
||||
pass
|
||||
|
||||
def test_unverified_user_no_recommendations(self, api_client, unverified_user):
|
||||
"""未审核用户不返回真实推荐"""
|
||||
resp = api_client.get("/api/v1/home")
|
||||
data = resp.json()
|
||||
assert data.get("recommendations") == [] or data.get("recommendations") is None
|
||||
|
||||
def test_paused_user_no_new_recommendations(self, api_client, paused_user):
|
||||
"""Paused状态用户不返回新推荐"""
|
||||
resp = api_client.get("/api/v1/home")
|
||||
data = resp.json()
|
||||
# Paused用户应有推荐区降级提示,而非空列表
|
||||
assert "recommendations" in data or "userState" in data
|
||||
|
||||
def test_successful_user_no_match_recommendations(self, api_client, successful_user):
|
||||
"""Successful用户不返回找对象推荐"""
|
||||
resp = api_client.get("/api/v1/home")
|
||||
data = resp.json()
|
||||
# Successful用户首页应转为公益服务推荐
|
||||
pass
|
||||
|
||||
def test_service_location_shown_when_available(self, api_client, service_location_factory):
|
||||
"""服务站可展示"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
def test_banner_cannot_link_external_url(self, admin_client):
|
||||
"""Banner不能创建外部URL跳转"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.e2e
|
||||
class TestCapabilityService:
|
||||
"""CapabilityService 能力判断测试"""
|
||||
|
||||
def test_can_receive_recommendations(self, api_client, searching_user):
|
||||
"""Searching用户canReceiveRecommendations=true"""
|
||||
resp = api_client.get("/api/v1/home")
|
||||
data = resp.json()
|
||||
caps = data.get("capabilities", {})
|
||||
assert caps.get("canReceiveRecommendations") is True
|
||||
|
||||
def test_paused_user_cannot_receive_recommendations(self, api_client, paused_user):
|
||||
"""Paused用户canReceiveRecommendations=false"""
|
||||
resp = api_client.get("/api/v1/home")
|
||||
data = resp.json()
|
||||
caps = data.get("capabilities", {})
|
||||
assert caps.get("canReceiveRecommendations") is False
|
||||
|
||||
def test_counseling_enabled_capability(self, api_client, verified_user):
|
||||
"""counselingEnabled flag控制canApplyCounseling"""
|
||||
# TODO: P22 实现后完善
|
||||
pass
|
||||
@@ -0,0 +1,72 @@
|
||||
"""
|
||||
V1.1 本地资格 E2E 测试骨架
|
||||
测试项目: 本地资格声明 → 佐证上传 → 审核流程
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.mark.e2e
|
||||
class TestLocalEligibilityE2E:
|
||||
"""本地资格 E2E 全流程测试"""
|
||||
|
||||
def test_declare_local_eligibility(self, api_client, verified_user):
|
||||
"""用户可声明丹阳工作/户籍/居住"""
|
||||
# POST /api/v1/local-eligibility/declaration
|
||||
# TODO: P04 实现后完善
|
||||
pass
|
||||
|
||||
def test_declare_does_not_require_evidence_by_default(self, api_client, verified_user):
|
||||
"""声明本地资格不默认要求上传佐证"""
|
||||
# TODO: P04 实现后完善
|
||||
pass
|
||||
|
||||
def test_evidence_upload_requires_permission(self, api_client, verified_user):
|
||||
"""佐证文件上传需要鉴权"""
|
||||
# TODO: P04 实现后完善
|
||||
pass
|
||||
|
||||
def test_reviewer_can_access_evidence(self, operator_client, local_eligibility_factory):
|
||||
"""审核员可访问本地资格佐证"""
|
||||
# TODO: P05 实现后完善
|
||||
pass
|
||||
|
||||
def test_matchmaker_cannot_access_evidence(self, matchmaker_client, local_eligibility_factory):
|
||||
"""红娘不可访问本地资格佐证(INV-011)"""
|
||||
# TODO: P13 + P05 实现后完善
|
||||
pass
|
||||
|
||||
def test_local_eligibility_status_in_me_status(self, api_client, verified_user):
|
||||
"""/me/status 返回 localEligibilityStatus"""
|
||||
# TODO: P04 实现后完善
|
||||
pass
|
||||
|
||||
def test_local_eligibility_affects_match_eligibility(self, api_client, user_factory):
|
||||
"""本地资格未核验影响匹配资格"""
|
||||
# TODO: P06 实现后完善
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.e2e
|
||||
class TestLocalEligibilityReview:
|
||||
"""本地资格审核流程测试"""
|
||||
|
||||
def test_review_queue_local_eligibility_type(self, operator_client):
|
||||
"""本地资格审核进入 review_type=local_eligibility 队列"""
|
||||
# TODO: P05 实现后完善
|
||||
pass
|
||||
|
||||
def test_approve_updates_eligibility_status(self, operator_client, local_eligibility_factory):
|
||||
"""审核通过更新 local_eligibility 状态"""
|
||||
# TODO: P05 实现后完善
|
||||
pass
|
||||
|
||||
def test_need_evidence_triggers_upload(self, operator_client, local_eligibility_factory):
|
||||
"""需补充佐证触发用户上传"""
|
||||
# TODO: P05 实现后完善
|
||||
pass
|
||||
|
||||
def test_evidence_access_logged(self, operator_client, local_eligibility_factory):
|
||||
"""查看佐证文件记录审计日志"""
|
||||
# TODO: P05 实现后完善
|
||||
pass
|
||||
@@ -0,0 +1,46 @@
|
||||
"""
|
||||
V1.1 服务预约 E2E 测试骨架
|
||||
测试项目: 服务预约全流程 + 并发安全
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.mark.e2e
|
||||
class TestServiceAppointmentE2E:
|
||||
"""服务预约 E2E 测试"""
|
||||
|
||||
def test_submit_appointment(self, api_client, service_location_factory):
|
||||
"""用户可提交服务预约"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
def test_appointment_idempotent(self, api_client, service_location_factory):
|
||||
"""预约提交支持幂等(Idempotency-Key)"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
def test_operator_can_confirm(self, operator_client, appointment_factory):
|
||||
"""后台可确认预约"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
def test_appointment_concurrent_safety(self, api_client, service_location_factory):
|
||||
"""同一预约同时取消和确认的并发安全性"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
def test_my_appointments_list(self, api_client, appointment_factory):
|
||||
"""我的预约列表正确"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
def test_cancel_before_confirmation(self, api_client, appointment_factory):
|
||||
"""待确认状态可取消"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
|
||||
def test_cancel_after_confirmation_denied(self, api_client, appointment_factory):
|
||||
"""已确认状态不可自行取消"""
|
||||
# TODO: P19 实现后完善
|
||||
pass
|
||||
Reference in New Issue
Block a user