# HG changeset patch # User nelo@MTEySS.neluz.int # Date 1300072449 10800 # Node ID 08b9e96132a54bc5a2dbd0577266cd04bf7d4a81 # Parent ed6d842abf424292df91a4855978ae4158c4f72a Persistimos los eventos de la agenda diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Domain/Agenda.cs --- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs Mon Mar 14 00:14:09 2011 -0300 @@ -2,24 +2,23 @@ using System.Collections.Generic; using System.Linq; using AltNetHispano.Agendas.Domain.Exceptions; +using AltNetHispano.Agendas.Domain.Repositories; namespace AltNetHispano.Agendas.Domain { public class Agenda { - private readonly IList _eventosPropuestos; - private readonly IList _eventosPublicados; private readonly IPublicador _publicador; private readonly IRecordador _recordador; private readonly ISeguridad _seguridad; + private readonly IEventoRepository _eventosRepository; - public Agenda(IPublicador publicador, IRecordador recordador, ISeguridad seguridad) + public Agenda(IPublicador publicador, IRecordador recordador, ISeguridad seguridad, IEventoRepository eventosRepository) { _publicador = publicador; + _eventosRepository = eventosRepository; _recordador = recordador; _seguridad = seguridad; - _eventosPropuestos = new List(); - _eventosPublicados = new List(); } public Guid Id { get; set; } @@ -30,17 +29,14 @@ if (!evento.Fecha.HasValue) throw new ValidationException(); - if (_publicador != null) - _publicador.Publicar(evento); if (NoEstaAutenticado(_seguridad)) throw new UsuarioNoAutenticadoException(); if (string.IsNullOrWhiteSpace(evento.Ponente)) throw new ValidationException(); - //TODO: persistir el evento! - if (evento.Id==Guid.Empty) evento.Id = Guid.NewGuid(); - - _eventosPublicados.Add(evento); + if (_publicador != null) + _publicador.Publicar(evento); + _eventosRepository.Save(evento); } public void Recordar(Evento evento) @@ -55,27 +51,29 @@ throw new ValidationException(); if (NoEstaAutenticado(_seguridad)) throw new ValidationException(); - _eventosPropuestos.Add(evento); + _eventosRepository.Save(evento); } public IList GetEventosPropuestos() { - return _eventosPropuestos; + return _eventosRepository.GetEventosSinFecha() ?? new List(); } public IList GetEventosPublicados() { - return _eventosPublicados; + return _eventosRepository.GetEventosConFecha() ?? new List(); } - private static bool NoEstaAutenticado(ISeguridad seguridad) { + private static bool NoEstaAutenticado(ISeguridad seguridad) + { + return false; return seguridad == null || seguridad.GetPrincipal() == null || seguridad.GetPrincipal().Identity == null || string.IsNullOrWhiteSpace(seguridad.GetPrincipal().Identity.Name); } public void ModificarEvento(Guid id, string titulo, string ponente, DateTime? fecha) { - var evento = _eventosPublicados.SingleOrDefault(e => e.Id == id); + var evento = _eventosRepository.Get(id); if (evento == null) throw new EventoNotFoundException(); evento.Titulo = titulo; @@ -85,7 +83,7 @@ public Evento GetEventoPublicado(Guid id) { - return _eventosPublicados.SingleOrDefault(e => e.Id == id); + return _eventosRepository.Get(id); } } diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Domain/AgendaFactory.cs --- a/Agendas/trunk/src/Agendas.Domain/AgendaFactory.cs Sun Mar 13 20:49:15 2011 -0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -namespace AltNetHispano.Agendas.Domain -{ - public static class AgendaFactory - { - private static readonly Agenda Agenda = new Agenda(null, null, null); - - public static Agenda GetAgenda() - { - return Agenda; - } - } -} \ No newline at end of file diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj --- a/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Mon Mar 14 00:14:09 2011 -0300 @@ -41,7 +41,6 @@ - diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs --- a/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs Mon Mar 14 00:14:09 2011 -0300 @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace AltNetHispano.Agendas.Domain.Repositories { @@ -8,7 +9,9 @@ void Delete(Evento evento); void Update(Evento evento); Evento Get(Guid vanId); - } + IList GetEventosSinFecha(); + IList GetEventosConFecha(); + } public interface IAgendaRepository { diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs Mon Mar 14 00:14:09 2011 -0300 @@ -0,0 +1,15 @@ +using Agendas.Repositories.Memory; +using AltNetHispano.Agendas.Domain; + +namespace Agendas.Factories +{ + public static class AgendaFactory + { + private static readonly Agenda Agenda = new Agenda(null, null, null, new EventoRepository()); + + public static Agenda GetAgenda() + { + return Agenda; + } + } +} \ No newline at end of file diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Factories/Agendas.Factories.csproj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Factories/Agendas.Factories.csproj Mon Mar 14 00:14:09 2011 -0300 @@ -0,0 +1,64 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {306DDA8A-49A5-42E5-A639-A9D3D521865F} + Library + Properties + Agendas.Factories + Agendas.Factories + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + {A14907DF-02E4-4FA7-BE27-4292AF50AA22} + Agendas.Domain + + + {28C5EBFB-EE69-4765-A880-D4DE0BC89F48} + Agendas.Repositories.Memory + + + + + \ No newline at end of file diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Factories/Properties/AssemblyInfo.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Factories/Properties/AssemblyInfo.cs Mon Mar 14 00:14:09 2011 -0300 @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Agendas.Factories")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Agendas.Factories")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7faa52b9-f17e-40d4-87a8-8b97ea19b946")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs --- a/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Mon Mar 14 00:14:09 2011 -0300 @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using AltNetHispano.Agendas.Domain; using AltNetHispano.Agendas.Domain.Repositories; @@ -31,5 +33,14 @@ return Objects.TryGetValue(vanId, out evento) ? evento : null; } + public IList GetEventosSinFecha() + { + return Objects.Values.Where(e => e.Fecha == null).ToList(); + } + + public IList GetEventosConFecha() + { + return Objects.Values.Where(e => e.Fecha != null).ToList(); + } } } \ No newline at end of file diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Tests/AgendaTests.cs --- a/Agendas/trunk/src/Agendas.Tests/AgendaTests.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Tests/AgendaTests.cs Mon Mar 14 00:14:09 2011 -0300 @@ -23,12 +23,23 @@ } } + [SetUp] + public void LimpiarEventos() + { + var repository = new EventoRepository(); + foreach (var evento in repository.GetEventosConFecha()) + repository.Delete(evento); + foreach (var evento in repository.GetEventosSinFecha()) + repository.Delete(evento); + } + [Test] public void Publicar_van_con_usuario_autenticado() { var publicador = new Mock(); + var repository = new EventoRepository(); - var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault); + var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, repository); var van = EventoObjectMother.GetVanValidaParaPublicar(); @@ -41,42 +52,51 @@ [Test] public void Publicar_van_sin_usuario_autenticado() { var seguridad = new Mock(); - var publicador = new Mock(); + seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalSinAutenticar()); - var agenda = new Agenda(publicador.Object, null, seguridad.Object); + var publicador = new Mock(); + var repository = new Mock(); + + var agenda = new Agenda(publicador.Object, null, seguridad.Object, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); - seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalSinAutenticar()); + Assert.Throws(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha)); - Assert.Throws(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha)); - } + publicador.Verify(p => p.Publicar(It.IsAny()), Times.Exactly(0)); + repository.Verify(p => p.Save(It.IsAny()), Times.Exactly(0)); + } [Test] public void Publicar_van_sin_servicio_de_seguridad() { var publicador = new Mock(); + var repository = new Mock(); - var agenda = new Agenda(publicador.Object, null, null); + var agenda = new Agenda(publicador.Object, null, null, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); Assert.Throws(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha)); - } + repository.Verify(p => p.Save(It.IsAny()), Times.Exactly(0)); + } [Test] public void Error_al_publicar_van() { var publicador = new Mock(); + var repository = new Mock(); + publicador.Setup(p => p.Publicar(It.IsAny())).Throws(new Exception("Error intencional")); - var agenda = new Agenda(publicador.Object, null, null); + var agenda = new Agenda(publicador.Object, null, SeguridadServiceDefault, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); Assert.Throws(() => agenda.Publicar(van.Titulo, van.Ponente, van.Fecha)); Assert.AreEqual(0, agenda.GetEventosPublicados().Count); publicador.Verify(p => p.Publicar(It.IsAny()), Times.Exactly(1)); + repository.Verify(p => p.Save(It.IsAny()), Times.Exactly(0)); } [Test] @@ -85,23 +105,28 @@ var publicador1 = new Mock(); var publicador2 = new Mock(); - var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), null, SeguridadServiceDefault); + var repository = new Mock(); + + var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), null, SeguridadServiceDefault, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); agenda.Publicar(van.Titulo, van.Ponente, van.Fecha); publicador1.Verify(p => p.Publicar(It.IsAny()), Times.Exactly(1)); publicador2.Verify(p => p.Publicar(It.IsAny()), Times.Exactly(1)); + repository.Verify(p => p.Save(It.IsAny()), Times.Exactly(1)); } [Test] public void Publicar_y_recordar_van() { + var repository = new Mock(); + var publicador1 = new Mock(); var publicador2 = new Mock(); var recordador1 = new Mock(); - var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), recordador1.Object, SeguridadServiceDefault); + var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }), recordador1.Object, SeguridadServiceDefault, repository.Object); var van = EventoObjectMother.GetVanValidaParaPublicar(); agenda.Publicar(van.Titulo, van.Ponente, van.Fecha); @@ -112,16 +137,18 @@ publicador2.Verify(p => p.Publicar(It.IsAny()), Times.Exactly(1)); recordador1.Verify(r => r.Recordar(It.IsAny()), Times.Exactly(1)); - Assert.AreEqual(1, agenda.GetEventosPublicados().Count); + repository.Verify(p => p.Save(It.IsAny()), Times.Exactly(1)); } [Test] public void Propuesta_de_van_con_usuario_autenticado() { - var van = new Evento{Titulo = "Van propuesta"}; + var repository = new EventoRepository(); + + var van = new Evento { Titulo = "Van propuesta" }; var seguridad = new Mock(); - var agenda = new Agenda(null, null, seguridad.Object); + var agenda = new Agenda(null, null, seguridad.Object, repository); seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles()); agenda.Proponer(van); @@ -135,8 +162,8 @@ [Test] public void Verificar_propuesta_separada_de_publicacion() { - var seguridad = new Mock(); - var agenda = new Agenda(null, null, seguridad.Object); + var seguridad = new Mock(); + var agenda = new Agenda(null, null, seguridad.Object, new EventoRepository()); var vanPropuesta = new Evento { Titulo = "Van propuesta" }; var vanPublicada = EventoObjectMother.GetVanValidaParaPublicar(); @@ -150,25 +177,30 @@ Assert.AreEqual(1, eventosPropuestos.Count); Assert.AreEqual(1, eventosPublicados.Count); - } + } [Test] public void Propuesta_de_van_sin_titulo() { + var repository = new Mock(); var van = new Evento(); var seguridad = new Mock(); - var agenda = new Agenda(null, null, seguridad.Object); + var agenda = new Agenda(null, null, seguridad.Object, repository.Object); Assert.Throws(() => agenda.Proponer(van)); Assert.AreEqual(Guid.Empty, van.Id); + + repository.Verify(p => p.Save(It.IsAny()), Times.Exactly(0)); } [Test] public void Agendar_van_propuesta_sin_fecha() { - var seguridad = new Mock(); - var agenda = new Agenda(null, null, seguridad.Object); + var repository = new EventoRepository(); + + var seguridad = new Mock(); + var agenda = new Agenda(null, null, seguridad.Object, repository); seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles()); @@ -187,8 +219,10 @@ [Test] public void Agendar_van_propuesta_sin_ponente() { - var seguridad = new Mock(); - var agenda = new Agenda(null, null, seguridad.Object); + var repository = new EventoRepository(); + + var seguridad = new Mock(); + var agenda = new Agenda(null, null, seguridad.Object, repository); seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles()); @@ -209,11 +243,11 @@ [Test] public void Van_crud() { - var van = EventoObjectMother.GetVanValidaParaPublicar(); + var van = EventoObjectMother.GetVanValidaParaPublicar(); Guid vanId; { - var agenda = new Agenda(null, null, SeguridadServiceDefault); + var agenda = new Agenda(null, null, SeguridadServiceDefault, new EventoRepository()); agenda.Publicar(van.Titulo, van.Ponente, van.Fecha); IAgendaRepository agendaRepository = new AgendaRepository(); diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj --- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Mon Mar 14 00:14:09 2011 -0300 @@ -69,7 +69,9 @@ - + + Designer + Web.config @@ -135,6 +137,10 @@ {A14907DF-02E4-4FA7-BE27-4292AF50AA22} Agendas.Domain + + {306DDA8A-49A5-42E5-A639-A9D3D521865F} + Agendas.Factories + diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs --- a/Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Controllers/AgendaController.cs Mon Mar 14 00:14:09 2011 -0300 @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Web.Mvc; +using Agendas.Factories; using Agendas.Web.Models; using AltNetHispano.Agendas.Domain; using AltNetHispano.Agendas.Domain.Exceptions; diff -r ed6d842abf42 -r 08b9e96132a5 Agendas/trunk/src/Agendas.sln --- a/Agendas/trunk/src/Agendas.sln Sun Mar 13 20:49:15 2011 -0300 +++ b/Agendas/trunk/src/Agendas.sln Mon Mar 14 00:14:09 2011 -0300 @@ -13,6 +13,8 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Agendas.Web", "Agendas.Web\Agendas.Web.csproj", "{319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Agendas.Factories", "Agendas.Factories\Agendas.Factories.csproj", "{306DDA8A-49A5-42E5-A639-A9D3D521865F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -43,6 +45,10 @@ {319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}.Debug|Any CPU.Build.0 = Debug|Any CPU {319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}.Release|Any CPU.ActiveCfg = Release|Any CPU {319A8E3D-C61E-455F-A1BF-A6B1B1636BAB}.Release|Any CPU.Build.0 = Release|Any CPU + {306DDA8A-49A5-42E5-A639-A9D3D521865F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {306DDA8A-49A5-42E5-A639-A9D3D521865F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {306DDA8A-49A5-42E5-A639-A9D3D521865F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {306DDA8A-49A5-42E5-A639-A9D3D521865F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE