view Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs @ 62:c40b97bbed01

Verificando persistencia de Ponentes y Tracks en tests de CRUD
author nelopauselli
date Tue, 17 May 2011 01:55:19 -0300
parents 02e163f2ca38
children 96d7609f2e08
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 IPonenteRepository _ponenteRepository;

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

			_requestEmulator = requestEmulator;
		}

		public Guid Create()
		{
			using (_requestEmulator.Invoke())
			{
				var ponente = new Ponente("Carlos Blé");
				_ponenteRepository.Save(ponente);

				var van = Evento.Proponer("TDD - Diseño Basado en Ejemplos", ponente);
				_eventoRepository.Save(van);

				return van.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);
				Assert.AreEqual(1, van.Ponente.Eventos.Count());
				Assert.AreEqual(van, van.Ponente.Eventos.First());

				Assert.AreEqual(1, van.Tracks.Where(t => t.Accion == Accion.Proponer).Count());
				
				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 Ponente("José");
				_ponenteRepository.Save(otroPonente);

				van.Actualizar(otroPonente, new DateTime(2010, 04, 17));

				_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 = _ponenteRepository.GetByNombre("Carlos Blé");
				Assert.IsNotNull(ponente1);
				Assert.AreEqual(0, ponente1.Eventos.Count());

				var ponente2 = _ponenteRepository.GetByNombre("José");
				Assert.IsNotNull(ponente2);
				Assert.AreEqual(1, ponente2.Eventos.Count());

				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 = _ponenteRepository.GetByNombre("Carlos Blé");
				
				Assert.IsNotNull(ponente);
				Assert.AreEqual(0, ponente.Eventos.Count());
			}
		}
	}
}