Mercurial > altnet-hispano
diff Agendas/trunk/src/Agendas.Tests/AgendarTests.cs @ 75:96d7609f2e08
Agendar evento propuesto
author | nelopauselli |
---|---|
date | Mon, 23 May 2011 20:43:01 -0300 |
parents | |
children | 926bd1cdb98f |
line wrap: on
line diff
--- /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