import 'reflect-metadata'; import 'jasmine'; import { Expector } from '@inmotion/utils/tests'; import { Cart, CartRepository } from '@inmotion/swift-libs'; import { IApplicationContext } from '@inmotion/core'; import { ConfigService, NEW_CART, ProductRepositoryFactory } from '@whittaker/swift-libs'; import { CartBuilderInput, CartCreationService, CartCreationServiceFactory, CartState } from '../services'; describe('CartCreationService', () => { const appContext: IApplicationContext = ConfigService.initDev(); const _cartCreationService: CartCreationService = new CartCreationServiceFactory( appContext, new ProductRepositoryFactory(appContext).build() ).build(); const _cartRepo: CartRepository = new CartRepository(appContext); describe('saveCart', () => { it('should set cartId and cartGuid to same value', async () => { let initialCart: Cart, cartOne: Cart; initialCart = _cartCreationService.defaultCart(); cartOne = await _cartCreationService.saveCart(initialCart); Expector.expectActualToEqualExpected(cartOne.__i.guid, cartOne.CartId); return; }); it('should pass back the same CartId every time', async () => { let initialCart: Cart, cartOne: Cart, cartTwo: Cart; initialCart = _cartCreationService.defaultCart(); cartOne = await _cartCreationService.saveCart(initialCart); cartTwo = await _cartCreationService.saveCart(cartOne); Expector.expectActualToEqualExpected(cartOne.__i.guid, cartTwo.__i.guid); Expector.expectActualToEqualExpected(cartOne.CartId, cartTwo.CartId); return; }); }); describe('updateOrCreateCartAndBuildState', () => { describe('guest checkout', () => { it('should create a cart when guid is new', async () => { let input = new CartBuilderInput(); input.guid = NEW_CART; input.shipping.Name.First = 'Jack'; input.shipping.Name.Last = 'Bauer'; input.shipping.EmailAddress = 'jackbauer@ctu.com'; let state = await _cartCreationService.updateOrCreateCartAndBuildState(input); Expector.expectItemNotToBeNil(state); Expector.expectItemNotToBeNil(state.cart); Expector.expectTypeToBeString(state.cart.__i.guid); Expector.expectNotEqual(state.cart.__i.guid, ''); // cleanup await _cartRepo.removeAsync(state.cart.__i.guid); return; }); it('should update an existing cart', async () => { let input: CartBuilderInput, state: CartState; // create cart input = new CartBuilderInput(); input.guid = NEW_CART; input.shipping.Name.First = 'Jack'; input.shipping.Name.Last = 'Bauer'; input.shipping.EmailAddress = 'jackbauer@ctu.com'; state = await _cartCreationService.updateOrCreateCartAndBuildState(input); Expector.expectItemNotToBeNil(state); Expector.expectItemNotToBeNil(state.cart); Expector.expectTypeToBeString(state.cart.__i.guid); Expector.expectNotEqual(state.cart.__i.guid, ''); const cartGuid = state.cart.__i.guid; // modify cart input = new CartBuilderInput(); input.guid = cartGuid; input.shipping.Name.First = 'Jerry'; input.shipping.Name.Last = 'Seinfeld'; input.shipping.EmailAddress = 'jerry@nbc.com'; state = await _cartCreationService.updateOrCreateCartAndBuildState(input); Expector.expectItemNotToBeNil(state); Expector.expectItemNotToBeNil(state.cart); Expector.expectActualToEqualExpected(state.cart.Shipping.Name.First, input.shipping.Name.First); Expector.expectActualToEqualExpected(state.cart.Shipping.Name.Last, input.shipping.Name.Last); Expector.expectActualToEqualExpected(state.cart.Shipping.EmailAddress, input.shipping.EmailAddress); Expector.expectActualToEqualExpected(state.cart.__i.guid, cartGuid); // cleanup await _cartRepo.removeAsync(state.cart.__i.guid); return; }); }); }); });