ManageUnitTest #2

Merged
victor_perez.ngounou merged 2 commits from ManageUnitTest into main 2 years ago

@ -7,8 +7,10 @@
<LangVersion>11</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(RunConfiguration)' == 'https' " />
<PropertyGroup Condition=" '$(RunConfiguration)' == 'http' " />
<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" />
</ItemGroup>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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