changeset 287:eeca9ddb330a

BUG: Los Patrocinadores quedaban asociados a un único evento. Se armó un test que lo demuestra y se modificó el modelo de la base de datos.
author juanjose.montesdeocaarbos
date Mon, 02 Jan 2012 19:44:41 -0300
parents a8f7c41e3b47
children a6037c6c88d8 8b0c62c255cd
files Agendas/trunk/db/v1.1/02 - Patrocinadores.sql Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs Agendas/trunk/src/Agendas.Repositories.Tests/Agendas.Repositories.Tests.csproj Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrudMemory.cs Agendas/trunk/src/Agendas.Repositories.Tests/Infraestructure/NhHelperTest.cs Agendas/trunk/src/Agendas.Repositories.Tests/PatrocinadorEventoMemoryTests.cs Agendas/trunk/src/Agendas.Repositories.Tests/PatrocinadorEventoNhTests.cs Agendas/trunk/src/Agendas.Repositories.Tests/PatrocinadorEventoTests.cs Agendas/trunk/src/Agendas.Repositories.Tests/WorkflowMemoryTests.cs Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj Agendas/trunk/src/Agendas.Tests/Eventos_y_patrocinadores_tests.cs
diffstat 11 files changed, 235 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/db/v1.1/02 - Patrocinadores.sql	Mon Jan 02 15:51:19 2012 -0300
+++ b/Agendas/trunk/db/v1.1/02 - Patrocinadores.sql	Mon Jan 02 19:44:41 2012 -0300
@@ -1,14 +1,19 @@
-/****** Object:  Table [dbo].[Patrocinador]    Script Date: 11/30/2011 07:46:21 ******/
-IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Patrocinador_Evento]') AND parent_object_id = OBJECT_ID(N'[dbo].[Patrocinador]'))
-ALTER TABLE [dbo].[Patrocinador] DROP CONSTRAINT [FK_Patrocinador_Evento]
+IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Patrocinadores_Evento]') AND parent_object_id = OBJECT_ID(N'[dbo].[Patrocinadores]'))
+ALTER TABLE [dbo].[Patrocinadores] DROP CONSTRAINT [FK_Patrocinadores_Evento]
 GO
 
-/****** Object:  Table [dbo].[Patrocinador]    Script Date: 11/30/2011 07:46:35 ******/
+IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Patrocinadores_Patrocinador]') AND parent_object_id = OBJECT_ID(N'[dbo].[Patrocinadores]'))
+ALTER TABLE [dbo].[Patrocinadores] DROP CONSTRAINT [FK_Patrocinadores_Patrocinador]
+GO
+
+IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Patrocinadores]') AND type in (N'U'))
+DROP TABLE [dbo].[Patrocinadores]
+GO
+
 IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Patrocinador]') AND type in (N'U'))
 DROP TABLE [dbo].[Patrocinador]
 GO
 
-
 SET ANSI_NULLS ON
 GO
 
@@ -22,8 +27,6 @@
 	[Id] [uniqueidentifier] NOT NULL,
 	[Nombre] [nvarchar](255) NULL,
 	[Logo] [varbinary](8000) NULL,
