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)); }
public async Task <Result <SurveyModel, Error> > Handle(CreateSurveyCommand request, CancellationToken cancellationToken) { try { var userInfo = await _userService.GetUserInfo(cancellationToken); var surveyOwner = await _surveyContext.Users.FirstAsync(user => user.ExternalUserId == userInfo.Id, cancellationToken); var survey = new Survey(surveyOwner, NonEmptyString.Create(request.SurveyTopic), request.NumberOfRespondents, NonEmptyString.Create(request.RespondentType)); survey.AddSurveyOptions(request.SurveyOptions.Select(option => new SurveyOption(NonEmptyString.Create(option.OptionText), option.PreferredNumberOfVotes))); survey.CalculateOutcome(); await _surveyContext.Surveys.AddAsync(survey, cancellationToken); await _surveyContext.SaveChangesAsync(cancellationToken); return(_mapper.Map <SurveyModel>(survey)); } catch (SurveyDomainException e) { return(new Error("survey.domain.exception", e.Message)); } }
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() { const string topic = "Tabs or spaces?"; const int numberOfRespondents = 1000; const string respondentType = "Developers"; var survey = new Survey(null, NonEmptyString.Create(topic), numberOfRespondents, NonEmptyString.Create(respondentType)); Assert.Throws <SurveyDomainException>(() => survey.CalculateOutcome()); }
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_Fixed_Outcome() { const string topic = "Tabs or spaces?"; const int numberOfRespondents = 1000; const string respondentType = "Developers"; var survey = new Survey(null, NonEmptyString.Create(topic), numberOfRespondents, NonEmptyString.Create(respondentType)); survey.AddSurveyOption(NonEmptyString.Create("Tabs"), 600); survey.AddSurveyOption(NonEmptyString.Create("Spaces"), 400); survey.CalculateOutcome(); Assert.Equal(600, survey.Options.First().NumberOfVotes); Assert.Equal(400, survey.Options.Last().NumberOfVotes); }
public void Should_Be_Able_To_Calculate_Results_Of_Survey_With_Random_Outcome() { const string topic = "Tabs or spaces?"; const int numberOfRespondents = 1000; const string respondentType = "Developers"; var survey = new Survey(null, NonEmptyString.Create(topic), numberOfRespondents, NonEmptyString.Create(respondentType)); survey.AddSurveyOption(NonEmptyString.Create("Tabs")); survey.AddSurveyOption(NonEmptyString.Create("Spaces")); survey.CalculateOutcome(); Assert.Equal(numberOfRespondents, survey.Options.Sum(option => option.NumberOfVotes)); Assert.True(survey.Options.All(option => option.NumberOfVotes > 0)); }
public void GivenSurveyWithNoOption_WhenCalculatingOutcome_ThenSurveyDomainExceptionShouldBeThrown() { const string topic = "Tabs or spaces?"; const int numberOfRespondents = 1000; const string respondentType = "Developers"; Action act = () => { var survey = new Survey(_testUser, NonEmptyString.Create(topic), numberOfRespondents, NonEmptyString.Create(respondentType)); survey.CalculateOutcome(); }; act.Should().ThrowExactly <SurveyDomainException>(); }
GivenSurveyWithOptionsHavingPreferredNumberOfVotes_WhenCalculatingOutcome_ThenEachOptionShouldHaveExpectedPreferredNumberOfVotes() { const string topic = "Tabs or spaces?"; const int numberOfRespondents = 1000; const string respondentType = "Developers"; var survey = new Survey(_testUser, NonEmptyString.Create(topic), numberOfRespondents, NonEmptyString.Create(respondentType)); survey.AddSurveyOption(NonEmptyString.Create("Tabs"), 600); survey.AddSurveyOption(NonEmptyString.Create("Spaces"), 400); survey.CalculateOutcome(); survey.Options.First().NumberOfVotes.Should().Be(600); survey.Options.Last().NumberOfVotes.Should().Be(400); }
public void GivenSurveyWithOptions_WhenCalculatingOutcome_ThenOptionNumberOfVotesShouldBeDistributedEvenly() { const string topic = "Tabs or spaces?"; const int numberOfRespondents = 1000; const string respondentType = "Developers"; var survey = new Survey(_testUser, NonEmptyString.Create(topic), numberOfRespondents, NonEmptyString.Create(respondentType)); survey.AddSurveyOption(NonEmptyString.Create("Tabs")); survey.AddSurveyOption(NonEmptyString.Create("Spaces")); survey.CalculateOutcome(); survey.Options.Sum(option => option.NumberOfVotes).Should().Be(numberOfRespondents); survey.Options.All(option => option.NumberOfVotes > 0).Should().BeTrue(); }
public void Should_Be_Able_To_Calculate_Results_Of_Survey_With_One_Sided_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 OneSidedVoteDistribution(); var result = survey.CalculateOutcome(voteDistributionStrategy); Assert.Equal(numberOfRespondents, result.Options.Max(option => option.NumberOfVotes)); }
public void Should_Be_Able_To_Calculate_Results_Of_Survey_With_Fixed_Outcome() { var topic = "Tabs or spaces?"; var numberOfRespondents = 1000; var respondentType = "Developers"; var survey = new Survey(topic, numberOfRespondents, respondentType); survey.AddSurveyOption("Tabs", 600); survey.AddSurveyOption("Spaces", 400); var voteDistribution = new FixedVoteDistribution(); var result = survey.CalculateOutcome(voteDistribution); Assert.Equal(600, result.Options.First().NumberOfVotes); Assert.Equal(400, result.Options.Last().NumberOfVotes); }