Merge pull request 'ManageUnitTest' (#2) from ManageUnitTest into main
continuous-integration/drone/push Build is failing Details

Reviewed-on: #2
pull/7/head
Victor Perez NGOUNOU 2 years ago
commit 536880d9bb

@ -7,8 +7,10 @@
<LangVersion>11</LangVersion> <LangVersion>11</LangVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(RunConfiguration)' == 'https' " />
<PropertyGroup Condition=" '$(RunConfiguration)' == 'http' " />
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0" /> <!--<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0" />-->
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
</ItemGroup> </ItemGroup>

@ -1,5 +1,6 @@
using BowlingEF.Entities; using BowlingEF.Entities;
using BowlingService.Interfaces; using BowlingService.Interfaces;
using DTOs;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace BowlingApi.Controllers; namespace BowlingApi.Controllers;

@ -19,6 +19,13 @@ builder.Services.AddAutoMapper(typeof(JoueurProfile));
builder.Services.AddScoped<IJoueurService, JoueurService>(); builder.Services.AddScoped<IJoueurService, JoueurService>();
builder.Services.AddScoped<IJoueurRepository, JoueurRepository>(); builder.Services.AddScoped<IJoueurRepository, JoueurRepository>();
//configure Logger
builder.Services.AddLogging(configure =>
{
configure.AddConsole();
configure.AddDebug();
});
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.

@ -1,4 +1,4 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json", "$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": { "iisSettings": {
"windowsAuthentication": false, "windowsAuthentication": false,
@ -11,7 +11,6 @@
"profiles": { "profiles": {
"http": { "http": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "http://localhost:5229", "applicationUrl": "http://localhost:5229",
@ -21,7 +20,6 @@
}, },
"https": { "https": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "https://localhost:7097;http://localhost:5229", "applicationUrl": "https://localhost:7097;http://localhost:5229",
@ -38,4 +36,4 @@
} }
} }
} }
} }

@ -21,7 +21,7 @@ namespace BowlingEF.Entities
[ForeignKey("JoueurForeignKey")] [ForeignKey("JoueurForeignKey")]
public JoueurEntity Joueur { get; set; } public JoueurEntity Joueur { get; set; }
[Required] [Required]
public DateTime Date { get; set; } public DateTime Date { get; set; } = DateTime.Now;
public ICollection<FrameEntity> Frames { get; set; } public ICollection<FrameEntity> Frames { get; set; }
[Required] [Required]
public int? Score { get; set; } public int? Score { get; set; }

@ -1,4 +1,5 @@
using BowlingEF.Entities; using BowlingEF.Entities;
using DTOs;
namespace BowlingService.Interfaces; namespace BowlingService.Interfaces;

