// Author: fruit.com.cn import 'dart:async'; import 'package:flutter_test/flutter_test.dart'; import 'package:fruitshorts/core/data/models/interaction.dart'; import 'package:fruitshorts/core/data/remote/api_client.dart'; import 'package:fruitshorts/core/data/services/interaction_controller.dart'; import '../support/fake_interaction_repositories.dart'; void main() { test('should_update_drama_like_optimistically_and_use_server_state_when_toggle_succeeds', () async { final repository = FakeInteractionRepository(); final gate = Completer(); repository.likeGate = gate; final controller = InteractionController(repository); final future = controller.toggleDramaLike('5'); expect(controller.isLiked('5'), isTrue); expect(repository.likeTargets, ['DRAMA:5']); repository.nextLikeResult = const LikeToggleResult(liked: false, count: 0); gate.complete(); final result = await future; expect(result.isSuccess, isTrue); expect(controller.isLiked('5'), isFalse); controller.dispose(); }); test('should_rollback_drama_like_when_toggle_fails', () async { final repository = FakeInteractionRepository( nextLikeResult: const LikeToggleResult(liked: true, count: 3), ); final controller = InteractionController(repository); await controller.toggleDramaLike('5'); repository.likeError = const ApiException(500, '点赞失败'); final result = await controller.toggleDramaLike('5'); expect(result.isSuccess, isFalse); expect(result.errorMessage, '点赞失败'); expect(controller.isLiked('5'), isTrue); controller.dispose(); }); test('should_clear_account_scoped_drama_likes_when_session_changes', () async { final repository = FakeInteractionRepository( nextLikeResult: const LikeToggleResult(liked: true, count: 1), ); final controller = InteractionController(repository); await controller.toggleDramaLike('5'); controller.clear(); expect(controller.isLiked('5'), isFalse); controller.dispose(); }); }