新增:帖子详情页真实数据整页替换——四态/真九宫格大图/评论区/关注双态,Feed 导航与互动全接线,demo 详情退役(T3-15/16)
CI / flutter-gates (push) Failing after 20s
CI / flutter-gates (push) Failing after 20s
- post_detail_page 整页重写:内存副本先渲染 + getPost 拉新、四态 (loading/error+重试/ready/40403 提示后返回 Feed 并刷新);媒体全量 ——单图原比例(高度钳制 [0.75w,1.33w])、多图真九宫格(D11 轮播 弃用,本单裁定)+ InteractiveViewer 全屏大图(03 号拍板 E) - 评论区:游标列表触底补页 + 底部输入条创建(幂等键在数据层)+ 仅本人评论渲染删除入口(40301/40404 服务端兜底);成败埋点对 (durationMs 取输入会话起点、attemptSeq 会话内递增);CommentTile 升共享组件(@ 回复前缀呈现、降级作者「宠友」占位) - 关注双态钮(tonal +关注 / Outlined 已关注 + 取关确认)乐观翻转、 回滚零动画 + SnackBar,user_followed/unfollowed(post_detail) 挂接; 本人帖不渲染 - Feed 接通:整卡与评论钮导航详情(T3-14 占位提示移除)、点赞/收藏 接共享 ToggleSync(详情与卡片同一实例跨页一致)、toggleError 一次性 SnackBar 消费 - 主壳/装配:openPost 按 postId push;create demo 流不再导航已退役的 demo 详情(发布页真实化留 T3-17);AppState 在 post_detail/Feed 面 消费清零 - compose 冒烟(env 门控默认跳过):真链路发帖/点赞幂等/收藏/评论/ 删评一轮 + 断网点赞回滚(生产 ApiClient 异常链) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:patbond_flutter/core/theme/app_theme.dart';
|
||||
import 'package:patbond_flutter/core/widgets/comment_tile.dart';
|
||||
|
||||
import '../../helpers/community_test_helpers.dart';
|
||||
|
||||
void main() {
|
||||
final now = DateTime.parse('2026-09-08T13:00:00.000Z');
|
||||
|
||||
Widget wrap(Widget child) => MaterialApp(
|
||||
theme: buildAppTheme(),
|
||||
home: Scaffold(body: Center(child: child)),
|
||||
);
|
||||
|
||||
testWidgets('渲染作者名 / 内容 / 相对时间;无 onDelete 不显删除', (tester) async {
|
||||
await tester.pumpWidget(
|
||||
wrap(CommentTile(comment: sampleComment(), now: now)),
|
||||
);
|
||||
|
||||
expect(find.text('毛毛的铲屎官'), findsOneWidget);
|
||||
expect(find.text('好可爱!', findRichText: true), findsOneWidget);
|
||||
expect(find.text('2 小时前'), findsOneWidget);
|
||||
expect(find.text('删除'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('@ 回复以「回复 @昵称:」前缀呈现;降级作者「宠友」占位', (tester) async {
|
||||
await tester.pumpWidget(
|
||||
wrap(
|
||||
CommentTile(
|
||||
comment: sampleComment(
|
||||
author: sampleAuthorJson(nickname: null, avatarUrl: null),
|
||||
replyToUser: sampleAuthorJson(userId: 'u-2', nickname: '豆豆麻麻'),
|
||||
),
|
||||
now: now,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
expect(find.text('宠友'), findsOneWidget);
|
||||
expect(
|
||||
find.textContaining('回复 @豆豆麻麻:', findRichText: true),
|
||||
findsOneWidget,
|
||||
);
|
||||
});
|
||||
|
||||
testWidgets('onDelete 提供时显删除入口并回调;deleting 期间转圈锁定', (tester) async {
|
||||
var deleted = 0;
|
||||
await tester.pumpWidget(
|
||||
wrap(
|
||||
CommentTile(
|
||||
comment: sampleComment(),
|
||||
now: now,
|
||||
onDelete: () => deleted++,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await tester.tap(find.text('删除'));
|
||||
expect(deleted, 1);
|
||||
|
||||
await tester.pumpWidget(
|
||||
wrap(
|
||||
CommentTile(
|
||||
comment: sampleComment(),
|
||||
now: now,
|
||||
deleting: true,
|
||||
onDelete: () => deleted++,
|
||||
),
|
||||
),
|
||||
);
|
||||
expect(find.text('删除'), findsNothing);
|
||||
expect(find.byType(CircularProgressIndicator), findsOneWidget);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user