view Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs @ 140:3639803112c6

Refactoring de la relación entre Evento y Estado
author nelopauselli
date Fri, 29 Jul 2011 16:30:53 -0300
parents c3573defd18f
children 2dbb15f4510f
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é");
				_personaRepository.Save(ponente);

				var usuario = new Persona("Nelo");
				_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();

			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, new DateTime(2010, 04, 17), 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), van.Fecha);

				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.Fecha, 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);
			}

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