diff --git a/src/app/shared/components/cart-item/cart-item.component.html b/src/app/shared/components/cart-item/cart-item.component.html index 14e9c02..2401388 100644 --- a/src/app/shared/components/cart-item/cart-item.component.html +++ b/src/app/shared/components/cart-item/cart-item.component.html @@ -31,8 +31,9 @@ class="cart-item-variant-selector" [variants]="variants()" [selectedVariant]="selectedVariant()" + [autoSelectFirst]="false" [compact]="true" - (selectedVariantChange)="onVariantChange($event)" + (selectionValuesChange)="onVariantChange($event.selectedVariant)" /> } @else {
diff --git a/src/app/shared/components/cart/cart.component.spec.ts b/src/app/shared/components/cart/cart.component.spec.ts index b367a0d..663bfe2 100644 --- a/src/app/shared/components/cart/cart.component.spec.ts +++ b/src/app/shared/components/cart/cart.component.spec.ts @@ -3,13 +3,14 @@ import { signal } from '@angular/core'; import { TestBed, getTestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; -import { of, throwError } from 'rxjs'; +import { of, Subject, throwError } from 'rxjs'; import { afterEach, beforeAll, describe, expect, it, vi } from 'vitest'; import { CartService } from '../../../core/services/cart/cart.service'; import { ModalService } from '../../../core/services/modal.service'; import { ToastService } from '../../../core/services/toast.service'; import { CartComponent } from './cart.component'; +import { VariantSelectorComponent } from '../variant-selector/variant-selector.component'; describe('CartComponent', () => { beforeAll(() => { @@ -22,6 +23,7 @@ describe('CartComponent', () => { afterEach(() => { TestBed.resetTestingModule(); + vi.restoreAllMocks(); }); it('shows an empty cart message when there are no items', async () => { @@ -565,6 +567,57 @@ describe('CartComponent', () => { expect(quantityChange).not.toHaveBeenCalled(); }); + it('does not automatically replace an unavailable variant or retry a rejected selection', async () => { + const response = new Subject(); + const updateItemVariant = vi.fn().mockReturnValue(response); + const danger = vi.fn(); + vi.spyOn(console, 'error').mockImplementation(() => {}); + await TestBed.configureTestingModule({ + imports: [CartComponent], + providers: [ + { provide: CartService, useValue: { cart: signal(null), updateItemVariant } }, + { provide: ModalService, useValue: {} }, + { provide: ToastService, useValue: { success: vi.fn(), danger } }, + ], + }).compileComponents(); + const fixture = TestBed.createComponent(CartComponent); + const item = { + cartItemId: 10, + imageUrl: null, + product: 'Entrada', + originalPrice: null, + discountedPrice: 1000, + discountPercentage: null, + attributes: [], + quantity: 2, + variantId: 20, + variants: [{ id: 20, values: { fecha: '09/10' } }], + }; + fixture.componentRef.setInput('items', [item]); + fixture.detectChanges(); + + const rescheduledItem = { + ...item, variants: [{ id: 21, values: { fecha: '20/10' } }], + }; + fixture.componentRef.setInput('items', [rescheduledItem]); + fixture.detectChanges(); + expect(updateItemVariant).not.toHaveBeenCalled(); + + const selector = fixture.debugElement.query(By.directive(VariantSelectorComponent)); + (selector.componentInstance as any).onValueChange('fecha', '20/10'); + fixture.detectChanges(); + expect(updateItemVariant).toHaveBeenCalledExactlyOnceWith(10, 2, 21); + + response.error({ status: 422, error: { message: 'Variante no disponible.' } }); + fixture.detectChanges(); + fixture.componentRef.setInput('items', [{ + ...rescheduledItem, variants: [...rescheduledItem.variants], + }]); + fixture.detectChanges(); + expect(updateItemVariant).toHaveBeenCalledTimes(1); + expect(danger).toHaveBeenCalledOnce(); + }); + it('persists a variant selected from a cart row', async () => { const updateItemVariant = vi.fn().mockReturnValue( of({