view Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrud.cs @ 255:50442a103281

Ticket #190: Que el listado de Personas venga ordenado por Nombre.
author juanjose.montesdeocaarbos
date Mon, 17 Oct 2011 08:54:45 -0300
parents 51faeabfb9d9
children
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.Linq;
using Agendas.Repositories.Tests.Infraestructure;
using AltNetHispano.Agendas.Domain;
using AltNetHispano.Agendas.Domain.Repositories;
using Moq;
using NUnit.Framework;

namespace Agendas.Repositories.Tests
{
	public abstract class EventoCrud<T> where T : IInfraestrutureFactory, new()
	{
		private readonly IEventoRepository _eventoRepository;
		private readonly Func<IDisposable> _requestEmulator;
		private readonly IPersonaRepository _personaRepository;

		protected EventoCrud()
		{
			var infraestrutureFactory = new T();

			_eventoRepository = infraestrutureFactory.GetEventoRepository();
			_personaRepository = infraestrutureFactory.GetPonenteRepository();
			_requestEmulator = infraestrutureFactory.GetRequestEmulator();
		}

		[SetUp]
		public void SetearUsuario()
		{
			var seguridad = new Mock<ISeguridad>();
			seguridad.Setup(s => s.GetUserName()).Returns("neluz");
			IdentityContext.Init(seguridad.Object, _personaRepository);
		}

		[Test]
		public void Create()
		{
			Assert.AreNotEqual(Guid.Empty, CreateEvento());
		}

		private Guid CreateEvento()
		{
			using (_requestEmulator.Invoke())
			{
				var colaboradores = new[]
				                    	{
											new Persona("Carlos Blé") {Twitter = "carlosble"},
				                    		new Persona("Alejandro Labra") {Twitter = "alejandrolabra"},
				                    		new Persona("Carlos Peix") {Twitter = "carlospeix"}
				                    	};

				foreach (var colaborador in colaboradores)
					_personaRepository.Save(colaborador);

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

				var evento = Evento.Proponer("TDD - Diseño Basado en Ejemplos", string.Empty, TipoEvento.Van);
				evento.ActualizarPonentes(colaboradores, null);

				evento.Tracks.First().LogAdd(new TrackLog(TrackLogPropietario.Twitter, "Mensaje", usuario, true));
					
				_eventoRepository.Save(evento);

				return evento.Id;
			}
		}

		[Test]
		public void Read()
		{
			Guid eventoId = CreateEvento();

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

				Assert.IsNotNull(van);
				Assert.IsNotNull(van.Ponentes);
				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Carlos Blé"));
				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Alejandro Labra"));
				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Carlos Peix"));
				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);

				Assert.AreEqual(3, van.Ponentes.Count());
			}
		}

		[Test]
		public void Update()
		{
			Guid eventoId = CreateEvento();
		    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(fechaInicio, fechaTermino, null);
				
				var ponentes = new List<Persona>(van.Ponentes);
				ponentes.RemoveAll(p => p.Nombre == "Carlos Blé");
				ponentes.Add(otroPonente);

				van.ActualizarPonentes(ponentes, null);

				_eventoRepository.Update(van);
			}

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

				Assert.IsNotNull(van);
				
				Assert.IsFalse(van.Ponentes.Any(p => p.Nombre == "Carlos Blé"));
				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Alejandro Labra"));
				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Carlos Peix"));
				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "José")); 
				
				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());
			}
		}

		[Test]
		public void Delete()
		{
			Guid eventoId = CreateEvento();

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

		[Test]
		public void Workflow()
		{
			Guid eventoId = CreateEvento();

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

				evento.Agendar(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);
			}
		}
	}
}