示例#1
0
        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));
        }
示例#2
0
        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));
        }
示例#3
0
        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
            }));
        }
示例#4
0
        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));
        }