view Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs @ 185:2d02adb79322

Se agrega fecha de termino de un Evento y se incluye la hora a la fecha de inicio. Se modifica la propiedad Fecha del Evento, renombrandola FechaInicio. En el ModelView se agrega propiedades Duración y Hora del Evento cuando es Modificado, Nuevo y Agendado. Las fechas ingresadas son creadas en sistema UTC Queda pendiente Agregar duración a Google Calendar.
author alabra
date Tue, 09 Aug 2011 01:04:27 -0400
parents 5c94b052d838
children
line wrap: on
line source

using System;
using System.Linq;
using AltNetHispano.Agendas.Domain;
using AltNetHispano.Agendas.Domain.Repositories;
using NUnit.Framework;

namespace AltNetHispano.Agendas.Tests.Cruds
{
	public class EventoCrud
	{
		private readonly IEventoRepository _eventoRepository;
		private readonly Func<IDisposable> _requestEmulator;
		private readonly IPersonaRepository _personaRepository;

		public EventoCrud(Func<IEventoRepository> createEventoRepository, Func<IPersonaRepository> createPonenteRepository, Func<IDisposable> requestEmulator)
		{
			_eventoRepository = createEventoRepository.Invoke();
			_personaRepository = createPonenteRepository.Invoke();

			_requestEmulator = requestEmulator;
		}

		public Guid Create()
		{
			using (_requestEmulator.Invoke())
			{
			    var ponente = new Persona("Carlos Blé") {Twitter = "carlosble"};
				_personaRepository.Save(ponente);

			    var usuario = new Persona("Nelo") {Twitter = "nelopauselli"};
				_personaRepository.Save(usuario);

				var evento = Evento.Proponer("TDD - Diseño Basado en Ejemplos", ponente, string.Empty, TipoEvento.Van);
				evento.Tracks.First().LogAdd(new TrackLog(TrackLogPropietario.Twitter, "Mensaje", usuario, true));
					
				_eventoRepository.Save(evento);

				return evento.Id;
			}
		}

		public void Read()
		{
			Guid eventoId = Create();

			using (_requestEmulator.Invoke())
			{
				Evento van = _eventoRepository.Get(eventoId);

				Assert.IsNotNull(van);
				Assert.IsNotNull(van.Ponente);
				Assert.AreEqual("Carlos Blé", van.Ponente.Nombre);

				var track1 = van.Tracks.Where(t => t.Accion == Accion.Proponer).FirstOrDefault();
				Assert.IsNotNull(track1);
				Assert.AreEqual(van, track1.Evento);
				
				Assert.AreEqual("TDD - Diseño Basado en Ejemplos", van.Titulo);
			}
		}

		public void Update()
		{
			Guid eventoId = Create();
		    var fechaInicio = new DateTime(2010, 04, 17).ToUniversalTime();
		    var fechaTermino = fechaInicio.AddHours(2);

			using (_requestEmulator.Invoke())
			{
				Evento van = _eventoRepository.Get(eventoId);

				Assert.IsNotNull(van);

				van.CambiarTitulo("TDD & Ejemplos");

				var otroPonente = new Persona("José");
				_personaRepository.Save(otroPonente);

				van.Actualizar(otroPonente, fechaInicio, fechaTermino, null);

				_eventoRepository.Update(van);
			}

			using (_requestEmulator.Invoke())
			{
				Evento van = _eventoRepository.Get(eventoId);

				Assert.IsNotNull(van);
				Assert.IsNotNull(van.Ponente);
				Assert.AreEqual("José", van.Ponente.Nombre);
				Assert.AreEqual("TDD & Ejemplos", van.Titulo);
				Assert.AreEqual(new DateTime(2010, 04, 17).ToUniversalTime(), van.FechaInicio);
                Assert.AreEqual(fechaTermino, van.FechaTermino);

				var ponente1 = _personaRepository.GetByNombre("Carlos Blé");
				Assert.IsNotNull(ponente1);

				var ponente2 = _personaRepository.GetByNombre("José");
				Assert.IsNotNull(ponente2);

				Assert.AreEqual(1, van.Tracks.Where(t => t.Accion == Accion.Proponer).Count());
				Assert.AreEqual(1, van.Tracks.Where(t => t.Accion == Accion.Modificar).Count());
			}
		}

		public void Delete()
		{
			Guid eventoId = Create();

			using (_requestEmulator.Invoke())
			{
				Evento van = _eventoRepository.Get(eventoId);
				Assert.IsNotNull(van);

				_eventoRepository.Delete(van);
			}

			using (_requestEmulator.Invoke())
			{
				Evento van = _eventoRepository.Get(eventoId);

				Assert.IsNull(van);

				var ponente = _personaRepository.GetByNombre("Carlos Blé");
				
				Assert.IsNotNull(ponente);
			}
		}

		public void Workflow()
		{
			Guid eventoId = Create();

			using (_requestEmulator.Invoke())
			{
				Evento evento = _eventoRepository.Get(eventoId);
				Assert.AreEqual(EventoPropuestoState.GetInstance(), evento.Estado);

				evento.Agendar(evento.Ponente, evento.FechaInicio, evento.FechaTermino, null);
			}

			using (_requestEmulator.Invoke())
			{
				Evento evento = _eventoRepository.Get(eventoId);
				Assert.AreEqual(EventoAgendadoState.GetInstance(), evento.Estado);

				evento.Confirmar();
			}

			using (_requestEmulator.Invoke())
			{
				Evento evento = _eventoRepository.Get(eventoId);
				Assert.AreEqual(EventoConfirmadoState.GetInstance(), evento.Estado);

				evento.Publicar(1, null, new TimeSpan(0, 0, 0));
			}

			using (_requestEmulator.Invoke())
			{
				Evento evento = _eventoRepository.Get(eventoId);
				Assert.AreEqual(EventoPublicadoState.GetInstance(), evento.Estado);
			}
		}
	}
}