changeset 24:41b283d27e3e

Ponentes como entidad Agenda no es una entidad persistente (por ahora)
author nelo@MTEySS.neluz.int
date Tue, 15 Mar 2011 07:49:53 -0300
parents a85674a7aa7a
children e8d2be47a6b0
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/Ponente.cs Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs Agendas/trunk/src/Agendas.Factories/AgendaFactory.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/EventoRepository.cs Agendas/trunk/src/Agendas.Repositories.Memory/PonenteRepository.cs Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj Agendas/trunk/src/Agendas.Tests/EventoObjectMother.cs Agendas/trunk/src/Agendas.Tests/EventoTests.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/TestBase.cs Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs
diffstat 18 files changed, 220 insertions(+), 153 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -11,31 +11,34 @@
 		private readonly IRecordador _recordador;
         private readonly ISeguridad _seguridad;
 		private readonly IEventoRepository _eventosRepository;
+		private readonly IPonenteRepository _ponenteRepository;
 
-		public Agenda(IPublicador publicador, IRecordador recordador, ISeguridad seguridad, IEventoRepository eventosRepository)
+		public Agenda(IPublicador publicador, IRecordador recordador, ISeguridad seguridad, IEventoRepository eventosRepository, IPonenteRepository ponenteRepository)
 		{
 			_publicador = publicador;
+			_ponenteRepository = ponenteRepository;
 			_eventosRepository = eventosRepository;
 			_recordador = recordador;
             _seguridad = seguridad;
 		}
 
-		public Guid Id { get; set; }
+        public void Publicar(string titulo, string ponenteNombre, DateTime? fecha)
+        {
+        	var ponente = GetPonente(ponenteNombre);
 
-        public void Publicar(string titulo, string ponente, DateTime? fecha)
-		{
             var evento = new Evento{Titulo=titulo, Ponente = ponente, Fecha = fecha};
 
 			if (!evento.Fecha.HasValue)
 				throw new ValidationException();
             if (NoEstaAutenticado(_seguridad))
                 throw new UsuarioNoAutenticadoException();
-            if (string.IsNullOrWhiteSpace(evento.Ponente))
+            if (string.IsNullOrWhiteSpace(evento.Ponente.Nombre))
                 throw new ValidationException();
 
 			if (_publicador != null)
 				_publicador.Publicar(evento);
 			_eventosRepository.Save(evento);
+			_ponenteRepository.Save(ponente);
 		}
 
 		public void Recordar(Guid eventoId)
@@ -72,11 +75,14 @@
                 || string.IsNullOrWhiteSpace(seguridad.GetPrincipal().Identity.Name);
         }
 
-		public void ModificarEvento(Guid id, string titulo, string ponente, DateTime? fecha)
+		public void ModificarEvento(Guid id, string titulo, string ponenteNombre, DateTime? fecha)
 		{
 			var evento = _eventosRepository.Get(id);
 			if (evento == null)
 				throw new EventoNotFoundException();
+
+			var ponente = GetPonente(ponenteNombre);
+
 			evento.Titulo = titulo;
 			evento.Ponente = ponente;
 			evento.Fecha = fecha;
@@ -86,6 +92,18 @@
 		{
 			return _eventosRepository.Get(id);
 		}
+
+		public void RegistrarPonente(string nombre, string mail, string twitter, string blog)
+		{
+			var ponente = new Ponente {Nombre = nombre, Mail = mail, Twitter = twitter, Blog = blog};
+			_ponenteRepository.Save(ponente);
+		}
+
+		private Ponente GetPonente(string nombre)
+		{
+			return _ponenteRepository.GetByNombre(nombre) ?? new Ponente { Nombre = nombre };
+		}
+
 	}
 
 	public class EventoNotFoundException : Exception
--- a/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj	Tue Mar 15 07:49:53 2011 -0300
@@ -46,6 +46,7 @@
     <Compile Include="Exceptions\ValidationException.cs" />
     <Compile Include="IRecordador.cs" />
     <Compile Include="ISeguridad.cs" />
