/// <summary> /// Executes the create basket use case. /// This execution triggers a domain event BasketCreated in order to be consumed by the interested parties. /// </summary> /// <param name="request">The request with the new basket data.</param> public async Task <Basket> Execute(InsertBasketRequest request) { Basket result; try { Ensure.IsNotNull(request); Ensure.IsNotNullOrEmpty(request.CustomerEmail); var domainBasket = Domain.Model.Baskets.Basket.Create(request.CustomerEmail); await this.basketsRepository.Insert(domainBasket); await this.ProduceBasketCreated(domainBasket); result = this.basketsTypeAdapter.ToDto(domainBasket); } catch (Exception ex) { this.logger.Error( $"{nameof(InsertBasket)}.{nameof(Execute)}", ex); throw; } return(result); }
public async Task InsertBasket_NullRequest_ThrowsException() { //Arrange var mock = InsertBasketMock.Create(); var target = mock.Target; InsertBasketRequest request = null; //Act async Task execute() => await target.Execute(request); //Assert await Assert.ThrowsAsync <ArgumentNullException>(execute); }
public async Task InsertBasket_NullCustomerEmail_ThrowsException() { //Arrange string customerEmail = null; var mock = InsertBasketMock.Create(); var target = mock.Target; var request = InsertBasketRequest.Create(customerEmail); //Act async Task execute() => await target.Execute(request); //Assert await Assert.ThrowsAsync <ArgumentException>(execute); }
public async Task InsertBasket_ValidRequest_ProducerCalledOnce() { //Arrange var customerEmail = "*****@*****.**"; var mock = InsertBasketMock.Create(); var target = mock.Target; var request = InsertBasketRequest.Create(customerEmail); //Act await target.Execute(request); //Assert mock.BasketCreatedProducerMock.Verify(x => x.ProduceBasketCreatedEventAsync(It.IsAny <string>()), Times.Once()); }
public async Task InsertBasket_ValidRequest_RepositoryCalledOnce() { //Arrange var customerEmail = "*****@*****.**"; var mock = InsertBasketMock.Create(); var target = mock.Target; var request = InsertBasketRequest.Create(customerEmail); //Act await target.Execute(request); //Assert mock.BasketsRepositoryMock.Verify(rep => rep.Insert(It.IsAny <Basket>()), Times.Once()); }
public async Task <IActionResult> InsertBasket(string customerEmail) { if (string.IsNullOrEmpty(customerEmail)) { return(this.BadRequest()); } var result = await this.insertBasket .Execute(InsertBasketRequest.Create(customerEmail)); return(this.CreatedAtRoute( routeName: nameof(GetBaskets), routeValues: new { basketId = result.Id }, value: result)); }