From d4176ee17bc3ec2af062ba2ce78a7a1c325c73e1 Mon Sep 17 00:00:00 2001 From: anperederi Date: Sat, 16 Mar 2024 23:59:01 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AA=20Add=20somes=20console=20and=20un?= =?UTF-8?q?it=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/HeartTrack.sln | 14 +++ src/Model/EnumMappeur.cs | 3 +- src/Shared/AthleteOrderCriteria.cs | 5 +- .../ActivityRepository.cs | 112 ++++++++++++++++++ .../RepositoriesUnitTest/GlobalUsings.cs | 1 + .../RepositoriesUnitTest.csproj | 31 +++++ src/Tests/RepositoriesUnitTest/UnitTest1.cs | 10 ++ src/Tests/TestApi/GlobalUsings.cs | 1 - src/Tests/TestApi/TestApi.csproj | 26 ---- src/Tests/TestApi/UserControllerTest.cs | 0 .../Controllers/UsersControllerTest.cs | 95 +++++++-------- .../UnitTestsEntities/DatabaseFixture.cs | 2 +- .../WebAPIConsoleTests/ActivityServiceAPI.cs | 110 +++++++++++++++++ src/Tests/WebAPIConsoleTests/HttpRequest.cs | 99 ++++++++++++++++ src/Tests/WebAPIConsoleTests/Program.cs | 63 ++++++++++ .../WebAPIConsoleTests.csproj | 17 +++ 16 files changed, 505 insertions(+), 84 deletions(-) create mode 100644 src/Tests/RepositoriesUnitTest/ActivityRepository.cs create mode 100644 src/Tests/RepositoriesUnitTest/GlobalUsings.cs create mode 100644 src/Tests/RepositoriesUnitTest/RepositoriesUnitTest.csproj create mode 100644 src/Tests/RepositoriesUnitTest/UnitTest1.cs delete mode 100644 src/Tests/TestApi/GlobalUsings.cs delete mode 100644 src/Tests/TestApi/TestApi.csproj delete mode 100644 src/Tests/TestApi/UserControllerTest.cs create mode 100644 src/Tests/WebAPIConsoleTests/ActivityServiceAPI.cs create mode 100644 src/Tests/WebAPIConsoleTests/HttpRequest.cs create mode 100644 src/Tests/WebAPIConsoleTests/Program.cs create mode 100644 src/Tests/WebAPIConsoleTests/WebAPIConsoleTests.csproj diff --git a/src/HeartTrack.sln b/src/HeartTrack.sln index 8bd8954..403513d 100644 --- a/src/HeartTrack.sln +++ b/src/HeartTrack.sln @@ -43,6 +43,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "APIMappers", "APIMappers\AP EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTestsModel", "Tests\UnitTestsModel\UnitTestsModel.csproj", "{508D380F-145C-437E-A7DF-7A17C526B2F3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RepositoriesUnitTest", "Tests\RepositoriesUnitTest\RepositoriesUnitTest.csproj", "{707B1AC4-F896-4270-BC2F-1A589F48979D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAPIConsoleTests", "Tests\WebAPIConsoleTests\WebAPIConsoleTests.csproj", "{D0EE112F-3151-4C28-A6EC-B1CEC7883FAE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -121,6 +125,14 @@ Global {508D380F-145C-437E-A7DF-7A17C526B2F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {508D380F-145C-437E-A7DF-7A17C526B2F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {508D380F-145C-437E-A7DF-7A17C526B2F3}.Release|Any CPU.Build.0 = Release|Any CPU + {707B1AC4-F896-4270-BC2F-1A589F48979D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {707B1AC4-F896-4270-BC2F-1A589F48979D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {707B1AC4-F896-4270-BC2F-1A589F48979D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {707B1AC4-F896-4270-BC2F-1A589F48979D}.Release|Any CPU.Build.0 = Release|Any CPU + {D0EE112F-3151-4C28-A6EC-B1CEC7883FAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D0EE112F-3151-4C28-A6EC-B1CEC7883FAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0EE112F-3151-4C28-A6EC-B1CEC7883FAE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D0EE112F-3151-4C28-A6EC-B1CEC7883FAE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -134,6 +146,8 @@ Global {31FA8E5E-D642-4C43-A2B2-02B9832B2CEC} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18} {73EA27F2-9F0C-443F-A5EE-2960C983A422} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18} {508D380F-145C-437E-A7DF-7A17C526B2F3} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18} + {707B1AC4-F896-4270-BC2F-1A589F48979D} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18} + {D0EE112F-3151-4C28-A6EC-B1CEC7883FAE} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0F3487F4-66CA-4034-AC66-1BC899C9B523} diff --git a/src/Model/EnumMappeur.cs b/src/Model/EnumMappeur.cs index b939ee9..a2b7f26 100644 --- a/src/Model/EnumMappeur.cs +++ b/src/Model/EnumMappeur.cs @@ -9,6 +9,7 @@ public static class EnumMappeur return value switch { "None" => Shared.AthleteOrderCriteria.None, + "ById" => Shared.AthleteOrderCriteria.ById, "ByUsername" => Shared.AthleteOrderCriteria.ByUsername, "ByFirstName" => Shared.AthleteOrderCriteria.ByFirstName, "ByLastName" => Shared.AthleteOrderCriteria.ByLastName, @@ -17,7 +18,7 @@ public static class EnumMappeur "ByWeight" => Shared.AthleteOrderCriteria.ByWeight, "ByDateOfBirth" => Shared.AthleteOrderCriteria.ByDateOfBirth, "ByEmail" => Shared.AthleteOrderCriteria.ByEmail, - "ByIsCoach" => Shared.AthleteOrderCriteria.ByIsCoach, + "ByIsCoach" => Shared.AthleteOrderCriteria.ByRole, _ => Shared.AthleteOrderCriteria.None }; } diff --git a/src/Shared/AthleteOrderCriteria.cs b/src/Shared/AthleteOrderCriteria.cs index 4bc54f0..851fbe2 100644 --- a/src/Shared/AthleteOrderCriteria.cs +++ b/src/Shared/AthleteOrderCriteria.cs @@ -3,15 +3,16 @@ public enum AthleteOrderCriteria { None, + ById, ByUsername, ByFirstName, ByLastName, + ByEmail, BySexe, ByLenght, ByWeight, ByDateOfBirth, - ByEmail, - ByIsCoach + ByRole } } diff --git a/src/Tests/RepositoriesUnitTest/ActivityRepository.cs b/src/Tests/RepositoriesUnitTest/ActivityRepository.cs new file mode 100644 index 0000000..e67b3ce --- /dev/null +++ b/src/Tests/RepositoriesUnitTest/ActivityRepository.cs @@ -0,0 +1,112 @@ +using Xunit; +using Model2Entities; +using Microsoft.EntityFrameworkCore; +using DbContextLib; +using StubbedContextLib; +using System.Linq; +using Microsoft.Data.Sqlite; +using System; +using Shared; +using Model; +using Moq; +using Microsoft.Extensions.Logging; +using Entities; + +namespace UnitTestsEntities +{ + public class ActivityRepositoryTests : IClassFixture + { + private readonly DatabaseFixture _fixture; + + public ActivityRepositoryTests(DatabaseFixture fixture) + { + _fixture = fixture; + } + + [Fact] + public async Task GetActivities_ReturnsActivities() + { + var options = new DbContextOptionsBuilder() + .UseSqlite(_fixture._connection) + .Options; + + using (var context = new HeartTrackContext(options)) + { + context.Database.EnsureCreated(); + } + + using (var context = new HeartTrackContext(options)) + { + var repository = new DbDataManager.ActivityRepository(new DbDataManager(context), null); + var activities = await repository.GetActivities(0, 10, ActivityOrderCriteria.None); + + Assert.NotNull(activities); + Assert.Equal(10, activities.Count()); + } + } + [Fact] + public async Task GetActivityByIdAsync_ReturnsCorrectActivity_WhenIdExists() + { + // Arrange + var activityId = 1; + var expectedActivity = new Activity { Id = activityId, Type = "Running" }; + + var mockDataManager = new Mock(); + mockDataManager.Setup(dm => dm.DbContext.ActivitiesSet.SingleOrDefaultAsync(a => a.IdActivity == activityId)) + .ReturnsAsync(expectedActivity.ToEntity()); + + var loggerMock = new Mock>(); + var activityRepository = new DbDataManager.ActivityRepository(mockDataManager.Object, loggerMock.Object); + + // Act + var result = await activityRepository.GetActivityByIdAsync(activityId); + + // Assert + Assert.NotNull(result); + Assert.Equal(expectedActivity.Id, result.Id); + Assert.Equal(expectedActivity.Type, result.Type); + } + + [Fact] + public async Task GetActivityByIdAsync_ReturnsNull_WhenIdDoesNotExist() + { + // Arrange + var activityId = 999; + + var mockDataManager = new Mock(); + mockDataManager.Setup(dm => dm.DbContext.ActivitiesSet.SingleOrDefaultAsync(a => a.IdActivity == activityId)) + .ReturnsAsync((ActivityEntity)null); + + var loggerMock = new Mock>(); + var activityRepository = new DbDataManager.ActivityRepository(mockDataManager.Object, loggerMock.Object); + + // Act + var result = await activityRepository.GetActivityByIdAsync(activityId); + + // Assert + Assert.Null(result); + } + + [Fact] + public async Task AddActivity_SuccessfullyAddsNewActivity() + { + // Arrange + var newActivity = new Activity { Type = "Walking" }; + + var mockDataManager = new Mock(); + mockDataManager.Setup(dm => dm.DbContext.AddItem(It.IsAny())) + .ReturnsAsync(newActivity.ToEntity()); + + var loggerMock = new Mock>(); + var activityRepository = new DbDataManager.ActivityRepository(mockDataManager.Object, loggerMock.Object); + + // Act + var result = await activityRepository.AddActivity(newActivity); + + // Assert + Assert.NotNull(result); + Assert.Equal(newActivity.Type, result.Type); + } + + } +} diff --git a/src/Tests/RepositoriesUnitTest/GlobalUsings.cs b/src/Tests/RepositoriesUnitTest/GlobalUsings.cs new file mode 100644 index 0000000..8c927eb --- /dev/null +++ b/src/Tests/RepositoriesUnitTest/GlobalUsings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/src/Tests/RepositoriesUnitTest/RepositoriesUnitTest.csproj b/src/Tests/RepositoriesUnitTest/RepositoriesUnitTest.csproj new file mode 100644 index 0000000..417f28f --- /dev/null +++ b/src/Tests/RepositoriesUnitTest/RepositoriesUnitTest.csproj @@ -0,0 +1,31 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + diff --git a/src/Tests/RepositoriesUnitTest/UnitTest1.cs b/src/Tests/RepositoriesUnitTest/UnitTest1.cs new file mode 100644 index 0000000..392318c --- /dev/null +++ b/src/Tests/RepositoriesUnitTest/UnitTest1.cs @@ -0,0 +1,10 @@ +namespace RepositoriesUnitTest; + +public class UnitTest1 +{ + [Fact] + public void Test1() + { + + } +} \ No newline at end of file diff --git a/src/Tests/TestApi/GlobalUsings.cs b/src/Tests/TestApi/GlobalUsings.cs deleted file mode 100644 index ab67c7e..0000000 --- a/src/Tests/TestApi/GlobalUsings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Microsoft.VisualStudio.TestTools.UnitTesting; \ No newline at end of file diff --git a/src/Tests/TestApi/TestApi.csproj b/src/Tests/TestApi/TestApi.csproj deleted file mode 100644 index 719074b..0000000 --- a/src/Tests/TestApi/TestApi.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - net8.0 - enable - enable - - false - true - - - - - - - - - - - - - - - - - diff --git a/src/Tests/TestApi/UserControllerTest.cs b/src/Tests/TestApi/UserControllerTest.cs deleted file mode 100644 index e69de29..0000000 diff --git a/src/Tests/TestsAPI/UnitTestApi/Controllers/UsersControllerTest.cs b/src/Tests/TestsAPI/UnitTestApi/Controllers/UsersControllerTest.cs index 0a5eb52..32cade7 100644 --- a/src/Tests/TestsAPI/UnitTestApi/Controllers/UsersControllerTest.cs +++ b/src/Tests/TestsAPI/UnitTestApi/Controllers/UsersControllerTest.cs @@ -86,7 +86,6 @@ public class UsersControllerTest [TestMethod] public async Task Get_ReturnsPageResponse_WhenRequestIsValid() { - var request = new PageRequest { Index = 0, @@ -95,11 +94,10 @@ public class UsersControllerTest Descending = false }; - // Act var result = await _usersController.Get(request); Assert.IsInstanceOfType(result.Result, typeof(OkObjectResult)); var okResult = result.Result as OkObjectResult; - // Assert + Assert.IsNotNull(okResult); Assert.IsInstanceOfType(okResult.Value, typeof(PageResponse)); var pageResponse = okResult.Value as PageResponse; @@ -118,7 +116,6 @@ public class UsersControllerTest public async Task Get_ReturnsCorrectPaginationAndOrdering(int index, int count, string orderingProperty, bool descending, int expectedItemCount) { - var request = new PageRequest { Index = index, @@ -126,11 +123,11 @@ public class UsersControllerTest OrderingPropertyName = orderingProperty, Descending = descending }; - // Act + var result = await _usersController.Get(request); Assert.IsInstanceOfType(result.Result, typeof(OkObjectResult)); var okResult = result.Result as OkObjectResult; - // Assert + Assert.IsNotNull(okResult); Assert.IsInstanceOfType(okResult.Value, typeof(PageResponse)); var pageResponse = okResult.Value as PageResponse; @@ -157,67 +154,59 @@ public class UsersControllerTest - [TestMethod] - public async Task GetById_ReturnsUserDto_WhenRequestIsValid() - { - - var id = 1; - _dataManagerMock.Setup(dm => dm.UserRepo.GetItemById(id)).ReturnsAsync(_users.First(x => x.Id == id)); - - // Act - var result = await _usersController.GetById(id) ; - Assert.IsInstanceOfType(result.Result, typeof(OkObjectResult)); - var okResult = result.Result as OkObjectResult; - - // Assert - Assert.IsNotNull(okResult); - var resultObject = result.Result as OkObjectResult; - Assert.IsNotNull(resultObject); - Assert.IsInstanceOfType(resultObject.Value, typeof(UserDto)); - var user = resultObject.Value as UserDto; - Assert.IsNotNull(user); - var tmp = _users.First(x => x.Id == id).ToDto(); - Assert.AreEqual(tmp.Id, user.Id); - } + [TestMethod] + public async Task GetById_ReturnsUserDto_WhenRequestIsValid() + { + var id = 1; + _dataManagerMock.Setup(dm => dm.UserRepo.GetItemById(id)).ReturnsAsync(_users.First(x => x.Id == id)); + + var result = await _usersController.GetById(id) ; + Assert.IsInstanceOfType(result.Result, typeof(OkObjectResult)); + var okResult = result.Result as OkObjectResult; + + Assert.IsNotNull(okResult); + var resultObject = result.Result as OkObjectResult; + Assert.IsNotNull(resultObject); + Assert.IsInstanceOfType(resultObject.Value, typeof(UserDto)); + var user = resultObject.Value as UserDto; + Assert.IsNotNull(user); + var tmp = _users.First(x => x.Id == id).ToDto(); + Assert.AreEqual(tmp.Id, user.Id); + } - [TestMethod] - public async Task GetById_ReturnsUserDto_WhenRequestUserDoesNotExist() - { - - var id = 0; - _dataManagerMock.Setup(dm => dm.UserRepo.GetItemById(id)).ReturnsAsync((User)null!); + [TestMethod] + public async Task GetById_ReturnsUserDto_WhenRequestUserDoesNotExist() + { + + var id = 0; + _dataManagerMock.Setup(dm => dm.UserRepo.GetItemById(id)).ReturnsAsync((User)null!); - // Act - var result = await _usersController.GetById(id) ; + // Act + var result = await _usersController.GetById(id) ; - // Assert - Assert.IsInstanceOfType(result.Result, typeof(NotFoundObjectResult)); - } + // Assert + Assert.IsInstanceOfType(result.Result, typeof(NotFoundObjectResult)); + } - [TestMethod] - public async Task GetById_Returns404_WhenIdIsInvalid() - { - - var id = -2; - - // Act - var result = await _usersController.GetById(id); - - // Assert - Assert.IsInstanceOfType(result.Result, typeof(NotFoundObjectResult)); - } + [TestMethod] + public async Task GetById_Returns404_WhenIdIsInvalid() + { + var id = -2; + + var result = await _usersController.GetById(id); + + Assert.IsInstanceOfType(result.Result, typeof(NotFoundObjectResult)); + } [TestMethod] public async Task Count_ReturnsInt_WhenRequestIsValid() { - // Act var result = await _usersController.Count(); Assert.IsNotNull(result); result = result.Result as OkObjectResult; - // Assert Assert.IsNotNull(result); Assert.IsInstanceOfType(result.Value, typeof(int)); } diff --git a/src/Tests/UnitTestsEntities/DatabaseFixture.cs b/src/Tests/UnitTestsEntities/DatabaseFixture.cs index eaae26d..00dc9bf 100644 --- a/src/Tests/UnitTestsEntities/DatabaseFixture.cs +++ b/src/Tests/UnitTestsEntities/DatabaseFixture.cs @@ -7,7 +7,7 @@ namespace UnitTestsEntities; public class DatabaseFixture : IDisposable { - private readonly SqliteConnection _connection; + public readonly SqliteConnection _connection; public readonly DbContextOptions _options; public DatabaseFixture() { diff --git a/src/Tests/WebAPIConsoleTests/ActivityServiceAPI.cs b/src/Tests/WebAPIConsoleTests/ActivityServiceAPI.cs new file mode 100644 index 0000000..78f042f --- /dev/null +++ b/src/Tests/WebAPIConsoleTests/ActivityServiceAPI.cs @@ -0,0 +1,110 @@ +/*! + * \file BookDataServiceAPI.cs + * \author HeartTeam + * \brief Fichier contenant la classe BookDataServiceAPI. + */ + +using System.Diagnostics; +using Dto; +using Model.Repository; +using Shared; +using APIMappers; + +/*! + * \brief Implémentation de l'interface IActivityRepository pour récupérer des activités via un service HTTP. + */ +public class ActivityServiceAPI : IActivityRepository +{ + private HttpRequest myRequest = new HttpRequest(); + + /*! + * \brief Constructeur de la classe ActivityServiceAPI. + * Initialise l'adresse de base du client HTTP. + */ + public ActivityServiceAPI() + { + myRequest.HttpClient.BaseAddress = new Uri("http://localhost:5030/api/v1/Activity/"); + } + + /*! + * \brief Récupère toutes les Activités de manière asynchrone. + * \return Une tâche représentant l'opération asynchrone qui retourne une liste d'Activity. + */ + public async Task?> GetActivities(int index, int count, ActivityOrderCriteria criteria, bool descending = false) + { + var activityDtos = await myRequest.GetAllAsync(); + return activityDtos?.ToModels(); + } + + /*! + * \brief Récupère les activités par index et compte de manière asynchrone. + * \param index L'index de départ pour la pagination. + * \param count Le nombre d'éléments à récupérer. + * \return Une tâche représentant l'opération asynchrone qui retourne une liste d'Activity. + */ + public async Task> GetBooksAsync(ActivityOrderCriteria criteria, bool descending, int index, int count) + { + var activityDtos = await myRequest.GetAsync(criteria, descending, index, count); + return (List)activityDtos.ToModels(); + } + + /*! + * \brief Récupère une activité par son identifiant de manière asynchrone. + * \param id L'identifiant du livre à récupérer. + * \return Une tâche représentant l'opération asynchrone qui retourne une liste d'Activity. + */ + public async Task?> GetActivityByIdAsync(int id) + { + var activityDtos = await myRequest.GetByIdAsync(id); + return activityDtos.ToModels(); + } + + /*! + * \brief Ajoute une activité de manière asynchrone. + * \param activity L'Activity à ajouter. + * \return Une tâche représentant l'opération asynchrone qui retourne l'activité ajouté (Activity). + */ + public async Task AddActivity(Model.Activity activity) + { + return await myRequest.PostAsync(activity.ToDto()).ToModel(); + } + + /*! + * \brief Met à jour une activité de manière asynchrone. + * \param id L'identifiant de l'activité à mettre à jour. + * \param activity Les nouvelles données de l'activité à mettre à jour. + * \return Une tâche représentant l'opération asynchrone qui retourne l'activité mis à jour (Activity). + */ + public async Task UpdateActivity(int id, Model.Activity activity) + { + var activityDto = activity.ToDto(); + var updatedActivityDto = await myRequest.PutAsync(id, activityDto); + return updatedActivityDto?.ToModel(); + } + + /*! + * \brief Supprime une activité de manière asynchrone. + * \param id L'identifiant de l'activité à supprimer. + * \return Une tâche représentant l'opération asynchrone. + */ + public async Task DeleteActivity(int id) + { + await myRequest.DeleteAsync(id); + return true; + } + + public Task GetNbItems() + { + return myRequest.GetNbItems(); + } + + public Task?> GetActivitiesByUser(int userId, int index, int count, ActivityOrderCriteria orderCriteria, bool descending = false) + { + return (List)myRequest.GetActivitiesByUser(userId, index, count, orderCriteria, descending).ToModels(); + } + + public Task GetNbActivitiesByUser(int userId) + { + return myRequest.GetNbActivitiesByUser(userId); + } +} \ No newline at end of file diff --git a/src/Tests/WebAPIConsoleTests/HttpRequest.cs b/src/Tests/WebAPIConsoleTests/HttpRequest.cs new file mode 100644 index 0000000..ac4f976 --- /dev/null +++ b/src/Tests/WebAPIConsoleTests/HttpRequest.cs @@ -0,0 +1,99 @@ +/*! + * \file HttpRequest.cs + * \author Antoine PEREDERII + * \brief Fichier contenant la classe HttpRequest. + */ + +using System.Diagnostics; +using System.Net.Http.Json; +using Dto; +using Shared; + +/*! + * \brief Classe représentant un client HTTP pour les requêtes vers un service de gestion de livres. + */ +public class HttpRequest where T : class +{ + private HttpClient _httpClient { get; } = new HttpClient(); + public HttpClient HttpClient => _httpClient; + + /*! + * \brief Récupère tous les livres de manière asynchrone. + * \return Une tâche représentant l'opération asynchrone qui retourne une liste de T. + */ + public async Task> GetAllAsync() + { + return await _httpClient.GetFromJsonAsync>(""); + } + + /*! + * \brief Récupère les activités par index et compte de manière asynchrone. + * \param index L'index de départ pour la pagination. + * \param count Le nombre d'éléments à récupérer. + * \return Une tâche représentant l'opération asynchrone qui retourne une liste de T. + */ + public async Task> GetAsync((ActivityOrderCriteria, AthleteOrderCriteria) criteria, bool descending, int index, int count) + { + return await _httpClient.GetFromJsonAsync>($"?OrderingPropertyName={criteria}&Descending={descending}&Index={index}&Count={count}"); + } + + /*! + * \brief Récupère un livre par son identifiant de manière asynchrone. + * \param id L'identifiant du livre à récupérer. + * \return Une tâche représentant l'opération asynchrone qui retourne une liste de T. + */ + public async Task> GetByIdAsync(int id) + { + return await _httpClient.GetFromJsonAsync>($"{id}"); + } + + public Task GetNbItems() + { + return _httpClient.GetFromJsonAsync("count"); + } + + public Task?> GetActivitiesByUser(int userId, int index, int count, (ActivityOrderCriteria, AthleteOrderCriteria) orderCriteria, bool descending = false) + { + return _httpClient.GetFromJsonAsync?>($"?userId={userId}&index={index}&count={count}&orderCriteria={orderCriteria}&descending={descending}"); + } + + public Task GetNbActivitiesByUser(int userId) + { + return _httpClient.GetFromJsonAsync($"count?userId={userId}"); + } + + /*! + * \brief Ajoute un livre de manière asynchrone. + * \param book Le livre à ajouter. + * \return Une tâche représentant l'opération asynchrone qui retourne le livre ajouté (T). + */ + public async Task PostAsync(T activity) + { + var response = await _httpClient.PostAsJsonAsync("", activity); + + return await response.Content.ReadFromJsonAsync(); + } + + /*! + * \brief Met à jour un livre de manière asynchrone. + * \param id L'identifiant du livre à mettre à jour. + * \param book Les nouvelles données du livre à mettre à jour. + * \return Une tâche représentant l'opération asynchrone qui retourne le livre mis à jour (T). + */ + public async Task PutAsync(int id, T activity) + { + var response = await _httpClient.PutAsJsonAsync($"{id}", activity); + + return await response.Content.ReadFromJsonAsync(); + } + + /*! + * \brief Supprime un livre de manière asynchrone. + * \param id L'identifiant du livre à supprimer. + * \return Une tâche représentant l'opération asynchrone. + */ + public async Task DeleteAsync(int id) + { + await _httpClient.DeleteAsync($"{id}"); + } +} \ No newline at end of file diff --git a/src/Tests/WebAPIConsoleTests/Program.cs b/src/Tests/WebAPIConsoleTests/Program.cs new file mode 100644 index 0000000..f421479 --- /dev/null +++ b/src/Tests/WebAPIConsoleTests/Program.cs @@ -0,0 +1,63 @@ +using Dto; +using Model; +using Model.Repository; +using Shared; + +IActivityRepository myConsoleTest = new ActivityServiceAPI(); + +// defini un delais d'attente du déploiement de l'API +await Task.Delay(5000); + +// Affiche toutes les activités +Console.WriteLine("Affichage de toutes les Activités : "); +var res = await myConsoleTest.GetActivities(0, 10, ActivityOrderCriteria.ByAthleteId, false); +foreach(var myActivity in res) +{ + Console.WriteLine(myActivity.Id + ", " + myActivity.Type + ", " + myActivity.StartTime + ", " + myActivity.EndTime + ", " + myActivity.DataSource + ", " + myActivity.Athlete); +} + +// Affiche les activités par id +Console.WriteLine("Affichage du livre d'id 1 : "); +res = (IEnumerable)await myConsoleTest.GetActivityByIdAsync(1); +foreach (var myActivity in res) +{ + Console.WriteLine(myActivity.Id + ", " + myActivity.Type + ", " + myActivity.StartTime + ", " + myActivity.EndTime + ", " + myActivity.DataSource + ", " + myActivity.Athlete); +} + +// Ajouter une nouvelle activité +Console.WriteLine("Ajout d'un nouveau livre : "); +var newActivity = new ActivityDto { Type = "New Activity", StartTime = DateTime.Now, EndTime = DateTime.Now, DataSource = new DataSourceDto{}, Athlete = new UserDto{ Username = "Hello", FirstName = "feee", Email = "exemple.com", LastName = "dddd", Sexe = "M" } }; +var addedActivity = await myConsoleTest.AddActivity(newActivity); +Console.WriteLine($"Id: {addedActivity.Id}, Type: {addedActivity.Type}, StartTime: {addedActivity.StartTime}, EndTime: {addedActivity.EndTime}, DataSource: {addedActivity.DataSource}, Athlete: {addedActivity.Athlete}"); + +// Mettre à jour l'activity ajouté +Console.WriteLine("Mise à jour du livre ajouté : "); +var activity = await myConsoleTest.UpdateActivity(1, new ActivityDto { Id = 1, Type = "Updated Activity", StartTime = DateTime.Now, EndTime = DateTime.Now, DataSource = new DataSourceDto{}, Athlete = new UserDto{ Username = "Hello", FirstName = "feee", Email = "exemple.com", LastName = "dddd", Sexe = "M" } }); +Console.WriteLine($"Id: {activity.Id}, Type: {activity.Type}, StartTime: {activity.StartTime}, EndTime: {activity.EndTime}, DataSource: {activity.DataSource}, Athlete: {activity.Athlete}"); + +// Supprimer l'activity ajouté +Console.WriteLine("Suppression du livre ajouté : "); +await myConsoleTest.DeleteActivity(newActivity.Id); +res = await myConsoleTest.GetActivities(0, 10, ActivityOrderCriteria.ByAthleteId, false); +foreach (var activity1 in res) +{ + Console.WriteLine(activity1.Id + ", " + activity1.Type + ", " + activity1.StartTime + ", " + activity1.EndTime + ", " + activity1.DataSource + ", " + activity1.Athlete); +} + +// Affiche le nombre d'activités +Console.WriteLine("Affichage du nombre d'activités : "); +var nb = await myConsoleTest.GetNbItems(); +Console.WriteLine(nb); + +// Affiche les activités par utilisateur +Console.WriteLine("Affichage des activités par utilisateur : "); +res = await myConsoleTest.GetActivitiesByUser(1, 0, 10, ActivityOrderCriteria.ByAthleteId, false); +foreach (var activity3 in res) +{ + Console.WriteLine(activity3.Id + ", " + activity3.Type + ", " + activity3.StartTime + ", " + activity3.EndTime + ", " + activity3.DataSource + ", " + activity3.Athlete); +} + +// Affiche le nombre d'activités par utilisateur +Console.WriteLine("Affichage du nombre d'activités par utilisateur : "); +nb = await myConsoleTest.GetNbActivitiesByUser(1); +Console.WriteLine(nb); \ No newline at end of file diff --git a/src/Tests/WebAPIConsoleTests/WebAPIConsoleTests.csproj b/src/Tests/WebAPIConsoleTests/WebAPIConsoleTests.csproj new file mode 100644 index 0000000..8f402c3 --- /dev/null +++ b/src/Tests/WebAPIConsoleTests/WebAPIConsoleTests.csproj @@ -0,0 +1,17 @@ + + + + + + + + + + + Exe + net8.0 + enable + enable + + +