changeset 81:c76661cff260

Workflow de acciones sobre un evento (camino feliz)
author nelopauselli
date Tue, 24 May 2011 19:21:20 -0300
parents c2d98fd6593f
children c8897b1c6f49
files Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Domain/Evento.cs Agendas/trunk/src/Agendas.Domain/Track.cs Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs Agendas/trunk/src/Agendas.Tests/Workflows/WorkflowTests.cs
diffstat 7 files changed, 172 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Tue May 24 18:25:57 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Tue May 24 19:21:20 2011 -0300
@@ -21,9 +21,12 @@
 			_recordador = recordador;
 		}
 
-		public Evento GetEvento(Guid id)
+		public Evento GetEvento(Guid eventoId)
 		{
-			return _eventosRepository.Get(id);
+			Evento evento =_eventosRepository.Get(eventoId);
+			if (evento == null)
+				throw new EventoNotFoundException(eventoId);
+			return evento;
 		}
 
 		public IList<Evento> GetEventosPropuestos()
@@ -38,9 +41,7 @@
 
 		public Resultado ModificarEvento(Guid id, string titulo, string ponenteNombre, DateTime? fecha, string urlInvitacion)
 		{
-			Evento evento = _eventosRepository.Get(id);
-			if (evento == null)
-				throw new EventoNotFoundException(id);
+			Evento evento = GetEvento(id);
 
 			Ponente ponente = null;
 			if (!string.IsNullOrWhiteSpace(ponenteNombre))
@@ -54,8 +55,7 @@
 			else if (evento.Fecha != fecha || evento.Ponente != ponente || evento.UrlInvitacion != urlInvitacion)
 				evento.Actualizar(ponente, fecha, urlInvitacion);
 
-			if (_publicador != null)
-				_publicador.Publicar(evento);
+			Notify(evento);
 
 			return new Resultado(true);
 		}
@@ -73,6 +73,8 @@
 			if (string.IsNullOrWhiteSpace(evento.Titulo))
 				return new Resultado(false);
 
+			Notify(evento);
+
 			_eventosRepository.Save(evento);
 			_ponenteRepository.Save(ponente);
 
@@ -94,8 +96,7 @@
 			else
 				evento.Agendar(ponente, fecha, urlInvitacion);
 
-			if (_publicador != null)
-				_publicador.Publicar(evento);
+			Notify(evento);
 
 			_eventosRepository.Save(evento);
 			_ponenteRepository.Save(ponente);
@@ -103,6 +104,32 @@
 			return new Resultado(true);
 		}
 
+		public Resultado Confirmar(Guid eventoId)
+		{
+			Evento evento = GetEvento(eventoId);
+
+			evento.Confirmar();
+
+			Notify(evento);
+
+			_eventosRepository.Save(evento);
+
+			return new Resultado(true);
+		}
+
+		public Resultado Publicar(Guid eventoId)
+		{
+			Evento evento = GetEvento(eventoId);
+
+			evento.Publicar();
+
+			Notify(evento);
+
+			_eventosRepository.Save(evento);
+
+			return new Resultado(true);
+		}
+
 		public void Recordar(Guid eventoId)
 		{
 			Evento evento = _eventosRepository.Get(eventoId);
@@ -110,6 +137,12 @@
 				_recordador.Recordar(evento);
 		}
 
+		private void Notify(Evento evento)
+		{
+			if (_publicador != null)
+				_publicador.Publicar(evento);
+		}
+
 		public void RegistrarPonente(string nombre, string mail, string twitter, string blog)
 		{
 			var ponente = new Ponente(nombre, mail, twitter, blog);
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs	Tue May 24 18:25:57 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs	Tue May 24 19:21:20 2011 -0300
@@ -127,11 +127,22 @@
 			AddTracks(new Track(this, Accion.CambiarTitulo));
 		}
 
+		public virtual void Confirmar()
+		{
+			AddTracks(new Track(this, Accion.Confirmar));
+		}
+
+		public virtual void Publicar()
+		{
+			AddTracks(new Track(this, Accion.Publicar));
+		}
+
 		#endregion
 
 		private void AddTracks(Track track)
 		{
 			_tracks.Add(track);
 		}
+
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Track.cs	Tue May 24 18:25:57 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Track.cs	Tue May 24 19:21:20 2011 -0300
@@ -25,7 +25,8 @@
 		Agendar = 2,
 		Modificar = 3,
 		CambiarTitulo = 4,