-	[evento_key] [uniqueidentifier] NULL,
-	[idx] [int] NULL,
 PRIMARY KEY CLUSTERED 
 (
 	[Id] ASC
@@ -35,11 +38,31 @@
 SET ANSI_PADDING OFF
 GO
 
-ALTER TABLE [dbo].[Patrocinador]  WITH CHECK ADD  CONSTRAINT [FK_Patrocinador_Evento] FOREIGN KEY([evento_key])
+SET ANSI_NULLS ON
+GO
+SET QUOTED_IDENTIFIER ON
+GO
+CREATE TABLE [dbo].[Patrocinadores](
+	[evento_key] [uniqueidentifier] NOT NULL,
+	[elt] [uniqueidentifier] NOT NULL,
+	[idx] [int] NOT NULL,
+PRIMARY KEY CLUSTERED 
+(
+	[evento_key] ASC,
+	[idx] ASC
+)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
+) ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[Patrocinadores]  WITH CHECK ADD  CONSTRAINT [FK_Patrocinadores_Evento] FOREIGN KEY([evento_key])
 REFERENCES [dbo].[Evento] ([Id])
 GO
 
-ALTER TABLE [dbo].[Patrocinador] CHECK CONSTRAINT [FK_Patrocinador_Evento]
+ALTER TABLE [dbo].[Patrocinadores] CHECK CONSTRAINT [FK_Patrocinadores_Evento]
 GO
 
-
+ALTER TABLE [dbo].[Patrocinadores]  WITH CHECK ADD  CONSTRAINT [FK_Patrocinadores_Patrocinador] FOREIGN KEY([elt])
+REFERENCES [dbo].[Patrocinador] ([Id])
+GO
+ALTER TABLE [dbo].[Patrocinadores] CHECK CONSTRAINT [FK_Patrocinadores_Patrocinador]
+GO
--- a/Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs	Mon Jan 02 15:51:19 2012 -0300
+++ b/Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs	Mon Jan 02 19:44:41 2012 -0300
@@ -42,6 +42,7 @@
 			orm.TablePerClass<TrackLog>();
 			orm.TablePerClass<Cuenta>();
 			orm.TablePerClass<Patrocinador>();
+			orm.ManyToMany<Evento, Patrocinador>();
 
 			orm.Cascade<Evento, Persona>(Cascade.None);
 			orm.Cascade<Persona, Evento>(Cascade.None);
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/Agendas.Repositories.Tests.csproj	Mon Jan 02 15:51:19 2012 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/Agendas.Repositories.Tests.csproj	Mon Jan 02 19:44:41 2012 -0300
@@ -69,6 +69,9 @@
     <Compile Include="PatrocinadorCrud.cs" />
     <Compile Include="PatrocinadorCrudMemoryTests.cs" />
     <Compile Include="PatrocinadorCrudNhTests.cs" />
+    <Compile Include="PatrocinadorEventoMemoryTests.cs" />
+    <Compile Include="PatrocinadorEventoNhTests.cs" />
+    <Compile Include="PatrocinadorEventoTests.cs" />
     <Compile Include="PersonaCrud.cs" />
     <Compile Include="PersonaCrudMemoryTests.cs" />
     <Compile Include="PersonaCrudNhTests.cs" />
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrudMemory.cs	Mon Jan 02 15:51:19 2012 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrudMemory.cs	Mon Jan 02 19:44:41 2012 -0300
@@ -12,6 +12,7 @@
 		{
 			EventoRepository.Clear();
 			PersonaRepository.Clear();
+			PatrocinadorRepository.Clear();
 		}
 
 	}
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/Infraestructure/NhHelperTest.cs	Mon Jan 02 15:51:19 2012 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/Infraestructure/NhHelperTest.cs	Mon Jan 02 19:44:41 2012 -0300
@@ -10,8 +10,10 @@
 
 			var session = sf.OpenStatelessSession();
 			session.CreateSQLQuery("DELETE FROM Ponentes").ExecuteUpdate();
+			session.CreateSQLQuery("DELETE FROM Patrocinadores").ExecuteUpdate();
+			session.CreateSQLQuery("DELETE FROM Evento").ExecuteUpdate();
 			session.CreateSQLQuery("DELETE FROM Patrocinador").ExecuteUpdate();
