Mercurial > altnet-hispano
changeset 4:49b572535156
proponer van
publicar van propuesta
comportamiento ante excepcion en publicador
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs Tue Feb 08 00:08:49 2011 -0300 @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using AltNetHispano.Agendas.Domain.Exceptions; namespace AltNetHispano.Agendas.Domain { @@ -23,19 +24,40 @@ get { return _eventos; } } - public void Publicar(Evento evento) { - _eventos.Add(evento); - + if (!evento.Fecha.HasValue) + throw new ValidationException(); + if (_publicador != null) _publicador.Publicar(evento); + _eventos.Add(evento); } + public void Publicar(Van van) + { + if (string.IsNullOrWhiteSpace(van.Ponente)) + throw new ValidationException(); + Publicar(van as Evento); + } + + public void Recordar(Evento evento) { if (_recordador != null) _recordador.Recordar(evento); } + + public void Proponer(Van van) + { + if (string.IsNullOrWhiteSpace(van.Titulo)) + throw new ValidationException(); + _eventos.Add(van); + } + + public IList<Evento> GetEventosPropuestos() + { + return _eventos; + } } } \ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Tue Feb 08 00:08:49 2011 -0300 @@ -44,6 +44,7 @@ <Compile Include="Cafe.cs" /> <Compile Include="CompositePublicador.cs" /> <Compile Include="Evento.cs" /> + <Compile Include="Exceptions\ValidationException.cs" /> <Compile Include="IRecordador.cs" /> <Compile Include="Repositories\IEventoRepository.cs" /> <Compile Include="IPublicador.cs" />
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs Tue Feb 08 00:08:49 2011 -0300 @@ -6,7 +6,7 @@ { public Guid Id { get; set; } public string Titulo { get; set; } - public DateTime Fecha { get; set; } + public DateTime? Fecha { get; set; } public string Sintesis { get; set; } } } \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Domain/Exceptions/ValidationException.cs Tue Feb 08 00:08:49 2011 -0300 @@ -0,0 +1,8 @@ +using System; + +namespace AltNetHispano.Agendas.Domain.Exceptions +{ + public class ValidationException : Exception + { + } +} \ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/AgendaRepository.cs Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Repositories.Memory/AgendaRepository.cs Tue Feb 08 00:08:49 2011 -0300 @@ -1,14 +1,11 @@ using System; -using System.Collections.Generic; using AltNetHispano.Agendas.Domain; using AltNetHispano.Agendas.Domain.Repositories; namespace Agendas.Repositories.Memory { - public class AgendaRepository : IAgendaRepository + public class AgendaRepository : RepositoryBase<Agenda>, IAgendaRepository { - protected static readonly IDictionary<Guid, Agenda> Agendas = new Dictionary<Guid, Agenda>(); - #region IAgendaRepository Members public void Save(Agenda agenda) @@ -16,7 +13,7 @@ if (Guid.Empty.Equals(agenda.Id)) { agenda.Id = Guid.NewGuid(); - Agendas.Add(agenda.Id, agenda); + Objects.Add(agenda.Id, agenda); } } @@ -25,15 +22,15 @@ //nada que hacer en este método para este repositorio } - public void Delete(Agenda agenda) - { - Agendas.Remove(agenda.Id); - } - public Agenda Get(Guid agendaId) { Agenda agenda; - return Agendas.TryGetValue(agendaId, out agenda) ? agenda : null; + return Objects.TryGetValue(agendaId, out agenda) ? agenda : null; + } + + public void Delete(Agenda agenda) + { + Objects.Remove(agenda.Id); } #endregion
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/Agendas.Repositories.Memory.csproj Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Repositories.Memory/Agendas.Repositories.Memory.csproj Tue Feb 08 00:08:49 2011 -0300 @@ -44,6 +44,7 @@ <Compile Include="CafeRepository.cs" /> <Compile Include="EventoRepository.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="RepositoryBase.cs" /> <Compile Include="VanRepository.cs" /> </ItemGroup> <ItemGroup>
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/CafeRepository.cs Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Repositories.Memory/CafeRepository.cs Tue Feb 08 00:08:49 2011 -0300 @@ -11,7 +11,7 @@ public Cafe Get(Guid vanId) { Evento evento; - return Eventos.TryGetValue(vanId, out evento) ? evento as Cafe : null; + return Objects.TryGetValue(vanId, out evento) ? evento as Cafe : null; } #endregion
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Tue Feb 08 00:08:49 2011 -0300 @@ -1,19 +1,16 @@ using System; -using System.Collections.Generic; using AltNetHispano.Agendas.Domain; namespace Agendas.Repositories.Memory { - public abstract class EventoRepository + public abstract class EventoRepository : RepositoryBase<Evento> { - protected static readonly IDictionary<Guid, Evento> Eventos = new Dictionary<Guid, Evento>(); - public void Save(Evento evento) { if (Guid.Empty.Equals(evento.Id)) { evento.Id = Guid.NewGuid(); - Eventos.Add(evento.Id, evento); + Objects.Add(evento.Id, evento); } } @@ -24,7 +21,7 @@ public void Delete(Evento evento) { - Eventos.Remove(evento.Id); + Objects.Remove(evento.Id); } } } \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Repositories.Memory/RepositoryBase.cs Tue Feb 08 00:08:49 2011 -0300 @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace Agendas.Repositories.Memory +{ + public class RepositoryBase<T> + { + protected static readonly IDictionary<Guid, T> Objects = new Dictionary<Guid, T>(); + } +} \ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/VanRepository.cs Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Repositories.Memory/VanRepository.cs Tue Feb 08 00:08:49 2011 -0300 @@ -11,7 +11,7 @@ public Van Get(Guid vanId) { Evento evento; - return Eventos.TryGetValue(vanId, out evento) ? evento as Van : null; + return Objects.TryGetValue(vanId, out evento) ? evento as Van : null; } #endregion
--- a/Agendas/trunk/src/Agendas.Tests/AgendaTests.cs Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Tests/AgendaTests.cs Tue Feb 08 00:08:49 2011 -0300 @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using System.Linq; using Agendas.Repositories.Memory; using AltNetHispano.Agendas.Domain; +using AltNetHispano.Agendas.Domain.Exceptions; using AltNetHispano.Agendas.Domain.Repositories; using Moq; using NUnit.Framework; @@ -18,7 +20,7 @@ var agenda = new Agenda(publicador.Object, null); - var cafe = new Cafe(); + var cafe = EventoObjectMother.GetCafeValidoParaPublicar(); agenda.Publicar(cafe); publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1)); @@ -31,13 +33,31 @@ var agenda = new Agenda(publicador.Object, null); - var van = new Van(); + var van = EventoObjectMother.GetVanValidaParaPublicar(); + agenda.Publicar(van); + Assert.AreEqual(1, agenda.Eventos.Count()); publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1)); } [Test] + public void Error_al_publicar_van() + { + var publicador = new Mock<IPublicador>(); + publicador.Setup(p => p.Publicar(It.IsAny<Evento>())).Throws(new Exception("Error intencional")); + + var agenda = new Agenda(publicador.Object, null); + + var van = EventoObjectMother.GetVanValidaParaPublicar(); + Assert.Throws<Exception>(() => agenda.Publicar(van)); + Assert.AreEqual(0, agenda.Eventos.Count()); + + publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1)); + } + + + [Test] public void Publicar_van_multiples_publicadores() { var publicador1 = new Mock<IPublicador>(); @@ -45,8 +65,8 @@ var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}), null); - var cafe = new Cafe(); - agenda.Publicar(cafe); + var van = EventoObjectMother.GetVanValidaParaPublicar(); + agenda.Publicar(van); publicador1.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1)); publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1)); @@ -61,7 +81,7 @@ var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}), recordador1.Object); - var van = new Van(); + var van = EventoObjectMother.GetVanValidaParaPublicar(); agenda.Publicar(van); agenda.Recordar(van); @@ -74,12 +94,74 @@ } [Test] + public void Propuesta_de_van() + { + var van = new Van{Titulo = "Van propuesta"}; + + var agenda = new Agenda(null, null); + agenda.Proponer(van); + + IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos(); + Assert.IsNotNull(eventosPropuestos); + Assert.AreEqual(1, eventosPropuestos.Count); + Assert.AreEqual("Van propuesta", eventosPropuestos[0].Titulo); + } + + [Test] + public void Propuesta_de_van_sin_titulo() + { + var van = new Van(); + + var agenda = new Agenda(null, null); + Assert.Throws<ValidationException>(() => agenda.Proponer(van)); + Assert.AreEqual(Guid.Empty, van.Id); + } + + + [Test] + public void Agendar_van_propuesta_sin_fecha() + { + var agenda = new Agenda(null, null); + + { + var van = new Van {Titulo = "Van propuesta"}; + agenda.Proponer(van); + } + + { + var van = agenda.GetEventosPropuestos().FirstOrDefault(); + Assert.IsNotNull(van); + Assert.Throws<ValidationException>(()=>agenda.Publicar(van)); + } + } + + [Test] + public void Agendar_van_propuesta_sin_ponente() + { + var agenda = new Agenda(null, null); + + { + var van = new Van { Titulo = "Van propuesta" }; + agenda.Proponer(van); + } + + { + var van = agenda.GetEventosPropuestos().FirstOrDefault() as Van; + Assert.IsNotNull(van); + + van.Fecha = DateTime.Today.AddDays(5); + Assert.Throws<ValidationException>(() => agenda.Publicar(van)); + } + } + + + [Test] public void Van_crud() { Guid vanId; { var agenda = new Agenda(null, null); - agenda.Publicar(new Van()); + agenda.Publicar(EventoObjectMother.GetVanValidaParaPublicar()); IAgendaRepository agendaRepository = new AgendaRepository(); @@ -94,7 +176,7 @@ Assert.IsNotNull(agenda); Assert.AreEqual(1, agenda.Eventos.Count()); - agenda.Publicar(new Cafe()); + agenda.Publicar(EventoObjectMother.GetCafeValidoParaPublicar()); agendaRepository.Update(agenda); }
--- a/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj Sat Jan 22 20:23:50 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj Tue Feb 08 00:08:49 2011 -0300 @@ -47,6 +47,7 @@ </ItemGroup> <ItemGroup> <Compile Include="AgendaTests.cs" /> + <Compile Include="EventoObjectMother.cs" /> <Compile Include="EventoTests.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> </ItemGroup>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Tests/EventoObjectMother.cs Tue Feb 08 00:08:49 2011 -0300 @@ -0,0 +1,18 @@ +using System; +using AltNetHispano.Agendas.Domain; + +namespace AltNetHispano.Agendas.Tests +{ + public static class EventoObjectMother + { + public static Van GetVanValidaParaPublicar() + { + return new Van {Fecha = DateTime.Now, Ponente = "jjmontes"}; + } + + public static Cafe GetCafeValidoParaPublicar() + { + return new Cafe { Fecha = DateTime.Now }; + } + } +} \ No newline at end of file