view Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrud.cs @ 298:9bc60d166c8a

Se corrigieron los tests por el cambio de Patrocinador, para que no persista el logo en disco. Se comentó el código de PatrocinadorApiController, que no se utiliza.
author juanjose.montesdeocaarbos
date Sun, 19 Feb 2012 16:00:38 -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);
			}
		}
	}
}