|
|
@@ -4,6 +4,98 @@
|
|
|
|
|
|
---
|
|
|
|
|
|
+## v1.0.2061 (2026-11-05)
|
|
|
+
|
|
|
+### 文档
|
|
|
+- 研发负责人1 标准汇报 08:00 轮(黑窗已解·会话全空闲·双 RED createTask/review 证据齐待测试 mark-red 落账;YELLOW 2 待 mark-green;DONE 9;无新增能力键·池 0 pending·218 SC 0/218 本轮 0)
|
|
|
+- 研发负责人1 标准汇报 07:45 轮(S-cfc-13 RED 单测 291955bce 已推待测试 mark-red 落账;createTask/review 双 RED 证据齐;YELLOW 2 待 mark-green;DONE 9;黑窗 429 至 08:00·无新增能力键·218 SC 0/218 本轮 0)
|
|
|
+- 研发负责人2 标准汇报 07:40 轮(S-cfc-13 SC-P-11 入池派发;--backfill 12 任务全 done;3 键新 DONE wechatLogin/jwtGuard/switchRole;YELLOW 2 待测试 mark-green;RED 2 createTask 待登记 red_sha/review 在途;主工作树 101 WIP 未触碰;黑窗 429 至 08:00 fallback)
|
|
|
+- 研发负责人3 错峰03 汇报 2026-11-05 06:41(派发 S-cfc-9..12 四任务,RED 2 / YELLOW 4 / DONE 6)
|
|
|
+- 研发负责人1 标准汇报 06:33 轮(S-cfc-11 编译验证/pub-iwintrue 启动验证在途,产出未推远端 RED 2 键无 red_sha;YELLOW 4 键证据全在 origin/cfclub 等测试 mark-green;无新增能力键·218 SC 0/218 本轮 0;B-13 挂账·黑窗 429 至 08:00)
|
|
|
+
|
|
|
+### 测试
|
|
|
+- 补齐 task.parent.review 契约级单测(SC-P-11 任务审批完成通过/驳回)
|
|
|
+- S-cfc-11 family.parent.switchRole 契约级单测补齐(13 例全绿)
|
|
|
+- 补齐 auth.guest.wechatLogin 契约级单测(SC-G-02 微信一键登录)
|
|
|
+- S-cfc-10 auth.guest.jwtGuard 契约边界补充(OPTIONS预检/query-token/teacher-admin角色/LOGIN_REQUIRED 401)10 例全绿
|
|
|
+- 补齐 task.parent.createTask 契约级单测
|
|
|
+
|
|
|
+### 其他
|
|
|
+- 实现已存在但零测试覆盖(RED)。补齐纯 Mockito 单测,不依赖 DB/真实微信/Spring 容器,不改 src/main。
|
|
|
+- 新增测试(32 例全绿,skipTests=true 需 -DskipTests=false 显式开启):
|
|
|
+- - TaskControllerReviewTest(17 例):POST /api/tasks/{id}/review(approved 通过/驳回、DTO 字段映射、
|
|
|
+- 统一 @PostMapping GET→405、缺 body 400、直接调用 Result<T>);POST /api/tasks/pending-review
|
|
|
+- (parent 列表、缺 userId 400);POST /api/tasks/accept(body/currentMemberId 派生 memberId、
|
|
|
+- 缺 memberId 500、GET→405);POST /api/tasks/reject/{id}(成功、缺 memberId 500、GET→405)
|
|
|
+- - TaskServiceReviewTest(15 例):reviewTask 通过→发分+completed(PointsLog amount/type、余额 100→110、
|
|
|
+- legacy result=pass);驳回→pending+completedAt 清空(可重做)+不发分(legacy result≠pass 同);
|
|
|
+- 重复审批幂等(已 completed→true 但不重复发分/不落库);非待审状态→false;任务不存在→false;
|
|
|
+- acceptTask(assigned+正确执行人→in_progress+清 acceptDeadline;错误执行人/非 assigned→false);
|
|
|
+- rejectTask(assigned→rejected+双向关系分调整;错误执行人→false 不触关系分);
|
|
|
+- getPendingReviewTasks(仅 parent 可见本家庭列表;child/不存在→空列表不泄露)
|
|
|
+- 暴露缺陷(不修实现,交编排侧转 GREEN 决策):
|
|
|
+- - POST /api/tasks/accept HTTP 契约已断:handler @PostMapping("/accept") + @PathVariable Long id,
|
|
|
+- 路径模板无 {id} → 参数解析抛 MissingPathVariableException(MockMvc 观测 500);前端
|
|
|
+- cfc-frontend/utils/api.js acceptTask 把 taskId 放 body {taskId, memberId},handler 从不读 body.taskId。
|
|
|
+- acceptTask_httpPath_missingPathVariable_pinsObserved500_defect 钉住当前观测行为,修复后应翻转为 200 契约断言。
|
|
|
+- 溯源:SC-P-11 · tests/user-scenarios/应用场景总览.md · tests/test-cases/parent.md TC-P-06/TC-P-06-E
|
|
|
+- 设计:docs/superpowers/api/API_REFERENCE.md §4.3 · docs/superpowers/specs/2026-09-04-task-system-unification-design.md
|
|
|
+-
|
|
|
+- - 正常路径:parent→teacher、child持有parent切回家长
|
|
|
+- - 关键边界:未登录 userId null/-1/0→401、role 缺失、服务层空结果→业务错误
|
|
|
+- - 角色/权限:admin 当前角色禁止切换、未持有目标角色抛异常、非法目标角色拒绝
|
|
|
+- 纯 JUnit5+Mockito 直接调用,不依赖 Spring 上下文/微信/外部服务,不改 src/main。
|
|
|
+-
|
|
|
+- 不依赖数据库/真实微信/Spring 容器,不改 src/main 实现。
|
|
|
+- 新增测试(16 例全绿):
|
|
|
+- - AuthWechatLoginContractTest(10 例):TC-G-02 正常流(token+用户信息+默认 parent)、
|
|
|
+- TC-G-02a 边界(老用户重登 isNewUser=false 不重复建号)、TC-G-02-E 异常(Result.error
|
|
|
+- 仅透传业务 message、不泄露堆栈、不建脏号)、TC-G-02-P 权限(JwtInterceptor 公开白名单
|
|
|
+- 无 token 匿名放行/无效 token 降级放行、非必须登录路径)、结构契约 POST /api/auth/wechat-login
|
|
|
+- - UserServiceWechatLoginContractTest(6 例):服务层真实边界——全新 openid 建 User(parent)+家庭+成员、
|
|
|
+- 同一 openid 二次登录不重复建号/家庭/成员(仅刷 sessionKey)、code2Session 空 openid/抛异常不落库、
|
|
|
+- phoneCode 绑定手机号、teacher 老用户重登保留原角色
|
|
|
+- 溯源:SC-G-02 · tests/user-scenarios/01-guest.md 场景 G-2 · tests/test-cases/guest.md TC-G-02/TC-G-02a/TC-G-02-E/TC-G-02-P
|
|
|
+-
|
|
|
+- 本提交补齐该键契约边界 RED 阶段缺口,与既有 39 例回归合计 49/49 通过。
|
|
|
+- - 新增 JwtInterceptorContractEdgeTest 10 例:
|
|
|
+- 1) OPTIONS 预检放行(受保护/公开路径均不鉴权、不写 401)
|
|
|
+- 2) query 参数 ?token= 获取路径:有效 token 放行注入 userId/role/familyId/currentMemberId;无效 token 统一 401 不泄露
|
|
|
+- 3) teacher 有效 token 放行 + 注入 role=teacher + ROLE_teacher 权限上下文(@PreAuthorize 用)
|
|
|
+- 4) admin 有效 token 放行 + 注入 role=admin + ROLE_admin 权限上下文
|
|
|
+- 5) LOGIN_REQUIRED_PATHS 族边界:/api/family/user/switch-role、/api/ai/health-coach/send、/api/auth/switch-role 无 token → 401;同一路径携有效 token → 放行
|
|
|
+- - 只新增 src/test 下与该键相关测试,不改 src/main(未暴露实现缺陷)
|
|
|
+-
|
|
|
+- 原为未覆盖 handler(实现已存在、零测试覆盖),本提交补 7 条契约级单测
|
|
|
+- (MockMvc standalone + 直接调用级,无 Spring 上下文/无 DB/无外部服务):
|
|
|
+- - 正常路径:家长建任务(标题/成员B/积分/频率)→ 统一 Result<Long> code=200 data=任务ID
|
|
|
+- - DTO 反序列化:title/description/category/memberId/points/duration/taskType/frequency/
|
|
|
+- needReview/executorType/dimensionCode 字段映射经 ArgumentCaptor 验证
|
|
|
+- - 多成员下发边界:body.memberIds=[B1,B2] 原样传 Service(Service 层为每个成员建独立实例)
|
|
|
+- - 统一 @PostMapping:GET 同路径 → 405
|
|
|
+- - userId 属性缺失(@RequestAttribute required)→ 400(JwtInterceptor 负责注入,缺失即未认证)
|
|
|
+- - Service 业务拒绝(家庭不足2人等)→ 异常不吞,交 GlobalExceptionHandler 统一转
|
|
|
+- Result.error(400, message)(TC-P-05-E 频率非法 400 口径;区别于 addMember 控制器内捕获契约)
|
|
|
+- - 直接调用级:统一 Result<T> code=200/message=success/data=任务ID
|
|
|
+- 角色/权限口径:本 handler 无 @RequestAttribute(role/roles),授权由 JwtInterceptor(有效 token
|
|
|
+- 注入真实 userId)与 Service 层家庭归属/执行者校验承担,故覆盖 userId 注入与传递正确性而非角色分支。
|
|
|
+- 缺陷观察(交编排侧决策,未断言为绿灯):/api/tasks/create 未列入 JwtInterceptor.LOGIN_REQUIRED_PATHS,
|
|
|
+- 匿名(userId=-1)可到达 handler 走业务 500,与 SEC-20261031-01 已修复口径漂移同类。
|
|
|
+- 7 用例全部通过(mvn -DskipTests=false -Dtest=TaskControllerCreateTaskTest test);
|
|
|
+- 模块 test-compile 通过(EXIT=0)。不改 src/main 实现。
|
|
|
+-
|
|
|
+-
|
|
|
+- - FamilyMemberService.switchToMember: 异常语义修正(IllegalArgumentException→400 / AccessDeniedException→403)
|
|
|
+- - FamilyMembersController.switchToMember: 移除吞异常 try-catch,缺少 memberId→400,userId==null→401
|
|
|
+- - 新增 tests/e2e/api/sc-p-03-switch-role.spec.js(11 用例:正常/异常/权限三类流)
|
|
|
+- - 新增 tests/playwright.config.api.local.js(本地 API 配置)
|
|
|
+- - SC-P-03 专项 11/11 通过;既有 family-member-api 回归 13/13 通过
|
|
|
+-
|
|
|
+
|
|
|
+### 新功能
|
|
|
+- 双角色切换 API 修复与契约测试
|
|
|
+
|
|
|
+
|
|
|
## v1.0.2060 (2026-11-04)
|
|
|
|
|
|
### 文档
|