import { describe, it, expect } from 'vitest'; import { LoginViewDataBuilder } from './LoginViewDataBuilder'; import { SignupViewDataBuilder } from './SignupViewDataBuilder'; import { ForgotPasswordViewDataBuilder } from './ForgotPasswordViewDataBuilder'; import { ResetPasswordViewDataBuilder } from './ResetPasswordViewDataBuilder'; import type { LoginPageDTO } from '@/lib/services/auth/types/LoginPageDTO'; import type { SignupPageDTO } from '@/lib/services/auth/types/SignupPageDTO'; import type { ForgotPasswordPageDTO } from '@/lib/services/auth/types/ForgotPasswordPageDTO'; import type { ResetPasswordPageDTO } from '@/lib/services/auth/types/ResetPasswordPageDTO'; describe('Auth View Data - Cross-Builder Consistency', () => { describe('common patterns', () => { it('should all initialize with isSubmitting false', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.isSubmitting).toBe(false); expect(signupResult.isSubmitting).toBe(false); expect(forgotPasswordResult.isSubmitting).toBe(false); expect(resetPasswordResult.isSubmitting).toBe(false); }); it('should all initialize with submitError undefined', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.submitError).toBeUndefined(); expect(signupResult.submitError).toBeUndefined(); expect(forgotPasswordResult.submitError).toBeUndefined(); expect(resetPasswordResult.submitError).toBeUndefined(); }); it('should all initialize formState.isValid as true', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.formState.isValid).toBe(true); expect(signupResult.formState.isValid).toBe(true); expect(forgotPasswordResult.formState.isValid).toBe(true); expect(resetPasswordResult.formState.isValid).toBe(true); }); it('should all initialize formState.isSubmitting as false', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.formState.isSubmitting).toBe(false); expect(signupResult.formState.isSubmitting).toBe(false); expect(forgotPasswordResult.formState.isSubmitting).toBe(false); expect(resetPasswordResult.formState.isSubmitting).toBe(false); }); it('should all initialize formState.submitError as undefined', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.formState.submitError).toBeUndefined(); expect(signupResult.formState.submitError).toBeUndefined(); expect(forgotPasswordResult.formState.submitError).toBeUndefined(); expect(resetPasswordResult.formState.submitError).toBeUndefined(); }); it('should all initialize formState.submitCount as 0', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.formState.submitCount).toBe(0); expect(signupResult.formState.submitCount).toBe(0); expect(forgotPasswordResult.formState.submitCount).toBe(0); expect(resetPasswordResult.formState.submitCount).toBe(0); }); it('should all initialize form fields with touched false', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.formState.fields.email.touched).toBe(false); expect(loginResult.formState.fields.password.touched).toBe(false); expect(loginResult.formState.fields.rememberMe.touched).toBe(false); expect(signupResult.formState.fields.firstName.touched).toBe(false); expect(signupResult.formState.fields.lastName.touched).toBe(false); expect(signupResult.formState.fields.email.touched).toBe(false); expect(signupResult.formState.fields.password.touched).toBe(false); expect(signupResult.formState.fields.confirmPassword.touched).toBe(false); expect(forgotPasswordResult.formState.fields.email.touched).toBe(false); expect(resetPasswordResult.formState.fields.newPassword.touched).toBe(false); expect(resetPasswordResult.formState.fields.confirmPassword.touched).toBe(false); }); it('should all initialize form fields with validating false', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.formState.fields.email.validating).toBe(false); expect(loginResult.formState.fields.password.validating).toBe(false); expect(loginResult.formState.fields.rememberMe.validating).toBe(false); expect(signupResult.formState.fields.firstName.validating).toBe(false); expect(signupResult.formState.fields.lastName.validating).toBe(false); expect(signupResult.formState.fields.email.validating).toBe(false); expect(signupResult.formState.fields.password.validating).toBe(false); expect(signupResult.formState.fields.confirmPassword.validating).toBe(false); expect(forgotPasswordResult.formState.fields.email.validating).toBe(false); expect(resetPasswordResult.formState.fields.newPassword.validating).toBe(false); expect(resetPasswordResult.formState.fields.confirmPassword.validating).toBe(false); }); it('should all initialize form fields with error undefined', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.formState.fields.email.error).toBeUndefined(); expect(loginResult.formState.fields.password.error).toBeUndefined(); expect(loginResult.formState.fields.rememberMe.error).toBeUndefined(); expect(signupResult.formState.fields.firstName.error).toBeUndefined(); expect(signupResult.formState.fields.lastName.error).toBeUndefined(); expect(signupResult.formState.fields.email.error).toBeUndefined(); expect(signupResult.formState.fields.password.error).toBeUndefined(); expect(signupResult.formState.fields.confirmPassword.error).toBeUndefined(); expect(forgotPasswordResult.formState.fields.email.error).toBeUndefined(); expect(resetPasswordResult.formState.fields.newPassword.error).toBeUndefined(); expect(resetPasswordResult.formState.fields.confirmPassword.error).toBeUndefined(); }); }); describe('common returnTo handling', () => { it('should all handle returnTo with query parameters', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard?welcome=true', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard?welcome=true' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard?welcome=true' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard?welcome=true' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.returnTo).toBe('/dashboard?welcome=true'); expect(signupResult.returnTo).toBe('/dashboard?welcome=true'); expect(forgotPasswordResult.returnTo).toBe('/dashboard?welcome=true'); expect(resetPasswordResult.returnTo).toBe('/dashboard?welcome=true'); }); it('should all handle returnTo with hash fragments', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard#section', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard#section' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard#section' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard#section' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.returnTo).toBe('/dashboard#section'); expect(signupResult.returnTo).toBe('/dashboard#section'); expect(forgotPasswordResult.returnTo).toBe('/dashboard#section'); expect(resetPasswordResult.returnTo).toBe('/dashboard#section'); }); it('should all handle returnTo with encoded characters', () => { const loginDTO: LoginPageDTO = { returnTo: '/dashboard?redirect=%2Fadmin', hasInsufficientPermissions: false }; const signupDTO: SignupPageDTO = { returnTo: '/dashboard?redirect=%2Fadmin' }; const forgotPasswordDTO: ForgotPasswordPageDTO = { returnTo: '/dashboard?redirect=%2Fadmin' }; const resetPasswordDTO: ResetPasswordPageDTO = { token: 'abc123', returnTo: '/dashboard?redirect=%2Fadmin' }; const loginResult = LoginViewDataBuilder.build(loginDTO); const signupResult = SignupViewDataBuilder.build(signupDTO); const forgotPasswordResult = ForgotPasswordViewDataBuilder.build(forgotPasswordDTO); const resetPasswordResult = ResetPasswordViewDataBuilder.build(resetPasswordDTO); expect(loginResult.returnTo).toBe('/dashboard?redirect=%2Fadmin'); expect(signupResult.returnTo).toBe('/dashboard?redirect=%2Fadmin'); expect(forgotPasswordResult.returnTo).toBe('/dashboard?redirect=%2Fadmin'); expect(resetPasswordResult.returnTo).toBe('/dashboard?redirect=%2Fadmin'); }); }); });