@ -5,6 +5,7 @@ using System.Diagnostics;
using AutoMapper; using AutoMapper;
using BowlingRepository.Interface; using BowlingRepository.Interface;
using BowlingService.Interfaces; using BowlingService.Interfaces;
using DTOs;
namespace BowlingService namespace BowlingService
{ {
@ -20,10 +21,11 @@ namespace BowlingService
#region Méthodes #region Méthodes
public JoueurService(IJoueurRepository joueurRepository,IMapper mapper) public JoueurService(IJoueurRepository joueurRepository,IMapper mapper , ILogger<JoueurService> logger)
{ {
_joueurRepository = joueurRepository; _joueurRepository = joueurRepository;
_mapper = mapper; _mapper = mapper;
_logger = logger;
} }
/// <summary> /// <summary>
@ -35,36 +37,24 @@ namespace BowlingService
{ {
JoueurDTO result = null; JoueurDTO result = null;
try try
{
//Mapping entre la classe joueur et la classe joueurEntity
JoueurEntity entity = _mapper.Map<JoueurEntity>(_joueur);
entity.PartieEntities=_joueur.PartieDTO.Select(p =>
{ {
//Mapping entre la classe joueur et la classe joueurEntity var partieEntity = _mapper.Map<PartieEntity>(p);
JoueurEntity entity = new JoueurEntity partieEntity.Frames=p.FramesDTO.Select(f => _mapper.Map<FrameEntity>(f)).ToList();
{ return partieEntity;
Id = _joueur.Id, }).ToList();
Pseudo = _joueur.Pseudo,
}; result = _mapper.Map<JoueurDTO>(await _joueurRepository.Add(entity));
_logger.LogInformation("A new player was added : {player}", _joueur.Pseudo);
//Parcourt de la liste des parties d'un joueur }
for (int i = 0; i < _joueur.PartieDTO.Count; i++) catch (Exception ex)
{ {
//Mapping entre les parties d'un joueur et les partieEntity d'une partieEntity _logger.LogError(ex, "Error while adding new player : {player}", _joueur.Pseudo);
PartieEntity partieEntity = _mapper.Map<PartieEntity>(_joueur.PartieDTO.ElementAt(1)); throw;
}
//Parcourt de la liste des frames d'une partie
for (int j = 0; j < _joueur.PartieDTO.ElementAt(i).FramesDTO.Count; j++)
{
//Mapping entre les frames d'une partie et les frameEntity d'une partieEntity
FrameEntity frameEntity = _mapper.Map<FrameEntity>(_joueur.PartieDTO.ElementAt(i).FramesDTO.ElementAt(j));
partieEntity.Frames.Add(frameEntity);
}
entity.PartieEntities.Add(partieEntity);
}
result = _mapper.Map<JoueurDTO>(await _joueurRepository.Add(entity));
}
catch (Exception ex)
{
Debug.WriteLine(ex);
throw;
}
return result; return result;
} }
@ -75,7 +65,18 @@ namespace BowlingService
/// <returns></returns> /// <returns></returns>
public async Task<bool> Delete(JoueurDTO _joueur) public async Task<bool> Delete(JoueurDTO _joueur)
{ {
return await _joueurRepository.Delete(_joueur.Id); var result = false;
try
{
result = await _joueurRepository.Delete(_joueur.Id);
_logger.LogInformation("A player was deleted : {player}", _joueur.Pseudo);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error while deleting player : {player}", _joueur.Pseudo);
throw;
}
return result;
} }
/// <summary> /// <summary>
@ -87,9 +88,17 @@ namespace BowlingService
using (var context = new BowlingContext()) using (var context = new BowlingContext())
{ {
List<JoueurDTO> joueurs = new List<JoueurDTO>(); List<JoueurDTO> joueurs = new List<JoueurDTO>();
var data= await _joueurRepository.GetAllJoueur(); try
foreach (var item in data) {
joueurs.Add(_mapper.Map<JoueurDTO>(item)); var joueursEntity = await _joueurRepository.GetAllJoueur();
joueurs = joueursEntity.Select(j => _mapper.Map<JoueurDTO>(j)).ToList();
_logger.LogInformation("All players were retrieved");
}
catch (Exception ex)
{
_logger.LogError(ex, "Error while retrieving all players");
throw;
}
return joueurs; return joueurs;
} }
} }
@ -101,29 +110,48 @@ namespace BowlingService
/// <returns></returns> /// <returns></returns>
public async Task<JoueurDTO> GetDataWithName(string name) public async Task<JoueurDTO> GetDataWithName(string name)
{ {
using (var context = new BowlingContext()) JoueurDTO _joueur = null;
try
{ {
JoueurDTO _joueur = null; var joueurEntity = await _joueurRepository.GetJoueurByNom(name);
_joueur = _mapper.Map<JoueurDTO>(joueurEntity);
var query = _joueurRepository.GetJoueurByNom(name); _logger.LogInformation("Player was retrieved : {player}", name);
_joueur = _mapper.Map<JoueurDTO>(query.Result); }
return _joueur; catch (Exception ex)
{
_logger.LogError(ex, "Error while retrieving player : {player}", name);
throw;
} }
return _joueur;
} }
public async Task<bool> Update(JoueurDTO _joueur) public async Task<bool> Update(JoueurDTO _joueur)
{ {
bool result = false; bool result = false;
using (var context = new BowlingContext()) try
{ {
JoueurEntity entity = _joueurRepository.GetJoueur(_joueur.Id).Result; JoueurEntity entity = _joueurRepository.GetJoueur(_joueur.Id).Result;
if (entity!=null) if (entity!= null)
{ {
entity.Pseudo = _joueur.Pseudo; entity.Pseudo = _joueur.Pseudo;
result = _joueurRepository.Update(entity).Result; entity.PartieEntities = _joueur.PartieDTO.Select(p =>
{
var partieEntity = _mapper.Map<PartieEntity>(p);
partieEntity.Frames = p.FramesDTO.Select(f => _mapper.Map<FrameEntity>(f)).ToList();
return partieEntity;
}).ToList();
result = await _joueurRepository.Update(entity);
_logger.LogInformation("Player was updated : {player}", _joueur.Pseudo);
} }
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error while updating player : {player}", _joueur.Pseudo);
throw;
} }
return result;
} }
#endregion #endregion

@ -4,7 +4,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace BowlingEF.Entities namespace DTOs
{ {
/// <summary> /// <summary>
/// Classe de gestion des equipes /// Classe de gestion des equipes

@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace BowlingEF.Entities namespace DTOs
{ {
/// <summary> /// <summary>
/// Classe de gestion des frames /// Classe de gestion des frames
@ -9,18 +9,14 @@ namespace BowlingEF.Entities
public class FrameDTO public class FrameDTO
{ {
#region Properties #region Properties
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; } public long Id { get; set; }
[Required]
public int Numero { get; set; } public int Numero { get; set; }
[Required]
public int Lancer1 { get; set; } public int Lancer1 { get; set; }
[Required]
public int Lancer2 { get; set; } public int Lancer2 { get; set; }
public int Lancer3 { get; set; } public int Lancer3 { get; set; }
public PartieDTO Partie { get; set; } public PartieDTO Partie { get; set; }
#endregion #endregion
} }
} }

@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace BowlingEF.Entities namespace DTOs
{ {
/// <summary> /// <summary>
/// Classe de gestion des Joueurs /// Classe de gestion des Joueurs
@ -18,4 +18,6 @@ namespace BowlingEF.Entities
public ICollection<PartieDTO> PartieDTO { get; set; } = new List<PartieDTO>(); public ICollection<PartieDTO> PartieDTO { get; set; } = new List<PartieDTO>();
#endregion #endregion
} }
} }

