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