using EPAServeur.Context; using EPAServeur.Exceptions; using EPAServeur.Models.Formation; using EPAServeur.Services; using IO.Swagger.Controllers; using IO.Swagger.DTO; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using NUnit.Framework; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection; using EPAServeur.IServices; using Moq; using IO.Swagger.ApiCollaborateur; using IO.Swagger.Enum; namespace EPAServeur.Tests.Controllers { [TestFixture] public class EngagementsApiTests { #region Variables private IEngagementService engagementService; private Mock mockEnvironment; private EpContext epContext; #endregion #region Setup [SetUp] public void Setup() { // Création d'une collection de services pour l'injection de dépendance var services = new ServiceCollection(); // Utilisation d'une base de données en mémoire var optionBuider = new DbContextOptionsBuilder() .UseInMemoryDatabase("server_ep_test") .Options; services.AddDbContext(b => b.UseInMemoryDatabase("server_ep_test")); epContext = new EpContext(optionBuider); epContext.Database.EnsureDeleted(); epContext.Database.EnsureCreated(); epContext.SaveChanges(); // Ajout du jeu de données pour les tests DataSeeder.AddEngagements(epContext); // Détache les entités du context car la base de données InMemory créé des conflits // entre les clés primaires lors d'un Update ou d'un Insert foreach (var entity in epContext.ChangeTracker.Entries()) { entity.State = EntityState.Detached; } services.AddScoped(); services.AddScoped(); services.AddScoped(); // Récupère le service qui sera utilsé pour tester le contrôleur var serviceProvider = services.BuildServiceProvider(); engagementService = serviceProvider.GetService(); // Simule l'interface IWebHostEnvironment avec Moq mockEnvironment = new Mock(); mockEnvironment .Setup(m => m.EnvironmentName) .Returns("Development"); } #endregion #region Tests GetEngagements [Test] public void GetEngagements_PasseDesParamsPresentsDansLaBDD_RetourneUnObjetOkResult() { // Arrange EngagementsApiController engagementsApiController = new EngagementsApiController(engagementService, new NullLogger(), mockEnvironment.Object); List idBUs = new List { 1, 2 }; // Act var okResult = engagementsApiController.GetEngagements(idBUs, null, true, 1, 5, null, null); // Assert Assert.IsInstanceOf(okResult.Result); } [Test] public void GetEngagements_PasseDesParamsPresentsDansLaBDD_RetourneLesCinqPremiersEngagements() { // Arrange EngagementsApiController engagementsApiController = new EngagementsApiController(engagementService, new NullLogger(), mockEnvironment.Object); List idBUs = new List { 1, 2 }; int nbEngagement = 5; int idFirstEngagement = 8; int idLastEngagement = 4; // Act var okResult = engagementsApiController.GetEngagements(idBUs, null, true, 1, 5, null, null).Result as OkObjectResult; // Assert Assert.IsInstanceOf>(okResult.Value); Assert.AreEqual(nbEngagement, (okResult.Value as IEnumerable).Count()); Assert.AreEqual(idFirstEngagement, (okResult.Value as IEnumerable).First().Id); Assert.AreEqual(idLastEngagement, (okResult.Value as IEnumerable).Last().Id); } #endregion #region Tests GetEngagementsCount [Test] public void GetEngagementsCount_PasseDesParamsPresentsDansLaBDD_RetourneUnObjetOkResult() { // Arrange EngagementsApiController engagementsApiController = new EngagementsApiController(engagementService, new NullLogger(), mockEnvironment.Object); List idBUs = new List { 1, 2 }; // Act var okResult = engagementsApiController.GetEngagementsCount(idBUs, null, null); // Assert Assert.IsInstanceOf(okResult.Result); } [Test] public void GetEngagementsCount_PasseDesParamsPresentsDansLaBDD_RetourneLeBonNombreDEngagement() { // Arrange EngagementsApiController engagementsApiController = new EngagementsApiController(engagementService, new NullLogger(), mockEnvironment.Object); List idBUs = new List { 1, 2 }; int nbEngagement = 12; // Act var okResult = engagementsApiController.GetEngagementsCount(idBUs, null, null).Result as OkObjectResult; // Assert Assert.IsInstanceOf(okResult.Value); Assert.AreEqual(nbEngagement, (long)okResult.Value); } #endregion #region Tests UpdateEngagement [Test] public void UpdateEngagement_ModifieUnEngagementAvecUnEPInvalide_RetourneUnObjetObjectResultDansCatchEngagementInvalidException() { // Arrange long idEngagement = 1; EtatEngagement reponse = EtatEngagement.Respecte; EngagementsApiController engagementsApiController = new EngagementsApiController(engagementService, new NullLogger(), mockEnvironment.Object); EpInformationDTO epInformationDTO = null; EngagementDTO engagementDTO = new EngagementDTO { Id = idEngagement, Action = "Je m'engage à trouver une formation sur l'Asp.Net Core.", Dispositif = "Demande de formation RH.", Modalite = "Sur temps de travail", DateLimite = new DateTime(2020, 9, 1), EtatEngagement = reponse, Ep = epInformationDTO }; // Act var objectResult = engagementsApiController.UpdateEngagement(engagementDTO, idEngagement); // Assert Assert.IsInstanceOf(objectResult.Result); } [Test] public void UpdateEngagement_ModifieUnEngagementAvecUnIdEngagementInvalide_RetourneUnObjetObjectResultDansCatchEngagementIncompatibleIdException() { // Arrange long idEngagement = 1; long idEngagementIncorrecte = 2; long idEp = 9; EtatEngagement reponse = EtatEngagement.Respecte; EngagementsApiController engagementsApiController = new EngagementsApiController(engagementService, new NullLogger(), mockEnvironment.Object); EpInformationDTO epInformationDTO = epContext.Ep.Where(ep => ep.IdEP == idEp) .Select(ep => new EpInformationDTO { Id = ep.IdEP, Type = ep.TypeEP, Statut = ep.Statut, DateDisponibilite = ep.DateDisponibilite, DatePrevisionnelle = ep.DatePrevisionnelle, Obligatoire = ep.Obligatoire }).FirstOrDefault(); EngagementDTO engagementDTO = new EngagementDTO { Id = idEngagementIncorrecte, Action = "Je m'engage à trouver une formation sur l'Asp.Net Core.", Dispositif = "Demande de formation RH.", Modalite = "Sur temps de travail", DateLimite = new DateTime(2020, 9, 1), EtatEngagement = reponse, Ep = epInformationDTO }; // Act var objectResult = engagementsApiController.UpdateEngagement(engagementDTO, idEngagement); // Assert Assert.IsInstanceOf(objectResult.Result); } [Test] public void UpdateEngagement_ModifieUnEngagementInexistant_RetourneUnObjetObjectResultDansCatchEngagementNotFoundExceptionn() { // Arrange long idEngagementInexistant = 999; long idEp = 9; EtatEngagement reponse = EtatEngagement.Respecte; EngagementsApiController engagementsApiController = new EngagementsApiController(engagementService, new NullLogger(), mockEnvironment.Object); EpInformationDTO epInformationDTO = epContext.Ep.Where(ep => ep.IdEP == idEp) .Select(ep => new EpInformationDTO { Id = ep.IdEP, Type = ep.TypeEP, Statut = ep.Statut, DateDisponibilite = ep.DateDisponibilite, DatePrevisionnelle = ep.DatePrevisionnelle, Obligatoire = ep.Obligatoire }).FirstOrDefault(); EngagementDTO engagementDTO = new EngagementDTO { Id = idEngagementInexistant, Action = "Toto.", Dispositif = "Tata.", Modalite = "Titi", DateLimite = new DateTime(2020, 9, 1), EtatEngagement = reponse, Ep = epInformationDTO }; // Act var objectResult = engagementsApiController.UpdateEngagement(engagementDTO, idEngagementInexistant); // Assert Assert.IsInstanceOf(objectResult.Result); } [Test] public void UpdateEngagement_ModifieUnEngagementValide_RetourneUnObjetOkObjectResult() { // Arrange long idEngagement = 1; long idEp = 9; EtatEngagement reponse = EtatEngagement.Respecte; EngagementsApiController engagementsApiController = new EngagementsApiController(engagementService, new NullLogger(), mockEnvironment.Object); EpInformationDTO epInformationDTO = epContext.Ep.Where(ep => ep.IdEP == idEp) .Select(ep => new EpInformationDTO { Id = ep.IdEP, Type = ep.TypeEP, Statut = ep.Statut, DateDisponibilite = ep.DateDisponibilite, DatePrevisionnelle = ep.DatePrevisionnelle, Obligatoire = ep.Obligatoire }).FirstOrDefault(); EngagementDTO engagementDTO = new EngagementDTO { Id = idEngagement, Action = "Je m'engage à trouver une formation sur l'Asp.Net Core.", Dispositif = "Demande de formation RH.", Modalite = "Sur temps de travail", DateLimite = new DateTime(2020, 9, 1), EtatEngagement = reponse, Ep = epInformationDTO }; // Act var okObjectResult = engagementsApiController.UpdateEngagement(engagementDTO, idEngagement); // Assert Assert.IsInstanceOf(okObjectResult.Result); } [Test] public void UpdateEngagement_ModifieUnEngagementValide_RetourneLEngagementModifie() { // Arrange long idEngagement = 1; long idEp = 9; EtatEngagement reponse = EtatEngagement.Respecte; EngagementsApiController engagementsApiController = new EngagementsApiController(engagementService, new NullLogger(), mockEnvironment.Object); EpInformationDTO epInformationDTO = epContext.Ep.Where(ep => ep.IdEP == idEp) .Select(ep => new EpInformationDTO { Id = ep.IdEP, Type = ep.TypeEP, Statut = ep.Statut, DateDisponibilite = ep.DateDisponibilite, DatePrevisionnelle = ep.DatePrevisionnelle, Obligatoire = ep.Obligatoire }).FirstOrDefault(); EngagementDTO engagementDTO = new EngagementDTO { Id = idEngagement, Action = "Je m'engage à trouver une formation sur l'Asp.Net Core.", Dispositif = "Demande de formation RH.", Modalite = "Sur temps de travail", DateLimite = new DateTime(2020, 9, 1), EtatEngagement = reponse, Ep = epInformationDTO }; // Act var okObjectResult = engagementsApiController.UpdateEngagement(engagementDTO, idEngagement).Result as OkObjectResult; // Assert Assert.IsInstanceOf(okObjectResult.Value); Assert.AreEqual(reponse, (okObjectResult.Value as EngagementDTO).EtatEngagement); } #endregion } }