예제 #1
0
        public void AddNewCampaign_NOT_ON_SAME_STREET_BAD_REQUEST()
        {
            //Arrange
            var request = new NewCampaignRequest
            {
                StartDate      = "2020-07-01",
                EndDate        = "2020-08-01",
                IdClient       = 3,
                FromIdBuilding = 1,
                ToIdBuilding   = 2
            };

            var targetErrorMessage = "Buildings MUST be located on the same street";

            _clientsMockDbService.Setup(service => service.ClientExists(request.IdClient))
            .Returns(true);
            _campaignsMockDbService.Setup(service =>
                                          service.BuildingsOnSameStreet(request.FromIdBuilding, request.ToIdBuilding))
            .Returns(false);

            //Act
            var actionResult = _campaignsController.AddNewCampaign(request);

            //Assrt
            var badRequestObjectResult = actionResult as BadRequestObjectResult;

            Assert.NotNull(badRequestObjectResult);

            var errorMessage = badRequestObjectResult.Value as string;

            Assert.Equal(targetErrorMessage, errorMessage);
        }
예제 #2
0
        public void AddNewCampaign_CLIENT_DOESNT_EXIST_BAD_REQUEST()
        {
            //Arrange
            var request = new NewCampaignRequest
            {
                StartDate      = "2020-07-01",
                EndDate        = "2020-08-01",
                IdClient       = 3,
                FromIdBuilding = 1,
                ToIdBuilding   = 2
            };

            var targetErrorMessage = "Client with id " + request.IdClient + " DOESNT EXIST";

            _clientsMockDbService.Setup(service => service.ClientExists(request.IdClient))
            .Returns(false);

            //Act
            var actionResult = _campaignsController.AddNewCampaign(request);

            //Assrt
            var badRequestObjectResult = actionResult as BadRequestObjectResult;

            Assert.NotNull(badRequestObjectResult);

            var errorMessage = badRequestObjectResult.Value as string;

            Assert.Equal(targetErrorMessage, errorMessage);
        }
