changeset 75:96d7609f2e08

Agendar evento propuesto
author nelopauselli
date Mon, 23 May 2011 20:43:01 -0300
parents bc46e7426c80
children 926bd1cdb98f
files Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Domain/Evento.cs Agendas/trunk/src/Agendas.Tests/AgendarTests.cs Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs Agendas/trunk/src/Agendas.Tests/PonentesTests.cs Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs Agendas/trunk/src/Agendas.Tests/PulicarTests.cs Agendas/trunk/src/Agendas.Tests/TrackTests.cs Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs Agendas/trunk/src/Agendas.Web/Views/Evento/Edit.cshtml Agendas/trunk/src/Agendas.Web/Views/Propuesta/Index.cshtml
diffstat 15 files changed, 269 insertions(+), 223 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Mon May 23 20:43:01 2011 -0300
@@ -31,25 +31,27 @@
 			return _eventosRepository.GetEventosSinFecha() ?? new List<Evento>();
 		}
 
-		public IList<Evento> GetEventosPublicados()
+		public IList<Evento> GetEventosAgendados()
 		{
 			return _eventosRepository.GetEventosConFecha() ?? new List<Evento>();
 		}
 
-		public Resultado ModificarEvento(Guid id, string titulo, string ponenteNombre, DateTime? fecha)
+		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);
 
-			Ponente ponente=null;
+			Ponente ponente = null;
 			if (!string.IsNullOrWhiteSpace(ponenteNombre))
 				ponente = GetPonente(ponenteNombre);
 
 			if (evento.Titulo != titulo)
 				evento.CambiarTitulo(titulo);
 
-			if (evento.Fecha != fecha || evento.Ponente != ponente)
+			if (evento.Fecha == null && fecha != null)
+				evento.Agendar(ponente, fecha, urlInvitacion);
+			else if (evento.Fecha != fecha || evento.Ponente != ponente)
 				evento.Actualizar(ponente, fecha);
 
 			if (_publicador != null)
@@ -58,15 +60,15 @@
 			return new Resultado(true);
 		}
 
-		public Resultado ModificarPropuesta(Guid id, string titulo, string ponenteNombre)
+		public Resultado ModificarPropuesta(Guid id, string titulo, string ponenteNombre, string urlInvitacion)
 		{
-			return ModificarEvento(id, titulo, ponenteNombre, null);
+			return ModificarEvento(id, titulo, ponenteNombre, null, urlInvitacion);
 		}
 
