250 lines
14 KiB
TypeScript
250 lines
14 KiB
TypeScript
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');
|
|
});
|
|
});
|
|
});
|