+    <Compile Include="Ponente.cs" />
     <Compile Include="Repositories\IEventoRepository.cs" />
     <Compile Include="IPublicador.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -9,7 +9,7 @@
 		public string Titulo { get; set; }
 		public DateTime? Fecha { get; set; }
 		public string Sintesis { get; set; }
-        public string Ponente { get; set; }
+        public Ponente Ponente { get; set; }
         public IList<string> Enlaces { get; set; }
     }
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/Ponente.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -0,0 +1,17 @@
+using System;
+
+namespace AltNetHispano.Agendas.Domain
+{
+	public class Ponente {
+		public Guid Id { get; set; }
+
+		public string Nombre { get; set; }
+
+		public string Mail { get; set; }
+
+		public string Twitter { get; set; }
+
+		public string Blog { get; set; }
+
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -13,11 +13,10 @@
 		IList<Evento> GetEventosConFecha();
 	}
 
-	public interface IAgendaRepository
+	public interface IPonenteRepository
 	{
-		void Save(Agenda agenda);
-		void Delete(Agenda agenda);
-		void Update(Agenda agenda);
-		Agenda Get(Guid agendaId);
+		void Save(Ponente ponente);
+		Ponente GetByNombre(string ponenteNombre);
+		IList<Ponente> GetAll();
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -11,7 +11,7 @@
     	public static Agenda GetAgenda()
         {
 			if (_agenda==null)
-				_agenda = new Agenda(null, null, _seguridad, new EventoRepository());
+				_agenda = new Agenda(null, null, _seguridad, new EventoRepository(), new PonenteRepository());
 
             return _agenda;
         }
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/AgendaRepository.cs	Tue Mar 15 06:57:58 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-using System;
-using AltNetHispano.Agendas.Domain;
-using AltNetHispano.Agendas.Domain.Repositories;
-
-namespace Agendas.Repositories.Memory
-{
-	public class AgendaRepository : RepositoryBase<Agenda>, IAgendaRepository
-	{
-		#region IAgendaRepository Members
-
-		public void Save(Agenda agenda)
-		{
-			if (Guid.Empty.Equals(agenda.Id))
-			{
-				agenda.Id = Guid.NewGuid();
-				Objects.Add(agenda.Id, agenda);
-			}
-		}
-
-		public void Update(Agenda agenda)
-		{
-			//nada que hacer en este método para este repositorio
-		}
-
-		public Agenda Get(Guid agendaId)
-		{
-			Agenda agenda;
-			return Objects.TryGetValue(agendaId, out agenda) ? agenda : null;
-		}
-
-		public void Delete(Agenda agenda)
-		{
-			Objects.Remove(agenda.Id);
-		}
-
-		#endregion
-	}
-}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/Agendas.Repositories.Memory.csproj	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Memory/Agendas.Repositories.Memory.csproj	Tue Mar 15 07:49:53 2011 -0300
@@ -40,8 +40,8 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="AgendaRepository.cs" />
     <Compile Include="EventoRepository.cs" />
+    <Compile Include="PonenteRepository.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="RepositoryBase.cs" />
   </ItemGroup>
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -42,5 +42,10 @@
 		{
 			return Objects.Values.Where(e => e.Fecha != null).ToList();
 		}
+
+		public static void Clear()
+		{
+			Objects.Clear();
+		}
 	}
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Repositories.Memory/PonenteRepository.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Domain.Repositories;
+
+namespace Agendas.Repositories.Memory
+{
+	public class PonenteRepository : RepositoryBase<Ponente>, IPonenteRepository
+	{
+		public void Save(Ponente ponente)
+		{
+			if (Guid.Empty.Equals(ponente.Id))
+			{
+				ponente.Id = Guid.NewGuid();
+				Objects.Add(ponente.Id, ponente);
+			}
+		}
+
+		public void Update(Ponente ponente)
+		{
+			//nada que hacer en este método para este repositorio
+		}
+
+		public Ponente Get(Guid vanId)
+		{
+			Ponente ponente;
+			return Objects.TryGetValue(vanId, out ponente) ? ponente : null;
+		}
+
+
+		public Ponente GetByNombre(string nombre)
+		{
+			return Objects.Values.SingleOrDefault(p => p.Nombre == nombre);
+		}
+
+		public IList<Ponente> GetAll()
+		{
+			return Objects.Values.ToList();
+		}
+
+		public static void Clear()
+		{
+			Objects.Clear();
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Tue Mar 15 07:49:53 2011 -0300
@@ -46,6 +46,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="PonentesTests.cs" />
     <Compile Include="PropuestasTests.cs" />
     <Compile Include="EventoObjectMother.cs" />
     <Compile Include="EventoTests.cs" />
--- a/Agendas/trunk/src/Agendas.Tests/EventoObjectMother.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/EventoObjectMother.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -5,9 +5,5 @@
 {
 	public static class EventoObjectMother
 	{
-        public static Evento GetVanValidaParaPublicar()
-        {
-            return new Evento { Fecha = DateTime.Now, Ponente = "jjmontes" };
-        }
     }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/EventoTests.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/EventoTests.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -17,7 +17,7 @@
 				var van = new Evento
 				          	{
 				          		Titulo = "TDD - Diseño Basado en Ejemplos",
-				          		Ponente = "Carlos Blé",
+				          		Ponente = new Ponente {Nombre = "Carlos Blé"},
 				          		Fecha = new DateTime(2010, 04, 16)
 				          	};
 				IEventoRepository eventoRepository = new EventoRepository();
@@ -35,7 +35,7 @@
 				Evento van = eventoRepository.Get(vanId);
 
 				Assert.IsNotNull(van);
-				Assert.AreEqual("Carlos Blé", van.Ponente);
+				Assert.AreEqual("Carlos Blé", van.Ponente.Nombre);
 				Assert.AreEqual("TDD - Diseño Basado en Ejemplos", van.Titulo);
 				Assert.AreEqual(new DateTime(2010, 04, 16), van.Fecha);
 
@@ -52,7 +52,7 @@
 				Evento van = eventoRepository.Get(vanId);
 
 				Assert.IsNotNull(van);
-				Assert.AreEqual("Carlos Blé", van.Ponente);
+				Assert.AreEqual("Carlos Blé", van.Ponente.Nombre);
 				Assert.AreEqual("TDD - Diseño Basado en Ejemplos", van.Titulo);
 				Assert.AreEqual(new DateTime(2010, 04, 17), van.Fecha);
 				Assert.AreEqual(sintesis, van.Sintesis);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -0,0 +1,72 @@
+using System;
+using AltNetHispano.Agendas.Domain;
+using Moq;
+using NUnit.Framework;
+
+namespace AltNetHispano.Agendas.Tests
+{
+	[TestFixture]
+	public class PonentesTests : TestBase
+	{
+		[Test]
+		public void Publicar_van_con_ponente_registrado()
+		{
+			var publicador = new Mock<IPublicador>();
+			Evento evento = null;
+			publicador.Setup(p => p.Publicar(It.IsAny<Evento>())).Callback<Evento>(e => evento = e);
+
+			var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, DefaultEventoRepository, DefaultPonenteRepository);
+
+			agenda.RegistrarPonente("Fabio Maulo", "fabiomaulo@gmail.com", "@fabiomaulo", "http://fabiomaulo.blogspot.com");
+
+			agenda.Publicar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26));
+
+			Assert.AreEqual(1, agenda.GetEventosPublicados().Count);
+
+			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+
+			Assert.IsNotNull(evento);
+			Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
+			Assert.AreEqual("fabiomaulo@gmail.com", evento.Ponente.Mail);
+			Assert.AreEqual("@fabiomaulo", evento.Ponente.Twitter);
+			Assert.AreEqual("http://fabiomaulo.blogspot.com", evento.Ponente.Blog);
+		}
+
+		[Test]
+		public void Publicar_van_sin_ponente_registrado()
+		{
+			var publicador = new Mock<IPublicador>();
+			Evento evento = null;
+			publicador.Setup(p => p.Publicar(It.IsAny<Evento>())).Callback<Evento>(e => evento = e);
+
+			var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, DefaultEventoRepository, DefaultPonenteRepository);
+
+			agenda.Publicar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26));
+
+			Assert.AreEqual(1, agenda.GetEventosPublicados().Count);
+
+			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
+
+			Assert.IsNotNull(evento);
+			Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
+			Assert.IsNullOrEmpty(evento.Ponente.Twitter);
+		}
+
+		[Test]
+		public void Publicar_dos_vans_sin_ponente_registrado()
+		{
+			var publicador = new Mock<IPublicador>();
+
+			var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, DefaultEventoRepository, DefaultPonenteRepository);
+
+			agenda.Publicar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26));
+			agenda.Publicar("Conform - Parte 2", "Fabio Maulo", new DateTime(2011, 3, 5));
+
+			Assert.AreEqual(2, agenda.GetEventosPublicados().Count);
+
+			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(2));
+
+			Assert.AreEqual(1, DefaultPonenteRepository.GetAll().Count);
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -1,7 +1,6 @@
 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;