-		public Resultado Proponer(string titulo, string ponenteNombre)
+		public Resultado Proponer(string titulo, string ponenteNombre, string urlInvitacion)
 		{
 			Ponente ponente = GetPonente(ponenteNombre);
-			var evento = Evento.Proponer(titulo, ponente);
+			var evento = Evento.Proponer(titulo, ponente, urlInvitacion);
 
 			if (string.IsNullOrWhiteSpace(evento.Titulo))
 				return new Resultado(false);
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs	Mon May 23 20:43:01 2011 -0300
@@ -74,9 +74,9 @@
 		/// <param name="titulo">Título del evento propuesto</param>
 		/// <param name="ponente">Ponente para evento propuesto</param>
 		/// <returns></returns>
-		public static Evento Proponer(string titulo, Ponente ponente)
+		public static Evento Proponer(string titulo, Ponente ponente, string urlInvitacion)
 		{
-			var evento = new Evento { Titulo = titulo, Ponente = ponente };
+			var evento = new Evento {Titulo = titulo, Ponente = ponente, UrlInvitacion = urlInvitacion};
 			evento.AddTracks(new Track(Accion.Proponer));
 
 			return evento;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Mon May 23 20:43:01 2011 -0300
@@ -0,0 +1,210 @@
+using System;
+using System.Linq;
+using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Domain.Exceptions;
+using AltNetHispano.Agendas.Domain.Repositories;
+using Moq;
+using NUnit.Framework;
+
+namespace AltNetHispano.Agendas.Tests
+{
+	[TestFixture]
+	public class AgendarTests : TestBase
+	{
+		private const string urlInvitacion = "http://groups.google.com/group/altnet-hispano/browse_thread/thread/65d6d26eb381386e";
+
+		[Test]
+		public void CompositePublicador_constructor_parametro_null_debe_generar_ArgumentNullException()
+		{
+			Assert.Throws<ArgumentNullException>(() => new CompositePublicador(null));
+		}
+
+		[Test]
+		public void Intentar_agendar_evento_donde_ocurre_una_excepcion_no_manejada()
+		{
+			var publicador = new Mock<IPublicador>();
+			var repository = new Mock<IEventoRepository>();
+
+			publicador.Setup(p => p.Publicar(It.IsAny<Evento>())).Throws(new Exception("Error intencional"));
+
+			var agenda = new Agenda(publicador.Object, null, repository.Object, DefaultPonenteRepository);
+
+			Assert.Throws<Exception>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now, urlInvitacion));
+			Assert.AreEqual(0, agenda.GetEventosAgendados().Count);
+
+			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
+		}
+
+		[Test]
+		public void Intentar_agendar_evento_sin_servicio_de_seguridad()
+		{
+			IdentityContext.Current = null;
+
+			var publicador = new Mock<IPublicador>();
+			var repository = new Mock<IEventoRepository>();
+
+			var agenda = new Agenda(publicador.Object, null, repository.Object, DefaultPonenteRepository);
+
+			Assert.Throws<IdentityContextNotConfiguredException>(
+				() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+					urlInvitacion));
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
+		}
+
+		[Test]
+		public void Intentar_agendar_evento_sin_usuario_autenticado()
+		{
+			SetCurrentUser(null);
+
+			var publicador = new Mock<IPublicador>();
+			var repository = new Mock<IEventoRepository>();
+
+			var agenda = new Agenda(publicador.Object, null, repository.Object, DefaultPonenteRepository);
+
+			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+				urlInvitacion));
+
+			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(0));
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
+		}
+
+		[Test]
+		public void Intentar_agendar_evento_sin_ponente()
+		{
+			var agenda = new Agenda(null, null, DefaultEventoRepository, DefaultPonenteRepository);
+
+			var r = agenda.Agendar("Van para publicar", string.Empty, DateTime.Now,
+				urlInvitacion);
+
+			Assert.IsFalse(r.Succeful);
+		}
+
+		[Test]
+		public void Agendar_evento_con_multiples_publicadores()
+		{
+			var publicador1 = new Mock<IPublicador>();
+			var publicador2 = new Mock<IPublicador>();
+
+			var repository = new Mock<IEventoRepository>();
+
+			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}), null,
+															repository.Object, DefaultPonenteRepository);
+
+			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+				urlInvitacion);
+
+			publicador1.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+			publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(1));
+		}
+
+		[Test]
+		public void Agendar_evento_correctamente()
+		{
+			var publicador = new Mock<IPublicador>();
+
+			var agenda = new Agenda(publicador.Object, null, DefaultEventoRepository, DefaultPonenteRepository);
+
+			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+				urlInvitacion);
+
+			Assert.AreEqual(0, agenda.GetEventosPropuestos().Count);
+
+			var eventos = agenda.GetEventosAgendados();
+			Assert.AreEqual(1, eventos.Count);
+
+			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+
+			var evento = eventos[0];
+			
+			Assert.IsNotNull(evento.Ponente);
+			Assert.IsNotNull(evento.Ponente.Eventos);
+			Assert.AreEqual(1, evento.Ponente.Eventos.Count());
+			Assert.AreEqual(evento, evento.Ponente.Eventos.First());
+
+		}
+
+		[Test]
+		public void Agendar_y_modificar_evento()
+		{
+			var repository = DefaultEventoRepository;
+			var publicador = new Mock<IPublicador>();
+
+			var agenda = new Agenda(publicador.Object, null, repository, DefaultPonenteRepository);
+
+			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+				urlInvitacion);
+
+			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+
+			var evento = repository.GetEventosConFecha().First();
+			Assert.AreNotEqual(Guid.Empty, evento.Id);
+			Assert.IsNotNull(evento.Fecha);
+
+			DateTime fecha = evento.Fecha.Value.AddDays(7);
+			agenda.ModificarEvento(evento.Id, "otro titulo", "otro ponente", fecha, urlInvitacion);
+
+			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(2));
+
+			evento = repository.GetEventosConFecha().First();
+			Assert.AreEqual("otro titulo", evento.Titulo);
+			Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
+			Assert.AreEqual(fecha, evento.Fecha);
+
+			var idEventoNoExistente = new Guid("99999999999999999999999999999999");
+			Assert.Throws<EventoNotFoundException>(
+				() => agenda.ModificarEvento(idEventoNoExistente, "algún título", "un ponente", DateTime.Now, urlInvitacion));
+		}
+
+		[Test]
+		public void Agendar_y_recordar_evento()
+		{
+			var publicador1 = new Mock<IPublicador>();
+			var publicador2 = new Mock<IPublicador>();
+			var recordador1 = new Mock<IRecordador>();
+
+			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}), recordador1.Object,
+															DefaultEventoRepository, DefaultPonenteRepository);
+
+			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+				urlInvitacion);
+
+			var van = agenda.GetEventosAgendados().Single(v => v.Titulo == "Van para publicar");
+			agenda.Recordar(van.Id);
+
+			publicador1.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+			publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+			recordador1.Verify(r => r.Recordar(It.IsAny<Evento>()), Times.Exactly(1));
+		}
+
+		[Test]
+		public void Agendar_evento_propuesto()
+		{
+			var publicador1 = new Mock<IPublicador>();
+			var publicador2 = new Mock<IPublicador>();
+			var recordador1 = new Mock<IRecordador>();
+
+			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), recordador1.Object,
+															DefaultEventoRepository, DefaultPonenteRepository);
+
+			agenda.Proponer("Html 5", "jjmontes", urlInvitacion);
+			Assert.AreEqual(1, agenda.GetEventosPropuestos().Count);
+			Assert.AreEqual(0, agenda.GetEventosAgendados().Count);
+
+			var publicado = agenda.GetEventosPropuestos().First();
+			Assert.AreEqual(1, publicado.Tracks.Count());
+
+			agenda.Agendar("Html 5", "jjmontes", DateTime.Today.AddDays(5), urlInvitacion);
+			Assert.AreEqual(0, agenda.GetEventosPropuestos().Count);
+			Assert.AreEqual(1, agenda.GetEventosAgendados().Count);
+
+			var agendado = agenda.GetEventosAgendados().First();
+			Assert.AreSame(publicado, agendado);
+			Assert.AreEqual(2, agendado.Tracks.Count());
+
+			Assert.IsNotNull(agendado.Tracks.Where(t => t.Accion == Accion.Proponer).SingleOrDefault());
+			Assert.IsNotNull(agendado.Tracks.Where(t => t.Accion == Accion.Agendar).SingleOrDefault());
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Mon May 23 20:43:01 2011 -0300
@@ -77,7 +77,7 @@
     <Compile Include="PropuestasTests.cs" />
     <Compile Include="Cruds\EventoTests.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="PulicarTests.cs" />