@ -6,7 +6,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace BowlingEF.Entities namespace DTOs
{ {
/// <summary> /// <summary>
/// Classe de gestion des parties /// Classe de gestion des parties
@ -34,4 +34,5 @@ namespace BowlingEF.Entities
} }
#endregion #endregion
} }
} }

@ -1,5 +1,6 @@
using AutoMapper; using AutoMapper;
using BowlingEF.Entities; using BowlingEF.Entities;
using DTOs;
namespace Mapper; namespace Mapper;

@ -1,5 +1,6 @@
using AutoMapper; using AutoMapper;
using BowlingEF.Entities; using BowlingEF.Entities;
using DTOs;
namespace Mapper; namespace Mapper;

@ -1,5 +1,6 @@
using AutoMapper; using AutoMapper;
using BowlingEF.Entities; using BowlingEF.Entities;
using DTOs;
namespace Mapper; namespace Mapper;

@ -1,5 +1,6 @@
using AutoMapper; using AutoMapper;
using BowlingEF.Entities; using BowlingEF.Entities;
using DTOs;
namespace Mapper; namespace Mapper;

@ -33,6 +33,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mapper", "Mapper\Mapper.csp
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BowlingRepository", "BowlingRepository\BowlingRepository.csproj", "{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BowlingRepository", "BowlingRepository\BowlingRepository.csproj", "{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BowlingAPITest", "Tests\BowlingAPITest\BowlingAPITest.csproj", "{E5F97007-B13F-4D89-BCC7-4C1D836413AF}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -75,6 +77,10 @@ Global
{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Release|Any CPU.ActiveCfg = Release|Any CPU {0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Release|Any CPU.Build.0 = Release|Any CPU {0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Release|Any CPU.Build.0 = Release|Any CPU
{E5F97007-B13F-4D89-BCC7-4C1D836413AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5F97007-B13F-4D89-BCC7-4C1D836413AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E5F97007-B13F-4D89-BCC7-4C1D836413AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5F97007-B13F-4D89-BCC7-4C1D836413AF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -86,6 +92,7 @@ Global
{E9350F3C-4E54-46C3-9C2D-0724C6DDF154} = {A67CAE01-FD47-4EFC-A226-0E23403693F4} {E9350F3C-4E54-46C3-9C2D-0724C6DDF154} = {A67CAE01-FD47-4EFC-A226-0E23403693F4}
{4C872D24-DF74-4F5C-B6C3-A00BB0E72BE5} = {BEA68AD8-C88B-4C1C-BE08-00832C695E76} {4C872D24-DF74-4F5C-B6C3-A00BB0E72BE5} = {BEA68AD8-C88B-4C1C-BE08-00832C695E76}
{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C} = {8CF29C06-8F11-49EA-80FC-579B98519159} {0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C} = {8CF29C06-8F11-49EA-80FC-579B98519159}
{E5F97007-B13F-4D89-BCC7-4C1D836413AF} = {C75DF644-C41F-4A08-8B69-C8554204AC72}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4D47853B-D1A3-49A5-84BA-CD2DC65FD105} SolutionGuid = {4D47853B-D1A3-49A5-84BA-CD2DC65FD105}

@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageReference Include="Moq" Version="4.18.4" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\BowlingApi\BowlingApi.csproj" />
<ProjectReference Include="..\..\BowlingService\BowlingService.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,64 @@
using DTOs;
namespace BowlingAPITest;
public class TestController
{
[Fact]
public async void Get_ShouldReturnOkResult()
{
// Arrange
var mockService = new Mock<IJoueurService>();
mockService.Setup(service => service.GetAll()).ReturnsAsync(new List<JoueurDTO>());
var controller = new JoueurController(mockService.Object);
// Act
var result = await controller.Get();
// Assert
Assert.IsType<OkObjectResult>(result);
}
[Fact]
public async void Get_ShouldReturnAllItems()
{
// Arrange
var testItems = GetTestItems();
var mockService = new Mock<IJoueurService>();
mockService.Setup(service => service.GetAll()).ReturnsAsync(testItems);
var controller = new JoueurController(mockService.Object);
// Act
var result = await controller.Get();
// Assert
var okResult = result as OkObjectResult;
var items = Assert.IsType<List<JoueurDTO>>(okResult.Value);
Assert.Equal(2, items.Count);
}
private IEnumerable<JoueurDTO> GetTestItems()
{
var testItems = new List<JoueurDTO>();
testItems.Add(new JoueurDTO {Pseudo = "Item1" });
testItems.Add(new JoueurDTO { Pseudo = "Item2" });
return testItems;
}
// [Fact]
// public async void GetById_ShouldReturnNotFound()
// {
// // Arrange
// var mockService = new Mock<IJoueurService>();
// mockService.Setup(service => service.Get(1)).ReturnsAsync((JoueurDTO)null);
// var controller = new JoueurController(mockService.Object);
//
// // Act
// var result = await controller.Get(1);
//
// // Assert
// Assert.IsType<NotFoundResult>(result);
// }
}

@ -0,0 +1,6 @@
global using Xunit;
global using BowlingApi.Controllers;
global using BowlingEF.Entities;
global using BowlingService.Interfaces;
global using Microsoft.AspNetCore.Mvc;
global using Moq;
Loading…
Cancel
Save