public async Task <SurveyModel> Handle(CreateSurveyCommand request, CancellationToken cancellationToken)
        {
            var survey = new Survey(request.SurveyTopic, request.NumberOfRespondents, request.RespondentType);

            foreach (var option in request.SurveyOptions)
            {
                if (option.PreferredNumberOfVotes.HasValue)
                {
                    survey.AddSurveyOption(option.OptionText, option.PreferredNumberOfVotes.Value);
                }
                else
                {
                    survey.AddSurveyOption(option.OptionText);
                }
            }

            IVoteDistribution voteDistribution;

            if (request.SurveyOptions.Any(option => option.PreferredNumberOfVotes > 0))
            {
                voteDistribution = new FixedVoteDistribution();
            }
            else
            {
                voteDistribution = new RandomVoteDistribution();
            }

            var result = survey.CalculateOutcome(voteDistribution);

            _surveyRepository.Add(result);

            await _surveyRepository.UnitOfWork.SaveEntitiesAsync(cancellationToken);

            return(_mapper.Map <SurveyModel>(result));
        }
Beispiel #2
0
        private async Task CreateSurvey(CancellationToken stoppingToken)
        {
            using var scope = _serviceScopeFactory.CreateScope();

            var surveyRepository = scope.ServiceProvider.GetService <ISurveyRepository>();

            var survey = new Survey("Test Topic", 100, "Testers");

            survey.AddSurveyOption("Option 1");
            survey.AddSurveyOption("Option 2");
            survey.AddSurveyOption("Option 3");
            survey.AddSurveyOption("Option 4");

            IVoteDistribution voteDistribution = new RandomVoteDistribution();

            var result = survey.CalculateOutcome(voteDistribution);

            surveyRepository.Add(result);

            await surveyRepository.UnitOfWork.SaveChangesAsync(stoppingToken);

            var winningOption = result.Options.OrderByDescending(option => option.NumberOfVotes).First();

            _logger.LogInformation($"Added Survey with topic: {result.Topic} asking: {result.NumberOfRespondents} {result.RespondentType}. Winning option: {winningOption.OptionText} with: {winningOption.NumberOfVotes} votes");
        }
Beispiel #3
0
        public void Should_Not_Be_Able_To_Calculate_Results_Of_Survey_With_No_Options()
        {
            var topic = "Tabs or spaces?";
            var numberOfRespondents = 1000;
            var respondentType      = "Developers";

            var survey = new Survey(topic, numberOfRespondents, respondentType);

            var voteDistributionStrategy = new RandomVoteDistribution();

            Assert.Throws <SurveyDomainException>(() => survey.CalculateOutcome(voteDistributionStrategy));
        }
Beispiel #4
0
        public void Should_Be_Able_To_Calculate_Results_Of_Survey_With_Random_Outcome()
        {
            var topic = "Tabs or spaces?";
            var numberOfRespondents = 1000;
            var respondentType      = "Developers";

            var survey = new Survey(topic, numberOfRespondents, respondentType);

            survey.AddSurveyOption("Tabs");
            survey.AddSurveyOption("Spaces");

            var voteDistributionStrategy = new RandomVoteDistribution();

            var result = survey.CalculateOutcome(voteDistributionStrategy);

            Assert.Equal(numberOfRespondents, result.Options.Sum(option => option.NumberOfVotes));
            Assert.True(result.Options.All(option => option.NumberOfVotes > 0));
        }