import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:patbond_flutter/app/app.dart'; import 'package:patbond_flutter/core/widgets/post_card.dart'; import 'package:patbond_flutter/features/auth/session_manager.dart'; import 'package:patbond_flutter/features/community/community_models.dart'; import 'package:patbond_flutter/features/community/media_uploader.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../helpers/auth_test_helpers.dart'; import '../../helpers/community_test_helpers.dart'; import '../../helpers/media_test_helpers.dart'; import '../../helpers/pet_test_helpers.dart'; /// 主壳发布闭环(T3-17):创作 Tab 入口 → 发布页 → 发布成功 → /// 回首页 Feed 并整体刷新 → 新帖置顶可见(M3 验收「发布后可见」的 /// 客户端侧断言;跨客户端可见性走 compose 真链路实测,见 26 号报告 §5)。 void main() { testWidgets('创作 Tab「发布动态」→ 发布 → 回首页 Feed 刷新,新帖置顶', (tester) async { SharedPreferences.setMockInitialValues({}); final session = SessionManager(store: InMemoryTokenStore()) ..markAuthenticated(); final repository = FakeCommunityRepository(); var published = false; repository.onFeed = (_, _) async => feedPage( published ? [ FeedCard.fromJson({ ...sampleFeedCardJson(id: 'p-new'), 'contentPreview': '刚发布的动态', }), sampleFeedCard(id: 'p-old'), ] : [sampleFeedCard(id: 'p-old')], ); repository.onCreatePost = (request, _) async => Post.fromJson(samplePostJson(id: 'p-new', status: 'draft')); repository.onUpdatePost = (postId, request) async { published = true; return Post.fromJson(samplePostJson(id: postId, version: 2)); }; await tester.pumpWidget( App( sessionManager: session, authRepository: FakeAuthRepository(), petsRepository: FakePetsRepository(), communityRepository: repository, mediaUploaderFactory: (repo, analytics) => MediaUploader( repository: repo, picker: FakeMediaImagePicker([decodablePickedImage()]), compressor: FakeMediaCompressor(), directUpload: FakeDirectUploadClient(), analytics: analytics, ), ), ); await tester.pumpAndSettle(); // 创作 Tab → 发布页(entryPoint=create_tab)。 await tester.tap(find.text('创作')); await tester.pumpAndSettle(); await tester.tap(find.text('发布动态')); await tester.pumpAndSettle(); expect(find.widgetWithText(TextButton, '存草稿'), findsOneWidget); await tester.enterText(find.byType(TextField).first, '刚发布的动态'); await tester.pump(); await tester.tap(find.widgetWithText(FilledButton, '发布')); await tester.pumpAndSettle(); // 回首页 Feed(发布页已出栈)+ 整体刷新 + 新帖置顶。 expect(find.widgetWithText(TextButton, '存草稿'), findsNothing); expect(find.text('已发布,去首页看看吧 🐾'), findsOneWidget); expect( repository.calls.where((call) => call.startsWith('feed:')), hasLength(2), ); // 卡片区在首页家具(story 环 / 促销位)之下,滚到可见后断言首位。 await tester.drag(find.byType(ListView).first, const Offset(0, -320)); await tester.pumpAndSettle(); final cards = tester.widgetList(find.byType(PostCard)).toList(); expect(cards.first.card.id, 'p-new'); expect(find.text('刚发布的动态'), findsWidgets); }); }