import 'package:flutter_test/flutter_test.dart'; import 'package:shuffle/features/auth/domain/auth_failure.dart'; import 'package:shuffle/features/auth/domain/email_link_type.dart'; import 'package:shuffle/features/auth/domain/resend_origin.dart'; void main() { group('KTO-01 Kriterium 6: resendFailureFor (F12)', () { const limited = AuthFailure.emailSendLimited(); test('check-email screen treats emailSendLimited as success', () { expect(resendFailureFor(limited, ResendOrigin.checkEmail), isNull); }); test('login screen shows the throttling hint', () { expect( resendFailureFor(limited, ResendOrigin.login), const AuthFailure.rateLimited(), ); }); test('other failures pass through unchanged', () { for (final origin in ResendOrigin.values) { expect( resendFailureFor(const AuthFailure.rateLimited(), origin), const AuthFailure.rateLimited(), ); expect( resendFailureFor(const AuthFailure.network(), origin), const AuthFailure.network(), ); } }); }); group('KTO-01 Kriterium 4: openEmailInputFailureFor (F12)', () { test('emailSendLimited counts as success', () { expect( openEmailInputFailureFor(const AuthFailure.emailSendLimited()), isNull, ); }); test('rateLimited stays visible', () { expect( openEmailInputFailureFor(const AuthFailure.rateLimited()), const AuthFailure.rateLimited(), ); }); }); group('KTO-01 Kriterium 8: EmailLinkType.tryParse', () { test('maps email and signup to confirmation, recovery to recovery', () { expect(EmailLinkType.tryParse('email'), EmailLinkType.confirmation); expect(EmailLinkType.tryParse('signup'), EmailLinkType.confirmation); expect(EmailLinkType.tryParse('recovery'), EmailLinkType.recovery); }); test('rejects missing and unknown types', () { expect(EmailLinkType.tryParse(null), isNull); expect(EmailLinkType.tryParse(''), isNull); expect(EmailLinkType.tryParse('magiclink'), isNull); expect(EmailLinkType.tryParse('invite'), isNull); }); }); }