+    <Compile Include="AgendarTests.cs" />
     <Compile Include="TestBase.cs" />
     <Compile Include="TrackTests.cs" />
   </ItemGroup>
--- a/Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs	Mon May 23 20:43:01 2011 -0300
@@ -27,7 +27,7 @@
 				var ponente = new Ponente("Carlos Blé");
 				_ponenteRepository.Save(ponente);
 
-				var van = Evento.Proponer("TDD - Diseño Basado en Ejemplos", ponente);
+				var van = Evento.Proponer("TDD - Diseño Basado en Ejemplos", ponente, string.Empty);
 				_eventoRepository.Save(van);
 
 				return van.Id;
--- a/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Mon May 23 20:43:01 2011 -0300
@@ -24,7 +24,7 @@
 			agenda.Agendar("Conform - Parte 2", "Fabio Maulo", new DateTime(2011, 3, 5),
 				urlInvitacion);
 
-			var eventos = agenda.GetEventosPublicados();
+			var eventos = agenda.GetEventosAgendados();
 			Assert.AreEqual(2, eventos.Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(2));
@@ -53,7 +53,7 @@
 
 			agenda.Agendar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26), urlInvitacion);
 
-			Assert.AreEqual(1, agenda.GetEventosPublicados().Count);
+			Assert.AreEqual(1, agenda.GetEventosAgendados().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
 
@@ -76,7 +76,7 @@
 			agenda.Agendar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26),
 				urlInvitacion);
 
