reverted back to up/downvotes, configured log4net a little more

This commit is contained in:
tmont 2011-02-10 20:34:55 +00:00
parent 4f0dd9a6e8
commit 7e042d3b93
7 changed files with 54 additions and 23 deletions

View File

@ -0,0 +1,7 @@
using System;
namespace VideoGameQuotes.Api {
public class CannotVoteTwiceException : Exception {
public CannotVoteTwiceException(string message = null, Exception innerException = null) : base(message, innerException) { }
}
}

View File

@ -23,22 +23,24 @@ namespace VideoGameQuotes.Api {
public virtual IEnumerable<Vote> Votes { get { return votes; } } public virtual IEnumerable<Vote> Votes { get { return votes; } }
public virtual IEnumerable<QuoteFlag> Flags { get { return flags; } } public virtual IEnumerable<QuoteFlag> Flags { get { return flags; } }
public virtual void VoteFor(User user, int value) { public virtual void VoteFor(User user, VoteDirection direction) {
var currentVote = votes.SingleOrDefault(vote => vote.Voter == user); var currentVote = votes.SingleOrDefault(vote => vote.Voter == user);
if (currentVote != null) { if (currentVote != null) {
if (currentVote.Direction == direction) {
throw new CannotVoteTwiceException();
}
votes.Remove(currentVote); votes.Remove(currentVote);
currentVote.Value = value; currentVote.Direction = direction;
currentVote.Modified = DateTime.UtcNow; currentVote.Created = DateTime.UtcNow;
votes.Add(currentVote); votes.Add(currentVote);
} else { } else {
votes.Add(new Vote { Value = value, Quote = this, Voter = user }); votes.Add(new Vote { Direction = direction, Quote = this, Voter = user });
}
} }
} }
public static class QuoteExtensions { public virtual int UpVotes { get { return Votes.Count(vote => vote.Direction == VoteDirection.Up); } }
public static int GetTotalPoints(this Quote quote) { public virtual int DownVotes { get { return Votes.Count(vote => vote.Direction == VoteDirection.Down); } }
return quote.Votes.Sum(vote => (int)vote); public virtual int NetVotes { get { return Votes.Sum(vote => (int)vote); } }
}
} }
} }

View File

@ -64,6 +64,7 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="CannotVoteTwiceException.cs" />
<Compile Include="Game.cs" /> <Compile Include="Game.cs" />
<Compile Include="ICurrentUserProvider.cs" /> <Compile Include="ICurrentUserProvider.cs" />
<Compile Include="Persistence\IUserRepository.cs" /> <Compile Include="Persistence\IUserRepository.cs" />
@ -78,6 +79,7 @@
<Compile Include="User.cs" /> <Compile Include="User.cs" />
<Compile Include="UserGroup.cs" /> <Compile Include="UserGroup.cs" />
<Compile Include="Vote.cs" /> <Compile Include="Vote.cs" />
<Compile Include="VoteDirection.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="Mappings\User.hbm.xml" /> <EmbeddedResource Include="Mappings\User.hbm.xml" />

View File

@ -3,18 +3,13 @@ using Portoa.Persistence;
namespace VideoGameQuotes.Api { namespace VideoGameQuotes.Api {
public class Vote : Entity<Vote, int> { public class Vote : Entity<Vote, int> {
public Vote() {
Created = DateTime.UtcNow;
}
public virtual User Voter { get; set; } public virtual User Voter { get; set; }
public virtual Quote Quote { get; set; } public virtual Quote Quote { get; set; }
public virtual DateTime Created { get; set; } public virtual DateTime Created { get; set; }
public virtual DateTime? Modified { get; set; } public virtual VoteDirection Direction { get; set; }
public virtual int Value { get; set; }
public static explicit operator int(Vote vote) { public static explicit operator int(Vote vote) {
return vote.Value; return vote.Direction == VoteDirection.Up ? 1 : -1;
} }
} }
} }

View File

@ -0,0 +1,6 @@
namespace VideoGameQuotes.Api {
public enum VoteDirection {
Up = 1,
Down = 0
}
}

View File

@ -13,7 +13,8 @@ namespace VideoGameQuotes.Web {
Container Container
.AddNewExtension<ConfigureLog4Net>() .AddNewExtension<ConfigureLog4Net>()
.Configure<ILog4NetConfigurator>() .Configure<ILog4NetConfigurator>()
.SetName("VideoGameQuotes.Web"); .SetName("VideoGameQuotes.Web")
.UseXml();
Container Container
.AddNewExtension<LogAllMethodCalls>() .AddNewExtension<LogAllMethodCalls>()

View File

@ -3,16 +3,34 @@
namespace VideoGameQuotes.Api.Tests { namespace VideoGameQuotes.Api.Tests {
[TestFixture] [TestFixture]
public class QuoteTests { public class QuoteTests {
[Test] [Test]
public void Should_remove_old_vote_if_voting_for_same_quote() { [ExpectedException(typeof(CannotVoteTwiceException))]
public void Should_not_allow_voting_in_the_same_direction_twice() {
var quote = new Quote(); var quote = new Quote();
var user = new User(); var user = new User();
quote.VoteFor(user, 5); quote.VoteFor(user, VoteDirection.Up);
Assert.That(quote.GetTotalPoints(), Is.EqualTo(5)); quote.VoteFor(user, VoteDirection.Up);
}
[Test]
public void Should_remove_old_vote_if_voting_in_opposite_direction() {
var quote = new Quote();
var user = new User();
quote.VoteFor(user, VoteDirection.Up);
Assert.That(quote.UpVotes, Is.EqualTo(1));
Assert.That(quote.DownVotes, Is.EqualTo(0));
Assert.That(quote.NetVotes, Is.EqualTo(1));
quote.VoteFor(user, VoteDirection.Down);
Assert.That(quote.UpVotes, Is.EqualTo(0));
Assert.That(quote.DownVotes, Is.EqualTo(1));
Assert.That(quote.NetVotes, Is.EqualTo(-1));
}
quote.VoteFor(user, 7);
Assert.That(quote.GetTotalPoints(), Is.EqualTo(7));
}
} }
} }