95 lines
3.3 KiB
Dart
95 lines
3.3 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:dio/dio.dart';
|
|
|
|
import 'package:lanebow/services/event_service.dart';
|
|
import 'package:lanebow/services/api_service.dart';
|
|
|
|
class _InterceptPutPost extends Interceptor {
|
|
RequestOptions? lastPutOptions;
|
|
dynamic lastPutData;
|
|
|
|
@override
|
|
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
|
|
// Mock responses for addParticipant (POST) and updateParticipant (PUT)
|
|
if (options.method == 'POST' && options.path.endsWith('/participants')) {
|
|
handler.resolve(Response(
|
|
requestOptions: options,
|
|
statusCode: 201,
|
|
data: {
|
|
'message': '참가자가 등록되었습니다.',
|
|
'participant': {
|
|
'id': '99',
|
|
'eventId': options.path.split('/').reversed.skip(1).first,
|
|
'memberId': (options.data is Map && options.data['memberId'] != null)
|
|
? options.data['memberId'].toString()
|
|
: '7',
|
|
'status': 'confirmed',
|
|
'paymentStatus': 'unpaid',
|
|
}
|
|
},
|
|
));
|
|
return;
|
|
}
|
|
if (options.method == 'PUT' && options.path.endsWith('/participants')) {
|
|
lastPutOptions = options;
|
|
lastPutData = options.data;
|
|
handler.resolve(Response(
|
|
requestOptions: options,
|
|
statusCode: 200,
|
|
data: {
|
|
'message': '참가자 정보가 수정되었습니다.',
|
|
'participant': {
|
|
'id': (options.data is Map) ? options.data['id']?.toString() : '99',
|
|
'eventId': options.path.split('/').reversed.skip(1).first,
|
|
'memberId': (options.data is Map) ? options.data['memberId']?.toString() : '7',
|
|
'status': (options.data is Map) ? options.data['status'] ?? 'pending' : 'pending',
|
|
'paymentStatus': ((options.data is Map) ? options.data['paymentStatus'] : null) ?? 'unpaid',
|
|
}
|
|
},
|
|
));
|
|
return;
|
|
}
|
|
|
|
// Default pass-through success
|
|
handler.resolve(Response(requestOptions: options, statusCode: 200, data: {}));
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
group('EventService.updateParticipant', () {
|
|
test('auto-fills missing memberId from local cache when updating', () async {
|
|
// Arrange
|
|
final api = ApiService();
|
|
final dio = Dio(BaseOptions(baseUrl: ''));
|
|
final tap = _InterceptPutPost();
|
|
dio.interceptors.add(tap);
|
|
api.setDio(dio);
|
|
|
|
final service = EventService.forTest(api);
|
|
await service.initialize('dummy-token');
|
|
service.setClubId('3');
|
|
|
|
// Seed local cache by adding a participant (memberId = 7)
|
|
await service.addParticipant('1', {
|
|
'memberId': '7',
|
|
'status': 'confirmed',
|
|
'paymentStatus': 'unpaid',
|
|
});
|
|
|
|
// Act: update without providing memberId
|
|
await service.updateParticipant('1', '99', {
|
|
'status': 'canceled',
|
|
});
|
|
|
|
// Assert: PUT called with memberId auto-filled
|
|
expect(tap.lastPutOptions, isNotNull);
|
|
expect(tap.lastPutOptions!.method, equals('PUT'));
|
|
expect(tap.lastPutOptions!.path, equals('/club/events/1/participants'));
|
|
expect(tap.lastPutData, isA<Map>());
|
|
expect(tap.lastPutData['memberId']?.toString(), equals('7'));
|
|
expect(tap.lastPutData['status'], equals('canceled'));
|
|
expect(tap.lastPutData['clubId']?.toString(), equals('3'));
|
|
});
|
|
});
|
|
}
|