diff --git a/src/app/features/store/pages/register-page/register-page.component.html b/src/app/features/store/pages/register-page/register-page.component.html index 93606df..da3cfc4 100644 --- a/src/app/features/store/pages/register-page/register-page.component.html +++ b/src/app/features/store/pages/register-page/register-page.component.html @@ -38,11 +38,13 @@ @if (getControlError('password'); as errorMessage) { {{ errorMessage }} @@ -51,11 +53,13 @@ @if (getControlError('password_confirmation'); as errorMessage) { {{ errorMessage }} diff --git a/src/app/features/store/pages/register-page/register-page.component.spec.ts b/src/app/features/store/pages/register-page/register-page.component.spec.ts index c190fb7..1376ffb 100644 --- a/src/app/features/store/pages/register-page/register-page.component.spec.ts +++ b/src/app/features/store/pages/register-page/register-page.component.spec.ts @@ -12,6 +12,48 @@ describe('RegisterPageComponent', () => { TestBed.resetTestingModule(); }); + it('shows and hides both password fields with either visibility control', async () => { + await TestBed.configureTestingModule({ + imports: [RegisterPageComponent], + providers: [ + provideRouter([]), + { provide: AuthService, useValue: { register: vi.fn() } }, + { provide: ModalService, useValue: { openSimple: vi.fn() } }, + { provide: ToastService, useValue: { danger: vi.fn() } } + ] + }).compileComponents(); + + const fixture = TestBed.createComponent(RegisterPageComponent); + fixture.detectChanges(); + + const getPasswordInputs = () => + Array.from( + fixture.nativeElement.querySelectorAll( + 'input#register-password, input#register-password-repeat' + ) + ) as HTMLInputElement[]; + const getVisibilityButtons = () => + Array.from( + fixture.nativeElement.querySelectorAll('button[aria-label]') + ) as HTMLButtonElement[]; + + expect(getPasswordInputs().map((input) => input.type)).toEqual(['password', 'password']); + + getVisibilityButtons()[0].click(); + fixture.detectChanges(); + + expect(getPasswordInputs().map((input) => input.type)).toEqual(['text', 'text']); + expect(getVisibilityButtons().map((button) => button.getAttribute('aria-label'))).toEqual([ + 'Ocultar contraseña', + 'Ocultar contraseña' + ]); + + getVisibilityButtons()[1].click(); + fixture.detectChanges(); + + expect(getPasswordInputs().map((input) => input.type)).toEqual(['password', 'password']); + }); + it('submits registration data and redirects to /login on success', async () => { const authService = { register: vi.fn().mockReturnValue( diff --git a/src/app/features/store/pages/register-page/register-page.component.ts b/src/app/features/store/pages/register-page/register-page.component.ts index de6d3e6..11d689a 100644 --- a/src/app/features/store/pages/register-page/register-page.component.ts +++ b/src/app/features/store/pages/register-page/register-page.component.ts @@ -48,6 +48,7 @@ export class RegisterPageComponent { private readonly submittedState = signal(false); private readonly serverErrorState = signal(null); private readonly isSubmittingState = signal(false); + private readonly passwordVisibleState = signal(false); protected readonly form = this.formBuilder.nonNullable.group({ nombre_apellido: ['', [Validators.required, Validators.maxLength(TEXT_MAX_LENGTH)]], @@ -67,6 +68,11 @@ export class RegisterPageComponent { protected readonly submitted = this.submittedState.asReadonly(); protected readonly serverError = this.serverErrorState.asReadonly(); protected readonly isSubmitting = this.isSubmittingState.asReadonly(); + protected readonly passwordVisible = this.passwordVisibleState.asReadonly(); + + protected setPasswordVisibility(visible: boolean): void { + this.passwordVisibleState.set(visible); + } goToLogin(): void { void this.router.navigate(['/login']); diff --git a/src/environments/environment.homo.ts b/src/environments/environment.homo.ts index 6b23224..5bd05cb 100644 --- a/src/environments/environment.homo.ts +++ b/src/environments/environment.homo.ts @@ -1,5 +1,5 @@ export const environment = { - production: false, + production: true, nombre:"Homologación - activo", url:"https://backend.qa.shopit.com.ar/api/", urlDescarga:"url/"