61 lines
2.0 KiB
Dart
61 lines
2.0 KiB
Dart
// 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<void>();
|
|
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();
|
|
});
|
|
}
|