예제 #3
0
        public IActionResult AddNewCampaign(NewCampaignRequest campaignRequest)
        {
            var errorList = ValidationHelper.ValidateNewCampaignRequest(campaignRequest);

            if (errorList.Count > 0)
            {
                return(BadRequest(errorList));
            }

            try
            {
                var clientExists = _clientDbService.ClientExists(campaignRequest.IdClient);
                if (!clientExists)
                {
                    throw new Exception("Client with id " + campaignRequest.IdClient + " DOESNT EXIST");
                }

                var onSameStreet =
                    _campaignsDbService.BuildingsOnSameStreet(campaignRequest.FromIdBuilding,
                                                              campaignRequest.ToIdBuilding);
                if (!onSameStreet)
                {
                    throw new Exception("Buildings MUST be located on the same street");
                }

                BestPriceWrapper priceWrapper = _campaignsDbService.GetBestPrice(campaignRequest);
                var response = _campaignsDbService.AddNewCampaign(campaignRequest, priceWrapper);
                return(StatusCode(201, response));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
예제 #4
0
        public Campaign CreateNewCampaign(NewCampaignRequest request)
        {
            var Id       = DbContext.Campaign.Max(c => c.IdCampaign) + 1;
            var campaign = new Campaign {
                IdCampaign          = Id, IdClient = request.IdClient, StartDate = request.StartDate, EndDate = request.EndDate,
                PricePerSquareMeter = request.PricePerSquareMeter, FromIdBuilding = request.FromIdBuilding, ToldBuilding = request.ToIdBuilding
            };

            DbContext.Campaign.Add(campaign);
            DbContext.SaveChanges();
            return(campaign);
        }
예제 #5
0
        public void AddNewCampaign_SUCCESS()
        {
            //Arrange
            var request = new NewCampaignRequest
            {
                StartDate      = "2020-07-01",
                EndDate        = "2020-08-01",
                IdClient       = 3,
                FromIdBuilding = 1,
                ToIdBuilding   = 2
            };

            var priceWrapper = new BestPriceWrapper
            {
                FirstBanner = new BannerWrapper
                {
                    BannerName = "abc"
                },
                SecondBanner = new BannerWrapper
                {
                    BannerName = "cba"
                },
                TotalPrice = new decimal(1000)
            };

            var targetResponse = new NewCampaignResponse
            {
                CampaignId = 100
            };

            _clientsMockDbService.Setup(service => service.ClientExists(request.IdClient))
            .Returns(true);
            _campaignsMockDbService.Setup(service =>
                                          service.BuildingsOnSameStreet(request.FromIdBuilding, request.ToIdBuilding))
            .Returns(true);
            _campaignsMockDbService.Setup(service => service.GetBestPrice(request))
            .Returns(priceWrapper);
            _campaignsMockDbService.Setup(service => service.AddNewCampaign(request, priceWrapper))
            .Returns(targetResponse);
            //Act
            var actionResult = _campaignsController.AddNewCampaign(request);

            //Assrt
            var createdObjectResult = actionResult as ObjectResult;

            Assert.NotNull(createdObjectResult);
            Assert.Equal(201, createdObjectResult.StatusCode);

            var resultResponse = createdObjectResult.Value as NewCampaignResponse;

            Assert.Equal(targetResponse, resultResponse);
        }
예제 #6
0
        public IActionResult AddNewCampaign([FromServices] IClientDal _dbService, NewCampaignRequest request)
        {
            var result = _dbService.AddCampaign(request);

            if (result == -1)
            {
                return(StatusCode(404, "Wrong buildings"));
            }
            else
            {
                return(Ok(result));
            }
        }
예제 #7
0
 public IActionResult NewCampaign(NewCampaignRequest request)
 {
     try
     {
         return(Created("", dbService.NewCampaign(request)));
     }
     catch (BuildingsNotExistException exc)
     {
         return(NotFound(exc));
     }
     catch (BuildingsNotNearException exc)
     {
         return(BadRequest(exc));
     }
 }
예제 #8
0
        public NewCampaignResponse AddNewCampaign(NewCampaignRequest request, BestPriceWrapper wrapper)
        {
            int campaignId = CreateCampaign(request);

            CreateBanner(wrapper.FirstBanner, campaignId);
            CreateBanner(wrapper.SecondBanner, campaignId);

            return(new NewCampaignResponse
            {
                CampaignId = campaignId,
                FirstBanner = wrapper.FirstBanner,
                SecondBanner = wrapper.SecondBanner,
                TotalPrice = wrapper.TotalPrice
            });
        }
예제 #9
0
 public IActionResult NewCampaign(NewCampaignRequest req)
 {
     try
     {
         return(Created("", _dbService.NewCampaign(req)));
     }
     catch (BuildingsException exc)
     {
         return(NotFound(exc));
     }
     catch (LocationException e)
     {
         return(BadRequest(e));
     }
 }
예제 #10
0
        public IActionResult CreateNewCampaign(NewCampaignRequest request)
        {
            List <Building> ListBuilings = DbService.CheckBuildings(request);

            if (ListBuilings != null)
            {
                ListBuilings = DbService.GetBuildings(ListBuilings);
                NewCampaignResponse campaignResponse = CalculateService.GeCampaignSetup(ListBuilings, request.PricePerSquareMeter);
                var campaign = DbService.CreateNewCampaign(request);
                DbService.CreateNewBanners(campaign.IdCampaign, campaignResponse);
                campaignResponse.Campaign = campaign;
                return(CreatedAtAction("CreateNewCampaign", campaignResponse));
            }
            return(BadRequest("Nie poprawne dane budynków"));
        }
예제 #11
0
        public void AddCampaign_CompleteRequest_Correct()
        {
            NewCampaignRequest request = new NewCampaignRequest
            {
                IdClient            = 5,
                StartDate           = DateTime.Today,
                EndDate             = DateTime.Today.AddDays(15),
                PricePerSquareMeter = 45,
                FromIdBuilding      = 2,
                ToIdBuilding        = 5
            };
            var controller = new AdvertController(new SqlServerDbService(new s19205Context(), new ConfigurationBuilder().Build()));
            var result     = controller.NewCampaign(request);

            Assert.IsNotNull(result);
            Assert.IsTrue(result is CreatedResult);
        }
예제 #12
0
        public NewCampaignResponse NewCampaign(NewCampaignRequest request)
        {
            if (dbContext.Building.Count() < 2)
            {
                throw new BuildingsNotExistException("No buildings in the database!");
            }

            var building1 = dbContext.Building.Where(b => b.IdBuilding.Equals(request.FromIdBuilding)).FirstOrDefault();
            var building2 = dbContext.Building.Where(b => b.IdBuilding.Equals(request.ToIdBuilding)).FirstOrDefault();

            if (!building1.Street.Equals(building2.Street))
            {
                throw new BuildingsNotNearException("Buildings are not near with each other");
            }

            Campaign camp = new Campaign
            {
                IdClient            = request.IdClient,
                StartDate           = request.StartDate,
                EndDate             = request.EndDate,
                PricePerSquareMeter = request.PricePerSquareMeter,
                FromIdBuilding      = request.FromIdBuilding,
                ToIdBuilding        = request.ToIdBuilding
            };

            dbContext.Campaign.Add(camp);
            dbContext.SaveChanges();

            var buildings = dbContext.Building
                            .Where(b => b.StreetNumber >= building1.StreetNumber && b.StreetNumber <= building2.StreetNumber)
                            .OrderBy(a => a.StreetNumber)
                            .ToList();

            List <Banner> banners = calculateSize(buildings, camp, request.PricePerSquareMeter);

            dbContext.Banner.AddRange(banners.First(), banners.Last());
            dbContext.SaveChanges();

            return(new NewCampaignResponse
            {
                Campaign = camp,
                Banner1 = banners.First(),
                Banner2 = banners.Last()
            });
        }
예제 #13
0
        public void AddCampaign_CompleteRequest_Correct()
        {
            NewCampaignRequest request = new NewCampaignRequest {
                IdClient            = 5,
                StartDate           = DateTime.Today,
                EndDate             = DateTime.Today.AddDays(15),
                PricePerSquareMeter = 45,
                FromIdBuilding      = 2,
                ToIdBuilding        = 5
            };
            var context = new ValidationContext(request, null, null);
            var results = new List <ValidationResult>();

            var isModelValid = Validator.TryValidateObject(request, context, results, true);

            Assert.IsTrue(isModelValid);
            Assert.IsTrue(results.Count == 0);
        }
예제 #14
0
        private int CreateCampaign(NewCampaignRequest request)
        {
            int campaignId = GetNewCampaignId();

            _context.Campaign.Add(new Campaign
            {
                IdCampaign          = campaignId,
                StartDate           = Convert.ToDateTime(request.StartDate),
                EndDate             = Convert.ToDateTime(request.EndDate),
                PricePerSquareMeter = request.PricePerSquareMeter,
                FromIdBuilding      = request.FromIdBuilding,
                ToIdBuilding        = request.ToIdBuilding,
                IdClient            = request.IdClient
            });

            _context.SaveChanges();
            return(campaignId);
        }
예제 #15
0
        public void AddNewCampaign_VALIDATION_ERROR_BAD_REQUEST()
        {
            //Arrange
            var request = new NewCampaignRequest
            {
                StartDate           = "bad date",
                PricePerSquareMeter = 123,
                EndDate             = "bad date"
            };

            var targetErrorList = new List <Error>();

            targetErrorList.Add(
                new Error
            {
                Field        = "StartDate",
                InvalidValue = request.StartDate,
                Message      = "Date doesnt match regex ^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$)"
            }
                );
            targetErrorList.Add(
                new Error
            {
                Field        = "EndDate",
                InvalidValue = request.EndDate,
                Message      = "Date doesnt match regex ^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$)"
            }
                );

            //Act
            var actionResult = _campaignsController.AddNewCampaign(request);

            //Assert
            var badRequestObjectResult = actionResult as BadRequestObjectResult;

            Assert.NotNull(badRequestObjectResult);

            var resultErrorList = badRequestObjectResult.Value as List <Error>;

            targetErrorList.Should().BeEquivalentTo(resultErrorList);

            _clientsMockDbService.Verify(service => service.ClientExists(It.IsAny <int>()), Times.Never);
        }
예제 #16
0
        public List <Building> CheckBuildings(NewCampaignRequest CampaignRequest)
        {
            var list = new List <Building>();

            if (DbContext.Building.Where(b => b.IdBuilding == CampaignRequest.FromIdBuilding).Any() && DbContext.Building.Where(b => b.IdBuilding == CampaignRequest.ToIdBuilding).Any())
            {
                var b1 = GetBuilding(CampaignRequest.FromIdBuilding);
                var b2 = GetBuilding(CampaignRequest.ToIdBuilding);
                if (b1.City == b2.City && b1.Street == b2.Street)
                {
                    list.Add(b1);
                    list.Add(b2);
                    return(list);
                }
                list = null;
                return(list);
            }
            list = null;
            return(list);
        }
예제 #17
0
        public void AddNewCampaign_VALIDATION_ERROR_IS_START_BEFORE_END_BAD_REQUEST()
        {
            //Arrange
            var request = new NewCampaignRequest
            {
                StartDate = "2020-07-01",
                EndDate   = "2020-01-01"
            };

            var targetErrorList = new List <Error>();

            targetErrorList.Add(
                new Error
            {
                Field        = "StartDate",
                InvalidValue = request.StartDate,
                Message      = "StartDate should be BEFORE EndDate"
            }
                );

            //Act
            var actionResult = _campaignsController.AddNewCampaign(request);

            //Assert
            var badRequestObjectResult = actionResult as BadRequestObjectResult;

            Assert.NotNull(badRequestObjectResult);

            var resultErrorList = badRequestObjectResult.Value as List <Error>;

            targetErrorList.Should().BeEquivalentTo(resultErrorList);

            _clientsMockDbService.Verify(service => service.ClientExists(It.IsAny <int>()), Times.Never);
            _campaignsMockDbService.Verify(service => service.BuildingsOnSameStreet(It.IsAny <int>(), It.IsAny <int>()),
                                           Times.Never);
            _campaignsMockDbService.Verify(service => service.GetBestPrice(It.IsAny <NewCampaignRequest>()),
                                           Times.Never);
            _campaignsMockDbService.Verify(
                service => service.AddNewCampaign(It.IsAny <NewCampaignRequest>(), It.IsAny <BestPriceWrapper>()),
                Times.Never);
        }
예제 #18
0
        public static List <Error> ValidateNewCampaignRequest(NewCampaignRequest request)
        {
            List <Error> errors = new List <Error>();

            if (!IsDateValid(request.StartDate))
            {
                errors.Add(new Error
                {
                    Field        = "StartDate",
                    InvalidValue = request.StartDate,
                    Message      = "Date doesnt match regex ^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$)"
                });
            }

            if (!IsDateValid(request.EndDate))
            {
                errors.Add(new Error
                {
                    Field        = "EndDate",
                    InvalidValue = request.EndDate,
                    Message      = "Date doesnt match regex ^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$)"
                });
            }

            if (IsDateValid(request.StartDate) && IsDateValid(request.EndDate))
            {
                if (!IsBefore(request.StartDate, request.EndDate))
                {
                    errors.Add(new Error
                    {
                        Field        = "StartDate",
                        InvalidValue = request.StartDate,
                        Message      = "StartDate should be BEFORE EndDate"
                    });
                }
            }

            return(errors);
        }
예제 #19
0
        public double AddCampaign(NewCampaignRequest campaign)
        {
            CalculationService calculation = new CalculationService();

            var B1 = db.Building.Where(b => b.IdBuilding == campaign.FromIdBuilding)
                     .SingleOrDefault();

            var B2 = db.Building.Where(b => b.IdBuilding == campaign.ToIdBuilding)
                     .SingleOrDefault();

            if (B1 == null || B2 == null || B2.Street != B1.Street)
            {
                return(-1);
            }

            var cmp = new Campaign
            {
                IdCampaign          = db.Campaign.Max(e => e.IdCampaign) + 1,
                IdClient            = campaign.IdClient,
                StartDate           = campaign.StartDate,
                EndDate             = campaign.EndDate,
                PricePerSquareMeter = campaign.PricePerSquareMeter,
                FromIdBuilding      = campaign.FromIdBuilding,
                ToIdBuilding        = campaign.ToIdBuilding
            };

            db.Attach(cmp);
            db.Campaign.Add(cmp);
            db.SaveChanges();

            var list = db.Building.Where(e => e.Street == B1.Street && (
                                             (e.StreetNumber > B1.StreetNumber && e.StreetNumber < B2.StreetNumber) ||
                                             (e.StreetNumber <B1.StreetNumber && e.StreetNumber> B2.StreetNumber)
                                             )
                                         ).OrderBy(e => e.StreetNumber).ToList();

            return(calculation.getPrice(list, campaign.PricePerSquareMeter));
        }
예제 #20
0
        public NewCampaignResponse NewCampaign(NewCampaignRequest req)
        {
            if (_context.Buildings.Count() < 2)
            {
                throw new BuildingsException("Count of buildings less than 2 or no buildings in the database");
            }

            var buildingFirst  = _context.Buildings.Where(p => p.IdBuilding.Equals(req.FromIdBuilding)).FirstOrDefault();
            var buildingSecond = _context.Buildings.Where(p => p.IdBuilding.Equals(req.ToIdBuilding)).FirstOrDefault();

            if (!buildingFirst.Street.Equals(buildingSecond.Street))
            {
                throw new LocationException("Buildings are not on the same street");
            }

            Campaign campaign = new Campaign
            {
                IdClient            = req.IdCampaign,
                StartDate           = req.StartDate,
                EndDate             = req.EndDate,
                PricePerSquareMeter = req.PricePerSquareMeter,
                FromIdBuilding      = req.FromIdBuilding,
                ToIdBuilding        = req.ToIdBuilding
            };

            _context.Campaigns.Add(campaign);
            _context.SaveChanges();

            var buildings = _context.Buildings
                            .Where(p => p.StreetNumber >= buildingFirst.StreetNumber &&
                                   p.StreetNumber <= buildingSecond.StreetNumber)
                            .OrderBy(p => p.StreetNumber)
                            .ToList();



            List <Banner> banners = new List <Banner>
            {
                new Banner
                {
                    Name       = 123,
                    Price      = ((buildingFirst.Height * Math.Abs(buildingFirst.StreetNumber - buildingSecond.StreetNumber) * req.PricePerSquareMeter)),
                    IdCampaign = campaign.IdCampaign,
                    Area       = (buildingFirst.Height * Math.Abs(buildingFirst.StreetNumber - buildingSecond.StreetNumber))
                },
                new Banner
                {
                    Name       = 456,
                    Price      = ((buildingSecond.Height * Math.Abs(buildingSecond.StreetNumber - buildingFirst.StreetNumber) * req.PricePerSquareMeter)),
                    IdCampaign = campaign.IdCampaign,
                    Area       = (buildingSecond.Height * Math.Abs(buildingSecond.StreetNumber - buildingFirst.StreetNumber))
                }
            };

            _context.Banners.AddRange(banners.First(), banners.Last());
            _context.SaveChanges();

            return(new NewCampaignResponse
            {
                Campaign = campaign,
                BannerFirst = banners.First(),
                BannerSecond = banners.Last()
            });
        }
예제 #21
0
        public BestPriceWrapper GetBestPrice(NewCampaignRequest request)
        {
            var buildings = GetAllBuildingsInBetween(request.FromIdBuilding, request.ToIdBuilding);

            return(CalculateTotalPrice(buildings, request.PricePerSquareMeter));
        }