public void Given_AnsweredQuestion_When_Reduce_Then_QuizResults()
        {
            var quizModel     = CreateQuiz();
            var quizId        = Guid.NewGuid();
            var firstQuestion = quizModel.Questions.First();
            var lastQuestion  = quizModel.Questions.Last();
            var firstOption   = firstQuestion.Options.First();

            var events = new object[]
            {
                new QuizStartedEvent(quizId, quizModel),
                new QuizAnsweredEvent(quizId, new List <QuizAnswer>
                {
                    new QuizAnswer
                    {
                        QuestionId = firstQuestion.Id,
                        OptionId   = firstQuestion.Options.First(o => o.IsCorrect).Id,
                    },
                    new QuizAnswer
                    {
                        QuestionId = lastQuestion.Id,
                        OptionId   = lastQuestion.Options.First(o => !o.IsCorrect).Id,
                    }
                }),
            };

            var aggregate = QuizResultsAggregate.Create(quizId, events);

            Assert.Equal(quizModel.Questions.Count, aggregate.Questions.Count);
            Assert.Equal(100, aggregate.Questions.First(q => q.Id == firstQuestion.Id).CorrectAnswersPercent);
            Assert.Equal(100, aggregate.Questions.First(q => q.Id == lastQuestion.Id).IncorrectAnswersPercent);

            Assert.True(aggregate.Questions.Where(q => q.Id != firstQuestion.Id && q.Id != lastQuestion.Id)
                        .All(q => q.CorrectAnswersPercent == 0 && q.IncorrectAnswersPercent == 0));
        }
Beispiel #2
0
        public void Start()
        {
            aggregate = StartAggregate();
            _bus.SubscribeAsync <QuizEvent>("QuizEvents", async @event => {
                switch (@event)
                {
                case QuizStartedEvent startedEvent:
                    aggregate = Create(startedEvent.QuizId, startedEvent);
                    break;

                case QuizAnsweredEvent answerEvent:
                    aggregate = Reduce(aggregate, answerEvent);
                    break;
                }

                await Publish();
            });

            async Task Publish()
            {
                try
                {
                    await _wsBus.SendMessageToAllAsync(aggregate);
                }
                catch (Exception)
                {
                    // Log
                }
            }
        }
        public void Given_StartedEvent_When_Reduce_Then_QuizResults_Initialized()
        {
            var quizModel = CreateQuiz();
            var events    = new object[]
            {
                new QuizStartedEvent(Guid.NewGuid(), quizModel)
            };

            var aggregate = QuizResultsAggregate.Create(Guid.NewGuid(), events);

            Assert.Equal(quizModel.Questions.Count, aggregate.Questions.Count);
            Assert.True(
                aggregate.Questions.All(
                    q => q.CorrectAnswersPercent == 0 && q.IncorrectAnswersPercent == 0));
        }