public async Task CanGetCoupon_PostNewCoupon() { var couponRepository = new InMemoryCouponRepository(); var couponController = new CouponController(couponRepository) .BootstrapForTests(); var postRequestDto = new PostRequestDto { Code = "GRAND_SALE", PercentOff = 50 }; var postResponse = await couponController.Post(postRequestDto); var postResponseCouponDto = (CouponDto)postResponse.Value; var getResponse = await couponController.Get(postResponseCouponDto.Id); Assert.Equal((int)HttpStatusCode.OK, getResponse.StatusCode); var couponDto = (CouponDto)getResponse.Value; Assert.Equal("GRAND_SALE", couponDto.Code); Assert.Equal(50, couponDto.PercentOff); }
public async Task RespondsWithCreated_PostNewCoupon() { var couponRepository = new InMemoryCouponRepository(); var couponController = new CouponController(couponRepository) .BootstrapForTests(urlHelper: new ActionNameOnlyUrlHelper()); var postRequestDto = new PostRequestDto { Code = "GRAND_SALE", PercentOff = 50 }; var postResponse = (CreatedResult)await couponController.Post(postRequestDto); Assert.Equal((int)HttpStatusCode.Created, postResponse.StatusCode); var couponDto = (CouponDto)postResponse.Value; Assert.Equal(nameof(CouponController.Get), postResponse.Location); Assert.Equal("GRAND_SALE", couponDto.Code); Assert.Equal(50, couponDto.PercentOff); }
public async Task ApplyHighestDiscount_HasAmountOffHasPercentOffHasCoupon( string testName, double itemPercentOff, decimal itemAmountOff, double couponPercentOff, decimal expectedTotalCost) { var itemRepository = new InMemoryItemRepository(); var itemReadRepository = new InMemoryItemReadRepository(); itemRepository.EventOccurred += async entity => await new ItemReadModelHandler(itemReadRepository).Handle(entity.NewEvents.ToList <object>()); var itemController = new ItemController(itemRepository, itemReadRepository) .BootstrapForTests(); var postNewPotatoItemDto = new PostRequestDto { Code = "potato", Price = 50 }; var postPotatoResult = await itemController.Post(postNewPotatoItemDto); var potatoDto = (ItemDto)postPotatoResult.Value; var setDiscountOnPotatoDto = new SetDiscountRequestDto { PercentOff = itemPercentOff, AmountOff = itemAmountOff }; await itemController.SetDiscount(potatoDto.Id, setDiscountOnPotatoDto); var couponRepository = new InMemoryCouponRepository(); var couponReadRepository = new InMemoryCouponReadRepository(); couponRepository.EventOccurred += async entity => await new CouponReadModelHandler(couponReadRepository).Handle(entity.NewEvents.ToList <object>()); var couponController = new CouponController(couponRepository) .BootstrapForTests(); var postRequestDto = new ShoppingCartApi.Controllers.Coupon.PostRequestDto { Code = "GRAND_SALE", PercentOff = couponPercentOff }; await couponController.Post(postRequestDto); var calculatorController = new CalculatorController(itemRepository, couponReadRepository) .BootstrapForTests(); var calculatorComputeCostRequestDto = new CalculatorComputeCostRequestDto { CouponCode = "GRAND_SALE", ShoppingItems = new List <ShoppingItemDto> { new ShoppingItemDto { Id = potatoDto.Id, Quantity = 2 } } }; var result = await calculatorController.ComputeCost(calculatorComputeCostRequestDto); Assert.Equal((int)HttpStatusCode.OK, result.StatusCode); Assert.NotNull(result.Value); var dto = (CalculatorComputeCostDto)result.Value; Assert.Equal(expectedTotalCost, dto.TotalCost); }
public async Task ApplyDiscount_FromCouponOnlyForSelectItemType() { var itemTypeRepository = new InMemoryItemTypeRepository(); var itemTypeReadRepository = new InMemoryItemTypeReadRepository(); itemTypeRepository.EventOccurred += async entity => await new ItemTypeReadModelHandler(itemTypeReadRepository).Handle(entity.NewEvents.ToList <object>()); var itemRepository = new InMemoryItemRepository(); var itemReadRepository = new InMemoryItemReadRepository(); itemRepository.EventOccurred += async entity => await new ItemReadModelHandler(itemReadRepository).Handle(entity.NewEvents.ToList <object>()); var couponRepository = new InMemoryCouponRepository(); var couponReadRepository = new InMemoryCouponReadRepository(); couponRepository.EventOccurred += async entity => await new CouponReadModelHandler(couponReadRepository).Handle(entity.NewEvents.ToList <object>()); var itemTypeController = new ItemTypeController(itemTypeRepository, itemTypeReadRepository) .BootstrapForTests(); var postFruitResult = await itemTypeController.Post( new ShoppingCartApi.Controllers.ItemType.PostRequestDto { Code = "fruit" }); var fruitItemTypeDto = (ItemTypeDto)postFruitResult.Value; var postVegetableResult = await itemTypeController.Post( new ShoppingCartApi.Controllers.ItemType.PostRequestDto { Code = "vegetable" }); var vegetableItemTypeDto = (ItemTypeDto)postVegetableResult.Value; var itemController = new ItemController(itemRepository, itemReadRepository) .BootstrapForTests(); var postPotatoResult = await itemController.Post(new PostRequestDto { Code = "potato", Price = 30, ItemTypeId = vegetableItemTypeDto.Id }); var potatoDto = (ItemDto)postPotatoResult.Value; var postAppleResult = await itemController.Post(new PostRequestDto { Code = "apple", Price = 50, ItemTypeId = fruitItemTypeDto.Id }); var appleDto = (ItemDto)postAppleResult.Value; var couponController = new CouponController(couponRepository) .BootstrapForTests(); var postRequestDto = new ShoppingCartApi.Controllers.Coupon.PostRequestDto { Code = "HALF_OFF_FRUIT", PercentOff = 50, ForItemTypeId = fruitItemTypeDto.Id }; await couponController.Post(postRequestDto); var calculatorController = new CalculatorController(itemRepository, couponReadRepository) .BootstrapForTests(); var calculatorComputeCostRequestDto = new CalculatorComputeCostRequestDto { CouponCode = "HALF_OFF_FRUIT", ShoppingItems = new List <ShoppingItemDto> { new ShoppingItemDto { Id = potatoDto.Id, Quantity = 3 }, new ShoppingItemDto { Id = appleDto.Id, Quantity = 1 } } }; var result = await calculatorController.ComputeCost(calculatorComputeCostRequestDto); Assert.Equal((int)HttpStatusCode.OK, result.StatusCode); Assert.NotNull(result.Value); var dto = (CalculatorComputeCostDto)result.Value; Assert.Equal(115, dto.TotalCost); }
public async Task ApplyDiscount_FromCoupon() { var itemRepository = new InMemoryItemRepository(); var itemReadRepository = new InMemoryItemReadRepository(); itemRepository.EventOccurred += async entity => await new ItemReadModelHandler(itemReadRepository).Handle(entity.NewEvents.ToList <object>()); var itemController = new ItemController(itemRepository, itemReadRepository) .BootstrapForTests(); var postNewPotatoItemDto = new PostRequestDto { Code = "potato", Price = 30 }; var postPotatoResult = await itemController.Post(postNewPotatoItemDto); var potatoDto = (ItemDto)postPotatoResult.Value; var postNewLettuceItemDto = new PostRequestDto { Code = "lettuce", Price = 50 }; var postLettuceResult = await itemController.Post(postNewLettuceItemDto); var lettuceDto = (ItemDto)postLettuceResult.Value; var couponRepository = new InMemoryCouponRepository(); var couponReadRepository = new InMemoryCouponReadRepository(); couponRepository.EventOccurred += async entity => await new CouponReadModelHandler(couponReadRepository).Handle(entity.NewEvents.ToList <object>()); var couponController = new CouponController(couponRepository) .BootstrapForTests(); var postRequestDto = new ShoppingCartApi.Controllers.Coupon.PostRequestDto { Code = "GRAND_SALE", PercentOff = 20 }; await couponController.Post(postRequestDto); var calculatorController = new CalculatorController(itemRepository, couponReadRepository) .BootstrapForTests(); var calculatorComputeCostRequestDto = new CalculatorComputeCostRequestDto { CouponCode = "GRAND_SALE", ShoppingItems = new List <ShoppingItemDto> { new ShoppingItemDto { Id = potatoDto.Id, Quantity = 3 }, new ShoppingItemDto { Id = lettuceDto.Id, Quantity = 1 } } }; var result = await calculatorController.ComputeCost(calculatorComputeCostRequestDto); Assert.Equal((int)HttpStatusCode.OK, result.StatusCode); Assert.NotNull(result.Value); var dto = (CalculatorComputeCostDto)result.Value; Assert.Equal(112, dto.TotalCost); }