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); }
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)); }