@@ -17,7 +16,7 @@
 		public void Propuesta_de_van_con_usuario_autenticado()
 		{
             var seguridad = new Mock<ISeguridad>();
-            var agenda = new Agenda(null, null, seguridad.Object, DefaultEventoRepository);
+            var agenda = new Agenda(null, null, seguridad.Object, DefaultEventoRepository, DefaultPonenteRepository);
             
             seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles());
 			agenda.Proponer("Van propuesta");
@@ -31,12 +30,10 @@
         [Test]
         public void Verificar_propuesta_separada_de_publicacion()
         {
-            var agenda = new Agenda(null, null, SeguridadServiceDefault, new EventoRepository());
-
-            var vanPublicada = EventoObjectMother.GetVanValidaParaPublicar();
+            var agenda = new Agenda(null, null, SeguridadServiceDefault, DefaultEventoRepository, DefaultPonenteRepository);
 
 			agenda.Proponer("Van propuesta");
-            agenda.Publicar(vanPublicada.Titulo, vanPublicada.Ponente, vanPublicada.Fecha);
+            agenda.Publicar("Van publicada", "jjmontes", DateTime.Now);
 
             IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
             IList<Evento> eventosPublicados = agenda.GetEventosPublicados();
@@ -51,7 +48,7 @@
 			var repository = new Mock<IEventoRepository>();
 
             var seguridad = new Mock<ISeguridad>();
-            var agenda = new Agenda(null, null, seguridad.Object, repository.Object);
+            var agenda = new Agenda(null, null, seguridad.Object, repository.Object, DefaultPonenteRepository);
             
             Assert.Throws<ValidationException>(() => agenda.Proponer(string.Empty));
 
@@ -62,7 +59,7 @@
 		public void Agendar_van_propuesta_sin_fecha()
 		{
 			var seguridad = new Mock<ISeguridad>();
-            var agenda = new Agenda(null, null, seguridad.Object, DefaultEventoRepository);
+            var agenda = new Agenda(null, null, seguridad.Object, DefaultEventoRepository, DefaultPonenteRepository);
             
             seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles());
 
@@ -73,7 +70,7 @@
 			{
 				var van = agenda.GetEventosPropuestos().FirstOrDefault();
 				Assert.IsNotNull(van);
-                Assert.Throws<ValidationException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha));
+                Assert.Throws<ValidationException>(() => agenda.Publicar(van.Titulo, string.Empty, van.Fecha));
 			}
 		}
 
