public async Task TestCreateRequestSecondInvalidRequest(string useCase, int statusCode, ErrorCode errorCode) { // Arrange var user = user1; var request1 = new NewRequestRequest() { SelectedProducts = new[] { new ProductRequestRequest() { Id = products[0].Id, Quantity = 9 }, new ProductRequestRequest() { Id = products[1].Id, Quantity = 2 }, } }; // Act var result1 = await GetRequestsController(user).Create(request1); // Assert var response1 = result1.Result.Should().BeOfType <OkObjectResult>().Which.Value.Should().BeOfType <NewRequestResponse>().Which; // User creates the second request // Arrange if (useCase == "differentUser") { user = user2; } var request2 = new NewRequestRequest() { RefNo = useCase == "invalidRefNo" ? Guid.NewGuid() : response1.RefNo, SelectedProducts = new[] { new ProductRequestRequest() { Id = products[2].Id, Quantity = 15 }, } }; // Act var result2 = await GetRequestsController(user).Create(request2); // Assert result2.Result.Should().BeEquivalentTo(ExpectedErrorResult(statusCode, errorCode)); }
public async Task TestCreateRequestInvalidRequest(string useCase, ErrorCode errorCode) { // Arrange var user = user1; var request = new NewRequestRequest(); if (useCase != "missingParameters") { request.SelectedProducts = new[] { new ProductRequestRequest() { Id = useCase == "invalidProductId" ? Guid.NewGuid() : products[2].Id, Quantity = useCase == "negativeValue" ? -12 : 15, }, }; } // Act var result = await GetRequestsController(user).Create(request); // Assert result.Result.Should().BeEquivalentTo(ExpectedErrorResult(400, errorCode)); }
public async Task <ActionResult <NewRequestResponse> > Create([FromBody] NewRequestRequest request) { var email = this.GetUserEmail(); // Check mandatory parameters. if (AnyMissing(request?.SelectedProducts)) { return(this.Problem("Unable to create request", 400, ErrorCode.MissingMandatoryField)); } // Check for negative quantities. if (request.SelectedProducts.Any(p => p.Quantity < 0)) { return(this.Problem("Unable to create request", 400, ErrorCode.NegativeValue)); } // Create new request. using var transaction = await context.Database.BeginTransactionAsync(); Guid refNo; if (request.RefNo == null) { // Unknown refNo. Assign new one. refNo = Guid.NewGuid(); } else { // Known refNo. Set previous request with same refNo as not being current anymore. refNo = request.RefNo.Value; var existingRequest = await context .Request .Include(r => r.RequestStatus) .Include(r => r.User) .SingleOrDefaultAsync(r => r.RefNo.Equals(refNo) && r.IsCurrent == 1); if (existingRequest == null) { return(this.Problem("Unable to create request", 400, ErrorCode.InvalidRefNo)); } if (existingRequest.User.Email != email) { return(this.Problem("Unable to create request", 403, ErrorCode.UserNotAllowed)); } existingRequest.IsCurrent = 0; context.Request.Update(existingRequest); await context.SaveChangesAsync(); } var user = await context.User.SingleAsync(u => u.Email == email); var status = await context.RequestStatus.SingleAsync(s => s.Id == RequestStatusId.Pending); var newRequest = new Request() { Id = Guid.NewGuid(), RefNo = refNo, User = user, IsCurrent = 1, RequestStatus = status, }; var newRequestDetails = request.SelectedProducts.Select(sp => new RequestDetail() { Id = Guid.NewGuid(), Qty = sp.Quantity, Product = context.Product.SingleOrDefault(p => p.Id == sp.Id), Request = newRequest, }).ToList(); if (newRequestDetails.Any(rd => rd.Product == null)) { return(this.Problem("Unable to create request", 400, ErrorCode.InvalidProductId)); } await context.Request.AddAsync(newRequest); await context.SaveChangesAsync(); await context.RequestDetail.AddRangeAsync(newRequestDetails); await context.SaveChangesAsync(); transaction.Commit(); return(Ok(new NewRequestResponse() { RefNo = newRequest.RefNo })); }
public async Task TestCreateRequest() { // Arrange var user = user1; var request1 = new NewRequestRequest() { SelectedProducts = new[] { new ProductRequestRequest() { Id = products[0].Id, Quantity = 9 }, new ProductRequestRequest() { Id = products[1].Id, Quantity = 2 }, } }; // Act var result1 = await GetRequestsController(user).Create(request1); // Assert var response1 = result1.Result.Should().BeOfType <OkObjectResult>().Which.Value.Should().BeOfType <NewRequestResponse>().Which; var expectedRequestRow = ExpectedRequestRow(response1.RefNo.ToString()); var requestRow = db.Request.Single(r => r.User.Email == user.Email && r.RefNo == response1.RefNo); requestRow.Should().BeEquivalentTo(expectedRequestRow, options => options.Excluding(r => r.Id).Excluding(r => r.User).Excluding(r => r.RequestDetails).Excluding(r => r.RequestStatus.Requests)); var expectedRequestDetailRows = request1.SelectedProducts.Select(ExpectedRequestDetailRow).ToList(); var requestDetailRows = db.RequestDetail.Where(rd => rd.Request.RefNo == response1.RefNo).ToList(); requestDetailRows.Should().BeEquivalentTo(expectedRequestDetailRows, options => options.Excluding(rd => rd.Id).Excluding(rd => rd.Product.RequestDetails).Excluding(rd => rd.Request)); // User creates the second request // Arrange var request2 = new NewRequestRequest() { RefNo = response1.RefNo, SelectedProducts = new[] { new ProductRequestRequest() { Id = products[2].Id, Quantity = 15 }, } }; // Act var result2 = await GetRequestsController(user).Create(request2); // Assert var expectedResult2 = new OkObjectResult(new NewRequestResponse() { RefNo = response1.RefNo }); result2.Result.Should().BeEquivalentTo(expectedResult2); var expectedRequestRows = new[] { ExpectedRequestRow(response1.RefNo.ToString(), isCurrent: 0), ExpectedRequestRow(response1.RefNo.ToString(), isCurrent: 1), }; var requestRows = db.Request.Where(r => r.User.Email == user.Email && r.RefNo == response1.RefNo); requestRows.Should().BeEquivalentTo(expectedRequestRows, options => options.Excluding(r => r.Id).Excluding(r => r.User).Excluding(r => r.RequestDetails).Excluding(r => r.RequestStatus.Requests)); expectedRequestDetailRows = request2.SelectedProducts.Select(ExpectedRequestDetailRow).ToList(); requestDetailRows = db.RequestDetail.Where(rd => rd.Request.RefNo == response1.RefNo && rd.Request.IsCurrent == 1).ToList(); requestDetailRows.Should().BeEquivalentTo(expectedRequestDetailRows, options => options.Excluding(rd => rd.Id).Excluding(rd => rd.Product.RequestDetails).Excluding(rd => rd.Request)); }