-			Assert.AreEqual(1, agenda.GetEventosPublicados().Count);
+			Assert.AreEqual(1, agenda.GetEventosAgendados().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
 
@@ -93,7 +93,7 @@
 			const string titulo = "Audit (parallel model) con NHibernate 3";
 			Guid eventoId;
 
-			agenda.Proponer(titulo, "Fabio");
+			agenda.Proponer(titulo, "Fabio", urlInvitacion);
 			Ponente ponente;
 			{
 				var eventos = agenda.GetEventosPropuestos();
@@ -106,7 +106,7 @@
 				ponente = evento.Ponente;
 			}
 
-			agenda.ModificarPropuesta(eventoId, titulo, null);
+			agenda.ModificarPropuesta(eventoId, titulo, null, urlInvitacion);
 			{
 				var eventos = agenda.GetEventosPropuestos();
 				Assert.AreEqual(1, eventos.Count);
@@ -126,7 +126,7 @@
 			const string titulo = "Audit (parallel model) con NHibernate 3";
 			Guid eventoId;
 
-			agenda.Proponer(titulo, "Fabio");
+			agenda.Proponer(titulo, "Fabio", urlInvitacion);
 			Ponente ponente1;
 			{
 				var eventos = agenda.GetEventosPropuestos();
@@ -139,7 +139,7 @@
 				ponente1 = evento.Ponente;
 			}
 
-			agenda.ModificarPropuesta(eventoId, titulo, "José");
+			agenda.ModificarPropuesta(eventoId, titulo, "José", urlInvitacion);
 			Ponente ponente2;
 			{
 				var eventos = agenda.GetEventosPropuestos();
--- a/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Mon May 23 20:43:01 2011 -0300
@@ -19,16 +19,16 @@
 		{
 			var agenda = new Agenda(null, null, DefaultEventoRepository, DefaultPonenteRepository);
 
-			agenda.Proponer("Van", null);
+			agenda.Proponer("Van", null, urlInvitacion);
 			{
 				IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
-				IList<Evento> eventosPublicados = agenda.GetEventosPublicados();
+				IList<Evento> eventosPublicados = agenda.GetEventosAgendados();
 
 				Assert.AreEqual(1, eventosPropuestos.Count);
 				Assert.AreEqual(0, eventosPublicados.Count);
 
 				var evento = eventosPropuestos.FirstOrDefault();
-				agenda.ModificarPropuesta(evento.Id, "Van 2", "otro ponente");
+				agenda.ModificarPropuesta(evento.Id, "Van 2", "otro ponente", urlInvitacion);
 
 				eventosPropuestos = agenda.GetEventosPropuestos();
 				Assert.AreEqual(1, eventosPropuestos.Count);
@@ -42,7 +42,7 @@
 			Assert.IsTrue(r.Succeful);
 			{
 				IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
-				IList<Evento> eventosPublicados = agenda.GetEventosPublicados();
+				IList<Evento> eventosPublicados = agenda.GetEventosAgendados();
 
 				Assert.AreEqual(0, eventosPropuestos.Count);
 				Assert.AreEqual(1, eventosPublicados.Count);
@@ -55,7 +55,7 @@
 			var agenda = new Agenda(null, null, DefaultEventoRepository, DefaultPonenteRepository);
 
 			{
-				agenda.Proponer("Van propuesta", null);
+				agenda.Proponer("Van propuesta", null, urlInvitacion);
 			}
 
 			{
@@ -73,7 +73,7 @@
 			var agenda = new Agenda(null, null, DefaultEventoRepository, DefaultPonenteRepository);
 
 			{
-				agenda.Proponer("Van propuesta", null);
+				agenda.Proponer("Van propuesta", null, urlInvitacion);
 			}
 
 			{
@@ -104,7 +104,7 @@
 
 			var agenda = new Agenda(null, null, repository.Object, DefaultPonenteRepository);
 
-			var r = agenda.Proponer(string.Empty, null);
+			var r = agenda.Proponer(string.Empty, null, urlInvitacion);
 			Assert.IsFalse(r.Succeful);
 
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
@@ -117,14 +117,14 @@
 
 			SetCurrentUser(null);
 
-			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Proponer("Inmortalidad de la meduza.", null));
+			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Proponer("Inmortalidad de la meduza.", null, urlInvitacion));
 		}
 
 		[Test]
 		public void Proponer_evento_correctamente()
 		{
 			var agenda = new Agenda(null, null, DefaultEventoRepository, DefaultPonenteRepository);
-			agenda.Proponer("Van propuesta", null);
+			agenda.Proponer("Van propuesta", null, urlInvitacion);
 
 			IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
 			Assert.IsNotNull(eventosPropuestos);
@@ -137,13 +137,13 @@
 		{
 			var agenda = new Agenda(null, null, DefaultEventoRepository, DefaultPonenteRepository);
 
-			agenda.Proponer("Van propuesta", null);
+			agenda.Proponer("Van propuesta", null, urlInvitacion);
 			var r = agenda.Agendar("Van publicada", "jjmontes", DateTime.Now,
 				urlInvitacion);
 			Assert.IsTrue(r.Succeful);
 
 			IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
-			IList<Evento> eventosPublicados = agenda.GetEventosPublicados();
+			IList<Evento> eventosPublicados = agenda.GetEventosAgendados();
 
 			Assert.AreEqual(1, eventosPropuestos.Count);
 			Assert.AreEqual(1, eventosPublicados.Count);
--- a/Agendas/trunk/src/Agendas.Tests/PulicarTests.cs	Mon May 23 20:13:37 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,178 +0,0 @@
-using System;
-using System.Linq;
-using AltNetHispano.Agendas.Domain;
-using AltNetHispano.Agendas.Domain.Exceptions;
-using AltNetHispano.Agendas.Domain.Repositories;
-using Moq;
-using NUnit.Framework;
-
-namespace AltNetHispano.Agendas.Tests
-{
-	[TestFixture]
-	public class PulicarTests : TestBase
-	{
-		private const string urlInvitacion = "http://groups.google.com/group/altnet-hispano/browse_thread/thread/65d6d26eb381386e";
-
-		[Test]
-		public void CompositePublicador_constructor_parametro_null_debe_generar_ArgumentNullException()
-		{
-			Assert.Throws<ArgumentNullException>(() => new CompositePublicador(null));
-		}
-
-		[Test]
-		public void Intentar_publicar_evento_donde_ocurre_una_excepcion_no_manejada()
-		{
-			var publicador = new Mock<IPublicador>();
-			var repository = new Mock<IEventoRepository>();
-
-			publicador.Setup(p => p.Publicar(It.IsAny<Evento>())).Throws(new Exception("Error intencional"));
-
-			var agenda = new Agenda(publicador.Object, null, repository.Object, DefaultPonenteRepository);
-
-			Assert.Throws<Exception>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now, urlInvitacion));
-			Assert.AreEqual(0, agenda.GetEventosPublicados().Count);
-
-			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
-			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
-		}
-
-		[Test]
-		public void Intentar_publicar_evento_sin_servicio_de_seguridad()
-		{
-			IdentityContext.Current = null;
-
-			var publicador = new Mock<IPublicador>();
-			var repository = new Mock<IEventoRepository>();
-
-			var agenda = new Agenda(publicador.Object, null, repository.Object, DefaultPonenteRepository);
-
-			Assert.Throws<IdentityContextNotConfiguredException>(
-				() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-					urlInvitacion));
-			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
-		}
-
-		[Test]
-		public void Intentar_publicar_evento_sin_usuario_autenticado()
-		{
-			SetCurrentUser(null);
-
-			var publicador = new Mock<IPublicador>();
-			var repository = new Mock<IEventoRepository>();
-
-			var agenda = new Agenda(publicador.Object, null, repository.Object, DefaultPonenteRepository);
-
-			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-				urlInvitacion));
-
-			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(0));
-			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
-		}
-
-		[Test]
-		public void Intentar_publicar_evento_sin_ponente()
-		{
-			var agenda = new Agenda(null, null, DefaultEventoRepository, DefaultPonenteRepository);
-
-			var r = agenda.Agendar("Van para publicar", string.Empty, DateTime.Now,
-				urlInvitacion);
-
-			Assert.IsFalse(r.Succeful);
-		}
-
-		[Test]
-		public void Publicar_evento_con_multiples_publicadores()
-		{
-			var publicador1 = new Mock<IPublicador>();
-			var publicador2 = new Mock<IPublicador>();
-
-			var repository = new Mock<IEventoRepository>();
-
-			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}), null,
-															repository.Object, DefaultPonenteRepository);
-
-			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-				urlInvitacion);
-
-			publicador1.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
-			publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
-			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(1));
-		}
-
-		[Test]
-		public void Publicar_evento_correctamente()
-		{
-			var publicador = new Mock<IPublicador>();
-
-			var agenda = new Agenda(publicador.Object, null, DefaultEventoRepository, DefaultPonenteRepository);
-
-			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-				urlInvitacion);
-			var eventos = agenda.GetEventosPublicados();
-			Assert.AreEqual(1, eventos.Count);
-
-			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
-
-			var evento = eventos[0];
-			
-			Assert.IsNotNull(evento.Ponente);
-			Assert.IsNotNull(evento.Ponente.Eventos);
-			Assert.AreEqual(1, evento.Ponente.Eventos.Count());
-			Assert.AreEqual(evento, evento.Ponente.Eventos.First());
-
-		}
-
-		[Test]
-		public void Publicar_y_modificar_evento()
-		{
-			var repository = DefaultEventoRepository;
-			var publicador = new Mock<IPublicador>();
-
-			var agenda = new Agenda(publicador.Object, null, repository, DefaultPonenteRepository);
-
-			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-				urlInvitacion);
-
-			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
-
-			var evento = repository.GetEventosConFecha().First();
-			Assert.AreNotEqual(Guid.Empty, evento.Id);
-			Assert.IsNotNull(evento.Fecha);
-
-			DateTime fecha = evento.Fecha.Value.AddDays(7);
-			agenda.ModificarEvento(evento.Id, "otro titulo", "otro ponente", fecha);
-
-			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(2));
-
-			evento = repository.GetEventosConFecha().First();
-			Assert.AreEqual("otro titulo", evento.Titulo);
-			Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
-			Assert.AreEqual(fecha, evento.Fecha);
-
-			var idEventoNoExistente = new Guid("99999999999999999999999999999999");
-			Assert.Throws<EventoNotFoundException>(
-				() => agenda.ModificarEvento(idEventoNoExistente, "algún título", "un ponente", DateTime.Now));
-		}
-
-		[Test]
-		public void Publicar_y_recordar_evento()
-		{
-			var publicador1 = new Mock<IPublicador>();
-			var publicador2 = new Mock<IPublicador>();
-			var recordador1 = new Mock<IRecordador>();
-
-			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}), recordador1.Object,
-															DefaultEventoRepository, DefaultPonenteRepository);
-
-			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-				urlInvitacion);
-
-			var van = agenda.GetEventosPublicados().Single(v => v.Titulo == "Van para publicar");
-			agenda.Recordar(van.Id);
-
-			publicador1.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
-			publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
-			recordador1.Verify(r => r.Recordar(It.IsAny<Evento>()), Times.Exactly(1));
-		}
-	}
-}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Mon May 23 20:43:01 2011 -0300
@@ -24,11 +24,11 @@
 			Assert.AreEqual(1, evento.Tracks.Count());
 			Assert.AreEqual(Accion.Agendar, evento.Tracks.Last().Accion);
 
