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/"