-			session.CreateSQLQuery("DELETE FROM Evento").ExecuteUpdate();
+			session.CreateSQLQuery("DELETE FROM Roles").ExecuteUpdate();
 			session.CreateSQLQuery("DELETE FROM Persona").ExecuteUpdate();
 		}
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/PatrocinadorEventoMemoryTests.cs	Mon Jan 02 19:44:41 2012 -0300
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Agendas.Repositories.Tests.Infraestructure;
+using AltNetHispano.Agendas.Repositories.Memory;
+using NUnit.Framework;
+
+namespace Agendas.Repositories.Tests
+{
+	[TestFixture]
+	public class PatrocinadorEventoMemoryTests : PatrocinadorEventoTests<MemoryInfraestrutureFactory>
+	{
+		[SetUp]
+		public void BorrarRepositorios()
+		{
+			EventoRepository.Clear();
+			PersonaRepository.Clear();
+			PatrocinadorRepository.Clear();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/PatrocinadorEventoNhTests.cs	Mon Jan 02 19:44:41 2012 -0300
@@ -0,0 +1,15 @@
+using Agendas.Repositories.Tests.Infraestructure;
+using NUnit.Framework;
+
+namespace Agendas.Repositories.Tests
+{
+	[TestFixture]
+	public class PatrocinadorEventoNhTests : PatrocinadorEventoTests<NhInfraestrutureFactory>
+	{
+		[SetUp]
+		public void BorrarRepositorios()
+		{
+			NhHelperTest.CleanDb();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/PatrocinadorEventoTests.cs	Mon Jan 02 19:44:41 2012 -0300
@@ -0,0 +1,131 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+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 PatrocinadorEventoTests<T> where T : IInfraestrutureFactory, new()
+	{
+		private readonly IPersonaRepository _personaRepository;
+		private readonly IEventoRepository _eventoRepository;
+		private readonly IPatrocinadorRepository _patrocinadorRepository;
+		private readonly Func<IDisposable> _requestEmulator;
+
+		private Guid _apressId;
+		private Guid _eventoUnoId;
+		private Guid _eventoDosId;
+		private Agenda _agenda;
+		private readonly TestsHelper _testsHelper;
+
+		protected PatrocinadorEventoTests()
+		{
+			var infraestrutureFactory = new T();
+
+			_eventoRepository = infraestrutureFactory.GetEventoRepository();
+			_personaRepository = infraestrutureFactory.GetPonenteRepository();
+			_patrocinadorRepository = infraestrutureFactory.GetPatrocinadorRepository();
+			_requestEmulator = infraestrutureFactory.GetRequestEmulator();
+
+			_testsHelper = new TestsHelper(_personaRepository, _patrocinadorRepository);
+		}
+
+		[SetUp]
+		public void SetearUsuario()
+		{
+			var seguridad = new Mock<ISeguridad>();
+			seguridad.Setup(s => s.GetUserName()).Returns("neluz");
+			IdentityContext.Init(seguridad.Object, _personaRepository);
+		}
+
+		private Guid CrearEvento(string[] nombrePonentes, string nombreEvento, DateTime fechaInicio, DateTime fechaTermino)
+		{
+			Evento evento;
+			var ponentes = new Guid[nombrePonentes.Length];
+			for (var nroPonente = 0; nroPonente < nombrePonentes.Length; nroPonente++)
+			{
+				using (_requestEmulator.Invoke())
+				{
+					ponentes[nroPonente] = _testsHelper.GetOrCreatePonente(nombrePonentes[nroPonente]);
+				}
+			}
+
+			using (_requestEmulator.Invoke())
+			{
+				_agenda.Agendar(nombreEvento, ponentes, fechaInicio, fechaTermino, null, TipoEvento.Van);
+			}
+			using (_requestEmulator.Invoke())
+			{
+				evento = _eventoRepository.GetActivos().First(e => e.Titulo == nombreEvento);
+			}
+			return evento.Id;
+		}
+
+		private Guid CrearPatrocinador(string nombre, string images)
+		{
+			var patrocinador = new Patrocinador(nombre);
+			patrocinador.LoadLogo(images);
+			using (_requestEmulator.Invoke())
+			{
+				_patrocinadorRepository.Save(patrocinador);
+			}
+			return patrocinador.Id;
+		}
+
+		protected void CrearDatos()
+		{
+			var fechaInicio = DateTime.Today.AddDays(7).ToUniversalTime();
+			var fechaTermino = fechaInicio.AddHours(2);
+			_agenda = new Agenda(null, _eventoRepository, _personaRepository, _patrocinadorRepository);
+
+			_apressId = CrearPatrocinador("Apress", "images/apress.gif");
+			_eventoUnoId = CrearEvento(new[] { "Carlos Peix", "Nelo Pauselli" }, "ADFS", fechaInicio, fechaTermino);
+			_eventoDosId = CrearEvento(new[] { "Carlos Peix", "Nelo Pauselli" }, "ADFS: Segunda parte.", fechaInicio.AddDays(3), fechaTermino.AddDays(3));
+		}
+
+		[Test]
+		public void MismoPatrocinadorEnDosEventosDiferentes()
+		{
+			CrearDatos();
+			Evento eventoUno, eventoDos;
+			{
+				using (_requestEmulator.Invoke())
+				{
+					_agenda.IndicarPatrocinadores(_eventoUnoId, new[] {_apressId});
+				}
+				using (_requestEmulator.Invoke())
+				{
+					eventoUno = _eventoRepository.GetActivos().First(e => e.Id == _eventoUnoId);
+					Assert.AreEqual(1, eventoUno.Patrocinadores.Count());
+				}
+			}
+
+			{
+				using (_requestEmulator.Invoke())
+				{
+					_agenda.IndicarPatrocinadores(_eventoDosId, new[] {_apressId});
+				}
+				using (_requestEmulator.Invoke())
+				{
+					eventoDos = _eventoRepository.GetActivos().First(e => e.Id == _eventoDosId);
+					Assert.AreEqual(1, eventoDos.Patrocinadores.Count());
+				}
+			}
+			using (_requestEmulator.Invoke())
+			{
+				eventoDos = _eventoRepository.GetActivos().First(e => e.Id == _eventoDosId);
+				Assert.AreEqual(1, eventoDos.Patrocinadores.Count());
+			}
+			using (_requestEmulator.Invoke())
+			{
+				eventoUno = _eventoRepository.GetActivos().First(e => e.Id == _eventoUnoId);
+				Assert.AreEqual(1, eventoUno.Patrocinadores.Count());
+			}
+		}
+	}
+}
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/WorkflowMemoryTests.cs	Mon Jan 02 15:51:19 2012 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/WorkflowMemoryTests.cs	Mon Jan 02 19:44:41 2012 -0300
@@ -12,6 +12,7 @@
 		{
 			EventoRepository.Clear();
 			PersonaRepository.Clear();
+			PatrocinadorRepository.Clear();
 		}
 
 	}
--- a/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Mon Jan 02 15:51:19 2012 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Mon Jan 02 19:44:41 2012 -0300
@@ -86,6 +86,10 @@
       <Project>{28C5EBFB-EE69-4765-A880-D4DE0BC89F48}</Project>
       <Name>Agendas.Repositories.Memory</Name>
     </ProjectReference>
+    <ProjectReference Include="..\Agendas.Repositories.NHibernate\Agendas.Repositories.NHibernate.csproj">
+      <Project>{0973DF44-3B90-4D2A-B579-C64C93B6C853}</Project>
+      <Name>Agendas.Repositories.NHibernate</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config">
--- a/Agendas/trunk/src/Agendas.Tests/Eventos_y_patrocinadores_tests.cs	Mon Jan 02 15:51:19 2012 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Eventos_y_patrocinadores_tests.cs	Mon Jan 02 19:44:41 2012 -0300
@@ -11,23 +11,27 @@
 	{
 		private Guid _apressId;
 		private Guid _jetbrainsId;
-		private Guid _eventoId;
+		private Guid _eventoUnoId;
+		private Guid _eventoDosId;
 		private Agenda _agenda;
 
 		[SetUp]
 		public void CrearDatos()
 		{
+			var fechaInicio = DateTime.Today.AddDays(7).ToUniversalTime();
+			var fechaTermino = fechaInicio.AddHours(2); 
 			_agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
 			_apressId = CrearPatrocinador("Apress", "images/apress.gif");
 			_jetbrainsId = CrearPatrocinador("jetbrains", "images/jetbrains.png");
-			_eventoId = CrearEvento();
+			_eventoUnoId = CrearEvento(new[] { "Carlos Peix", "Nelo Pauselli" }, "ADFS", fechaInicio, fechaTermino);
+			_eventoDosId = CrearEvento(new[] { "Carlos Peix", "Nelo Pauselli" }, "ADFS: Segunda parte.", fechaInicio.AddDays(3), fechaTermino.AddDays(3));
 		}
 
 		[Test]
 		public void Indicar_patrociadores()
 		{
-			_agenda.IndicarPatrocinadores(_eventoId, new[] { _apressId, _jetbrainsId });
+			_agenda.IndicarPatrocinadores(_eventoUnoId, new[] { _apressId, _jetbrainsId });
 
 			var evento = DefaultEventoRepository.GetActivos().First();
 			Assert.AreNotEqual(Guid.Empty, evento.Id);
@@ -42,7 +46,7 @@
 		public void Agregar_patrociador()
 		{
 			{
-				_agenda.IndicarPatrocinadores(_eventoId, new[] { _apressId });
+				_agenda.IndicarPatrocinadores(_eventoUnoId, new[] { _apressId });
 
 				var evento = DefaultEventoRepository.GetActivos().First();
 				Assert.IsTrue(evento.Patrocinadores.Any(p => p.Nombre == "Apress"));
@@ -50,7 +54,7 @@
 			}
 
 			{
-				_agenda.IndicarPatrocinadores(_eventoId, new[] { _apressId, _jetbrainsId });
+				_agenda.IndicarPatrocinadores(_eventoUnoId, new[] { _apressId, _jetbrainsId });
 
 				var evento = DefaultEventoRepository.GetActivos().First();
 				Assert.IsTrue(evento.Patrocinadores.Any(p => p.Nombre == "Apress"));
@@ -62,7 +66,7 @@
 		public void Quitar_patrociador()
 		{
 			{
-				_agenda.IndicarPatrocinadores(_eventoId, new[] { _apressId, _jetbrainsId });
+				_agenda.IndicarPatrocinadores(_eventoUnoId, new[] { _apressId, _jetbrainsId });
 
 				var evento = DefaultEventoRepository.GetActivos().First();
 				Assert.IsTrue(evento.Patrocinadores.Any(p => p.Nombre == "Apress"));
@@ -70,7 +74,7 @@
 			}
 
 			{
-				_agenda.IndicarPatrocinadores(_eventoId, new[] { _apressId });
+				_agenda.IndicarPatrocinadores(_eventoUnoId, new[] { _apressId });
 
 				var evento = DefaultEventoRepository.GetActivos().First();
 				Assert.IsTrue(evento.Patrocinadores.Any(p => p.Nombre == "Apress"));
@@ -78,7 +82,7 @@
 			}
 
 			{
-				_agenda.IndicarPatrocinadores(_eventoId, new Guid[] { });
+				_agenda.IndicarPatrocinadores(_eventoUnoId, new Guid[] { });
 
 				var evento = DefaultEventoRepository.GetActivos().First();
 				Assert.IsFalse(evento.Patrocinadores.Any());
@@ -96,14 +100,17 @@
 			return patrocinador.Id;
 		}
 
-		private Guid CrearEvento()
+		private Guid CrearEvento(string[] nombrePonentes, string nombreEvento, DateTime fechaInicio, DateTime fechaTermino)
 		{
-			var fechaInicio = DateTime.Today.AddDays(7).ToUniversalTime();
-			var fechaTermino = fechaInicio.AddHours(2);
-			var ponentes = new[] {TestsHelper.GetOrCreatePonente("Carlos Peix"), TestsHelper.GetOrCreatePonente("Nelo Pauselli")};
-			_agenda.Agendar("ADFS", ponentes, fechaInicio, fechaTermino, null, TipoEvento.Van);
+			var ponentes = new Guid[nombrePonentes.Length];
+			for (var nroPonente = 0; nroPonente < nombrePonentes.Length; nroPonente++)
+			{
+				ponentes[nroPonente] = TestsHelper.GetOrCreatePonente(nombrePonentes[nroPonente]);
+			}
 
-			var evento = DefaultEventoRepository.GetActivos().First();
+			_agenda.Agendar(nombreEvento, ponentes, fechaInicio, fechaTermino, null, TipoEvento.Van);
+
+			var evento = DefaultEventoRepository.GetActivos().First(e=>e.Titulo == nombreEvento);
 			return evento.Id;
 		}