-			agenda.ModificarEvento(evento.Id, "Html 5", "otro ponente", fecha);
+			agenda.ModificarEvento(evento.Id, "Html 5", "otro ponente", fecha, urlInvitacion);
 			Assert.AreEqual(2, evento.Tracks.Count());
 			Assert.AreEqual(Accion.Modificar, evento.Tracks.Last().Accion);
 
-			agenda.ModificarEvento(evento.Id, "Html 5 y Css 3", "otro ponente", fecha);
+			agenda.ModificarEvento(evento.Id, "Html 5 y Css 3", "otro ponente", fecha, urlInvitacion);
 			Assert.AreEqual(3, evento.Tracks.Count());
 			Assert.AreEqual(Accion.CambiarTitulo, evento.Tracks.Last().Accion);
 		}
--- a/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Mon May 23 20:43:01 2011 -0300
@@ -14,7 +14,7 @@
 
 			var model = new EventoIndexModel
 			{
-				ProximosEventos = from e in agenda.GetEventosPublicados()
+				ProximosEventos = from e in agenda.GetEventosAgendados()
 								  select new EventoDto { Id = e.Id.ToString(), Titulo = e.Titulo }
 			};
 			
@@ -72,7 +72,7 @@
 			{
 				var agenda = AgendaFactory.GetAgenda();
 
-				var r =agenda.ModificarEvento(new Guid(model.Id), model.Titulo, model.Ponente, model.Fecha);
+				var r =agenda.ModificarEvento(new Guid(model.Id), model.Titulo, model.Ponente, model.Fecha.Value , model.UrlInvitacion);
 				if (r.Succeful)
 					return RedirectToAction("Index");
 				ModelState.AddModelError("error", r.ToString());
--- a/Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs	Mon May 23 20:43:01 2011 -0300
@@ -13,10 +13,16 @@
 			var agenda = AgendaFactory.GetAgenda();
 
 			var model = new PropuestaIndexModel
-			{
-				Propuestas = from e in agenda.GetEventosPropuestos()
-							 select new PropuestaDto { Id = e.Id.ToString(), Titulo = e.Titulo, Ponente = e.Ponente.Nombre }
-			};
+			            	{
+			            		Propuestas = from e in agenda.GetEventosPropuestos()
+			            		             select
+			            		             	new PropuestaDto
+			            		             		{
+			            		             			Id = e.Id.ToString(),
+			            		             			Titulo = e.Titulo,
+			            		             			Ponente = e.Ponente != null ? e.Ponente.Nombre : string.Empty
+			            		             		}
+			            	};
 
 			return View(model);
 		}
@@ -35,7 +41,7 @@
 			{
 				var agenda = AgendaFactory.GetAgenda();
 
-				var r = agenda.Proponer(model.Titulo, model.Ponente);
+				var r = agenda.Proponer(model.Titulo, model.Ponente, model.UrlInvitacion);
 				if (r.Succeful)
 					return RedirectToAction("Index");
 				ModelState.AddModelError("error", r.ToString());
@@ -70,7 +76,7 @@
 			{
 				var agenda = AgendaFactory.GetAgenda();
 
-				var r = agenda.ModificarPropuesta(new Guid(model.Id), model.Titulo, model.Ponente);
+				var r = agenda.ModificarPropuesta(new Guid(model.Id), model.Titulo, model.Ponente, model.UrlInvitacion);
 				if (r.Succeful)
 					return RedirectToAction("Index");
 				ModelState.AddModelError("error", r.ToString());
--- a/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Mon May 23 20:43:01 2011 -0300
@@ -37,7 +37,9 @@
 
         [Required(ErrorMessage = "debe ingresar la fecha del evento")]
         public DateTime? Fecha { get; set; }
-    }
+
+		public string UrlInvitacion { get; set; }
+	}
     
 
     public class EventoDto
--- a/Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs	Mon May 23 20:43:01 2011 -0300
@@ -15,7 +15,9 @@
         public string Titulo { get; set; }
 
         public string Ponente { get; set; }
