view Agendas/trunk/src/Agendas.Tests/AgendarTests.cs @ 94:db4b1e2cae49

Cambio del nombre de la clase Ponente a Persona Se agrega la clase Cuenta para identificar cada una de las cuentas con que se puede autenticar una persona Alta Automatica de cuentas de twitter creando la persona
author Nelo@Kenia.neluz.int
date Sat, 04 Jun 2011 12:11:17 -0300
parents 26d0513a8410
children 83d76f6e0a3c
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.Linq;
using AltNetHispano.Agendas.Domain;
using AltNetHispano.Agendas.Domain.Exceptions;
using AltNetHispano.Agendas.Domain.Repositories;
using AltNetHispano.Agendas.Repositories.Memory;
using Moq;
using NUnit.Framework;

namespace AltNetHispano.Agendas.Tests
{
	[TestFixture]
	public class AgendarTests : TestBase
	{
		private const string urlInvitacion = "http://groups.google.com/group/altnet-hispano/browse_thread/thread/65d6d26eb381386e";

		[Test]
		public void CompositePublicador_constructor_parametro_null_debe_generar_ArgumentNullException()
		{
			Assert.Throws<ArgumentNullException>(() => new CompositePublicador(null));
		}

		[Test]
		public void Intentar_agendar_evento_donde_ocurre_una_excepcion_no_manejada()
		{
			var publicador = new Mock<IPublicador>();
			var repository = new Mock<IEventoRepository>();

			publicador.Setup(p => p.Publicar(It.IsAny<IEnumerable<Track>>())).Throws(new Exception("Error intencional"));

			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);

			Assert.Throws<Exception>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now, urlInvitacion));
			Assert.AreEqual(0, agenda.GetEventosAgendados().Count);

			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
		}

		[Test]
		public void Intentar_agendar_evento_sin_servicio_de_seguridad()
		{
			IdentityContext.Init(null, new PersonaRepository());

			var publicador = new Mock<IPublicador>();
			var repository = new Mock<IEventoRepository>();

			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);

			Assert.Throws<IdentityContextNotConfiguredException>(
				() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
					urlInvitacion));
			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
		}

		[Test]
		public void Intentar_agendar_evento_sin_usuario_autenticado()
		{
			SetCurrentUser(null, null);

			var publicador = new Mock<IPublicador>();
			var repository = new Mock<IEventoRepository>();

			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);

			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
				urlInvitacion));

			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(0));
			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
		}

		[Test]
		public void Intentar_agendar_evento_sin_ponente()
		{
			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);

			var r = agenda.Agendar("Van para publicar", string.Empty, DateTime.Now,
				urlInvitacion);

			Assert.IsFalse(r.Succeful);
		}

		[Test]
		public void Agendar_evento_con_multiples_publicadores()
		{
			var publicador1 = new Mock<IPublicador>();
			var publicador2 = new Mock<IPublicador>();

			var repository = new Mock<IEventoRepository>();

			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}),
															repository.Object, DefaultPersonaRepository);

			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
				urlInvitacion);

			publicador1.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
			publicador2.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(1));
		}

		[Test]
		public void Agendar_evento_correctamente()
		{
			var publicador = new Mock<IPublicador>();

			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository);

			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
				urlInvitacion);

			Assert.AreEqual(0, agenda.GetEventosPropuestos().Count);

			var eventos = agenda.GetEventosAgendados();
			Assert.AreEqual(1, eventos.Count);

			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));

			var evento = eventos[0];
			
			Assert.IsNotNull(evento.Persona);
			Assert.IsNotNull(evento.Persona.Eventos);
			Assert.AreEqual(1, evento.Persona.Eventos.Count());
			Assert.AreEqual(evento, evento.Persona.Eventos.First());

		}

		[Test]
		public void Agendar_y_modificar_evento()
		{
			var repository = DefaultEventoRepository;
			var publicador = new Mock<IPublicador>();

			var agenda = new Agenda(publicador.Object, repository, DefaultPersonaRepository);

			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
				urlInvitacion);

			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));

			var evento = repository.GetEventosConFecha().First();
			Assert.AreNotEqual(Guid.Empty, evento.Id);
			Assert.IsNotNull(evento.Fecha);

			DateTime fecha = evento.Fecha.Value.AddDays(7);
			agenda.ModificarEvento(evento.Id, "otro titulo", "otro ponente", fecha, urlInvitacion);

			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(2));

			evento = repository.GetEventosConFecha().First();
			Assert.AreEqual("otro titulo", evento.Titulo);
			Assert.AreEqual("otro ponente", evento.Persona.Nombre);
			Assert.AreEqual(fecha, evento.Fecha);

			var idEventoNoExistente = new Guid("99999999999999999999999999999999");
			Assert.Throws<EventoNotFoundException>(
				() => agenda.ModificarEvento(idEventoNoExistente, "algún título", "un ponente", DateTime.Now, urlInvitacion));
		}

		[Test, Ignore("Por ahora no existe el concepto de recordar")]
		public void Agendar_y_recordar_evento()
		{
			var publicador1 = new Mock<IPublicador>();
			var publicador2 = new Mock<IPublicador>();

			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}),
															DefaultEventoRepository, DefaultPersonaRepository);

			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
				urlInvitacion);

			var van = agenda.GetEventosAgendados().Single(v => v.Titulo == "Van para publicar");
			//agenda.Recordar(van.Id);

			publicador1.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
			publicador2.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
			//recordador1.Verify(r => r.Recordar(It.IsAny<Evento>()), Times.Exactly(1));
		}

		[Test]
		public void Agendar_evento_propuesto()
		{
			var publicador1 = new Mock<IPublicador>();
			var publicador2 = new Mock<IPublicador>();

			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
															DefaultEventoRepository, DefaultPersonaRepository);

			agenda.Proponer("Html 5", "jjmontes", urlInvitacion);
			Assert.AreEqual(1, agenda.GetEventosPropuestos().Count);
			Assert.AreEqual(0, agenda.GetEventosAgendados().Count);

			var publicado = agenda.GetEventosPropuestos().First();
			Assert.AreEqual(1, publicado.Tracks.Count());

			agenda.ModificarEvento(publicado.Id, "Html 5", "jjmontes", DateTime.Today.AddDays(5), urlInvitacion);
			Assert.AreEqual(0, agenda.GetEventosPropuestos().Count);
			Assert.AreEqual(1, agenda.GetEventosAgendados().Count);

			var agendado = agenda.GetEventosAgendados().First();
			Assert.AreSame(publicado, agendado);
			Assert.AreEqual(2, agendado.Tracks.Count());

			Assert.IsNotNull(agendado.Tracks.Where(t => t.Accion == Accion.Proponer).SingleOrDefault());
			Assert.IsNotNull(agendado.Tracks.Where(t => t.Accion == Accion.Agendar).SingleOrDefault());
		}
	}
}