changeset 195:4d0b2552edb2

Ticket 170: Cuando se agenda o confirma un evento, verificar que no existan otros dentro del rango horario en que se desarrollará el evento actual.
author juanjose.montesdeocaarbos
date Sat, 13 Aug 2011 01:01:54 -0300
parents 21ad1c337c94
children bb7a60c28d8d
files Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Tests/AgendarTests.cs
diffstat 2 files changed, 64 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Fri Aug 12 23:55:09 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Sat Aug 13 01:01:54 2011 -0300
@@ -104,12 +104,20 @@
                 return new EventoResultado(false, string.Format("No se encontró el ponente indicado ({0})", ponenteId), null);
 
             Evento evento = _eventosRepository.GetPropuestaByTitulo(titulo);
-            if (evento == null)
+
+			if (evento == null)
                 evento = Evento.Agendar(titulo, persona, fechaInicio.Value, fechaTermino.Value, urlInvitacion, tipo);
             else
                 evento.Agendar(persona, fechaInicio, fechaTermino, urlInvitacion);
 
-            Notify(evento);
+			foreach (var e in _eventosRepository.GetActivos())
+			{
+			    if (!e.Equals(evento) && (evento.FechaInicio <= e.FechaTermino && evento.FechaTermino >= e.FechaInicio))
+			    {
+			        return new EventoResultado(false, string.Format("El evento que está intentando agendar entra en conflicto con '{0}'", evento.Titulo), null);
+			    }
+			}
+			Notify(evento);
 
             _eventosRepository.Save(evento);
 
--- a/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Fri Aug 12 23:55:09 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Sat Aug 13 01:01:54 2011 -0300
@@ -28,7 +28,7 @@
 			var repository = new Mock<IEventoRepository>();
 
 			publicador.Setup(p => p.Publicar(It.IsAny<IEnumerable<Track>>())).Throws(new Exception("Error intencional"));
-
+			repository.Setup(r => r.GetActivos()).Returns(new List<Evento>());
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
 		    var fechaInicio = DateTime.Now.ToUniversalTime();
@@ -102,7 +102,7 @@
 			var publicador2 = new Mock<IPublicador>();
 
 			var repository = new Mock<IEventoRepository>();
-
+			repository.Setup(r => r.GetActivos()).Returns(new List<Evento>());
 			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
@@ -463,5 +463,57 @@
 			Assert.Throws<ArgumentOutOfRangeException>(() => agenda.Publicar(evento.Id, 1, urlWiki, new TimeSpan(0, 0, 0)));
 			Assert.Throws<ArgumentOutOfRangeException>(() => agenda.Publicar(evento.Id, 1, urlWiki, new TimeSpan(0, 0, 59)));
 		}
+
+		[Test]
+		public void Verificar_que_no_se_puedan_agendar_dos_eventos_para_el_mismo_intervalo()
+		{
+			var publicador1 = new Mock<IPublicador>();
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository,
+									DefaultPatrocinadorRepository);
+			var fechaInicio = new DateTime(2011, 7, 1, 18, 00, 00);
+			var fechaTermino = fechaInicio.AddHours(2);
+
+			var r = agenda.Agendar("Conceptos de HTTP y Fiddler web debugger", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio,
+						   fechaTermino, string.Empty, TipoEvento.Van);
+			Assert.IsTrue(r.Succeful);
+
+			fechaInicio = new DateTime(2011, 7, 1, 05, 00, 00);
+			fechaTermino = fechaInicio.AddHours(2);
+			r = agenda.Agendar("Una primer van que NO se superpone",
+						   TestsHelper.GetOrCreatePonente("jjmontes"),
+						   fechaInicio,
+						   fechaTermino, string.Empty, TipoEvento.Van);
+			Assert.IsTrue(r.Succeful);
+			
+			r = agenda.Agendar("Otra van que se superpone",
+			                       TestsHelper.GetOrCreatePonente("jjmontes"),
+			                       fechaInicio,
+			                       fechaTermino, string.Empty, TipoEvento.Van);
+			Assert.IsFalse(r.Succeful);
+
+			fechaInicio = new DateTime(2011, 7, 1, 17, 00, 00);
+			fechaTermino = fechaInicio.AddHours(2);
+			r = agenda.Agendar("Otra van que se superpone",
+			                   TestsHelper.GetOrCreatePonente("jjmontes"),
+			                   fechaInicio,
+			                   fechaTermino, string.Empty, TipoEvento.Van);
+			Assert.IsFalse(r.Succeful);
+
+			fechaInicio = new DateTime(2011, 7, 1, 19, 00, 00);
+			fechaTermino = fechaInicio.AddHours(2);
+			r = agenda.Agendar("Otra van que se superpone",
+			                   TestsHelper.GetOrCreatePonente("jjmontes"),
+			                   fechaInicio,
+			                   fechaTermino, string.Empty, TipoEvento.Van);
+			Assert.IsFalse(r.Succeful);
+
+			fechaInicio = new DateTime(2011, 7, 1, 21, 00, 00);
+			fechaTermino = fechaInicio.AddHours(2);
+			r = agenda.Agendar("Una segunda van que NO se superpone",
+			                   TestsHelper.GetOrCreatePonente("jjmontes"),
+			                   fechaInicio,
+			                   fechaTermino, string.Empty, TipoEvento.Van);
+			Assert.IsTrue(r.Succeful);
+		}		
 	}
 }
\ No newline at end of file