view Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs @ 161:c1062de96845

Al publicar una agenda el nroOrden debe ser mayor a cero y urlWiki no vacio.
author juanjose.montesdeocaarbos
date Fri, 05 Aug 2011 21:54:43 -0300
parents 2dbb15f4510f
children 5c94b052d838
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();

			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);
			}
		}
	}
}