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));
        }
    }
Ejemplo n.º 3
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");
        }
Ejemplo n.º 4
0
        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());
        }
Ejemplo n.º 5
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));
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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));
        }
Ejemplo n.º 8
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>();
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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();
        }
Ejemplo n.º 11
0
        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));
        }
Ejemplo n.º 12
0
        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);
        }