public void Voteable_SameUserCannotApplyVoteTwice_Throws()
        {
            // Arrange
            var target     = new QuestionBuilder().SetupValidQuestion().Build();
            var firstVote  = new VoteBuilder(target).SetupValidUpvote().ByOneUser().Build();
            var secondVote = new VoteBuilder(target).SetupValidUpvote().ByOneUser().Build();

            target.ApplyVote(firstVote);

            // Act, Assert
            Assert.Throws <BusinessException>(() => target.ApplyVote(secondVote));
        }
        public void Voteable_CannotRevokeNonExistingVote_Throws()
        {
            // Arrange
            var target     = new QuestionBuilder().SetupValidQuestion().Build();
            var limits     = new LimitsBuilder().Build();
            var firstVote  = new VoteBuilder(target).SetupValidUpvote().ByOneUser().Build();
            var secondVote = new VoteBuilder(target).SetupValidUpvote().ByAnotherUser().Build();

            target.ApplyVote(firstVote);

            // Act, Assert
            Assert.Throws <BusinessException>(() => target.RevokeVote(secondVote, limits));
        }
        public void Voteable_CanApplyVoteToQuestion_Successfully()
        {
            // Arrange
            var target = new QuestionBuilder().SetupValidQuestion().Build();
            var vote   = new VoteBuilder(target).SetupValidUpvote().ByOneUser().Build();

            // Act
            target.ApplyVote(vote);

            // Assert
            Assert.Equal(1, target.VotesSum);
            Assert.Contains(vote, target.Votes);
        }
        public void Voteable_CanRevokeVoteWithinDeadline_Successfully()
        {
            // Arrange
            var target = new QuestionBuilder().SetupValidQuestion().Build();
            var vote   = new VoteBuilder(target).SetupValidUpvote().ByOneUser().Build();
            var limits = new LimitsBuilder().Build();

            target.ApplyVote(vote);

            // Act
            target.RevokeVote(vote, limits);

            // Assert
            Assert.Equal(0, target.VotesSum);
        }
        public void Voteable_CannotRevokeVoteOutsideDeadline_Successfully()
        {
            // Arrange
            var target    = new QuestionBuilder().SetupValidQuestion().Build();
            var limits    = new LimitsBuilder().Build();
            var firstVote = new VoteBuilder(target)
                            .SetupValidUpvote()
                            .ByOneUser()
                            .MakeTimeGoBy()
                            .Build();

            target.ApplyVote(firstVote);

            // Act, Assert
            Assert.Throws <BusinessException>(() => target.RevokeVote(firstVote, limits));
        }