-    }
+
+		public string UrlInvitacion { get; set; }
+	}
 
     public class PropuestaEditModel
     {
@@ -26,7 +28,9 @@
         public string Titulo { get; set; }
 
         public string Ponente { get; set; }
-    }
+
+		public string UrlInvitacion { get; set; }
+	}
     
 
     public class PropuestaDto
--- a/Agendas/trunk/src/Agendas.Web/Views/Evento/Edit.cshtml	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Evento/Edit.cshtml	Mon May 23 20:43:01 2011 -0300
@@ -1,4 +1,4 @@
-@model AltNetHispano.Agendas.Web.Models.AgendaEditModel
+@model AltNetHispano.Agendas.Web.Models.EventoEditModel
 <h2>Agenda</h2>
 <p>
     Modifique los datos que desea corregir y presione guardar
--- a/Agendas/trunk/src/Agendas.Web/Views/Propuesta/Index.cshtml	Mon May 23 20:13:37 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Propuesta/Index.cshtml	Mon May 23 20:43:01 2011 -0300
@@ -19,7 +19,7 @@
             <td>@item.Ponente</td>
             <td>
 				@Html.ActionLink("Modificar", "Edit", new { id = item.Id })
-				@Html.ActionLink("Publicar", "Publish", new { id = item.Id })
+				@Html.ActionLink("Agendar", "Edit", "Evento", new { id = item.Id }, null)
 			</td>
         </tr>
         }