feat: implement variant selection in cart and product components for enhanced user experience

This commit is contained in:
2026-08-10 12:08:41 -03:00
parent dd828d9a4e
commit d6bab24e1d
17 changed files with 478 additions and 234 deletions

View File

@@ -407,4 +407,57 @@ describe('CartComponent', () => {
fixture.debugElement.query(By.css('app-cart-item')).componentInstance.quantityDisabled(),
).toBe(false);
});
it('persists a variant selected from a cart row', async () => {
const updateItemVariant = vi.fn().mockReturnValue(
of({
message: 'Variante actualizada.',
data: {},
}),
);
await TestBed.configureTestingModule({
imports: [CartComponent],
providers: [
{
provide: CartService,
useValue: {
cart: signal(null).asReadonly(),
updateItemQuantity: vi.fn(),
updateItemVariant,
removeItem: vi.fn(),
},
},
{ provide: ModalService, useValue: {} },
{
provide: ToastService,
useValue: { success: vi.fn(), info: vi.fn(), danger: vi.fn() },
},
],
}).compileComponents();
const fixture = TestBed.createComponent(CartComponent);
fixture.componentRef.setInput('items', [
{
cartItemId: 10,
imageUrl: null,
product: 'Comida',
originalPrice: null,
discountedPrice: 1000,
discountPercentage: null,
attributes: [{ label: 'Servicio', value: 'Almuerzo' }],
quantity: 2,
variantId: 20,
variants: [
{ value: 20, values: { servicio: 'Almuerzo' } },
{ value: 21, values: { servicio: 'Cena' } },
],
},
]);
fixture.detectChanges();
fixture.debugElement.query(By.css('app-cart-item')).triggerEventHandler('variantChange', 21);
expect(updateItemVariant).toHaveBeenCalledWith(10, 2, 21);
});
});