コード例 #1
0
ファイル: PromotionService.cs プロジェクト: tabright26/edoxa
        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);
        }
コード例 #2
0
        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();
            });
        }
コード例 #3
0
 public static PromotionRecipientModel ToModel(this PromotionRecipient recipient)
 {
     return(new PromotionRecipientModel
     {
         UserId = recipient.User.Id,
         RedeemedAt = recipient.RedeemedAt
     });
 }