136 lines
4.0 KiB
Dart
136 lines
4.0 KiB
Dart
|
|
import 'package:dio/dio.dart';
|
||
|
|
import 'package:flutter_test/flutter_test.dart';
|
||
|
|
import 'package:mocktail/mocktail.dart';
|
||
|
|
import 'package:social_app/features/todo/data/todo_api.dart';
|
||
|
|
import 'package:social_app/core/api/i_api_client.dart';
|
||
|
|
|
||
|
|
class MockApiClient extends Mock implements IApiClient {}
|
||
|
|
|
||
|
|
class FakeRequestOptions extends Fake implements RequestOptions {}
|
||
|
|
|
||
|
|
void main() {
|
||
|
|
late TodoApi todoApi;
|
||
|
|
late MockApiClient mockClient;
|
||
|
|
|
||
|
|
setUpAll(() {
|
||
|
|
registerFallbackValue(FakeRequestOptions());
|
||
|
|
});
|
||
|
|
|
||
|
|
setUp(() {
|
||
|
|
mockClient = MockApiClient();
|
||
|
|
todoApi = TodoApi(mockClient);
|
||
|
|
});
|
||
|
|
|
||
|
|
group('TodoApi.updateTodo - cross-quadrant drag', () {
|
||
|
|
test(
|
||
|
|
'calls PATCH with priority when moving to different quadrant',
|
||
|
|
() async {
|
||
|
|
const todoId = 'todo-123';
|
||
|
|
const targetPriority = 2;
|
||
|
|
|
||
|
|
when(
|
||
|
|
() => mockClient.patch(any(), data: any(named: 'data')),
|
||
|
|
).thenAnswer(
|
||
|
|
(_) async => Response(
|
||
|
|
requestOptions: RequestOptions(path: '/api/v1/todos/$todoId'),
|
||
|
|
data: {
|
||
|
|
'id': todoId,
|
||
|
|
'owner_id': 'user-1',
|
||
|
|
'title': 'Test Todo',
|
||
|
|
'priority': targetPriority,
|
||
|
|
'status': 'pending',
|
||
|
|
'created_at': '2024-01-01T00:00:00Z',
|
||
|
|
'updated_at': '2024-01-01T00:00:00Z',
|
||
|
|
},
|
||
|
|
),
|
||
|
|
);
|
||
|
|
|
||
|
|
final result = await todoApi.updateTodo(
|
||
|
|
todoId,
|
||
|
|
priority: targetPriority,
|
||
|
|
);
|
||
|
|
|
||
|
|
expect(result.priority, targetPriority);
|
||
|
|
verify(
|
||
|
|
() => mockClient.patch(
|
||
|
|
'/api/v1/todos/$todoId',
|
||
|
|
data: {'priority': targetPriority},
|
||
|
|
),
|
||
|
|
).called(1);
|
||
|
|
},
|
||
|
|
);
|
||
|
|
|
||
|
|
test('throws when API fails - triggers rollback', () async {
|
||
|
|
const todoId = 'todo-123';
|
||
|
|
|
||
|
|
when(
|
||
|
|
() => mockClient.patch(any(), data: any(named: 'data')),
|
||
|
|
).thenThrow(Exception('Network error'));
|
||
|
|
|
||
|
|
expect(() => todoApi.updateTodo(todoId, priority: 2), throwsException);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
group('Quadrant priority mapping', () {
|
||
|
|
test('priority 1 = important urgent (Q1)', () async {
|
||
|
|
when(() => mockClient.patch(any(), data: any(named: 'data'))).thenAnswer(
|
||
|
|
(_) async => Response(
|
||
|
|
requestOptions: RequestOptions(path: '/api/v1/todos/todo-1'),
|
||
|
|
data: {
|
||
|
|
'id': 'todo-1',
|
||
|
|
'owner_id': 'user-1',
|
||
|
|
'title': 'Q1 Todo',
|
||
|
|
'priority': 1,
|
||
|
|
'status': 'pending',
|
||
|
|
'created_at': '2024-01-01T00:00:00Z',
|
||
|
|
'updated_at': '2024-01-01T00:00:00Z',
|
||
|
|
},
|
||
|
|
),
|
||
|
|
);
|
||
|
|
|
||
|
|
final result = await todoApi.updateTodo('todo-1', priority: 1);
|
||
|
|
expect(result.priority, 1);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('priority 2 = important not urgent (Q3)', () async {
|
||
|
|
when(() => mockClient.patch(any(), data: any(named: 'data'))).thenAnswer(
|
||
|
|
(_) async => Response(
|
||
|
|
requestOptions: RequestOptions(path: '/api/v1/todos/todo-2'),
|
||
|
|
data: {
|
||
|
|
'id': 'todo-2',
|
||
|
|
'owner_id': 'user-1',
|
||
|
|
'title': 'Q3 Todo',
|
||
|
|
'priority': 2,
|
||
|
|
'status': 'pending',
|
||
|
|
'created_at': '2024-01-01T00:00:00Z',
|
||
|
|
'updated_at': '2024-01-01T00:00:00Z',
|
||
|
|
},
|
||
|
|
),
|
||
|
|
);
|
||
|
|
|
||
|
|
final result = await todoApi.updateTodo('todo-2', priority: 2);
|
||
|
|
expect(result.priority, 2);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('priority 3 = urgent not important (Q2)', () async {
|
||
|
|
when(() => mockClient.patch(any(), data: any(named: 'data'))).thenAnswer(
|
||
|
|
(_) async => Response(
|
||
|
|
requestOptions: RequestOptions(path: '/api/v1/todos/todo-3'),
|
||
|
|
data: {
|
||
|
|
'id': 'todo-3',
|
||
|
|
'owner_id': 'user-1',
|
||
|
|
'title': 'Q2 Todo',
|
||
|
|
'priority': 3,
|
||
|
|
'status': 'pending',
|
||
|
|
'created_at': '2024-01-01T00:00:00Z',
|
||
|
|
'updated_at': '2024-01-01T00:00:00Z',
|
||
|
|
},
|
||
|
|
),
|
||
|
|
);
|
||
|
|
|
||
|
|
final result = await todoApi.updateTodo('todo-3', priority: 3);
|
||
|
|
expect(result.priority, 3);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|