Ejemplo n.º 1
0
        public async Task CreateChallengeAsync_ShouldBeOfTypeValidationResultWithErrors()
        {
            // Arrange
            TestMock.ChallengePayoutStrategy.Setup(payout => payout.GetChallengePayout(It.IsAny <ChallengePayoutEntries>(), It.IsAny <EntryFee>())).Verifiable();

            TestMock.ChallengePayoutFactory.Setup(payout => payout.CreateInstance()).Returns(TestMock.ChallengePayoutStrategy.Object).Verifiable();

            var service = new ChallengeService(TestMock.ChallengePayoutFactory.Object, TestMock.ChallengeRepository.Object);

            var bucket = new ChallengePayoutBucket(ChallengePayoutBucketPrize.Consolation, ChallengePayoutBucketSize.Individual);

            var buckets = new ChallengePayoutBuckets(
                new List <ChallengePayoutBucket>
            {
                bucket
            });

            var payoutEntries = new ChallengePayoutEntries(buckets);

            // Act
            var result = await service.CreateChallengeAsync(new ChallengeId(), payoutEntries, new EntryFee(5000, CurrencyType.Token));

            // Assert
            result.Should().BeOfType <DomainValidationResult <IChallenge> >();

            result.Errors.Should().NotBeEmpty();

            TestMock.ChallengePayoutStrategy.Verify(payout => payout.GetChallengePayout(It.IsAny <ChallengePayoutEntries>(), It.IsAny <EntryFee>()), Times.Once);

            TestMock.ChallengePayoutFactory.Verify(payout => payout.CreateInstance(), Times.Once);
        }
        public void GetPayout_WithoutEntries_ShouldBeNull()
        {
            // Arrange
            var payoutStrategy = new DefaultChallengePayoutStrategy();

            var buckets = new ChallengePayoutBuckets(new List <ChallengePayoutBucket>());

            var payoutEntries = new ChallengePayoutEntries(buckets);

            // Act
            var action = new Func <IChallengePayout>(() => payoutStrategy.GetChallengePayout(payoutEntries, new EntryFee(5000, CurrencyType.Token)));

            // Assert
            action.Should().Throw <NotSupportedException>();
        }
Ejemplo n.º 3
0
        public IChallengePayout GetChallengePayout(ChallengePayoutEntries entries, EntryFee entryFee)
        {
            var charts = FileStorage.ChallengePayouts[entries].ToList();

            if (charts.IsNullOrEmpty())
            {
                throw new NotSupportedException($"Payout entries value ({entries}) is not supported.");
            }

            var prize = entryFee.GetPayoutBucketPrizeOrDefault();

            var buckets = new ChallengePayoutBuckets(charts.Select(chart => new ChallengePayoutBucket(prize.Apply(chart), chart.Size)));

            return(new ChallengePayout(entryFee, buckets));
        }
        public void GetPayout_WithEntries_ShouldNotBeNull()
        {
            // Arrange
            var payoutStrategy = new DefaultChallengePayoutStrategy();

            var bucket = new ChallengePayoutBucket(ChallengePayoutBucketPrize.Consolation, ChallengePayoutBucketSize.Individual);

            var buckets = new ChallengePayoutBuckets(
                new List <ChallengePayoutBucket>
            {
                bucket
            });

            var payoutEntries = new ChallengePayoutEntries(buckets);

            // Act
            var payout = payoutStrategy.GetChallengePayout(payoutEntries, new EntryFee(5000, CurrencyType.Token));

            // Assert
            payout.Should().NotBeNull();
        }
Ejemplo n.º 5
0
        public async Task <DomainValidationResult <IChallenge> > CreateChallengeAsync(
            ChallengeId challengeId,
            ChallengePayoutEntries payoutEntries,
            EntryFee entryFee,
            CancellationToken cancellationToken = default
            )
        {
            var result = new DomainValidationResult <IChallenge>();

            var strategy = _challengePayoutFactory.CreateInstance();

            if (payoutEntries == 0)
            {
                return(result.AddFailedPreconditionError("Challenge payout entries cannot be zero."));
            }

            var payout = strategy.GetChallengePayout(payoutEntries, entryFee);

            if (payout == null)
            {
                return(result.AddFailedPreconditionError("Invalid payout structure. Payout entries doesn't match the chart."));
            }

            if (result.IsValid)
            {
                var challenge = new Challenge(challengeId, payout !);

                _challengeRepository.Create(challenge);

                await _challengeRepository.CommitAsync(true, cancellationToken);

                return(challenge);
            }

            return(result);
        }
Ejemplo n.º 6
0
        protected override async Task SeedProductionAsync()
        {
            await this.SeedAdministratorAccountAsync();

            var assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) !;

            var file = File.OpenRead(Path.Combine(assemblyPath, "Setup/Challenges.Production.csv"));

            using var csvReader = file.OpenCsvReader();

            Challenges.AddRange(
                csvReader.GetRecords(
                    new
            {
                Id = default(Guid),
                EntryFeeCurrency = default(int),
                EntryFeeAmount   = default(decimal),
                Entries          = default(int)
            })
                .Select(
                    record =>
            {
                var payoutStrategy = new ChallengePayoutFactory().CreateInstance();

                var payoutEntries = new ChallengePayoutEntries(record.Entries / 2);

                var currency = CurrencyType.FromValue(record.EntryFeeCurrency) !;

                var entryFee = new EntryFee(record.EntryFeeAmount, currency);

                var payout = payoutStrategy.GetChallengePayout(payoutEntries, entryFee);

                return(new Challenge(record.Id.ConvertTo <ChallengeId>(), payout));
            })
                .Where(challenge => Challenges.All(x => x.Id != challenge.Id))
                .Select(challenge => challenge.ToModel()));

            await this.CommitAsync();

            var startedAt = DateTimeOffset.FromUnixTimeMilliseconds(1582261200000).UtcDateTime;

            var duration = TimeSpan.FromDays(4);

            var promotion1 = new Promotion(
                "DHANA20REDCUP",
                new Money(5),
                duration,
                new DateTimeProvider(startedAt + duration));

            promotion1.SetEntityId(PromotionId.Parse("885cdd1e-0ed9-4fdc-9c29-d48a9d071cfd"));

            var promotion2 = new Promotion(
                "DHANA20TOK",
                new Token(250),
                duration,
                new DateTimeProvider(startedAt + duration));

            promotion2.SetEntityId(PromotionId.Parse("263aa2ed-3f88-4070-96e6-a098814e44f3"));

            var promotions = new List <Promotion>
            {
                promotion1,
                promotion2
            };

            Promotions.AddRange(promotions.Where(promotion => Promotions.All(x => x.Id != promotion.Id)).Select(promotion => promotion.ToModel()));

            await this.CommitAsync();
        }