public async Task <DomainValidationResult <Promotion> > RedeemPromotionAsync(Promotion promotion, UserId userId, IDateTimeProvider redeemedAt) { var result = new DomainValidationResult <Promotion>(); var user = new User(userId); var recipient = new PromotionRecipient(user, redeemedAt); if (promotion.IsExpired()) { result.AddFailedPreconditionError("The promotional code is expired"); } if (!promotion.IsActive()) { result.AddFailedPreconditionError("The promotional code is invalid"); } if (promotion.IsRedeemBy(recipient)) { result.AddFailedPreconditionError("The promotional code is already redeemed"); } if (result.IsValid) { promotion.Redeem(recipient); await _promotionRepository.CommitAsync(); return(promotion); } return(result); }
public async Task ShouldBeHttpStatusCodeBadRequest() { var user = TestData.FileStorage.GetUsers().First(); var recipient = new PromotionRecipient(new User(user), new DateTimeProvider(DateTime.UtcNow)); var factory = TestHost.WithClaimsFromDefaultAuthentication(new Claim(JwtClaimTypes.Subject, user.ToString())); _httpClient = factory.CreateClient(); var testServer = factory.Server; testServer.CleanupDbContext(); await testServer.UsingScopeAsync( async scope => { var repository = scope.GetRequiredService <IPromotionRepository>(); repository.Create(GenerateExpiredPromotion(new Money(50))); await repository.CommitAsync(); }); // Act using var response = await this.ExecuteAsync(TestCode); // Assert response.StatusCode.Should().Be(HttpStatusCode.BadRequest); await testServer.UsingScopeAsync( async scope => { var repository = scope.GetRequiredService <IPromotionRepository>(); var promotion = await repository.FindPromotionOrNullAsync(TestCode); promotion.Should().NotBeNull(); promotion?.IsRedeemBy(recipient).Should().BeFalse(); }); }
public static PromotionRecipientModel ToModel(this PromotionRecipient recipient) { return(new PromotionRecipientModel { UserId = recipient.User.Id, RedeemedAt = recipient.RedeemedAt }); }