public void GetVoterTurnout_WithNoVotes_ReturnsZeroTurnout()
        {
            // Arrange
            var couchDbMock = new Mock <ICouchDBService>();

            couchDbMock.Setup(c => c.FindByLevel <User>(It.Is <Level>(l => l == Level.A))).Returns(new[]
            {
                new User {
                    Username = "******", Level = Level.A
                },
                new User {
                    Username = "******", Level = Level.A
                },
                new User {
                    Username = "******", Level = Level.A
                }
            });

            // Act
            var votingService = new VotingService(couchDbMock.Object);
            var turnouts      = votingService.GetVoterTurnout();

            // Assert
            Assert.AreEqual(0, turnouts[Level.A]);
        }
        public void GetVoterTurnout_WithNoMatchingUsers_ReturnsEmptyResult()
        {
            // Arrange
            var couchDbMock = new Mock <ICouchDBService>();

            couchDbMock.Setup(c => c.FindByLevel <User>(It.IsAny <Level>())).Returns(new List <User>());

            // Act
            var votingService = new VotingService(couchDbMock.Object);
            var turnouts      = votingService.GetVoterTurnout();

            // Assert
            Assert.AreEqual(0, turnouts.Keys.Count);
        }
        public void GetVoterTurnout_WithMatchingUsersAndVotes_CalculatesCorrectTurnout()
        {
            // Arrange - create 5 distinct users, both A and AC, out of which one user from each level has
            // voted (which should give a turnout of 33.3% for A and 50% for AC).
            var couchDbMock = new Mock <ICouchDBService>();

            couchDbMock.Setup(c => c.FindByLevel <User>(It.Is <Level>(l => l == Level.A))).Returns(new[]
            {
                new User {
                    Username = "******", Level = Level.A
                },
                new User {
                    Username = "******", Level = Level.A
                },
                new User {
                    Username = "******", Level = Level.A
                }
            });
            couchDbMock.Setup(c => c.FindByUsername <Vote>(It.Is <string>(n => n == "*****@*****.**"))).Returns(new[]
            {
                new Vote {
                    Username = "******"
                },
                new Vote {
                    Username = "******"
                },
                new Vote {
                    Username = "******"
                }
            });

            couchDbMock.Setup(c => c.FindByLevel <User>(It.Is <Level>(l => l == Level.AC))).Returns(new[]
            {
                new User {
                    Username = "******", Level = Level.AC
                },
                new User {
                    Username = "******", Level = Level.AC
                }
            });
            couchDbMock.Setup(c => c.FindByUsername <Vote>(It.Is <string>(n => n == "*****@*****.**"))).Returns(new[]
            {
                new Vote {
                    Username = "******"
                },
                new Vote {
                    Username = "******"
                },
                new Vote {
                    Username = "******"
                }
            });

            // Act
            var votingService = new VotingService(couchDbMock.Object);
            var turnouts      = votingService.GetVoterTurnout();

            // Assert
            Assert.AreEqual(33.3, turnouts[Level.A]);
            Assert.AreEqual(50.0, turnouts[Level.AC]);
        }