@@ -81,7 +78,7 @@
 		public void Agendar_van_propuesta_sin_ponente()
 		{
 			var seguridad = new Mock<ISeguridad>();
-            var agenda = new Agenda(null, null, seguridad.Object, DefaultEventoRepository);
+            var agenda = new Agenda(null, null, seguridad.Object, DefaultEventoRepository, DefaultPonenteRepository);
             
             seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles());
 
@@ -94,55 +91,7 @@
 				Assert.IsNotNull(van);
 
 				van.Fecha = DateTime.Today.AddDays(5);
-                Assert.Throws<ValidationException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha));
-			}
-		}
-
-		[Test]
-		public void Van_crud()
-		{
-			var van = EventoObjectMother.GetVanValidaParaPublicar();
-            
-            Guid vanId;
-			{
-                var agenda = new Agenda(null, null, SeguridadServiceDefault, new EventoRepository());
-                agenda.Publicar(van.Titulo, van.Ponente, van.Fecha);
-
-				IAgendaRepository agendaRepository = new AgendaRepository();
-
-				agendaRepository.Save(agenda);
-				vanId = agenda.Id;
-			}
-
-			{
-				IAgendaRepository agendaRepository = new AgendaRepository();
-
-				Agenda agenda = agendaRepository.Get(vanId);
-
-				Assert.IsNotNull(agenda);
-				Assert.AreEqual(1, agenda.GetEventosPublicados().Count);
-                agenda.Publicar(van.Titulo, van.Ponente, van.Fecha);
-
-				agendaRepository.Update(agenda);
-			}
-
-			{
-				IAgendaRepository agendaRepository = new AgendaRepository();
-
-				Agenda agenda = agendaRepository.Get(vanId);
-
-				Assert.IsNotNull(agenda);
-				Assert.AreEqual(2, agenda.GetEventosPublicados().Count);
-
-				agendaRepository.Delete(agenda);
-			}
-
-			{
-				IAgendaRepository agendaRepository = new AgendaRepository();
-
-				Agenda agenda = agendaRepository.Get(vanId);
-
-				Assert.IsNull(agenda);
+				Assert.Throws<ValidationException>(() => agenda.Publicar(van.Titulo, string.Empty, van.Fecha));
 			}
 		}
 	}
