changeset 4:49b572535156

proponer van publicar van propuesta comportamiento ante excepcion en publicador
author nelopauselli
date Tue, 08 Feb 2011 00:08:49 -0300
parents 5f007e266509
children 51294f4e492f
files Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Agendas/trunk/src/Agendas.Domain/Evento.cs Agendas/trunk/src/Agendas.Domain/Exceptions/ValidationException.cs Agendas/trunk/src/Agendas.Repositories.Memory/AgendaRepository.cs Agendas/trunk/src/Agendas.Repositories.Memory/Agendas.Repositories.Memory.csproj Agendas/trunk/src/Agendas.Repositories.Memory/CafeRepository.cs Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Agendas/trunk/src/Agendas.Repositories.Memory/RepositoryBase.cs Agendas/trunk/src/Agendas.Repositories.Memory/VanRepository.cs Agendas/trunk/src/Agendas.Tests/AgendaTests.cs Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj Agendas/trunk/src/Agendas.Tests/EventoObjectMother.cs
diffstat 13 files changed, 167 insertions(+), 30 deletions(-) [+]
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