-		Publicar = 5
+		Publicar = 5,
+		Confirmar = 6
 	}
 
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Tue May 24 18:25:57 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Tue May 24 19:21:20 2011 -0300
@@ -80,6 +80,8 @@
     <Compile Include="AgendarTests.cs" />
     <Compile Include="TestBase.cs" />
     <Compile Include="TrackTests.cs" />
+    <Compile Include="Workflows\Workflow.cs" />
+    <Compile Include="Workflows\WorkflowTests.cs" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Agendas.Domain\Agendas.Domain.csproj">
@@ -112,6 +114,7 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
--- a/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Tue May 24 18:25:57 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Tue May 24 19:21:20 2011 -0300
@@ -94,7 +94,7 @@
 
 			var agenda = new Agenda(null, null, DefaultEventoRepository, DefaultPonenteRepository);
 
-			Assert.IsNull(agenda.GetEvento(idEventoNoExistente));
+			Assert.Throws<EventoNotFoundException>(() => agenda.GetEvento(idEventoNoExistente));
 		}
 
 		[Test]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs	Tue May 24 19:21:20 2011 -0300
@@ -0,0 +1,43 @@
+using System;
+using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Domain.Repositories;
+using NUnit.Framework;
+
+namespace AltNetHispano.Agendas.Tests.Workflows
+{
+	internal class Workflow
+	{
+		private readonly Agenda _agenda;
+
+		public Workflow(IPublicador publicador, IEventoRepository eventoRepository, IPonenteRepository ponenteRepository)
+		{
+			_agenda = new Agenda(publicador, null, eventoRepository, ponenteRepository);
+		}
+
+		public void Proponer()
+		{
+
+			var resultado = _agenda.Proponer("SOLID", "Jorge", null);
+			Assert.IsTrue(resultado.Succeful);
+		}
+
+
+		public void Agendar()
+		{
+			var resultado = _agenda.Agendar("SOLID", "Jorge", DateTime.Today.AddDays(5), null);
+			Assert.IsTrue(resultado.Succeful);
+		}
+
+		public void Confirmar(Guid eventoId)
+		{
+			var resultado = _agenda.Confirmar(eventoId);
+			Assert.IsTrue(resultado.Succeful);
+		}
+
+		public void Publicar(Guid eventoId)
+		{
+			var resultado = _agenda.Publicar(eventoId);
+			Assert.IsTrue(resultado.Succeful);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Tests/Workflows/WorkflowTests.cs	Tue May 24 19:21:20 2011 -0300
@@ -0,0 +1,70 @@
+using System.Linq;
+using AltNetHispano.Agendas.Domain;
+using Moq;
+using NUnit.Framework;
+
+namespace AltNetHispano.Agendas.Tests.Workflows
+{
+	[TestFixture]
+	public class WorkflowTests : TestBase
+	{
+		private Mock<IPublicador> _publicador;
+		private Workflow _workflow;
+
+		[SetUp]
+		public void InitPublicador()
+		{
+			_publicador = new Mock<IPublicador>();
+			_workflow = new Workflow(_publicador.Object, DefaultEventoRepository, DefaultPonenteRepository);
+		}
+
+		[Test]
+		public void Proponer()
+		{
+			_workflow.Proponer();
+			_publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Once());
+		}
+
+		[Test]
+		public void Proponer_y_agendar()
+		{
+			_workflow.Proponer();
+
+			_workflow.Agendar();
+
+			_publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(2));
+		}
+
+		[Test]
+		public void Proponer_agendar_y_confirmar()
+		{
+			_workflow.Proponer();
+
+			_workflow.Agendar();
+
+			var evento = DefaultEventoRepository.GetEventosConFecha().SingleOrDefault();
+			Assert.IsNotNull(evento);
+
+			_workflow.Confirmar(evento.Id);
+
+			_publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(3));
+		}
+
+		[Test]
+		public void Proponer_agendar_confirmar_publicar()
+		{
+			_workflow.Proponer();
+
+			_workflow.Agendar();
+
+			var evento = DefaultEventoRepository.GetEventosConFecha().SingleOrDefault();
+			Assert.IsNotNull(evento);
+
+			_workflow.Confirmar(evento.Id);
+
+			_workflow.Publicar(evento.Id);
+
+			_publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(4));
+		}
+	}
+}
\ No newline at end of file