--- a/Agendas/trunk/src/Agendas.Tests/PulicarTests.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PulicarTests.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -15,11 +15,9 @@
 		{
 			var publicador = new Mock<IPublicador>();
 
-			var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, DefaultEventoRepository);
+			var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, DefaultEventoRepository, DefaultPonenteRepository);
 
-			var van = EventoObjectMother.GetVanValidaParaPublicar();
-
-			agenda.Publicar(van.Titulo, van.Ponente, van.Fecha);
+			agenda.Publicar("Van para publicar", "jjmontes", DateTime.Now);
 			Assert.AreEqual(1, agenda.GetEventosPublicados().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
@@ -33,11 +31,9 @@
 			var publicador = new Mock<IPublicador>();
 			var repository = new Mock<IEventoRepository>();
 
-			var agenda = new Agenda(publicador.Object, null, seguridad.Object, repository.Object);
+			var agenda = new Agenda(publicador.Object, null, seguridad.Object, repository.Object, DefaultPonenteRepository);
 
-			var van = EventoObjectMother.GetVanValidaParaPublicar();
-
-			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha));
+			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar("Van para publicar", "jjmontes", DateTime.Now));
 
 			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(0));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
@@ -49,11 +45,9 @@
 			var publicador = new Mock<IPublicador>();
 			var repository = new Mock<IEventoRepository>();
 
-			var agenda = new Agenda(publicador.Object, null, null, repository.Object);
+			var agenda = new Agenda(publicador.Object, null, null, repository.Object, DefaultPonenteRepository);
 
-			var van = EventoObjectMother.GetVanValidaParaPublicar();
-
-			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha));
+			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Publicar("Van para publicar", "jjmontes", DateTime.Now));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
 		}
 
@@ -65,10 +59,9 @@
 
 			publicador.Setup(p => p.Publicar(It.IsAny<Evento>())).Throws(new Exception("Error intencional"));
 
-			var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, repository.Object);
+			var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, repository.Object, DefaultPonenteRepository);
 
