Esempio n. 1
0
        public async void SetPartnerPromoCodeLimitAsync_HasActiveLimit_ShouldSetCancelDateNow()
        {
            //Arrange
            var partner     = GetBasePartner().WithActiveLimit();
            var targetLimit = partner.PartnerLimits.First();
            var partnerId   = partner.Id;
            var request     = new Fixture().Create <SetPartnerPromoCodeLimitRequest>();
            var now         = new DateTime(2020, 10, 14);
            var expected    =
                new PartnerPromoCodeLimit()
            {
                Id         = Guid.Parse("c9bef066-3c5a-4e5d-9cff-bd54479f075e"),
                CreateDate = new DateTime(2020, 07, 9),
                CancelDate = now,
                EndDate    = new DateTime(2020, 10, 9),
                Limit      = 100
            };

            var mock = new Mock <IRepository <Partner> >();

            mock.Setup(x => x.GetByIdAsync(partnerId)).ReturnsAsync(partner);
            var mockCurrentDateTimeProvider = new Mock <ICurrentDateTimeProvider>();

            mockCurrentDateTimeProvider.Setup(x => x.CurrentDateTime)
            .Returns(now);

            //Act
            var controller = new PartnersController(mock.Object, mockCurrentDateTimeProvider.Object);

            await controller.SetPartnerPromoCodeLimitAsync(partnerId, request);

            //Assert
            targetLimit.Should().BeEquivalentTo(expected);
        }
Esempio n. 2
0
        public async Task <IActionResult> SetPartnerPromoCodeLimitAsync(Guid id, SetPartnerPromoCodeLimitRequest request)
        {
            var partner = await _partnersRepository.GetByIdAsync(id);

            if (partner == null)
            {
                return(NotFound());
            }

            //Если партнер заблокирован, то нужно выдать исключение
            if (!partner.IsActive)
            {
                return(BadRequest("Данный партнер не активен"));
            }

            //Установка лимита партнеру
            var activeLimit = partner.PartnerLimits.FirstOrDefault(x =>
                                                                   !x.CancelDate.HasValue);

            if (activeLimit != null)
            {
                //Если партнеру выставляется лимит, то мы
                //должны обнулить количество промокодов, которые партнер выдал, если лимит закончился,
                //то количество не обнуляется
                partner.NumberIssuedPromoCodes = 0;

                //При установке лимита нужно отключить предыдущий лимит
                activeLimit.CancelDate = DateTime.Now;
            }

            if (request.Limit <= 0)
            {
                return(BadRequest("Лимит должен быть больше 0"));
            }

            var newLimit = new PartnerPromoCodeLimit()
            {
                Limit      = request.Limit,
                Partner    = partner,
                PartnerId  = partner.Id,
                CreateDate = DateTime.Now,
                EndDate    = request.EndDate
            };

            if (partner.PartnerLimits == null)
            {
                partner.PartnerLimits = new List <PartnerPromoCodeLimit>();
            }

            partner.PartnerLimits.Add(newLimit);

            await _partnersRepository.UpdateAsync(partner);

            return(CreatedAtAction("SetPartnerPromocodeLimit", new { id = partner.Id, limitId = newLimit.Id }, null));
        }