import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:userfront/core/constants/error_whitelist.dart'; import 'package:userfront/features/auth/presentation/error_screen.dart'; import 'package:userfront/i18n.dart'; Future _pumpErrorScreen( WidgetTester tester, { String? errorCode, String? description, bool? isProdOverride, }) async { await tester.pumpWidget( MaterialApp( home: ErrorScreen( errorCode: errorCode, description: description, isProdOverride: isProdOverride, ), ), ); await tester.pump(); } void main() { setUpAll(() { TestWidgetsFlutterBinding.ensureInitialized(); final dispatcher = TestWidgetsFlutterBinding.instance.platformDispatcher; dispatcher.localeTestValue = const Locale('ko'); dispatcher.localesTestValue = const [Locale('ko')]; }); tearDownAll(() { final dispatcher = TestWidgetsFlutterBinding.instance.platformDispatcher; dispatcher.clearLocaleTestValue(); dispatcher.clearLocalesTestValue(); }); testWidgets('개발환경은 원문 메시지를 노출한다', (WidgetTester tester) async { await _pumpErrorScreen( tester, errorCode: 'custom_error', description: '원문 메시지', isProdOverride: false, ); final title = tr( 'msg.userfront.error.title_with_code', fallback: '오류: {{code}}', params: {'code': 'custom_error'}, ); final type = tr( 'msg.userfront.error.type', fallback: '오류 종류: {{type}}', params: {'type': 'custom_error'}, ); expect(find.text(title), findsOneWidget); expect(find.text('원문 메시지'), findsOneWidget); expect(find.text(type), findsOneWidget); }); testWidgets('프로덕션은 whitelist 메시지를 노출한다', (WidgetTester tester) async { await _pumpErrorScreen( tester, errorCode: 'settings_disabled', description: '원문 메시지', isProdOverride: true, ); final title = tr( 'msg.userfront.error.title', fallback: '인증 과정에서 오류가 발생했습니다', ); final detail = tr( 'msg.userfront.error.whitelist.settings_disabled', fallback: errorWhitelistMessages['settings_disabled']!, ); final type = tr( 'msg.userfront.error.type', fallback: '오류 종류: {{type}}', params: {'type': 'settings_disabled'}, ); expect(find.text(title), findsOneWidget); expect(find.text(detail), findsOneWidget); expect(find.text('원문 메시지'), findsNothing); expect(find.text(type), findsOneWidget); }); testWidgets('프로덕션은 비허용 에러를 unknown_error로 처리한다', (WidgetTester tester) async { await _pumpErrorScreen( tester, errorCode: 'weird_error', description: '원문 메시지', isProdOverride: true, ); final title = tr( 'msg.userfront.error.title', fallback: '인증 과정에서 오류가 발생했습니다', ); final detail = tr( 'msg.userfront.error.detail_contact', fallback: '에러가 계속되면 관리자에게 문의해주세요', ); final type = tr( 'msg.userfront.error.type', fallback: '오류 종류: {{type}}', params: {'type': 'unknown_error'}, ); expect(find.text(title), findsOneWidget); expect(find.text(detail), findsOneWidget); expect(find.text('원문 메시지'), findsNothing); expect(find.text(type), findsOneWidget); }); }