-			var van = EventoObjectMother.GetVanValidaParaPublicar();
-			Assert.Throws<Exception>(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha));
+			Assert.Throws<Exception>(() => agenda.Publicar("Van para publicar", "jjmontes", DateTime.Now));
 			Assert.AreEqual(0, agenda.GetEventosPublicados().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
@@ -83,10 +76,9 @@
 
 			var repository = new Mock<IEventoRepository>();
 
-			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), null, SeguridadServiceDefault, repository.Object);
+			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), null, SeguridadServiceDefault, repository.Object, DefaultPonenteRepository);
 
-			var van = EventoObjectMother.GetVanValidaParaPublicar();
-			agenda.Publicar(van.Titulo, van.Ponente, van.Fecha);
+			agenda.Publicar("Van para publicar", "jjmontes", DateTime.Now);
 
 			publicador1.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
 			publicador2.Verify(p => p.Publicar(It.IsAny<Evento>()), Times.Exactly(1));
@@ -96,24 +88,20 @@
 		[Test]
 		public void Publicar_y_recordar_van()
 		{
-			var repository = new Mock<IEventoRepository>();
-
 			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, SeguridadServiceDefault, repository.Object);
+			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), recordador1.Object, SeguridadServiceDefault, DefaultEventoRepository, DefaultPonenteRepository);
 
-			var van = EventoObjectMother.GetVanValidaParaPublicar();
-			agenda.Publicar(van.Titulo, van.Ponente, van.Fecha);
+			agenda.Publicar("Van para publicar", "jjmontes", DateTime.Now);
 
+			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));
-
-			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(1));
 		}
 
 		[Test]
@@ -121,10 +109,9 @@
 		{
 			var repository = DefaultEventoRepository;
 
-			var agenda = new Agenda(null, null, SeguridadServiceDefault, repository);
+			var agenda = new Agenda(null, null, SeguridadServiceDefault, repository, DefaultPonenteRepository);
 
-			var van = EventoObjectMother.GetVanValidaParaPublicar();
-			agenda.Publicar(van.Titulo, van.Ponente, van.Fecha);
+			agenda.Publicar("Van para publicar", "jjmontes", DateTime.Now);
 
 			var evento = repository.GetEventosConFecha().First();
 			Assert.AreNotEqual(Guid.Empty, evento.Id);
@@ -135,7 +122,7 @@
 
 			evento = repository.GetEventosConFecha().First();
 			Assert.AreEqual("otro titulo", evento.Titulo);
-			Assert.AreEqual("otro ponente", evento.Ponente);
+			Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
 			Assert.AreEqual(fecha, evento.Fecha);
 		}
 	}
--- a/Agendas/trunk/src/Agendas.Tests/TestBase.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TestBase.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -23,14 +23,21 @@
 			get { return new EventoRepository(); }
 		}
 
+		protected static IPonenteRepository DefaultPonenteRepository
+		{
+			get { return new PonenteRepository(); }
+		}
+
 		[SetUp]
 		public void LimpiarEventos()
 		{
-			var repository = new EventoRepository();
-			foreach (Evento evento in repository.GetEventosConFecha())
-				repository.Delete(evento);
-			foreach (Evento evento in repository.GetEventosSinFecha())
-				repository.Delete(evento);
+			EventoRepository.Clear();
+		}
+
+		[SetUp]
+		public void LimpiarPonentes()
+		{
+			PonenteRepository.Clear();
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs	Tue Mar 15 06:57:58 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs	Tue Mar 15 07:49:53 2011 -0300
@@ -61,7 +61,13 @@
 			var evento = agenda.GetEventoPublicado(new Guid(id));
 			if (evento!=null)
 			{
-				var model = new AgendaEditModel {Id = id, Titulo = evento.Titulo, Ponente = evento.Ponente, Fecha = evento.Fecha};
+				var model = new AgendaEditModel
+				            	{
+				            		Id = id,
+				            		Titulo = evento.Titulo,
+				            		Ponente = evento.Ponente != null ? evento.Ponente.Nombre : string.Empty,
+				            		Fecha = evento.Fecha
+				            	};
 				return View(model);
 			}
 			ModelState.AddModelError("error","No se encontró el evento que quiere modificar");