From d03d695e6885e84d97849d0a767fb8d81a35ba16 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Wed, 27 Mar 2024 13:24:02 +0100 Subject: [PATCH 01/30] changement de UserEntity ajout de unique sur les chanps email et username --- API_SQLuedo/EntityFramework/UserEntity.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/API_SQLuedo/EntityFramework/UserEntity.cs b/API_SQLuedo/EntityFramework/UserEntity.cs index aa2527f..ecbabcc 100644 --- a/API_SQLuedo/EntityFramework/UserEntity.cs +++ b/API_SQLuedo/EntityFramework/UserEntity.cs @@ -1,8 +1,11 @@ using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; namespace Entities; [Table("User")] +[Index(nameof(Username), IsUnique = true)] +[Index(nameof(Email), IsUnique = true)] public class UserEntity { public int Id { get; set; } From 8e8e55542b62173217ddbc3881e9287b4e01f9e0 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Wed, 27 Mar 2024 14:51:48 +0100 Subject: [PATCH 02/30] =?UTF-8?q?ajout=20de=20methode=20pour=20verfier=20s?= =?UTF-8?q?i=20l'email=20ou=20le=20username=20est=20d=C3=A9j=C3=A0=20en=20?= =?UTF-8?q?base=20de=20donn=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/API/Controllers/UserController.cs | 10 ++++++++++ API_SQLuedo/API/Service/UserDataServiceAPI.cs | 4 ++++ API_SQLuedo/DbDataManager/Service/UserDataService.cs | 12 ++++++++++++ API_SQLuedo/Shared/IUserService.cs | 2 ++ 4 files changed, 28 insertions(+) diff --git a/API_SQLuedo/API/Controllers/UserController.cs b/API_SQLuedo/API/Controllers/UserController.cs index 0d8a3cc..c2442a7 100644 --- a/API_SQLuedo/API/Controllers/UserController.cs +++ b/API_SQLuedo/API/Controllers/UserController.cs @@ -157,6 +157,16 @@ namespace API.Controllers return BadRequest(); } + if (userService.IsEmailTaken(dto.Email)) + { + return BadRequest("Email déjà utilisé"); + } + + if (userService.IsUsernameTaken(dto.Username)) + { + return BadRequest("Username déjà utilisé"); + } + // return Ok(userService.CreateUser(username, password, email, isAdmin)); logger.LogInformation( "[INFORMATION] Un utilisateur a été créé : username - {username}, password - {password}, email - {email}, isAdmin - {isAdmin}", diff --git a/API_SQLuedo/API/Service/UserDataServiceAPI.cs b/API_SQLuedo/API/Service/UserDataServiceAPI.cs index 273e5f0..1102048 100644 --- a/API_SQLuedo/API/Service/UserDataServiceAPI.cs +++ b/API_SQLuedo/API/Service/UserDataServiceAPI.cs @@ -38,4 +38,8 @@ public class UserDataServiceApi(IUserService userService) : IUserSer public UserDto CreateUser(string username, string password, string email, bool isAdmin) => userService.CreateUser(username, password, email, isAdmin).FromEntityToDto(); + + public bool IsEmailTaken(string email) => userService.IsEmailTaken(email); + + public bool IsUsernameTaken(string username) => userService.IsUsernameTaken(username); } \ No newline at end of file diff --git a/API_SQLuedo/DbDataManager/Service/UserDataService.cs b/API_SQLuedo/DbDataManager/Service/UserDataService.cs index 4676d15..ac3b606 100644 --- a/API_SQLuedo/DbDataManager/Service/UserDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/UserDataService.cs @@ -179,4 +179,16 @@ public class UserDataService : IUserService DbContext.SaveChangesAsync(); return newUserEntity; } + + public bool IsEmailTaken(string email) + { + var isEmail = DbContext.Users.Any(u => u.Email == email); + return isEmail; + } + + public bool IsUsernameTaken(string username) + { + var isUsername = DbContext.Users.Any(u => u.Username == username); + return isUsername; + } } \ No newline at end of file diff --git a/API_SQLuedo/Shared/IUserService.cs b/API_SQLuedo/Shared/IUserService.cs index 06051a9..4c4b10c 100644 --- a/API_SQLuedo/Shared/IUserService.cs +++ b/API_SQLuedo/Shared/IUserService.cs @@ -14,5 +14,7 @@ namespace Shared public bool DeleteUserByUsername(string username); public TUser UpdateUser(int id, TUser user); public TUser CreateUser(string username, string password, string email, bool isAdmin); + public bool IsEmailTaken(string email); + public bool IsUsernameTaken(string username); } } \ No newline at end of file From abe138e4e4bac2337dd29d1b82d2f36925021e2f Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Wed, 27 Mar 2024 15:26:03 +0100 Subject: [PATCH 03/30] resolution d'erreur pas rapport au tests EF --- .../Service/TestBlackListDataService.cs | 46 +++++------ .../TestEF/Service/TestUserDataService.cs | 80 +++++++++---------- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs index e4bbe1c..91b4114 100644 --- a/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs @@ -26,24 +26,24 @@ public class TestBlackListDataService [Fact] public void BanUser_Success() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test101", Email = "example101@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test102", Email = "example102@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test103", Email = "example103@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); - var banResult = _blackListDataService.BanUser("Test1"); + var banResult = _blackListDataService.BanUser("Test101"); Assert.True(banResult); } [Fact] public void GetNbBannedUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example1@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example2@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example3@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test61", Email = "example61@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test62", Email = "example62@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test63", Email = "example63@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); - var banResult1 = _blackListDataService.BanUser("Test1"); - var banResult2 = _blackListDataService.BanUser("Test2"); - var banResult3 = _blackListDataService.BanUser("Test3"); + var banResult1 = _blackListDataService.BanUser("Test61"); + var banResult2 = _blackListDataService.BanUser("Test62"); + var banResult3 = _blackListDataService.BanUser("Test63"); Assert.True(banResult1); Assert.True(banResult2); Assert.True(banResult3); @@ -53,9 +53,9 @@ public class TestBlackListDataService [Fact] public void BanUser_Fail() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test71", Email = "example71@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test72", Email = "example72@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test73", Email = "example73@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var banResult = _blackListDataService.BanUser("Test42"); Assert.False(banResult); @@ -64,24 +64,24 @@ public class TestBlackListDataService [Fact] public void IsBanned_Success() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example1@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test81", Email = "example81@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test82", Email = "example82@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test83", Email = "example83@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); - var banResult = _blackListDataService.BanUser("Test1"); + var banResult = _blackListDataService.BanUser("Test81"); Assert.True(banResult); - Assert.NotNull(_blackListDataService.GetUserBannedByEmail("example1@email.com")); + Assert.NotNull(_blackListDataService.GetUserBannedByEmail("example81@email.com")); } [Fact] public void UnbanUser_Success() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example1@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test91", Email = "example91@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test92", Email = "example92@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test93", Email = "example93@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); - var banResult = _blackListDataService.BanUser("Test1"); + var banResult = _blackListDataService.BanUser("Test91"); Assert.True(banResult); - Assert.True(_blackListDataService.UnbanUser("example1@email.com")); + Assert.True(_blackListDataService.UnbanUser("example91@email.com")); } } \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Service/TestUserDataService.cs b/API_SQLuedo/TestEF/Service/TestUserDataService.cs index 0908398..863a10c 100644 --- a/API_SQLuedo/TestEF/Service/TestUserDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestUserDataService.cs @@ -27,9 +27,9 @@ public class TestUserDataService [Fact] public void GetUsers_ReturnsCorrectNumberOfUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test10", Email = "example1@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test12", Email = "example2@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test13", Email = "example3@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var result = _userDataService.GetUsers(1, 2, UserOrderCriteria.None); Assert.Equal(2, result.Count()); @@ -38,9 +38,9 @@ public class TestUserDataService [Fact] public void GetNotAdminUsers_ReturnsCorrectNumberOfUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test14", Email = "example4@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test15", Email = "example5@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test16", Email = "example6@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.None); Assert.Equal(1, result.Count()); @@ -49,9 +49,9 @@ public class TestUserDataService [Fact] public void GetNotAdminUsers_BadPage_ReturnsCorrectNumberOfUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test17", Email = "example7@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test18", Email = "example8@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test19", Email = "example9@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var result = _userDataService.GetNotAdminUsers(-42, 2, UserOrderCriteria.None); Assert.Equal(1, result.Count()); @@ -60,9 +60,9 @@ public class TestUserDataService [Fact] public void GetNotAdminUsers_BadNumber_ReturnsCorrectNumberOfUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test20", Email = "example10@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test21", Email = "example11@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test22", Email = "example12@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var result = _userDataService.GetNotAdminUsers(1, -42, UserOrderCriteria.None); Assert.Equal(1, result.Count()); @@ -71,9 +71,9 @@ public class TestUserDataService [Fact] public void GetNotAdminUsers_OrderedById_ReturnsCorrectNumberOfUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test23", Email = "example13@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test24", Email = "example14@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test51", Email = "example15@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.ById); Assert.Equal(1, result.Count()); @@ -82,9 +82,9 @@ public class TestUserDataService [Fact] public void GetNotAdminUsers_OrderedByUsername_ReturnsCorrectNumberOfUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test25", Email = "example16@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test26", Email = "example17@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test27", Email = "example18@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.ByUsername); Assert.Equal(1, result.Count()); @@ -93,9 +93,9 @@ public class TestUserDataService [Fact] public void GetNotAdminUsers_OrderedByEmail_ReturnsCorrectNumberOfUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test52", Email = "example45@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test53", Email = "example46@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test54", Email = "example17@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.ByEmail); Assert.Equal(1, result.Count()); @@ -104,9 +104,9 @@ public class TestUserDataService [Fact] public void GetNotAdminUsers_OrderedByIsAdmin_ReturnsCorrectNumberOfUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test28", Email = "example19@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test29", Email = "example20@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test30", Email = "example21@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.ByIsAdmin); Assert.Equal(1, result.Count()); @@ -115,9 +115,9 @@ public class TestUserDataService [Fact] public void GetNumberOfUsers_ReturnsCorrectNumberOfUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); - _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test3", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test31", Email = "example22@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test32", Email = "example23@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test33", Email = "example24@email.com", Password = "password", IsAdmin = true }); _dbContext.SaveChanges(); var result = _userDataService.GetNumberOfUsers(); Assert.Equal(3, result); @@ -126,29 +126,29 @@ public class TestUserDataService [Fact] public void GetUserById_ReturnsCorrectUser() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test34", Email = "example25@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test35", Email = "example26@email.com", Password = "password", IsAdmin = false }); _dbContext.SaveChanges(); var result = _userDataService.GetUserById(1); - Assert.Equal("Test1", result.Username); + Assert.Equal("Test34", result.Username); } [Fact] public void GetUserByUsername_ReturnsCorrectUser() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test36", Email = "example27@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test37", Email = "example28@email.com", Password = "password", IsAdmin = false }); _dbContext.SaveChanges(); - var result = _userDataService.GetUserByUsername("Test1"); + var result = _userDataService.GetUserByUsername("Test36"); Assert.Equal(1, result.Id); } [Fact] public void GetUserByEmail_ReturnsCorrectUser() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test38", Email = "example29@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test39", Email = "example30@email.com", Password = "password", IsAdmin = false }); _dbContext.SaveChanges(); - var result = _userDataService.GetUserByEmail("example@email.com"); + var result = _userDataService.GetUserByEmail("example29@email.com"); Assert.Equal(1, result.Id); } @@ -196,8 +196,8 @@ public class TestUserDataService [Fact] public void GetUsers_WithBadPage_ReturnsClassicUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test40", Email = "example31@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test41", Email = "example32@email.com", Password = "password", IsAdmin = false }); _dbContext.SaveChanges(); var result = _userDataService.GetUsers(-1, 2, UserOrderCriteria.None); @@ -208,8 +208,8 @@ public class TestUserDataService [Fact] public void GetUsers_WithBadNumber_ReturnsClassicUsers() { - _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); - _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test2", Email = "example@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test43", Email = "example33@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test44", Email = "example34@email.com", Password = "password", IsAdmin = false }); _dbContext.SaveChanges(); var result = _userDataService.GetUsers(1, -42, UserOrderCriteria.None); From 823701a57ec4ef4ee646ece67e7e7ab5cc164550 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Wed, 27 Mar 2024 17:50:41 +0100 Subject: [PATCH 04/30] ajout des pour CreateUser avec un username existant et un email existant --- API_SQLuedo/TestAPI/UserUnitTest.cs | 30 +++++++++++++++++++ .../TestEF/Service/TestUserDataService.cs | 20 +++++++++++++ 2 files changed, 50 insertions(+) diff --git a/API_SQLuedo/TestAPI/UserUnitTest.cs b/API_SQLuedo/TestAPI/UserUnitTest.cs index 39345d0..abdfbfb 100644 --- a/API_SQLuedo/TestAPI/UserUnitTest.cs +++ b/API_SQLuedo/TestAPI/UserUnitTest.cs @@ -285,6 +285,36 @@ public class UserUnitTest Assert.Equal(400, bdObjectResult.StatusCode); } } + [Fact] + public void CreateUserWithExistingEmail() + { + GetUsersData(); + _userService.Setup(x => x.CreateUser("Nom", "Passssss", "adressemail@gmail.com", true)) + .Returns(new UserDto("Nom", "Passssss", "adressemail@gmail.com", true)); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.CreateUser(new UserDto(null, "Passssss", "adressemail@gmail.com", true)); + + if (userResult is BadRequestResult bdObjectResult) + { + Assert.Equal(400, bdObjectResult.StatusCode); + } + } + [Fact] + public void CreateUserWithExistingUsername() + { + GetUsersData(); + _userService.Setup(x => x.CreateUser("Useruser", "Passssss", "heudfk@hdye.com", true)) + .Returns(new UserDto("Useruser", "Passssss", "heudfk@hdye.com", true)); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.CreateUser(new UserDto("Useruser", "Passssss", "heudfk@hdye.com", true)); + + if (userResult is BadRequestResult bdObjectResult) + { + Assert.Equal(400, bdObjectResult.StatusCode); + } + } [Fact] public void UpdateUserSuccess() diff --git a/API_SQLuedo/TestEF/Service/TestUserDataService.cs b/API_SQLuedo/TestEF/Service/TestUserDataService.cs index 863a10c..9f4638c 100644 --- a/API_SQLuedo/TestEF/Service/TestUserDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestUserDataService.cs @@ -253,6 +253,26 @@ public class TestUserDataService Assert.False(result); } + [Fact] + public void isEmailTaken_ReturnFalse() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test81", Email = "example81@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + + var result = _userDataService.IsEmailTaken("example895@email.com"); + + Assert.False(result); + } + [Fact] + public void isEmailTaken_ReturnTrue() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test82", Email = "example82@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + + var result = _userDataService.IsEmailTaken("example82@email.com"); + + Assert.True(result); + } [Fact] public void DeleteUserByUsername_WithoutExisting_ReturnsFalse() From bdc1e01aa4bd9dc184186fe8a6db6e0e7d0388b3 Mon Sep 17 00:00:00 2001 From: masapountz Date: Wed, 27 Mar 2024 20:04:15 +0100 Subject: [PATCH 05/30] Ajout de l'autorisation au Blazor de se connecter --- API_SQLuedo/API/Program.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/API_SQLuedo/API/Program.cs b/API_SQLuedo/API/Program.cs index 529a451..eab3624 100644 --- a/API_SQLuedo/API/Program.cs +++ b/API_SQLuedo/API/Program.cs @@ -79,9 +79,22 @@ builder.Services.AddSwaggerGen(option => } }); }); +builder.Services.AddCors(options => +{ + options.AddPolicy("AllowSpecificOrigin", + builder => + { + builder.WithOrigins("https://localhost:7171") + .AllowAnyMethod() + .AllowAnyHeader(); + }); +}); + var app = builder.Build(); +app.UseCors("AllowSpecificOrigin"); + // Création de l'utilisateur admin pour la base de données Identity using (var scope = app.Services.CreateScope()) From e906584989b13f344004b3f0bd06fe323394d9b0 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Thu, 28 Mar 2024 10:19:53 +0100 Subject: [PATCH 06/30] changement des codes du verbe POST de User pour traiter les erreur dans la partie client --- API_SQLuedo/API/Controllers/UserController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/API_SQLuedo/API/Controllers/UserController.cs b/API_SQLuedo/API/Controllers/UserController.cs index c2442a7..1c1a6d4 100644 --- a/API_SQLuedo/API/Controllers/UserController.cs +++ b/API_SQLuedo/API/Controllers/UserController.cs @@ -159,12 +159,12 @@ namespace API.Controllers if (userService.IsEmailTaken(dto.Email)) { - return BadRequest("Email déjà utilisé"); + return StatusCode(409, "Email déjà utilisé"); } if (userService.IsUsernameTaken(dto.Username)) { - return BadRequest("Username déjà utilisé"); + return StatusCode(410, "Username déjà utilisé"); } // return Ok(userService.CreateUser(username, password, email, isAdmin)); From 9fd24d9726119a4a34259611d40bb41da8b3e706 Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Thu, 28 Mar 2024 10:40:15 +0100 Subject: [PATCH 07/30] =?UTF-8?q?Ajout=20de=20GetNumberOfInquiries=20et=20?= =?UTF-8?q?des=20tests=20unitaires=20associ=C3=A9s=20+=20modification=20de?= =?UTF-8?q?=20certaines=20valeurs=20de=20retour=20dans=20les=20controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../API/Controllers/BlackListController.cs | 14 ++++++++++---- .../API/Controllers/InquiriesController.cs | 10 ++++++++++ .../API/Service/InquiryDataServiceAPI.cs | 5 +++++ .../Service/InquiryDataService.cs | 5 +++++ .../DbDataManager/Service/UserDataService.cs | 1 - API_SQLuedo/Shared/IInquiryService.cs | 1 + API_SQLuedo/TestAPI/BlackListUnitTest.cs | 12 ++++++------ API_SQLuedo/TestAPI/InquiryUnitTest.cs | 19 +++++++++++++++++++ .../TestEF/Service/TestInquiryDataService.cs | 13 +++++++++++++ 9 files changed, 69 insertions(+), 11 deletions(-) diff --git a/API_SQLuedo/API/Controllers/BlackListController.cs b/API_SQLuedo/API/Controllers/BlackListController.cs index 7f2bc56..18e5e66 100644 --- a/API_SQLuedo/API/Controllers/BlackListController.cs +++ b/API_SQLuedo/API/Controllers/BlackListController.cs @@ -1,5 +1,7 @@ +using Asp.Versioning; using Dto; using Entities; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Model.OrderCriteria; using Shared; @@ -7,12 +9,16 @@ using Shared.Mapper; namespace API.Controllers; +[Route("api/v{version:apiVersion}/[controller]")] +[Authorize] +[ApiVersion("1.0")] +[ApiController] public class BlackListController(ILogger logger, IBlackListService blackListService) : ControllerBase { [HttpGet("user/ban/{page:int}/{number:int}")] [ProducesResponseType(typeof(IEnumerable), 200)] [ProducesResponseType(typeof(string), 204)] - public IActionResult GetUsers(int page, int number, BlackListOdrerCriteria orderCriteria) + public IActionResult GetBannedUsers(int page, int number, BlackListOdrerCriteria orderCriteria) { var users = blackListService.GetBannedUsers(page, number, orderCriteria).ToList(); if (users.Count == 0) @@ -32,7 +38,7 @@ public class BlackListController(ILogger logger, IBlackListServ { var nb = blackListService.GetNumberOfBannedUsers(); logger.LogInformation("[INFORMATION] {nb} Email(s) banni(s) trouvé(s)", nb); - return Ok(nb); + return Ok(new KeyValuePair("number",nb)); } [HttpPost("user/ban")] @@ -59,7 +65,7 @@ public class BlackListController(ILogger logger, IBlackListServ if (success) { logger.LogInformation("[INFORMATION] L'utilisateur avec le pseudo {username} a été banni pour 2 ans.", username); - return Ok(); + return Ok(new KeyValuePair("success", true)); } else { @@ -77,7 +83,7 @@ public class BlackListController(ILogger logger, IBlackListServ if (success) { logger.LogInformation("[INFORMATION] L'utilisateur avec l'email {email} a été débanni.", email); - return Ok(); + return Ok(new KeyValuePair("success", true)); } else { diff --git a/API_SQLuedo/API/Controllers/InquiriesController.cs b/API_SQLuedo/API/Controllers/InquiriesController.cs index 0b412bc..07b8c31 100644 --- a/API_SQLuedo/API/Controllers/InquiriesController.cs +++ b/API_SQLuedo/API/Controllers/InquiriesController.cs @@ -38,6 +38,16 @@ namespace API.Controllers _logger.LogInformation("[INFORMATION] {nb} Enquête(s) trouvée(s)", nbInquiry); return Ok(_inquiryDataService.GetInquiries(page, number, orderCriteria)); } + + [HttpGet("inquiries/number")] + [ProducesResponseType(typeof(InquiryDto), 200)] + [ProducesResponseType(typeof(string), 204)] + public IActionResult GetNumberOfInquiries() + { + var nbInquiry = _inquiryDataService.GetNumberOfInquiries(); + _logger.LogInformation("[INFORMATION] {nb} Enquête(s) trouvée(s)", nbInquiry); + return Ok(new KeyValuePair("nbInquiries", nbInquiry)); + } [HttpGet("inquiry/{id:int}")] [ProducesResponseType(typeof(InquiryDto), 200)] diff --git a/API_SQLuedo/API/Service/InquiryDataServiceAPI.cs b/API_SQLuedo/API/Service/InquiryDataServiceAPI.cs index 3e7d3a8..1244877 100644 --- a/API_SQLuedo/API/Service/InquiryDataServiceAPI.cs +++ b/API_SQLuedo/API/Service/InquiryDataServiceAPI.cs @@ -29,6 +29,11 @@ public class InquiryDataServiceApi(IInquiryService inquiryService return inquiries.Select(i => i.FromEntityToDto()).ToList(); } + public int GetNumberOfInquiries() + { + return inquiryService.GetNumberOfInquiries(); + } + public InquiryDto GetInquiryById(int id) => inquiryService.GetInquiryById(id).FromEntityToDto(); public InquiryDto GetInquiryByTitle(string title) => inquiryService.GetInquiryByTitle(title).FromEntityToDto(); diff --git a/API_SQLuedo/DbDataManager/Service/InquiryDataService.cs b/API_SQLuedo/DbDataManager/Service/InquiryDataService.cs index 0d69699..ef92e20 100644 --- a/API_SQLuedo/DbDataManager/Service/InquiryDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/InquiryDataService.cs @@ -48,6 +48,11 @@ public class InquiryDataService : IInquiryService return inquiries; } + public int GetNumberOfInquiries() + { + return DbContext.Inquiries.Count(); + } + public InquiryEntity GetInquiryById(int id) { var inquiryEntity = DbContext.Inquiries.FirstOrDefault(i => i.Id == id); diff --git a/API_SQLuedo/DbDataManager/Service/UserDataService.cs b/API_SQLuedo/DbDataManager/Service/UserDataService.cs index 4676d15..22277ce 100644 --- a/API_SQLuedo/DbDataManager/Service/UserDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/UserDataService.cs @@ -142,7 +142,6 @@ public class UserDataService : IUserService { return false; } - DbContext.Users.Remove(userEntity); DbContext.SaveChangesAsync(); return true; diff --git a/API_SQLuedo/Shared/IInquiryService.cs b/API_SQLuedo/Shared/IInquiryService.cs index 68d27b8..daf2c6a 100644 --- a/API_SQLuedo/Shared/IInquiryService.cs +++ b/API_SQLuedo/Shared/IInquiryService.cs @@ -5,6 +5,7 @@ namespace Shared; public interface IInquiryService { public IEnumerable GetInquiries(int page, int number, InquiryOrderCriteria orderCriteria); + public int GetNumberOfInquiries(); public TInquiry GetInquiryById(int id); public TInquiry GetInquiryByTitle(string title); public bool DeleteInquiry(int id); diff --git a/API_SQLuedo/TestAPI/BlackListUnitTest.cs b/API_SQLuedo/TestAPI/BlackListUnitTest.cs index 5bdd550..aea91ad 100644 --- a/API_SQLuedo/TestAPI/BlackListUnitTest.cs +++ b/API_SQLuedo/TestAPI/BlackListUnitTest.cs @@ -46,7 +46,7 @@ public class BlackListUnitTest var usersController = new BlackListController(new NullLogger(), _blackListService.Object); var userResult = usersController.BanUser("Test1"); - Assert.Equal(typeof(OkResult), userResult.GetType()); + Assert.Equal(typeof(OkObjectResult), userResult.GetType()); } [Fact] @@ -68,7 +68,7 @@ public class BlackListUnitTest var usersController = new BlackListController(new NullLogger(), _blackListService.Object); var userResult = usersController.UnbanUser("example@email.com"); - Assert.Equal(typeof(OkResult), userResult.GetType()); + Assert.Equal(typeof(OkObjectResult), userResult.GetType()); } [Fact] @@ -94,7 +94,7 @@ public class BlackListUnitTest }); var blackListController = new BlackListController(new NullLogger(), _blackListService.Object); - var result = blackListController.GetUsers(1,10,BlackListOdrerCriteria.None); + var result = blackListController.GetBannedUsers(1,10,BlackListOdrerCriteria.None); Assert.Equal(typeof(OkObjectResult), result.GetType()); if (result is OkObjectResult okObjectResult) { @@ -118,7 +118,7 @@ public class BlackListUnitTest }); var blackListController = new BlackListController(new NullLogger(), _blackListService.Object); - var result = blackListController.GetUsers(1,10,BlackListOdrerCriteria.ByEmail); + var result = blackListController.GetBannedUsers(1,10,BlackListOdrerCriteria.ByEmail); Assert.Equal(typeof(OkObjectResult), result.GetType()); if (result is OkObjectResult okObjectResult) { @@ -142,7 +142,7 @@ public class BlackListUnitTest }); var blackListController = new BlackListController(new NullLogger(), _blackListService.Object); - var result = blackListController.GetUsers(1,10,BlackListOdrerCriteria.ByExpirationDate); + var result = blackListController.GetBannedUsers(1,10,BlackListOdrerCriteria.ByExpirationDate); Assert.Equal(typeof(OkObjectResult), result.GetType()); if (result is OkObjectResult okObjectResult) { @@ -163,7 +163,7 @@ public class BlackListUnitTest var userResult = usersController.GetNumberOfBannedUsers(); Assert.Equal(typeof(OkObjectResult), userResult.GetType()); - Assert.Equal(10, (userResult as OkObjectResult).Value); + Assert.Equal(10, ((KeyValuePair)(userResult as OkObjectResult).Value).Value); } private IEnumerable GetBlackList() diff --git a/API_SQLuedo/TestAPI/InquiryUnitTest.cs b/API_SQLuedo/TestAPI/InquiryUnitTest.cs index 9bfdb68..b6bf727 100644 --- a/API_SQLuedo/TestAPI/InquiryUnitTest.cs +++ b/API_SQLuedo/TestAPI/InquiryUnitTest.cs @@ -36,6 +36,25 @@ public class InquiryUnitTest Assert.True(inquiryList.SequenceEqual(valeur as IEnumerable, new InquiryIdEqualityComparer())); } } + + [Fact] + public void GetNumberOfInquiries() + { + var inquiryList = GetInquiriesData(); + _inquiryService.Setup(x => x.GetNumberOfInquiries()) + .Returns(4); + var inquiryController = new InquiriesController(_inquiryService.Object, new NullLogger()); + + var inquiriesResult = inquiryController.GetNumberOfInquiries(); + + if (inquiriesResult is OkObjectResult okObjectResult) + { + var valeur = (KeyValuePair)okObjectResult.Value; + + Assert.NotNull(valeur); + Assert.Equal(GetInquiriesData().Count, valeur.Value); + } + } [Fact] public void GetInquiresListFail() diff --git a/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs index 1a6fb96..bb9e322 100644 --- a/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs @@ -37,6 +37,19 @@ public class TestInquiryDataService Assert.Equal(2, result.Count()); } + [Fact] + public void GetNumberOfInquiries() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.Inquiries.Add(new InquiryEntity { Id = 2, Title = "Test2", Description = "Desc2", IsUser = false }); + _dbContext.Inquiries.Add(new InquiryEntity { Id = 3, Title = "Test3", Description = "Desc3", IsUser = true }); + _dbContext.SaveChanges(); + + var result = _inquiryDataService.GetNumberOfInquiries(); + + Assert.Equal(3, result); + } + [Fact] public void GetInquiries_OrderedByTitle_ReturnsCorrectNumberOfInquiries() { From 92a1b9e8b3cbff42e832f3454931b140e8ff122a Mon Sep 17 00:00:00 2001 From: masapountz Date: Thu, 28 Mar 2024 15:26:30 +0100 Subject: [PATCH 08/30] Ajout de la route pour promouvoir un user --- API_SQLuedo/.dockerignore | 30 +++++++++++++++++ API_SQLuedo/API/Controllers/UserController.cs | 20 ++++++++++++ API_SQLuedo/API/Dockerfile | 32 +++++++++++++++++++ API_SQLuedo/API/Service/UserDataServiceAPI.cs | 3 ++ .../DbDataManager/Service/UserDataService.cs | 9 ++++++ API_SQLuedo/Shared/IUserService.cs | 1 + 6 files changed, 95 insertions(+) create mode 100644 API_SQLuedo/.dockerignore create mode 100644 API_SQLuedo/API/Dockerfile diff --git a/API_SQLuedo/.dockerignore b/API_SQLuedo/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/API_SQLuedo/.dockerignore @@ -0,0 +1,30 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md +!**/.gitignore +!.git/HEAD +!.git/config +!.git/packed-refs +!.git/refs/heads/** \ No newline at end of file diff --git a/API_SQLuedo/API/Controllers/UserController.cs b/API_SQLuedo/API/Controllers/UserController.cs index fb57815..8c0b394 100644 --- a/API_SQLuedo/API/Controllers/UserController.cs +++ b/API_SQLuedo/API/Controllers/UserController.cs @@ -128,5 +128,25 @@ namespace API.Controllers logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'id {id}.", id); return NotFound(); } + + [HttpPut("user/promote/{id:int}")] + [ProducesResponseType(typeof(UserDto), 200)] + [ProducesResponseType(typeof(string), 404)] + public IActionResult PromoteUser(int id) + { + var userPromoted = userService.GetUserById(id); + if (userPromoted != null) + { + userPromoted = userService.PromoteUser(id); + logger.LogInformation("[INFORMATION] La promotion de l'utilisateur avec l'id {id} a été effectuée"); + return Ok(userPromoted); + } + else + { + logger.LogInformation("[INFORMATION] La promotion de l'utilisateur avec l'id {id} à échouée", + id); + return NotFound(); + } + } } } \ No newline at end of file diff --git a/API_SQLuedo/API/Dockerfile b/API_SQLuedo/API/Dockerfile new file mode 100644 index 0000000..2ea3b4c --- /dev/null +++ b/API_SQLuedo/API/Dockerfile @@ -0,0 +1,32 @@ +#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER app +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["API/API.csproj", "API/"] +COPY ["DbContextLib/DbContextLib.csproj", "DbContextLib/"] +COPY ["EntityFramework/Entities.csproj", "EntityFramework/"] +COPY ["Dto/Dto.csproj", "Dto/"] +COPY ["DbDataManager/DbDataManager.csproj", "DbDataManager/"] +COPY ["Model/Model.csproj", "Model/"] +COPY ["Shared/Shared.csproj", "Shared/"] +COPY ["StubbedContextLib/StubbedContextLib.csproj", "StubbedContextLib/"] +RUN dotnet restore "./API/./API.csproj" +COPY . . +WORKDIR "/src/API" +RUN dotnet build "./API.csproj" -c $BUILD_CONFIGURATION -o /app/build + +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "API.dll"] \ No newline at end of file diff --git a/API_SQLuedo/API/Service/UserDataServiceAPI.cs b/API_SQLuedo/API/Service/UserDataServiceAPI.cs index 72bca16..621ee65 100644 --- a/API_SQLuedo/API/Service/UserDataServiceAPI.cs +++ b/API_SQLuedo/API/Service/UserDataServiceAPI.cs @@ -25,4 +25,7 @@ public class UserDataServiceApi(IUserService userService) : IUserSer public UserDto CreateUser(string username, string password, string email, bool isAdmin) => userService.CreateUser(username, password, email, isAdmin).FromEntityToDto(); + + public UserDto PromoteUser(int id) => + userService.PromoteUser(id).FromEntityToDto(); } \ No newline at end of file diff --git a/API_SQLuedo/DbDataManager/Service/UserDataService.cs b/API_SQLuedo/DbDataManager/Service/UserDataService.cs index ebb3ba5..4158622 100644 --- a/API_SQLuedo/DbDataManager/Service/UserDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/UserDataService.cs @@ -116,4 +116,13 @@ public class UserDataService : IUserService DbContext.SaveChangesAsync(); return newUserEntity; } + + public UserEntity PromoteUser(int id) + { + var userEdit = GetUserById(id); + var newUserEntity = UpdateUser(id,new UserEntity{Id = id,Username = userEdit.Username,Password = userEdit.Password,Email = userEdit.Email,IsAdmin = true}); + DbContext.Users.Add(newUserEntity); + DbContext.SaveChangesAsync(); + return newUserEntity; + } } \ No newline at end of file diff --git a/API_SQLuedo/Shared/IUserService.cs b/API_SQLuedo/Shared/IUserService.cs index d1d458a..d723558 100644 --- a/API_SQLuedo/Shared/IUserService.cs +++ b/API_SQLuedo/Shared/IUserService.cs @@ -10,5 +10,6 @@ namespace Shared public bool DeleteUser(int id); public TUser UpdateUser(int id, TUser user); public TUser CreateUser(string username, string password, string email, bool isAdmin); + public TUser PromoteUser(int id); } } \ No newline at end of file From 50b356c98a799af34ae9ac7e8b81ad821cd0dab6 Mon Sep 17 00:00:00 2001 From: masapountz Date: Fri, 29 Mar 2024 13:44:09 +0100 Subject: [PATCH 09/30] Modification Criteria pour les lessons et Users dans l'ordre --- API_SQLuedo/DbDataManager/Service/LessonDataService.cs | 8 +++++++- API_SQLuedo/DbDataManager/Service/UserDataService.cs | 5 +++-- API_SQLuedo/Model/OrderCriteria/LessonOrderCriteria.cs | 3 ++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/API_SQLuedo/DbDataManager/Service/LessonDataService.cs b/API_SQLuedo/DbDataManager/Service/LessonDataService.cs index aa67a64..051ef4c 100644 --- a/API_SQLuedo/DbDataManager/Service/LessonDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/LessonDataService.cs @@ -29,7 +29,7 @@ public class LessonDataService : ILessonService number = 10; } - IQueryable query = DbContext.Lessons.Skip((page - 1) * number).Take(number); + IQueryable query = DbContext.Lessons; switch (orderCriteria) { case LessonOrderCriteria.None: @@ -43,10 +43,16 @@ public class LessonDataService : ILessonService case LessonOrderCriteria.ByLastEdit: query = query.OrderBy(s => s.LastEdit); break; + case LessonOrderCriteria.ById: + query = query.OrderBy(s => (int) s.Id); + break; default: break; } + query = query.Skip((page - 1) * number).Take(number); + + var lessons = query.ToList(); return lessons; } diff --git a/API_SQLuedo/DbDataManager/Service/UserDataService.cs b/API_SQLuedo/DbDataManager/Service/UserDataService.cs index 16a0edc..5211aa2 100644 --- a/API_SQLuedo/DbDataManager/Service/UserDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/UserDataService.cs @@ -58,7 +58,8 @@ public class UserDataService : IUserService { number = 10; } - IQueryable query = DbContext.Users.Skip((page - 1) * number).Take(number); + + IQueryable query = DbContext.Users; switch (orderCriteria) { case UserOrderCriteria.None: @@ -78,6 +79,7 @@ public class UserDataService : IUserService default: break; } + query = query.Skip((page - 1) * number).Take(number); var users = query.ToList(); return users; @@ -195,7 +197,6 @@ public class UserDataService : IUserService { var userEdit = GetUserById(id); var newUserEntity = UpdateUser(id,new UserEntity{Id = id,Username = userEdit.Username,Password = userEdit.Password,Email = userEdit.Email,IsAdmin = true}); - DbContext.Users.Add(newUserEntity); DbContext.SaveChangesAsync(); return newUserEntity; } diff --git a/API_SQLuedo/Model/OrderCriteria/LessonOrderCriteria.cs b/API_SQLuedo/Model/OrderCriteria/LessonOrderCriteria.cs index db06097..0fdb058 100644 --- a/API_SQLuedo/Model/OrderCriteria/LessonOrderCriteria.cs +++ b/API_SQLuedo/Model/OrderCriteria/LessonOrderCriteria.cs @@ -5,5 +5,6 @@ public enum LessonOrderCriteria None, ByTitle, ByLastPublisher, - ByLastEdit + ByLastEdit, + ById } \ No newline at end of file From 05aa8d953350497f117145b0218a44acdf61be78 Mon Sep 17 00:00:00 2001 From: masapountz Date: Fri, 29 Mar 2024 15:09:04 +0100 Subject: [PATCH 10/30] =?UTF-8?q?Modification=20des=20cit=C3=A8res=20pour?= =?UTF-8?q?=20les=20enqu=C3=AAtes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/DbDataManager/Service/InquiryDataService.cs | 8 ++++++-- API_SQLuedo/Model/OrderCriteria/InquiryOrderCriteria.cs | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/API_SQLuedo/DbDataManager/Service/InquiryDataService.cs b/API_SQLuedo/DbDataManager/Service/InquiryDataService.cs index ef92e20..255bf45 100644 --- a/API_SQLuedo/DbDataManager/Service/InquiryDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/InquiryDataService.cs @@ -26,7 +26,7 @@ public class InquiryDataService : IInquiryService { number = 10; } - IQueryable query = DbContext.Inquiries.Skip((page - 1) * number).Take(number); + IQueryable query = DbContext.Inquiries; switch (orderCriteria) { case InquiryOrderCriteria.None: @@ -40,10 +40,14 @@ public class InquiryDataService : IInquiryService case InquiryOrderCriteria.ByIsUser: query = query.OrderBy(s => s.IsUser); break; + case InquiryOrderCriteria.ById: + query = query.OrderBy(s => s.Id); + break; default: break; } + query = query.Skip((page - 1) * number).Take(number); var inquiries = query.ToList(); return inquiries; } @@ -97,7 +101,7 @@ public class InquiryDataService : IInquiryService } DbContext.Inquiries.Remove(inquiryEntity); - DbContext.SaveChangesAsync(); + DbContext.SaveChanges(); return true; } diff --git a/API_SQLuedo/Model/OrderCriteria/InquiryOrderCriteria.cs b/API_SQLuedo/Model/OrderCriteria/InquiryOrderCriteria.cs index f800b0e..def4550 100644 --- a/API_SQLuedo/Model/OrderCriteria/InquiryOrderCriteria.cs +++ b/API_SQLuedo/Model/OrderCriteria/InquiryOrderCriteria.cs @@ -5,5 +5,6 @@ public enum InquiryOrderCriteria None, ByTitle, ByDescription, - ByIsUser + ByIsUser, + ById } \ No newline at end of file From 3efa6816fe841c0ab87182b7f3dfd23fd9877d31 Mon Sep 17 00:00:00 2001 From: masapountz Date: Fri, 29 Mar 2024 15:26:42 +0100 Subject: [PATCH 11/30] TU PromoteUser --- API_SQLuedo/TestAPI/UserUnitTest.cs | 61 +++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/API_SQLuedo/TestAPI/UserUnitTest.cs b/API_SQLuedo/TestAPI/UserUnitTest.cs index abdfbfb..ba8758b 100644 --- a/API_SQLuedo/TestAPI/UserUnitTest.cs +++ b/API_SQLuedo/TestAPI/UserUnitTest.cs @@ -29,12 +29,12 @@ public class UserUnitTest if (userResult is OkObjectResult okObjectResult) { - var valeur = (okObjectResult.Value as KeyValuePair?); + var valeur = (okObjectResult.Value as KeyValuePair?); Assert.NotNull(valeur); Assert.Equal(userList.Count, valeur.Value.Value); } } - + [Fact] public void GetUsersListSuccess() { @@ -54,7 +54,7 @@ public class UserUnitTest Assert.True(userList.SequenceEqual(valeur as IEnumerable, new UserIdEqualityComparer())); } } - + [Fact] public void GetNotAdminUsersListSuccess() { @@ -71,7 +71,8 @@ public class UserUnitTest Assert.NotNull(valeur); Assert.Equal(GetUsersData().ToString(), valeur.ToString()); - Assert.True(userList.Where(u => u.IsAdmin == false).SequenceEqual(valeur as IEnumerable, new UserIdEqualityComparer())); + Assert.True(userList.Where(u => u.IsAdmin == false) + .SequenceEqual(valeur as IEnumerable, new UserIdEqualityComparer())); } } @@ -155,6 +156,7 @@ public class UserUnitTest Assert.True(valeur.IsAdmin); } } + [Fact] public void GetUserEmailSuccess() { @@ -198,6 +200,7 @@ public class UserUnitTest Assert.False(userList == valeur); } } + [Fact] public void GetUserEmailFail() { @@ -285,6 +288,7 @@ public class UserUnitTest Assert.Equal(400, bdObjectResult.StatusCode); } } + [Fact] public void CreateUserWithExistingEmail() { @@ -300,6 +304,7 @@ public class UserUnitTest Assert.Equal(400, bdObjectResult.StatusCode); } } + [Fact] public void CreateUserWithExistingUsername() { @@ -351,6 +356,54 @@ public class UserUnitTest } } + + [Fact] + public void PromoteUserSuccess() + { + _userService.Setup(x => x.PromoteUser(1)) + .Returns(new UserDto( + 1, + "Leuser", + "motdepasse", + "deuxadresse@gmail.com", + true + )); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.PromoteUser(1); + if (userResult is OkObjectResult okObjectResult) + { + UserDto valeur = okObjectResult.Value as UserDto; + + Assert.NotNull(valeur); + Assert.Equal("Leuser", valeur.Username); + Assert.Equal("motdepasse", valeur.Password); + Assert.Equal("deuxadresse@gmail.com", valeur.Email); + Assert.True(valeur.IsAdmin); + } + } + + [Fact] + public void PromoteUserFail() + { + _userService.Setup(x => x.PromoteUser(1)) + .Returns(new UserDto( + 1, + "Leuser", + "motdepasse", + "deuxadresse@gmail.com", + true + )); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.PromoteUser(356262); + + if (userResult is BadRequestResult bdObjectResult) + { + Assert.Equal(404, bdObjectResult.StatusCode); + } + } + private List GetUsersData() { List usersData = new List(4) From 493719d1db2f8356986358c29f7c25c898620638 Mon Sep 17 00:00:00 2001 From: masapountz Date: Fri, 29 Mar 2024 15:55:59 +0100 Subject: [PATCH 12/30] =?UTF-8?q?Ajout=20de=20test=20suppl=C3=A9mentaires?= =?UTF-8?q?=20pour=20SuccessController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/TestAPI/SuccessesUnitTest.cs | 138 +++++++++++++++++++++-- 1 file changed, 131 insertions(+), 7 deletions(-) diff --git a/API_SQLuedo/TestAPI/SuccessesUnitTest.cs b/API_SQLuedo/TestAPI/SuccessesUnitTest.cs index 8ad235a..f8dc28c 100644 --- a/API_SQLuedo/TestAPI/SuccessesUnitTest.cs +++ b/API_SQLuedo/TestAPI/SuccessesUnitTest.cs @@ -1,6 +1,7 @@ using API.Controllers; using Dto; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging.Abstractions; using Moq; using Shared; @@ -40,14 +41,30 @@ public class SuccessesUnitTest } [Fact] - public void GetSuccessesListFail() + public void GetSuccessesListFail_When_Result_Equal_0() { _successService.Setup(x => x.GetSuccesses(1, 4, 0)) .Returns(new List()); var successesController = new SuccessesController(_successService.Object, new NullLogger()); - var successesResult = successesController.GetSuccesses(2, 3, 0); + var successesResult = successesController.GetSuccesses(26373, 31771, 0); + + if (successesResult is StatusCodeResult statusCodeResult && statusCodeResult.StatusCode == 204) + { + Assert.IsNotType(successesResult); + } + } + + [Fact] + public void GetSuccessesListFail_When_Page_Is_A_Negative() + { + _successService.Setup(x => x.GetSuccesses(1, 4, 0)) + .Returns(new List()); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var successesResult = successesController.GetSuccesses(-1, 3, 0); if (successesResult is StatusCodeResult statusCodeResult && statusCodeResult.StatusCode == 204) { @@ -89,7 +106,7 @@ public class SuccessesUnitTest } [Fact] - public void GetSuccessInquiryIdFail() + public void GetSuccessInquiryIdFail_When_Id_Not_Exist() { var successesList = GetSuccessesData(); _successService.Setup(x => x.GetSuccessesByInquiryId(1)) @@ -108,6 +125,26 @@ public class SuccessesUnitTest } } + [Fact] + public void GetSuccessInquiryIdFail_When_Id_Negative() + { + var successesList = GetSuccessesData(); + _successService.Setup(x => x.GetSuccessesByInquiryId(1)) + .Returns(new List { successesList[0], successesList[1] }); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var sucessesResult = successesController.GetSuccessByInquiryId(-1); + if (sucessesResult is NotFoundObjectResult nfObjectResult) + { + var valeur = nfObjectResult.Value; + + Assert.NotNull(valeur); + Assert.IsNotType(valeur); + Assert.DoesNotContain(valeur, successesList); + } + } + [Fact] public void GetSuccessUserIdSuccess() { @@ -140,7 +177,7 @@ public class SuccessesUnitTest } [Fact] - public void GetSuccessUserIdFail() + public void GetSuccessUserIdFail_When_Id_Not_Found() { var successesList = GetSuccessesData(); _successService.Setup(x => x.GetSuccessesByUserId(2)) @@ -159,6 +196,27 @@ public class SuccessesUnitTest } } + + [Fact] + public void GetSuccessUserIdFail_When_Id_Negative() + { + var successesList = GetSuccessesData(); + _successService.Setup(x => x.GetSuccessesByUserId(2)) + .Returns(new List { successesList[2], successesList[3] }); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var sucessesResult = successesController.GetSuccessByUserId(-1); + if (sucessesResult is NotFoundObjectResult nfObjectResult) + { + var valeur = nfObjectResult.Value; + + Assert.NotNull(valeur); + Assert.IsNotType(valeur); + Assert.DoesNotContain(valeur, successesList); + } + } + [Fact] public void DeleteSuccessSuccess() { @@ -177,7 +235,7 @@ public class SuccessesUnitTest } [Fact] - public void DeleteSuccessFail() + public void DeleteSuccessFail_When_Not_Found() { _successService.Setup(x => x.DeleteSuccess(1, 1)) .Returns(true); @@ -192,6 +250,22 @@ public class SuccessesUnitTest } } + [Fact] + public void DeleteSuccessFail_When_Negative() + { + _successService.Setup(x => x.DeleteSuccess(1, 1)) + .Returns(true); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var sucessesResult = successesController.DeleteSuccess(-1, 278); + if (sucessesResult is NotFoundObjectResult nfObjectResult) + { + Assert.Null(nfObjectResult.Value); + Assert.IsNotType(nfObjectResult.Value); + } + } + [Fact] public void CreateSuccessSuccess() { @@ -213,7 +287,7 @@ public class SuccessesUnitTest } [Fact] - public void CreateSuccessFail() + public void CreateSuccessFail_When_Id_Not_Found() { _successService.Setup(x => x.CreateSuccess(8, 8, true)) .Returns(new SuccessDto(8, 8, true)); @@ -228,6 +302,22 @@ public class SuccessesUnitTest } } + [Fact] + public void CreateSuccessFail_When_Id_Negative() + { + _successService.Setup(x => x.CreateSuccess(8, 8, true)) + .Returns(new SuccessDto(8, 8, true)); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var successesResult = successesController.CreateSuccess(new SuccessDto(-1, 818, true)); + + if (successesResult is BadRequestResult bdObjectResult) + { + Assert.Equal(400, bdObjectResult.StatusCode); + } + } + [Fact] public void UpdateSuccessSuccess() { @@ -249,7 +339,7 @@ public class SuccessesUnitTest } [Fact] - public void UpdateSuccessFail() + public void UpdateSuccessFail_When_Ids_Are_Differents() { _successService.Setup(x => x.UpdateSuccess(1, 1, new SuccessDto(1, 2, true))) .Returns(new SuccessDto(1, 2, true)); @@ -264,6 +354,40 @@ public class SuccessesUnitTest } } + [Fact] + public void UpdateSuccessFail_When_Id_Negative() + { + _successService.Setup(x => x.UpdateSuccess(1, 1, new SuccessDto(1, 2, true))) + .Returns(new SuccessDto(1, 2, true)); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var successesResult = successesController.UpdateSuccess(-2, 1, new SuccessDto(1, 2, true)); + + if (successesResult is BadRequestResult bdObjectResult) + { + Assert.Equal(400, bdObjectResult.StatusCode); + } + } + + [Fact] + public void UpdateSuccessFail_When_Id_Not_Found() + { + _successService.Setup(x => x.UpdateSuccess(1, 1, new SuccessDto(1, 2, true))) + .Returns(new SuccessDto(1, 2, true)); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var successesResult = successesController.UpdateSuccess(1000, 1000, new SuccessDto(1000, 1000, true)); + + if (successesResult is BadRequestResult bdObjectResult) + { + Assert.Equal(400, bdObjectResult.StatusCode); + } + } + + + private List GetSuccessesData() { List successesData = new List(4) From b474a171e6985e8cb934e07979164356ff3c5775 Mon Sep 17 00:00:00 2001 From: masapountz Date: Fri, 29 Mar 2024 16:50:08 +0100 Subject: [PATCH 13/30] Ajout de test UserController --- API_SQLuedo/TestAPI/UserUnitTest.cs | 100 ++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 22 deletions(-) diff --git a/API_SQLuedo/TestAPI/UserUnitTest.cs b/API_SQLuedo/TestAPI/UserUnitTest.cs index ba8758b..6109618 100644 --- a/API_SQLuedo/TestAPI/UserUnitTest.cs +++ b/API_SQLuedo/TestAPI/UserUnitTest.cs @@ -18,7 +18,7 @@ public class UserUnitTest } [Fact] - public void GetNumberOfUsers() + public void GetNumberOfUsersSuccess() { var userList = GetUsersData(); _userService.Setup(x => x.GetNumberOfUsers()) @@ -35,6 +35,24 @@ public class UserUnitTest } } + + [Fact] + public void GetNumberOfUsers_Fail_Cause_Not_Found() + { + var userList = GetUsersData(); + _userService.Setup(x => x.GetNumberOfUsers()) + .Returns(0); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.GetNumberOfUsers(); + + if (userResult is StatusCodeResult statusCodeResult && statusCodeResult.StatusCode == 204) + + { + Assert.IsNotType(userResult); + } + } + [Fact] public void GetUsersListSuccess() { @@ -55,6 +73,22 @@ public class UserUnitTest } } + [Fact] + public void GetUserListFail() + { + _userService.Setup(x => x.GetUsers(1, 4, 0)) + .Returns(new List()); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.GetUsers(2, 3, 0); + + if (userResult is StatusCodeResult statusCodeResult && statusCodeResult.StatusCode == 204) + + { + Assert.IsNotType(userResult); + } + } + [Fact] public void GetNotAdminUsersListSuccess() { @@ -65,30 +99,31 @@ public class UserUnitTest var userResult = usersController.GetNotAdminUsers(1, 4, 0); - if (userResult is OkObjectResult okObjectResult) - { - var valeur = okObjectResult.Value; + if (userResult is StatusCodeResult statusCodeResult && statusCodeResult.StatusCode == 204) - Assert.NotNull(valeur); - Assert.Equal(GetUsersData().ToString(), valeur.ToString()); - Assert.True(userList.Where(u => u.IsAdmin == false) - .SequenceEqual(valeur as IEnumerable, new UserIdEqualityComparer())); + { + Assert.IsNotType(userResult); } } [Fact] - public void GetUserListFail() + public void GetNotAdminUsersListFail_Cause_Not_Found() { - _userService.Setup(x => x.GetUsers(1, 4, 0)) - .Returns(new List()); + var userList = GetUsersData(); + _userService.Setup(x => x.GetNotAdminUsers(1, 4, 0)) + .Returns(userList.Where(u => u.IsAdmin == false)); var usersController = new UsersController(new NullLogger(), _userService.Object); - var userResult = usersController.GetUsers(2, 3, 0); - - if (userResult is StatusCodeResult statusCodeResult && statusCodeResult.StatusCode == 204) + var userResult = usersController.GetNotAdminUsers(100, 4, 0); + if (userResult is OkObjectResult okObjectResult) { - Assert.IsNotType(userResult); + var valeur = okObjectResult.Value; + + Assert.NotNull(valeur); + Assert.Equal(GetUsersData().ToString(), valeur.ToString()); + Assert.True(userList.Where(u => u.IsAdmin == false) + .SequenceEqual(valeur as IEnumerable, new UserIdEqualityComparer())); } } @@ -116,7 +151,7 @@ public class UserUnitTest } [Fact] - public void GetUserIdFail() + public void GetUserIdFail_Id_Doesnt_Exist() { var userList = GetUsersData(); _userService.Setup(x => x.GetUserById(1)) @@ -134,6 +169,26 @@ public class UserUnitTest } } + + [Fact] + public void GetUserIdFail__Argument_Exception_Negative_Id() + { + var userList = GetUsersData(); + _userService.Setup(x => x.GetUserById(1)) + .Returns(userList[1]); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.GetUserById(-1); + if (userResult is NotFoundObjectResult nfObjectResult) + { + var valeur = nfObjectResult.Value; + + Assert.NotNull(valeur); + Assert.IsNotType(valeur); + Assert.DoesNotContain(valeur, userList); + } + } + [Fact] public void GetUserUsernameSuccess() { @@ -274,7 +329,7 @@ public class UserUnitTest } [Fact] - public void CreateUserFail() + public void CreateUserFail_When_Field_Null() { GetUsersData(); _userService.Setup(x => x.CreateUser("Nom", "Passssss", "heudfk@hdye.com", true)) @@ -289,6 +344,7 @@ public class UserUnitTest } } + [Fact] public void CreateUserWithExistingEmail() { @@ -297,11 +353,11 @@ public class UserUnitTest .Returns(new UserDto("Nom", "Passssss", "adressemail@gmail.com", true)); var usersController = new UsersController(new NullLogger(), _userService.Object); - var userResult = usersController.CreateUser(new UserDto(null, "Passssss", "adressemail@gmail.com", true)); + var userResult = usersController.CreateUser(new UserDto("user", "Passssss", "adressemail@gmail.com", true)); if (userResult is BadRequestResult bdObjectResult) { - Assert.Equal(400, bdObjectResult.StatusCode); + Assert.Equal(409, bdObjectResult.StatusCode); } } @@ -309,11 +365,11 @@ public class UserUnitTest public void CreateUserWithExistingUsername() { GetUsersData(); - _userService.Setup(x => x.CreateUser("Useruser", "Passssss", "heudfk@hdye.com", true)) - .Returns(new UserDto("Useruser", "Passssss", "heudfk@hdye.com", true)); + _userService.Setup(x => x.CreateUser("Nom", "Passssss", "adressemail@gmail.com", true)) + .Returns(new UserDto("Nom", "Passssss", "adressemail@gmail.com", true)); var usersController = new UsersController(new NullLogger(), _userService.Object); - var userResult = usersController.CreateUser(new UserDto("Useruser", "Passssss", "heudfk@hdye.com", true)); + var userResult = usersController.CreateUser(new UserDto("Useruser", "Passssss", "adressemail@gmail.com", true)); if (userResult is BadRequestResult bdObjectResult) { From 22150135542b36702f20c5066238dc7df2168493 Mon Sep 17 00:00:00 2001 From: masapountz Date: Fri, 29 Mar 2024 17:53:38 +0100 Subject: [PATCH 14/30] =?UTF-8?q?Cover=20de=20quelques=20m=C3=A9thodes=20d?= =?UTF-8?q?ans=20BlacklistService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/TestBlackListDataService.cs | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs index 91b4114..b1a7f0c 100644 --- a/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs @@ -84,4 +84,49 @@ public class TestBlackListDataService Assert.True(banResult); Assert.True(_blackListDataService.UnbanUser("example91@email.com")); } + + [Fact] + public void UnbanUser_Fail_Cause_Email_Null() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test91", Email = "example91@email.com", Password = "password", IsAdmin = true }); + _dbContext.Users.Add(new UserEntity() { Id = 2, Username = "Test92", Email = "example92@email.com", Password = "password", IsAdmin = false }); + _dbContext.Users.Add(new UserEntity() { Id = 3, Username = "Test93", Email = "example93@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + var banResult = _blackListDataService.BanUser("Test91"); + Assert.True(banResult); + Assert.False(_blackListDataService.UnbanUser(null)); + } + + [Fact] + public void GetNumberOfBanned_Success() + { + _dbContext.BlackLists.Add(new BlackListEntity { Email = "email@email.com", ExpirationDate = new DateOnly(2024,03,30)}); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eeemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.SaveChanges(); + var banResult = _blackListDataService.GetNumberOfBannedUsers(); + Assert.Equal(3,banResult); + } + + [Fact] + public void GetBannedUser_Success_Positive_Value() + { + _dbContext.BlackLists.Add(new BlackListEntity { Email = "email@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eeemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.SaveChanges(); + var banResult = _blackListDataService.GetBannedUsers(1,3,0); + Assert.Equal(3, banResult.Count()); + } + + [Fact] + public void GetBannedUser_Success_Negative_Value() + { + _dbContext.BlackLists.Add(new BlackListEntity { Email = "email@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eeemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.SaveChanges(); + var banResult = _blackListDataService.GetBannedUsers(-1, -3, 0); + Assert.Equal(3, banResult.Count()); + } } \ No newline at end of file From 7bda8c5181835076b9c7fa08f8976858f9874e75 Mon Sep 17 00:00:00 2001 From: masapountz Date: Fri, 29 Mar 2024 22:07:40 +0100 Subject: [PATCH 15/30] Fusion de LinkBlazor dans Master --- API_SQLuedo/API/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/API_SQLuedo/API/Program.cs b/API_SQLuedo/API/Program.cs index 75376fa..0b0944b 100644 --- a/API_SQLuedo/API/Program.cs +++ b/API_SQLuedo/API/Program.cs @@ -89,7 +89,7 @@ builder.Services.AddCors(options => { builder.WithOrigins("https://localhost:7171") .AllowAnyMethod() - .AllowAnyHeader(); + .AllowAnyHeader(); }); }); From fd42cbf10410184f17afafd9c59f805747a48548 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Sat, 30 Mar 2024 07:29:49 +0100 Subject: [PATCH 16/30] =?UTF-8?q?=20modification=20pour=20le=20verbe=20PUT?= =?UTF-8?q?=20du=20UserController=20afin=20qu'il=20retour=20une=20erreur?= =?UTF-8?q?=20409=20conflit=20si=20le=20username=20ou=20l'email=20est=20d?= =?UTF-8?q?=C3=A9j=C3=A0=20utilis=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/API/Controllers/UserController.cs | 16 +-- API_SQLuedo/TestAPI/UserUnitTest.cs | 100 ++++++++++++++++++ 2 files changed, 109 insertions(+), 7 deletions(-) diff --git a/API_SQLuedo/API/Controllers/UserController.cs b/API_SQLuedo/API/Controllers/UserController.cs index 1c1a6d4..5096353 100644 --- a/API_SQLuedo/API/Controllers/UserController.cs +++ b/API_SQLuedo/API/Controllers/UserController.cs @@ -179,9 +179,9 @@ namespace API.Controllers [ProducesResponseType(typeof(UserDto), 200)] [ProducesResponseType(typeof(string), 400)] [ProducesResponseType(typeof(string), 404)] - public IActionResult UpdateUser(int id, [FromBody] UserDto UserDto) + public IActionResult UpdateUser(int id, [FromBody] UserDto userDto) { - if (id != UserDto.Id) + if (id != userDto.Id) { logger.LogError("[ERREUR] Problème ID - La mise à jour de l'utilisateur avec l'id {id} a échouée.", id); return BadRequest(); @@ -194,15 +194,17 @@ namespace API.Controllers return BadRequest(); } - if (UserDto != null) + if (userDto.Username == userService.GetUserById(id).Username && !userService.IsEmailTaken(userDto.Email) + || (userDto.Email == userService.GetUserById(id).Email && + !userService.IsUsernameTaken(userDto.Username)) + || (!userService.IsEmailTaken(userDto.Email) && !userService.IsUsernameTaken(userDto.Username))) { logger.LogInformation("[INFORMATION] La mise à jour de l'utilisateur avec l'id {id} a été effectuée", id); - return Ok(userService.UpdateUser(id, UserDto)); + return Ok(userService.UpdateUser(id, userDto)); } - - logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'id {id}.", id); - return NotFound(); + logger.LogError("[ERREUR] Email ou nom d'utilisateur déjà utilisé"); + return StatusCode(409,"Email ou nom d'utilisateur déjà utilisé"); } } } \ No newline at end of file diff --git a/API_SQLuedo/TestAPI/UserUnitTest.cs b/API_SQLuedo/TestAPI/UserUnitTest.cs index abdfbfb..599b33f 100644 --- a/API_SQLuedo/TestAPI/UserUnitTest.cs +++ b/API_SQLuedo/TestAPI/UserUnitTest.cs @@ -350,6 +350,106 @@ public class UserUnitTest Assert.Equal(400, bdObjectResult.StatusCode); } } + [Fact] + public void UpdateUserFailWithExistingUsername() + { + _userService.Setup(x => x.IsUsernameTaken("Useruser")).Returns(true); + _userService.Setup(x => x.IsEmailTaken("heudfk@hdye.com")).Returns(false); + _userService.Setup(x => x.GetUserById(1)).Returns(new UserDto(1, "Leuser", "motdepasse", "deuxadresse@gmail.com", true)); + _userService.Setup(x => x.UpdateUser(1, new UserDto(1, "Useruser", "Passssss", "heudfk@hdye.com", true))) + .Returns(new UserDto("Useruser", "Passssss", "heudfk@hdye.com", true)); + + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.UpdateUser(1, new UserDto(1,"Useruser", "Passssss", "heudfk@hdye.com", true)); + + if (userResult is StatusCodeResult statusCodeResult) + { + Assert.Equal(409, statusCodeResult.StatusCode); + } + } + [Fact] + public void UpdateUserFailWithExistingEmail() + { + _userService.Setup(x => x.IsUsernameTaken("Test1234")).Returns(false); + _userService.Setup(x => x.IsEmailTaken("adressemail@gmail.com")).Returns(true); + _userService.Setup(x => x.GetUserById(1)).Returns(new UserDto(1, "Leuser", "motdepasse", "deuxadresse@gmail.com", true)); + _userService.Setup(x => x.UpdateUser(1, new UserDto(1, "Test1234", "Passssss", "adressemail@gmail.com", true))) + .Returns(new UserDto("Test1234", "Passssss", "adressemail@gmail.com", true)); + + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.UpdateUser(1, new UserDto(1,"Test1234", "Passssss", "adressemail@gmail.com", true)); + + if (userResult is StatusCodeResult statusCodeResult) + { + Assert.Equal(409, statusCodeResult.StatusCode); + } + } + [Fact] + public void UpdateUserFailWithExistingEmailAndExistingUsername() + { + _userService.Setup(x => x.IsUsernameTaken("Useruser")).Returns(true); + _userService.Setup(x => x.IsEmailTaken("adressemail@gmail.com")).Returns(true); + _userService.Setup(x => x.GetUserById(1)).Returns(new UserDto(1, "Leuser", "motdepasse", "deuxadresse@gmail.com", true)); + _userService.Setup(x => x.UpdateUser(1, new UserDto(1, "Useruser", "Passssss", "adressemail@gmail.com", true))) + .Returns(new UserDto("Useruser", "Passssss", "adressemail@gmail.com", true)); + + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.UpdateUser(1, new UserDto(1,"Useruser", "Passssss", "adressemail@gmail.com", true)); + + if (userResult is StatusCodeResult statusCodeResult) + { + Assert.Equal(409, statusCodeResult.StatusCode); + } + } + [Fact] + public void UpdateUserSucessWithSameEmail() + { + _userService.Setup(x => x.IsUsernameTaken("Test1234")).Returns(false); + _userService.Setup(x => x.IsEmailTaken("deuxadresse@gmail.com")).Returns(true); + _userService.Setup(x => x.GetUserById(1)).Returns(new UserDto(1, "Leuser", "motdepasse", "deuxadresse@gmail.com", true)); + _userService.Setup(x => x.UpdateUser(1, new UserDto(1, "Test1234", "Passssss", "deuxadresse@gmail.com", true))) + .Returns(new UserDto("Test1234", "Passssss", "deuxadresse@gmail.com", true)); + + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.UpdateUser(1, new UserDto(1,"Test1234", "Passssss", "deuxadresse@gmail.com", true)); + if (userResult is OkObjectResult okObjectResult) + { + UserDto valeur = okObjectResult.Value as UserDto; + + Assert.NotNull(valeur); + Assert.Equal("Test1234", valeur.Username); + Assert.Equal("Passssss", valeur.Password); + Assert.Equal("deuxadresse@gmail.com", valeur.Email); + Assert.True(valeur.IsAdmin); + } + } + [Fact] + public void UpdateUserSucessWithSameUsername() + { + _userService.Setup(x => x.IsUsernameTaken("Leuser")).Returns(true); + _userService.Setup(x => x.IsEmailTaken("heudfk@hdye.com")).Returns(false); + _userService.Setup(x => x.GetUserById(1)).Returns(new UserDto(1, "Leuser", "motdepasse", "deuxadresse@gmail.com", true)); + _userService.Setup(x => x.UpdateUser(1, new UserDto(1, "Test1234", "Passssss", "heudfk@hdye.com", true))) + .Returns(new UserDto("Leuser", "Passssss", "heudfk@hdye.com", true)); + + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.UpdateUser(1, new UserDto(1,"Leuser", "Passssss", "heudfk@hdye.com", true)); + if (userResult is OkObjectResult okObjectResult) + { + UserDto valeur = okObjectResult.Value as UserDto; + + Assert.NotNull(valeur); + Assert.Equal("Leuser", valeur.Username); + Assert.Equal("Passssss", valeur.Password); + Assert.Equal("heudfk@hdye.com", valeur.Email); + Assert.True(valeur.IsAdmin); + } + } private List GetUsersData() { From d112da2e9be099090456be3c2634c1cd4168e8e5 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Sat, 30 Mar 2024 08:31:03 +0100 Subject: [PATCH 17/30] =?UTF-8?q?=20oublie=20:=20ajout=20des=20annotations?= =?UTF-8?q?=20sur=20les=20verbes=20POST=20et=20PUT=20du=20UserController?= =?UTF-8?q?=20pour=20indiquer=20quel=20code=20de=20retour=20puevent=20?= =?UTF-8?q?=C3=AAtre=20renvoy=C3=A9s=20par=20les=20methodes=20concern?= =?UTF-8?q?=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/API/Controllers/UserController.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/API_SQLuedo/API/Controllers/UserController.cs b/API_SQLuedo/API/Controllers/UserController.cs index 5096353..6c07a54 100644 --- a/API_SQLuedo/API/Controllers/UserController.cs +++ b/API_SQLuedo/API/Controllers/UserController.cs @@ -150,6 +150,8 @@ namespace API.Controllers [HttpPost] [ProducesResponseType(typeof(UserDto), 201)] [ProducesResponseType(typeof(string), 400)] + [ProducesResponseType(typeof(string), 409)] + [ProducesResponseType(typeof(string), 410)] public IActionResult CreateUser([FromBody] UserDto dto) { if (dto.Username == null || dto.Password == null || dto.Email == null) @@ -179,6 +181,7 @@ namespace API.Controllers [ProducesResponseType(typeof(UserDto), 200)] [ProducesResponseType(typeof(string), 400)] [ProducesResponseType(typeof(string), 404)] + [ProducesResponseType(typeof(string), 409)] public IActionResult UpdateUser(int id, [FromBody] UserDto userDto) { if (id != userDto.Id) From 4e60b513844f816e5d25d378b20d280ca7448cce Mon Sep 17 00:00:00 2001 From: masapountz Date: Sat, 30 Mar 2024 22:23:17 +0100 Subject: [PATCH 18/30] =?UTF-8?q?Ajout=20QueryController=20et=20route=20Ex?= =?UTF-8?q?ecuteQuery=20qui=20renvoie=20un=20Json=20bien=20format=C3=A9=20?= =?UTF-8?q?bien=20mignon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/API/API.csproj | 1 + .../API/Controllers/QueryController.cs | 32 +++++++++ API_SQLuedo/API/Program.cs | 2 + .../API/Service/QueryDataServiceApi.cs | 69 +++++++++++++++++++ API_SQLuedo/Dto/QueryDTO.cs | 13 ++++ API_SQLuedo/Shared/IQueryService.cs | 17 +++++ 6 files changed, 134 insertions(+) create mode 100644 API_SQLuedo/API/Controllers/QueryController.cs create mode 100644 API_SQLuedo/API/Service/QueryDataServiceApi.cs create mode 100644 API_SQLuedo/Dto/QueryDTO.cs create mode 100644 API_SQLuedo/Shared/IQueryService.cs diff --git a/API_SQLuedo/API/API.csproj b/API_SQLuedo/API/API.csproj index effc567..6cce789 100644 --- a/API_SQLuedo/API/API.csproj +++ b/API_SQLuedo/API/API.csproj @@ -21,6 +21,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/API_SQLuedo/API/Controllers/QueryController.cs b/API_SQLuedo/API/Controllers/QueryController.cs new file mode 100644 index 0000000..9ab92d7 --- /dev/null +++ b/API_SQLuedo/API/Controllers/QueryController.cs @@ -0,0 +1,32 @@ +using Dto; +using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Shared; +using Model.OrderCriteria; + +namespace API.Controllers +{ + [Route("api/v{version:apiVersion}/[controller]")] + [Authorize] + [ApiVersion("1.0")] + [ApiController] + public class QueryController(ILogger logger, IQueryService queryService) : ControllerBase + { + [HttpPost("{database}/execute")] + [ProducesResponseType(typeof(QueryDto), 200)] + [ProducesResponseType(typeof(string), 204)] + public IActionResult ExecuteQuery([FromBody]string query, string database) + { + var queryResult = queryService.ExecuteQuery(query, database); + if (queryResult == null) + { + logger.LogError("[ERREUR] La requête n'a rien renvoyé."); + return StatusCode(204); + } + + logger.LogInformation("[INFORMATION] La requête a renvoyé : {result} ", queryResult); + return Ok(queryResult); + } + } +} diff --git a/API_SQLuedo/API/Program.cs b/API_SQLuedo/API/Program.cs index 0b0944b..559793d 100644 --- a/API_SQLuedo/API/Program.cs +++ b/API_SQLuedo/API/Program.cs @@ -19,6 +19,8 @@ builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); +builder.Services.AddScoped, QueryDataServiceApi>(); + builder.Services.AddScoped, UserDataService>(); builder.Services.AddScoped, UserDataServiceApi>(); diff --git a/API_SQLuedo/API/Service/QueryDataServiceApi.cs b/API_SQLuedo/API/Service/QueryDataServiceApi.cs new file mode 100644 index 0000000..e2e8f3c --- /dev/null +++ b/API_SQLuedo/API/Service/QueryDataServiceApi.cs @@ -0,0 +1,69 @@ +using Dto; +using Entities; +using Model.OrderCriteria; +using Npgsql; +using Shared; +using Shared.Mapper; +using System.Text; +using Newtonsoft.Json; + +namespace API.Service; + +public class QueryDataServiceApi : IQueryService +{ + public QueryDto ExecuteQuery(string query, string database) + { + string connectionString = + $"Host=localhost;Username=admin;Password=motdepasse;Database={database}"; + + if (string.IsNullOrEmpty(database)) + { + return new QueryDto { Result = "Le nom de la base de données est requis." }; + } + + using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) + { + connection.Open(); + using (NpgsqlCommand command = new NpgsqlCommand(query, connection)) + { + using (NpgsqlDataReader reader = command.ExecuteReader()) + { + List> resultList = new List>(); + + + List columnNames = new List(); + for (int i = 0; i < reader.FieldCount; i++) + { + columnNames.Add(reader.GetName(i)); + } + + while (reader.Read()) + { + Dictionary row = new Dictionary(); + for (int i = 0; i < reader.FieldCount; i++) + { + row[columnNames[i]] = reader[i].ToString(); + } + + resultList.Add(row); + } + + string resultJson = JsonConvert.SerializeObject(resultList); + + QueryDto queryDto = new QueryDto { Result = resultJson }; + return queryDto; + } + } + } + } + + public IEnumerable GetTables(string database) + { + throw new NotImplementedException(); + } + + public IEnumerable GetColumns(string database, string table) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/API_SQLuedo/Dto/QueryDTO.cs b/API_SQLuedo/Dto/QueryDTO.cs new file mode 100644 index 0000000..ec3c0b9 --- /dev/null +++ b/API_SQLuedo/Dto/QueryDTO.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Dto +{ + public class QueryDto + { + public string Result { get; set; } + } +} diff --git a/API_SQLuedo/Shared/IQueryService.cs b/API_SQLuedo/Shared/IQueryService.cs new file mode 100644 index 0000000..85ecdf2 --- /dev/null +++ b/API_SQLuedo/Shared/IQueryService.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc; +using Model.OrderCriteria; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Shared +{ + public interface IQueryService + { + public TQuery ExecuteQuery(string query, string database); + public IEnumerable GetTables(string database); + public IEnumerable GetColumns(string database,string table); + } +} From f9f98e5705fc9f879860c7d7e535d7d290109e84 Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Sun, 31 Mar 2024 20:23:35 +0200 Subject: [PATCH 19/30] =?UTF-8?q?Ajout=20des=20controller=20notepad,=20sol?= =?UTF-8?q?ution=20et=20des=20services=20associ=C3=A9s=20+=20modification?= =?UTF-8?q?=20des=20controllers=20et=20services=20actuels=20pour=20se=20co?= =?UTF-8?q?nformer=20au=20site=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../API/Controllers/InquiryTableController.cs | 42 ++++++++ .../API/Controllers/LessonsController.cs | 10 ++ .../API/Controllers/NotepadController.cs | 97 +++++++++++++++++++ .../API/Controllers/ParagraphsController.cs | 16 +++ .../API/Controllers/SolutionController.cs | 43 ++++++++ API_SQLuedo/API/Program.cs | 9 ++ .../API/Service/InquiryTableDataServiceAPI.cs | 13 +++ .../API/Service/LessonDataServiceAPI.cs | 5 + .../API/Service/NotepadDataServiceAPI.cs | 24 +++++ .../API/Service/ParagraphDataServiceAPI.cs | 5 + .../API/Service/SolutionDataServiceAPI.cs | 14 +++ .../Service/InquiryTableDataService.cs | 27 ++++++ .../Service/LessonDataService.cs | 5 + .../Service/NotepadDataService.cs | 63 ++++++++++++ .../Service/ParagraphDataService.cs | 11 +++ .../Service/SolutionDataService.cs | 26 +++++ API_SQLuedo/Shared/IInquiryTableService.cs | 6 ++ API_SQLuedo/Shared/ILessonService.cs | 1 + API_SQLuedo/Shared/INotepadService.cs | 10 ++ API_SQLuedo/Shared/IParagraphService.cs | 1 + API_SQLuedo/Shared/ISolutionService.cs | 6 ++ .../StubbedContextLib/StubbedContext.cs | 24 +++++ 22 files changed, 458 insertions(+) create mode 100644 API_SQLuedo/API/Controllers/InquiryTableController.cs create mode 100644 API_SQLuedo/API/Controllers/NotepadController.cs create mode 100644 API_SQLuedo/API/Controllers/SolutionController.cs create mode 100644 API_SQLuedo/API/Service/InquiryTableDataServiceAPI.cs create mode 100644 API_SQLuedo/API/Service/NotepadDataServiceAPI.cs create mode 100644 API_SQLuedo/API/Service/SolutionDataServiceAPI.cs create mode 100644 API_SQLuedo/DbDataManager/Service/InquiryTableDataService.cs create mode 100644 API_SQLuedo/DbDataManager/Service/NotepadDataService.cs create mode 100644 API_SQLuedo/DbDataManager/Service/SolutionDataService.cs create mode 100644 API_SQLuedo/Shared/IInquiryTableService.cs create mode 100644 API_SQLuedo/Shared/INotepadService.cs create mode 100644 API_SQLuedo/Shared/ISolutionService.cs diff --git a/API_SQLuedo/API/Controllers/InquiryTableController.cs b/API_SQLuedo/API/Controllers/InquiryTableController.cs new file mode 100644 index 0000000..fa9d3f5 --- /dev/null +++ b/API_SQLuedo/API/Controllers/InquiryTableController.cs @@ -0,0 +1,42 @@ +using Asp.Versioning; +using Dto; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http.HttpResults; +using Microsoft.AspNetCore.Mvc; +using Shared; + +namespace API.Controllers; + +[Route("api/v{version:apiVersion}/[controller]")] +[Authorize] +[ApiVersion("1.0")] +[ApiController] +public class InquiryTableController : Controller +{ + private readonly IInquiryTableService _inquiryTableService; + + private readonly ILogger _logger; + + public InquiryTableController(IInquiryTableService inquiryTableService, ILogger logger) + { + _inquiryTableService = inquiryTableService; + _logger = logger; + } + + [HttpGet("database/{id:int}")] + [ProducesResponseType(typeof(string), 200)] + [ProducesResponseType(typeof(string), 404)] + public IActionResult GetSolutionByInquiryById(int id) + { + try + { + _logger.LogInformation("[INFORMATION] La base de données pour l'enquête avec l'id {id} a été trouvé.", id); + return Ok(new KeyValuePair("database", _inquiryTableService.GetDatabaseNameByInquiryId(id))); + } + catch (ArgumentException) + { + _logger.LogError("[ERREUR] Aucune base de données trouvée pour l'enquête avec l'id {id}.", id); + return NotFound(); + } + } +} \ No newline at end of file diff --git a/API_SQLuedo/API/Controllers/LessonsController.cs b/API_SQLuedo/API/Controllers/LessonsController.cs index c02cc6b..95b65ad 100644 --- a/API_SQLuedo/API/Controllers/LessonsController.cs +++ b/API_SQLuedo/API/Controllers/LessonsController.cs @@ -39,6 +39,16 @@ namespace API.Controllers _logger.LogInformation("[INFORMATION] {nb} Leçon(s) trouvée(s)", nbLesson); return Ok(_lessonDataService.GetLessons(page, number, orderCriteria)); } + + [HttpGet("lessons/number")] + [ProducesResponseType(typeof(KeyValuePair), 200)] + [ProducesResponseType(typeof(string), 204)] + public IActionResult GetNumberOfLessons() + { + var nbLesson = _lessonDataService.GetNumberOfLessons(); + _logger.LogInformation("[INFORMATION] {nb} Leçon(s) trouvée(s)", nbLesson); + return Ok(new KeyValuePair("nbLessons",nbLesson)); + } [HttpGet("lesson/{id:int}")] [ProducesResponseType(typeof(LessonDto), 200)] diff --git a/API_SQLuedo/API/Controllers/NotepadController.cs b/API_SQLuedo/API/Controllers/NotepadController.cs new file mode 100644 index 0000000..1eb3215 --- /dev/null +++ b/API_SQLuedo/API/Controllers/NotepadController.cs @@ -0,0 +1,97 @@ +using Asp.Versioning; +using Dto; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Shared; + +namespace API.Controllers; + +[Route("api/v{version:apiVersion}/[controller]")] +[Authorize] +[ApiVersion("1.0")] +[ApiController] +public class NotepadController : Controller +{ + private readonly INotepadService _notepadDataService; + + private readonly ILogger _logger; + + public NotepadController(INotepadService notepadService, ILogger logger) + { + _notepadDataService = notepadService; + _logger = logger; + } + + [HttpGet("notepad/{userId:int}/{inquiryId:int}")] + [ProducesResponseType(typeof(NotepadDto), 200)] + [ProducesResponseType(typeof(void), 404)] + public IActionResult GetNotepadByUserAndInquiryById(int userId, int inquiryId) + { + try + { + _logger.LogInformation( + "[INFORMATION] Le bloc-notes de l'utilisateur avec l'id {id} et l'enquête avec l'id {idInquiry} a été trouvé.", + userId, inquiryId); + return Ok(_notepadDataService.GetNotepadFromUserAndInquiryId(userId,inquiryId)); + } + catch (ArgumentException) + { + _logger.LogError( + "[ERREUR] Aucun bloc-notes trouvé pour l'utilisateur avec l'id {id} et l'enquête avec l'id {inquiryId}.", + userId, inquiryId); + return NotFound(); + } + } + + [HttpPost("notepad")] + [ProducesResponseType(typeof(void), 200)] + [ProducesResponseType(typeof(void), 404)] + public IActionResult SetNotepadByUserAndInquiryById([FromBody] NotepadDto notepad) + { + try + { + if (notepad.InquiryId == null || notepad.UserId == null || notepad.Notes == null) + { + return BadRequest(); + } + _notepadDataService.SetNotepadFromUserAndInquiryId(notepad.UserId, notepad.InquiryId, notepad.Notes); + _logger.LogInformation( + "[INFORMATION] Le bloc-notes de l'utilisateur avec l'id {id} et l'enquête avec l'id {idInquiry} a été créé.", + notepad.UserId, notepad.InquiryId); + return Ok(); + } + catch (ArgumentException) + { + _logger.LogError( + "[ERREUR] Aucun bloc-notes n'a pu être créé pour l'utilisateur avec l'id {id} et l'enquête avec l'id {inquiryId}.", + notepad.UserId, notepad.InquiryId); + return NotFound(); + } + } + + [HttpPut("notepad")] + [ProducesResponseType(typeof(void), 203)] + [ProducesResponseType(typeof(void), 404)] + public IActionResult UpdateNotepadByUserAndInquiryById([FromBody] NotepadDto notepad) + { + try + { + if (notepad.InquiryId == null || notepad.UserId == null || notepad.Notes == null) + { + return BadRequest(); + } + _notepadDataService.UpdateNotepadFromUserAndInquiryId(notepad.UserId, notepad.InquiryId, notepad.Notes); + _logger.LogInformation( + "[INFORMATION] Le bloc-notes de l'utilisateur avec l'id {id} et l'enquête avec l'id {idInquiry} a été mis à jour.", + notepad.UserId, notepad.InquiryId); + return Ok(); + } + catch (ArgumentException) + { + _logger.LogError( + "[ERREUR] Aucun bloc-notes n'a pu être mis à jour pour l'utilisateur avec l'id {id} et l'enquête avec l'id {inquiryId}.", + notepad.UserId, notepad.InquiryId); + return NotFound(); + } + } +} \ No newline at end of file diff --git a/API_SQLuedo/API/Controllers/ParagraphsController.cs b/API_SQLuedo/API/Controllers/ParagraphsController.cs index a8fa71a..1975928 100644 --- a/API_SQLuedo/API/Controllers/ParagraphsController.cs +++ b/API_SQLuedo/API/Controllers/ParagraphsController.cs @@ -39,6 +39,22 @@ namespace API.Controllers _logger.LogInformation("[INFORMATION] {nb} Paragraphe(s) trouvé(s)", nbParagraph); return Ok(_paragraphDataService.GetParagraphs(page, number, orderCriteria)); } + + [HttpGet("paragraphs/lesson/{id:int}")] + [ProducesResponseType(typeof(IEnumerable), 200)] + [ProducesResponseType(typeof(string), 204)] + public IActionResult GetParagraphsByLessonId(int id) + { + var nbParagraph = _paragraphDataService.GetParagraphsByLessonId(id).ToList().Count; + if (nbParagraph == 0) + { + _logger.LogError("[ERREUR] Aucun paragraphe trouvé."); + return StatusCode(204); + } + + _logger.LogInformation("[INFORMATION] {nb} Paragraphe(s) trouvé(s)", nbParagraph); + return Ok(_paragraphDataService.GetParagraphsByLessonId(id)); + } [HttpGet("paragraph/{id:int}")] [ProducesResponseType(typeof(ParagraphDto), 200)] diff --git a/API_SQLuedo/API/Controllers/SolutionController.cs b/API_SQLuedo/API/Controllers/SolutionController.cs new file mode 100644 index 0000000..f0ccf35 --- /dev/null +++ b/API_SQLuedo/API/Controllers/SolutionController.cs @@ -0,0 +1,43 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Dto; +using Model.OrderCriteria; +using Shared; +using Asp.Versioning; + +namespace API.Controllers +{ + [Route("api/v{version:apiVersion}/[controller]")] + [Authorize] + [ApiVersion("1.0")] + [ApiController] + public class SolutionController : Controller + { + private readonly ISolutionService _solutionDataService; + + private readonly ILogger _logger; + + public SolutionController(ISolutionService solutionDataService, ILogger logger) + { + _solutionDataService = solutionDataService; + _logger = logger; + } + + [HttpGet("solution/{id:int}")] + [ProducesResponseType(typeof(SolutionDto), 200)] + [ProducesResponseType(typeof(string), 404)] + public IActionResult GetSolutionByInquiryById(int id) + { + try + { + _logger.LogInformation("[INFORMATION] L'enquête avec l'id {id} a été trouvé.", id); + return Ok(_solutionDataService.GetSolutionByInquiryId(id)); + } + catch (ArgumentException) + { + _logger.LogError("[ERREUR] Aucune enquête trouvée avec l'id {id}.", id); + return NotFound(); + } + } + } +} \ No newline at end of file diff --git a/API_SQLuedo/API/Program.cs b/API_SQLuedo/API/Program.cs index e34c27e..650f0cc 100644 --- a/API_SQLuedo/API/Program.cs +++ b/API_SQLuedo/API/Program.cs @@ -28,6 +28,12 @@ builder.Services.AddScoped, BlackListDataService builder.Services.AddScoped, InquiryDataService>(); builder.Services.AddScoped, InquiryDataServiceApi>(); +builder.Services.AddScoped, SolutionDataService>(); +builder.Services.AddScoped, SolutionDataServiceAPI>(); + +builder.Services.AddScoped, InquiryTableDataService>(); +builder.Services.AddScoped, InquiryTableDataServiceAPI>(); + builder.Services.AddScoped, ParagraphDataService>(); builder.Services.AddScoped, ParagraphDataServiceApi>(); @@ -37,6 +43,9 @@ builder.Services.AddScoped, SuccessDataServiceApi>() builder.Services.AddScoped, LessonDataService>(); builder.Services.AddScoped, LessonDataServiceApi>(); +builder.Services.AddScoped, NotepadDataService>(); +builder.Services.AddScoped, NotepadDataServiceAPI>(); + builder.Services.AddDbContext(); builder.Services.AddDbContext(options => options.UseInMemoryDatabase("appDb")); builder.Services.AddIdentityApiEndpoints().AddEntityFrameworkStores(); diff --git a/API_SQLuedo/API/Service/InquiryTableDataServiceAPI.cs b/API_SQLuedo/API/Service/InquiryTableDataServiceAPI.cs new file mode 100644 index 0000000..71e11e5 --- /dev/null +++ b/API_SQLuedo/API/Service/InquiryTableDataServiceAPI.cs @@ -0,0 +1,13 @@ +using Dto; +using Entities; +using Shared; + +namespace API.Service; + +public class InquiryTableDataServiceAPI(IInquiryTableService inquiryTableService) : IInquiryTableService +{ + public string GetDatabaseNameByInquiryId(int id) + { + return inquiryTableService.GetDatabaseNameByInquiryId(id); + } +} \ No newline at end of file diff --git a/API_SQLuedo/API/Service/LessonDataServiceAPI.cs b/API_SQLuedo/API/Service/LessonDataServiceAPI.cs index 17fd31b..de6173e 100644 --- a/API_SQLuedo/API/Service/LessonDataServiceAPI.cs +++ b/API_SQLuedo/API/Service/LessonDataServiceAPI.cs @@ -14,6 +14,11 @@ public class LessonDataServiceApi(ILessonService lessonService) : return lessonsEntities.Select(e => e.FromEntityToDto()).ToList(); } + public int GetNumberOfLessons() + { + return lessonService.GetNumberOfLessons(); + } + public LessonDto GetLessonById(int id) => lessonService.GetLessonById(id).FromEntityToDto(); public LessonDto GetLessonByTitle(string title) => lessonService.GetLessonByTitle(title).FromEntityToDto(); diff --git a/API_SQLuedo/API/Service/NotepadDataServiceAPI.cs b/API_SQLuedo/API/Service/NotepadDataServiceAPI.cs new file mode 100644 index 0000000..263ee9e --- /dev/null +++ b/API_SQLuedo/API/Service/NotepadDataServiceAPI.cs @@ -0,0 +1,24 @@ +using Dto; +using Entities; +using Shared; +using Shared.Mapper; + +namespace API.Service; + +public class NotepadDataServiceAPI(INotepadService notepadService) : INotepadService +{ + public NotepadDto GetNotepadFromUserAndInquiryId(int userId, int inquiryId) + { + return notepadService.GetNotepadFromUserAndInquiryId(userId, inquiryId).FromEntityToDto(); + } + + public void SetNotepadFromUserAndInquiryId(int userId, int inquiryId, string notes) + { + notepadService.SetNotepadFromUserAndInquiryId(userId,inquiryId,notes); + } + + public void UpdateNotepadFromUserAndInquiryId(int userId, int inquiryId, string notes) + { + notepadService.UpdateNotepadFromUserAndInquiryId(userId,inquiryId,notes); + } +} \ No newline at end of file diff --git a/API_SQLuedo/API/Service/ParagraphDataServiceAPI.cs b/API_SQLuedo/API/Service/ParagraphDataServiceAPI.cs index 3b0cb16..39ceddf 100644 --- a/API_SQLuedo/API/Service/ParagraphDataServiceAPI.cs +++ b/API_SQLuedo/API/Service/ParagraphDataServiceAPI.cs @@ -15,6 +15,11 @@ public class ParagraphDataServiceApi(IParagraphService paragrap return paragraphsEntities.Select(e => e.FromEntityToDto()).ToList(); } + public IEnumerable GetParagraphsByLessonId(int lessonId) + { + return paragraphService.GetParagraphsByLessonId(lessonId).Select(p => p.FromEntityToDto()); + } + public ParagraphDto GetParagraphById(int id) => paragraphService.GetParagraphById(id).FromEntityToDto(); public ParagraphDto GetParagraphByTitle(string title) => diff --git a/API_SQLuedo/API/Service/SolutionDataServiceAPI.cs b/API_SQLuedo/API/Service/SolutionDataServiceAPI.cs new file mode 100644 index 0000000..f5d615d --- /dev/null +++ b/API_SQLuedo/API/Service/SolutionDataServiceAPI.cs @@ -0,0 +1,14 @@ +using Dto; +using Entities; +using Shared; +using Shared.Mapper; + +namespace API.Service; + +public class SolutionDataServiceAPI(ISolutionService solutionService) : ISolutionService +{ + public SolutionDto GetSolutionByInquiryId(int id) + { + return solutionService.GetSolutionByInquiryId(id).FromEntityToDto(); + } +} \ No newline at end of file diff --git a/API_SQLuedo/DbDataManager/Service/InquiryTableDataService.cs b/API_SQLuedo/DbDataManager/Service/InquiryTableDataService.cs new file mode 100644 index 0000000..9b968d9 --- /dev/null +++ b/API_SQLuedo/DbDataManager/Service/InquiryTableDataService.cs @@ -0,0 +1,27 @@ +using DbContextLib; +using Entities; +using Shared; + +namespace DbDataManager.Service; + +public class InquiryTableDataService : IInquiryTableService +{ + private UserDbContext DbContext { get; set; } + + public InquiryTableDataService(UserDbContext context) + { + DbContext = context; + context.Database.EnsureCreated(); + } + + public string GetDatabaseNameByInquiryId(int id) + { + var inquiryTable = DbContext.InquiryTables.FirstOrDefault(i => i.OwnerId == id); + if (inquiryTable == null) + { + throw new ArgumentException($"Erreur, impossible de trouver l'objet InquiryTable pour l'enquête d'id {id}", + nameof(id)); + } + return inquiryTable.DatabaseName; + } +} \ No newline at end of file diff --git a/API_SQLuedo/DbDataManager/Service/LessonDataService.cs b/API_SQLuedo/DbDataManager/Service/LessonDataService.cs index aa67a64..ffda92e 100644 --- a/API_SQLuedo/DbDataManager/Service/LessonDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/LessonDataService.cs @@ -51,6 +51,11 @@ public class LessonDataService : ILessonService return lessons; } + public int GetNumberOfLessons() + { + return DbContext.Lessons.Count(); + } + public LessonEntity GetLessonById(int id) { var lessonEntity = DbContext.Lessons.FirstOrDefault(u => u.Id == id); diff --git a/API_SQLuedo/DbDataManager/Service/NotepadDataService.cs b/API_SQLuedo/DbDataManager/Service/NotepadDataService.cs new file mode 100644 index 0000000..b4f9cdc --- /dev/null +++ b/API_SQLuedo/DbDataManager/Service/NotepadDataService.cs @@ -0,0 +1,63 @@ +using DbContextLib; +using Entities; +using Shared; + +namespace DbDataManager.Service; + +public class NotepadDataService : INotepadService +{ + private UserDbContext DbContext { get; set; } + + public NotepadDataService(UserDbContext context) + { + DbContext = context; + context.Database.EnsureCreated(); + } + public NotepadEntity GetNotepadFromUserAndInquiryId(int userId, int inquiryId) + { + var user = DbContext.Users.FirstOrDefault(u => u.Id == userId); + if (user == null) + { + throw new ArgumentException("Erreur, aucun utilisateur ne possède l'ID fourni"); + } + var inquiry = DbContext.Inquiries.FirstOrDefault(i => i.Id == inquiryId); + if (inquiry == null) + { + throw new ArgumentException("Erreur, aucune enquête ne possède l'ID fourni"); + } + var notepad = DbContext.Notepads.FirstOrDefault(n => n.UserId == userId && n.InquiryId == inquiryId); + if (notepad == null) + { + throw new ArgumentException("Erreur, aucun bloc-notes n'existe pour l'utilisateur et l'enquête donnés"); + } + return notepad; + } + + public void SetNotepadFromUserAndInquiryId(int userId, int inquiryId, string notes) + { + var user = DbContext.Users.FirstOrDefault(u => u.Id == userId); + if (user == null) + { + throw new ArgumentException("Erreur, aucun utilisateur ne possède l'ID fourni"); + } + var inquiry = DbContext.Inquiries.FirstOrDefault(i => i.Id == inquiryId); + if (inquiry == null) + { + throw new ArgumentException("Erreur, aucune enquête ne possède l'ID fourni"); + } + var notepad = DbContext.Notepads.FirstOrDefault(n => n.UserId == userId && n.InquiryId == inquiryId); + if (notepad != null) + { + throw new ArgumentException("Erreur, un bloc-notes existe déjà pour l'utilisateur et l'enquête donnés"); + } + DbContext.Notepads.Add(new NotepadEntity { UserId = userId, InquiryId = inquiryId, Notes = notes }); + DbContext.SaveChangesAsync(); + } + + public void UpdateNotepadFromUserAndInquiryId(int userId, int inquiryId, string notes) + { + var notepad = GetNotepadFromUserAndInquiryId(userId, inquiryId); + notepad.Notes = notes; + DbContext.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/API_SQLuedo/DbDataManager/Service/ParagraphDataService.cs b/API_SQLuedo/DbDataManager/Service/ParagraphDataService.cs index 4c77183..1b38e05 100644 --- a/API_SQLuedo/DbDataManager/Service/ParagraphDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/ParagraphDataService.cs @@ -54,6 +54,17 @@ public class ParagraphDataService : IParagraphService return paragraphs; } + public IEnumerable GetParagraphsByLessonId(int lessonId) + { + var lesson = DbContext.Lessons.FirstOrDefault(l => l.Id == lessonId); + if (lesson == null) + { + throw new ArgumentException($"Erreur, la leçon ayant pour id {lessonId} est introuvable."); + } + var list = DbContext.Paragraphs.Where(p => p.LessonId == lessonId); + return list; + } + public ParagraphEntity GetParagraphById(int id) { var paragraphEntity = DbContext.Paragraphs.FirstOrDefault(u => u.Id == id); diff --git a/API_SQLuedo/DbDataManager/Service/SolutionDataService.cs b/API_SQLuedo/DbDataManager/Service/SolutionDataService.cs new file mode 100644 index 0000000..d63992b --- /dev/null +++ b/API_SQLuedo/DbDataManager/Service/SolutionDataService.cs @@ -0,0 +1,26 @@ +using DbContextLib; +using Entities; +using Shared; + +namespace DbDataManager.Service; + +public class SolutionDataService : ISolutionService +{ + private UserDbContext DbContext { get; set; } + + public SolutionDataService(UserDbContext context) + { + DbContext = context; + context.Database.EnsureCreated(); + } + + public SolutionEntity GetSolutionByInquiryId(int id) + { + var solution = DbContext.Solutions.FirstOrDefault(s => s.OwnerId == id); + if (solution == null) + { + throw new ArgumentException($"Impossible de trouver la solution pour l'enquête d'id {id}", nameof(id)); + } + return solution; + } +} \ No newline at end of file diff --git a/API_SQLuedo/Shared/IInquiryTableService.cs b/API_SQLuedo/Shared/IInquiryTableService.cs new file mode 100644 index 0000000..fa3d5ff --- /dev/null +++ b/API_SQLuedo/Shared/IInquiryTableService.cs @@ -0,0 +1,6 @@ +namespace Shared; + +public interface IInquiryTableService +{ + public string GetDatabaseNameByInquiryId(int id); +} \ No newline at end of file diff --git a/API_SQLuedo/Shared/ILessonService.cs b/API_SQLuedo/Shared/ILessonService.cs index 51836e0..ab173fc 100644 --- a/API_SQLuedo/Shared/ILessonService.cs +++ b/API_SQLuedo/Shared/ILessonService.cs @@ -5,6 +5,7 @@ namespace Shared; public interface ILessonService { public IEnumerable GetLessons(int page, int number, LessonOrderCriteria orderCriteria); + public int GetNumberOfLessons(); public TLesson GetLessonById(int id); public TLesson GetLessonByTitle(string title); public bool DeleteLesson(int id); diff --git a/API_SQLuedo/Shared/INotepadService.cs b/API_SQLuedo/Shared/INotepadService.cs new file mode 100644 index 0000000..9e5bb6d --- /dev/null +++ b/API_SQLuedo/Shared/INotepadService.cs @@ -0,0 +1,10 @@ +namespace Shared; + +public interface INotepadService +{ + public TNotepad GetNotepadFromUserAndInquiryId(int userId, int inquiryId); + + public void SetNotepadFromUserAndInquiryId(int userId, int inquiryId, string notes); + + public void UpdateNotepadFromUserAndInquiryId(int userId, int inquiryId, string notes); +} \ No newline at end of file diff --git a/API_SQLuedo/Shared/IParagraphService.cs b/API_SQLuedo/Shared/IParagraphService.cs index 34a249b..7fc124e 100644 --- a/API_SQLuedo/Shared/IParagraphService.cs +++ b/API_SQLuedo/Shared/IParagraphService.cs @@ -5,6 +5,7 @@ namespace Shared public interface IParagraphService { public IEnumerable GetParagraphs(int page, int number, ParagraphOrderCriteria orderCriteria); + public IEnumerable GetParagraphsByLessonId(int lessonId); public TParagraph GetParagraphById(int id); public TParagraph GetParagraphByTitle(string title); public bool DeleteParagraph(int id); diff --git a/API_SQLuedo/Shared/ISolutionService.cs b/API_SQLuedo/Shared/ISolutionService.cs new file mode 100644 index 0000000..270ee5c --- /dev/null +++ b/API_SQLuedo/Shared/ISolutionService.cs @@ -0,0 +1,6 @@ +namespace Shared; + +public interface ISolutionService +{ + public TSolution GetSolutionByInquiryId(int id); +} \ No newline at end of file diff --git a/API_SQLuedo/StubbedContextLib/StubbedContext.cs b/API_SQLuedo/StubbedContextLib/StubbedContext.cs index b015ebc..1337b91 100644 --- a/API_SQLuedo/StubbedContextLib/StubbedContext.cs +++ b/API_SQLuedo/StubbedContextLib/StubbedContext.cs @@ -184,5 +184,29 @@ public class StubbedContext : UserDbContext IsFinished = true } ); + builder.Entity().HasData( + new LessonEntity + { + Id = 1, Title = "Lesson N°1", LastEdit = DateOnly.FromDateTime(DateTime.Now), LastPublisher = "Clément" + }, + new LessonEntity + { + Id = 2, Title = "Lesson N°2", LastEdit = DateOnly.FromDateTime(DateTime.Now), LastPublisher = "Clément" + }, + new LessonEntity + { + Id = 3, Title = "Lesson N°3", LastEdit = DateOnly.FromDateTime(DateTime.Now), LastPublisher = "Clément" + }, + new LessonEntity + { + Id = 4, Title = "Lesson N°4", LastEdit = DateOnly.FromDateTime(DateTime.Now), LastPublisher = "Clément" + } + ); + builder.Entity().HasData( + new ParagraphEntity { Id = 1, LessonId = 1, ContentTitle = "Paragraph N°1", ContentContent = "Content of paragraph N°1", Title = "Title Paragraph N°1", Content = "Content of paragraph N°1", Info = "Infos", Query = "SELECT * FROM Table", Comment = "Comment of paragraph N°1"}, + new ParagraphEntity { Id = 2, LessonId = 1, ContentTitle = "Paragraph N°2", ContentContent = "Content of paragraph N°2", Title = "Title Paragraph N°2", Content = "Content of paragraph N°2", Info = "Infos", Query = "SELECT * FROM Table", Comment = "Comment of paragraph N°2"}, + new ParagraphEntity { Id = 3, LessonId = 1, ContentTitle = "Paragraph N°3", ContentContent = "Content of paragraph N°3", Title = "Title Paragraph N°3", Content = "Content of paragraph N°3", Info = "Infos", Query = "SELECT * FROM Table", Comment = "Comment of paragraph N°3"}, + new ParagraphEntity { Id = 4, LessonId = 2, ContentTitle = "Paragraph N°1", ContentContent = "Content of paragraph N°1", Title = "Title Paragraph N°1", Content = "Content of paragraph N°1", Info = "Infos", Query = "SELECT * FROM Table", Comment = "Comment of paragraph N°1"} + ); } } \ No newline at end of file From 0161832d9ef0fa22756719f4c5469bcc860de9ab Mon Sep 17 00:00:00 2001 From: masapountz Date: Mon, 1 Apr 2024 03:08:28 +0200 Subject: [PATCH 20/30] Ajout de getTables et getColumns pour le queryController --- .../API/Controllers/QueryController.cs | 33 ++++ .../API/Service/QueryDataServiceApi.cs | 150 +++++++++++++++--- API_SQLuedo/Shared/IQueryService.cs | 5 +- 3 files changed, 162 insertions(+), 26 deletions(-) diff --git a/API_SQLuedo/API/Controllers/QueryController.cs b/API_SQLuedo/API/Controllers/QueryController.cs index 9ab92d7..e0fdb81 100644 --- a/API_SQLuedo/API/Controllers/QueryController.cs +++ b/API_SQLuedo/API/Controllers/QueryController.cs @@ -28,5 +28,38 @@ namespace API.Controllers logger.LogInformation("[INFORMATION] La requête a renvoyé : {result} ", queryResult); return Ok(queryResult); } + + [HttpGet("{database}/Tables")] + [ProducesResponseType(typeof(QueryDto), 200)] + [ProducesResponseType(typeof(string), 204)] + public IActionResult GetTables(string database) + { + var queryResult = queryService.GetTables(database); + if (queryResult == null) + { + logger.LogError("[ERREUR] La requête n'a rien renvoyé."); + return StatusCode(204); + } + + logger.LogInformation("[INFORMATION] La requête a renvoyé : {result} ", queryResult); + return Ok(queryResult); + } + + + [HttpGet("{database}/{table}/Columns")] + [ProducesResponseType(typeof(QueryDto), 200)] + [ProducesResponseType(typeof(string), 204)] + public IActionResult GetColumns(string database,string table) + { + var queryResult = queryService.GetColumns(database,table); + if (queryResult == null) + { + logger.LogError("[ERREUR] La requête n'a rien renvoyé."); + return StatusCode(204); + } + + logger.LogInformation("[INFORMATION] La requête a renvoyé : {result} ", queryResult); + return Ok(queryResult); + } } } diff --git a/API_SQLuedo/API/Service/QueryDataServiceApi.cs b/API_SQLuedo/API/Service/QueryDataServiceApi.cs index e2e8f3c..284b79c 100644 --- a/API_SQLuedo/API/Service/QueryDataServiceApi.cs +++ b/API_SQLuedo/API/Service/QueryDataServiceApi.cs @@ -6,6 +6,7 @@ using Shared; using Shared.Mapper; using System.Text; using Newtonsoft.Json; +using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace API.Service; @@ -21,49 +22,150 @@ public class QueryDataServiceApi : IQueryService return new QueryDto { Result = "Le nom de la base de données est requis." }; } - using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) + try { - connection.Open(); - using (NpgsqlCommand command = new NpgsqlCommand(query, connection)) + using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) { - using (NpgsqlDataReader reader = command.ExecuteReader()) + connection.Open(); + using (NpgsqlCommand command = new NpgsqlCommand(query, connection)) { - List> resultList = new List>(); - - - List columnNames = new List(); - for (int i = 0; i < reader.FieldCount; i++) + using (NpgsqlDataReader reader = command.ExecuteReader()) { - columnNames.Add(reader.GetName(i)); - } + List> resultList = new List>(); - while (reader.Read()) - { - Dictionary row = new Dictionary(); + + List columnNames = new List(); for (int i = 0; i < reader.FieldCount; i++) { - row[columnNames[i]] = reader[i].ToString(); + columnNames.Add(reader.GetName(i)); } - resultList.Add(row); - } + while (reader.Read()) + { + Dictionary row = new Dictionary(); + for (int i = 0; i < reader.FieldCount; i++) + { + row[columnNames[i]] = reader[i].ToString(); + } + + resultList.Add(row); + } - string resultJson = JsonConvert.SerializeObject(resultList); + string resultJson = JsonConvert.SerializeObject(resultList); - QueryDto queryDto = new QueryDto { Result = resultJson }; - return queryDto; + QueryDto queryDto = new QueryDto { Result = resultJson }; + return queryDto; + } } } } + catch (Exception ex) + { + return new QueryDto { Result = ex.Message }; + } } - public IEnumerable GetTables(string database) + public QueryDto GetTables(string database) { - throw new NotImplementedException(); + string connectionString = + $"Host=localhost;Username=admin;Password=motdepasse;Database={database}"; + + try + { + using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) + { + connection.Open(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = connection; + // Donner et exclure les bonnes permissions au rôle en question + + // GRANT SELECT ON TABLE information_schema.tables TO votre_utilisateur; + + // GRANT SELECT ON TABLE information_schema.columns TO votre_utilisateur; + + // REVOKE ALL ON SCHEMA information_schema FROM PUBLIC; + + command.CommandText = + "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';"; + + using (NpgsqlDataReader reader = command.ExecuteReader()) + { + List tableNames = new List(); + + while (reader.Read()) + { + tableNames.Add(reader["table_name"].ToString()); + } + + Dictionary tablesDict = new Dictionary(); + foreach (string tableName in tableNames) + { + tablesDict[tableName] = tableName; + } + + string tablesJson = JsonConvert.SerializeObject(tablesDict); + + QueryDto queryDto = new QueryDto { Result = tablesJson }; + return queryDto; + } + } + } + } + catch (Exception ex) + { + return new QueryDto { Result = ex.Message }; + } } - public IEnumerable GetColumns(string database, string table) + public QueryDto GetColumns(string database, string table) { - throw new NotImplementedException(); + string connectionString = + $"Host=localhost;Username=admin;Password=motdepasse;Database={database}"; + + using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) + { + connection.Open(); + using (NpgsqlCommand command = new NpgsqlCommand()) + { + command.Connection = connection; + // Donner et exclure les bonnes permissions au rôle en question + + //GRANT SELECT ON TABLE information_schema.tables TO votre_utilisateur; + + //GRANT SELECT ON TABLE information_schema.columns TO votre_utilisateur; + + //REVOKE ALL ON SCHEMA information_schema FROM PUBLIC; + + command.CommandText = + $"SELECT column_name FROM information_schema.columns WHERE table_name = '{table}';"; + + Console.WriteLine(command.CommandText); + + using (NpgsqlDataReader reader = command.ExecuteReader()) + { + List columnsNames = new List(); + + while (reader.Read()) + { + columnsNames.Add(reader["column_name"].ToString()); + } + + Dictionary columnsDict = new Dictionary(); + foreach (string colName in columnsNames) + { + columnsDict[colName] = colName; + } + + string tablesJson = JsonConvert.SerializeObject(columnsDict); + + Console.WriteLine(tablesJson); + + QueryDto queryDto = new QueryDto { Result = tablesJson }; + return queryDto; + } + } + } + } } \ No newline at end of file diff --git a/API_SQLuedo/Shared/IQueryService.cs b/API_SQLuedo/Shared/IQueryService.cs index 85ecdf2..d09ec6e 100644 --- a/API_SQLuedo/Shared/IQueryService.cs +++ b/API_SQLuedo/Shared/IQueryService.cs @@ -5,13 +5,14 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Dto; namespace Shared { public interface IQueryService { public TQuery ExecuteQuery(string query, string database); - public IEnumerable GetTables(string database); - public IEnumerable GetColumns(string database,string table); + public QueryDto GetTables(string database); + public QueryDto GetColumns(string database,string table); } } From 18e7df02f3f15175b193b9374de4feb2e70b1c32 Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Mon, 1 Apr 2024 10:27:14 +0200 Subject: [PATCH 21/30] Ajout des test unitaires pour les nouveaux controller et services --- .../API/Controllers/InquiryTableController.cs | 2 +- .../API/Controllers/NotepadController.cs | 4 +- API_SQLuedo/TestAPI/InquiryTableUnitTest.cs | 51 +++++ API_SQLuedo/TestAPI/NotepadUnitTest.cs | 183 ++++++++++++++++++ API_SQLuedo/TestAPI/SolutionUnitTest.cs | 52 +++++ .../Service/TestInquiryTableDataService.cs | 62 ++++++ .../TestEF/Service/TestNotepadDataService.cs | 169 ++++++++++++++++ .../TestEF/Service/TestSolutionDataService.cs | 75 +++++++ 8 files changed, 595 insertions(+), 3 deletions(-) create mode 100644 API_SQLuedo/TestAPI/InquiryTableUnitTest.cs create mode 100644 API_SQLuedo/TestAPI/NotepadUnitTest.cs create mode 100644 API_SQLuedo/TestAPI/SolutionUnitTest.cs create mode 100644 API_SQLuedo/TestEF/Service/TestInquiryTableDataService.cs create mode 100644 API_SQLuedo/TestEF/Service/TestNotepadDataService.cs create mode 100644 API_SQLuedo/TestEF/Service/TestSolutionDataService.cs diff --git a/API_SQLuedo/API/Controllers/InquiryTableController.cs b/API_SQLuedo/API/Controllers/InquiryTableController.cs index fa9d3f5..a610342 100644 --- a/API_SQLuedo/API/Controllers/InquiryTableController.cs +++ b/API_SQLuedo/API/Controllers/InquiryTableController.cs @@ -26,7 +26,7 @@ public class InquiryTableController : Controller [HttpGet("database/{id:int}")] [ProducesResponseType(typeof(string), 200)] [ProducesResponseType(typeof(string), 404)] - public IActionResult GetSolutionByInquiryById(int id) + public IActionResult GetDatabaseNameByInquiryById(int id) { try { diff --git a/API_SQLuedo/API/Controllers/NotepadController.cs b/API_SQLuedo/API/Controllers/NotepadController.cs index 1eb3215..e3f46bf 100644 --- a/API_SQLuedo/API/Controllers/NotepadController.cs +++ b/API_SQLuedo/API/Controllers/NotepadController.cs @@ -50,7 +50,7 @@ public class NotepadController : Controller { try { - if (notepad.InquiryId == null || notepad.UserId == null || notepad.Notes == null) + if (notepad.InquiryId < 0 || notepad.UserId < 0 || notepad.Notes == null) { return BadRequest(); } @@ -76,7 +76,7 @@ public class NotepadController : Controller { try { - if (notepad.InquiryId == null || notepad.UserId == null || notepad.Notes == null) + if (notepad.InquiryId < 0 || notepad.UserId < 0 || notepad.Notes == null) { return BadRequest(); } diff --git a/API_SQLuedo/TestAPI/InquiryTableUnitTest.cs b/API_SQLuedo/TestAPI/InquiryTableUnitTest.cs new file mode 100644 index 0000000..a306bf6 --- /dev/null +++ b/API_SQLuedo/TestAPI/InquiryTableUnitTest.cs @@ -0,0 +1,51 @@ +using API.Controllers; +using Dto; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging.Abstractions; +using Moq; +using Shared; + +namespace TestAPI; + +public class InquiryTableUnitTest +{ + private readonly Mock> _inquiryTableService; + + public InquiryTableUnitTest() + { + _inquiryTableService = new Mock>(); + } + + [Fact] + public void GetDatabaseNameFromInquiryId_Success() + { + var database = "Inquiry1"; + _inquiryTableService.Setup(x => x.GetDatabaseNameByInquiryId(42)) + .Returns(database); + var inquiryTableController = + new InquiryTableController(_inquiryTableService.Object, new NullLogger()); + + var inquiryTableResult = inquiryTableController.GetDatabaseNameByInquiryById(42); + + if (inquiryTableResult is OkObjectResult okObjectResult) + { + var valeur = okObjectResult.Value; + Assert.NotNull(valeur); + Assert.Equal(database, ((KeyValuePair)valeur).Value); + } + } + + [Fact] + public void GetDatabaseNameFromInquiryId_Throws_ArgumentException() + { + _inquiryTableService.Setup(x => x.GetDatabaseNameByInquiryId(42)) + .Throws(); + var inquiryTableController = + new InquiryTableController(_inquiryTableService.Object, new NullLogger()); + + var inquiryTableResult = inquiryTableController.GetDatabaseNameByInquiryById(42); + + Assert.NotNull(inquiryTableResult); + Assert.Equal(typeof(NotFoundResult), inquiryTableResult.GetType()); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestAPI/NotepadUnitTest.cs b/API_SQLuedo/TestAPI/NotepadUnitTest.cs new file mode 100644 index 0000000..1bc6ad6 --- /dev/null +++ b/API_SQLuedo/TestAPI/NotepadUnitTest.cs @@ -0,0 +1,183 @@ +using API.Controllers; +using Dto; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging.Abstractions; +using Moq; +using Shared; +using TestAPI.Extensions; + +namespace TestAPI; + +public class NotepadUnitTest +{ + private readonly Mock> _notepadService; + + public NotepadUnitTest() + { + _notepadService = new Mock>(); + } + + [Fact] + public void GetNotepadFromUserAndInquiryId() + { + var notepad = new NotepadDto(42, 42, "These are notes example."); + _notepadService.Setup(x => x.GetNotepadFromUserAndInquiryId(42, 42)) + .Returns(notepad); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.GetNotepadByUserAndInquiryById(42,42); + + if (notepadResult is OkObjectResult okObjectResult) + { + var valeur = okObjectResult.Value; + Assert.NotNull(valeur); + Assert.Equal(notepad, valeur); + } + } + + [Fact] + public void GetNotepadFromUserAndInquiryId_ThrowingArgumentException() + { + var notepad = new NotepadDto(42, 42, "These are notes example."); + _notepadService.Setup(x => x.GetNotepadFromUserAndInquiryId(42, 10)) + .Throws(); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.GetNotepadByUserAndInquiryById(42,10); + Assert.NotNull(notepadResult); + Assert.Equal(typeof(NotFoundResult),notepadResult.GetType()); + } + + [Fact] + public void SetNotepadFromUserAndInquiryId_Success() + { + _notepadService.Setup(x => x.SetNotepadFromUserAndInquiryId(42, 42,"These are notes example.")); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(42,42, "These are notes example.")); + Assert.NotNull(notepadResult); + Assert.Equal(typeof(OkResult),notepadResult.GetType()); + Assert.Equal(typeof(OkObjectResult) , notepadController.GetNotepadByUserAndInquiryById(42,42).GetType()); + } + + [Fact] + public void SetNotepadFromUserAndInquiryId_Negative_UserId() + { + _notepadService.Setup(x => x.SetNotepadFromUserAndInquiryId(-42, 42,"These are notes example.")).Throws(); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(-42,42, "These are notes example.")); + Assert.NotNull(notepadResult); + Assert.Equal(typeof(BadRequestResult),notepadResult.GetType()); + } + + [Fact] + public void SetNotepadFromUserAndInquiryId_Negative_InquiryId() + { + _notepadService.Setup(x => x.SetNotepadFromUserAndInquiryId(42, -42,"These are notes example.")).Throws(); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(42,-42, "These are notes example.")); + Assert.NotNull(notepadResult); + Assert.Equal(typeof(BadRequestResult),notepadResult.GetType()); + } + + [Fact] + public void SetNotepadFromUserAndInquiryId_Null_Notes() + { + _notepadService.Setup(x => x.SetNotepadFromUserAndInquiryId(42, 42,"These are notes example.")).Throws(); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(42,42, null)); + Assert.NotNull(notepadResult); + Assert.Equal(typeof(BadRequestResult),notepadResult.GetType()); + } + + [Fact] + public void SetNotepadFromUserAndInquiryId_Throws_ArgumentException() + { + var notepad = new NotepadDto(42, 42, "These are notes example."); + _notepadService.Setup(x => x.SetNotepadFromUserAndInquiryId(42, 42,"These are notes example.")).Throws(); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(notepad); + Assert.NotNull(notepadResult); + Assert.Equal(typeof(NotFoundResult),notepadResult.GetType()); + } + + + [Fact] + public void UpdateNotepadFromUserAndInquiryId_Success() + { + _notepadService.Setup(x => x.UpdateNotepadFromUserAndInquiryId(42, 42,"These are the new notes")); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(42,42, "These are notes example.")); + Assert.NotNull(notepadResult); + Assert.Equal(typeof(OkResult),notepadResult.GetType()); + Assert.Equal(typeof(OkObjectResult) , notepadController.GetNotepadByUserAndInquiryById(42,42).GetType()); + var updateResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(42,42, "These are the new notes")); + Assert.NotNull(updateResult); + Assert.Equal(typeof(OkResult),updateResult.GetType()); + } + + [Fact] + public void UpdateNotepadFromUserAndInquiryId_Negative_UserId() + { + _notepadService.Setup(x => x.UpdateNotepadFromUserAndInquiryId(42, 42,"These are the new notes")); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(42,42, "These are notes example.")); + var updateResult = notepadController.UpdateNotepadByUserAndInquiryById(new NotepadDto(-42,42, "These are the new notes")); + Assert.NotNull(updateResult); + Assert.Equal(typeof(BadRequestResult),updateResult.GetType()); + } + + [Fact] + public void UpdateNotepadFromUserAndInquiryId_Negative_InquiryId() + { + _notepadService.Setup(x => x.UpdateNotepadFromUserAndInquiryId(42, -42,"These are the new notes")); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(42,42, "These are notes example.")); + var updateResult = notepadController.UpdateNotepadByUserAndInquiryById(new NotepadDto(42,-42, "These are the new notes")); + Assert.NotNull(updateResult); + Assert.Equal(typeof(BadRequestResult),updateResult.GetType()); + } + + [Fact] + public void UpdateNotepadFromUserAndInquiryId_Null_Notes() + { + _notepadService.Setup(x => x.UpdateNotepadFromUserAndInquiryId(42, 42,null)).Throws(); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(42,42, "These are notes example.")); + var updateResult = notepadController.UpdateNotepadByUserAndInquiryById(new NotepadDto(42,42, null)); + Assert.NotNull(updateResult); + Assert.Equal(typeof(BadRequestResult),updateResult.GetType()); + } + + [Fact] + public void UpdateNotepadFromUserAndInquiryId_Throws_ArgumentException() + { + _notepadService.Setup(x => x.UpdateNotepadFromUserAndInquiryId(42, 10,"These are the new notes")).Throws(); + var notepadController = + new NotepadController(_notepadService.Object, new NullLogger()); + + var notepadResult = notepadController.SetNotepadByUserAndInquiryById(new NotepadDto(42,42, "These are notes example.")); + var updateResult = notepadController.UpdateNotepadByUserAndInquiryById(new NotepadDto(42,10, "These are the new notes")); + Assert.NotNull(updateResult); + Assert.Equal(typeof(NotFoundResult),updateResult.GetType()); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestAPI/SolutionUnitTest.cs b/API_SQLuedo/TestAPI/SolutionUnitTest.cs new file mode 100644 index 0000000..da81706 --- /dev/null +++ b/API_SQLuedo/TestAPI/SolutionUnitTest.cs @@ -0,0 +1,52 @@ +using API.Controllers; +using Dto; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging.Abstractions; +using Moq; +using Shared; + +namespace TestAPI; + +public class SolutionUnitTest +{ + private readonly Mock> _solutionService; + + public SolutionUnitTest() + { + _solutionService = new Mock>(); + } + + [Fact] + public void GetSolutionFromInquiryId_Success() + { + var solution = new SolutionDto(42,"Maxime","Sapountzis","La cuisine","Le couteau", "L'explication"); + _solutionService.Setup(x => x.GetSolutionByInquiryId(42)) + .Returns(solution); + var solutionController = + new SolutionController(_solutionService.Object, new NullLogger()); + + var solutionResult = solutionController.GetSolutionByInquiryById(42); + + if (solutionResult is OkObjectResult okObjectResult) + { + var valeur = okObjectResult.Value; + Assert.NotNull(valeur); + Assert.Equal(solution, valeur); + } + } + + [Fact] + public void GetSolutionFromInquiryId_Throws_ArgumentException() + { + var solution = new SolutionDto(42,"Maxime","Sapountzis","La cuisine","Le couteau", "L'explication"); + _solutionService.Setup(x => x.GetSolutionByInquiryId(42)) + .Throws(); + var solutionController = + new SolutionController(_solutionService.Object, new NullLogger()); + + var solutionResult = solutionController.GetSolutionByInquiryById(42); + + Assert.NotNull(solutionResult); + Assert.Equal(typeof(NotFoundResult), solutionResult.GetType()); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Service/TestInquiryTableDataService.cs b/API_SQLuedo/TestEF/Service/TestInquiryTableDataService.cs new file mode 100644 index 0000000..63ed0cf --- /dev/null +++ b/API_SQLuedo/TestEF/Service/TestInquiryTableDataService.cs @@ -0,0 +1,62 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; + +namespace TestEF.Service; + +public class TestInquiryTableDataService +{ + private readonly UserDbContext _dbContext; + private readonly InquiryTableDataService _inquiryTableDataService; + + public TestInquiryTableDataService() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new UserDbContext(options); + _inquiryTableDataService = new InquiryTableDataService(_dbContext); + } + + [Fact] + public void GetDatabaseFromInquiryId_Success() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Description", IsUser = false }); + var inquiryTable = new InquiryTableEntity() + { + OwnerId = 42, + DatabaseName = "Database", + ConnectionInfo = "ConnectionString" + }; + _dbContext.InquiryTables.Add(inquiryTable); + _dbContext.SaveChanges(); + var result = _inquiryTableDataService.GetDatabaseNameByInquiryId(42); + Assert.Equal("Database",result); + } + + [Fact] + public void GetSolution_NotFound() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Description", IsUser = false }); + var inquiryTable = new InquiryTableEntity() + { + OwnerId = 42, + DatabaseName = "Database", + ConnectionInfo = "ConnectionString" + }; + _dbContext.InquiryTables.Add(inquiryTable); + _dbContext.SaveChanges(); + + Assert.Throws(() => + { + _inquiryTableDataService.GetDatabaseNameByInquiryId(10); + }); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Service/TestNotepadDataService.cs b/API_SQLuedo/TestEF/Service/TestNotepadDataService.cs new file mode 100644 index 0000000..f67a561 --- /dev/null +++ b/API_SQLuedo/TestEF/Service/TestNotepadDataService.cs @@ -0,0 +1,169 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; +using Model.OrderCriteria; + +namespace TestEF.Service; + +public class TestNotepadDataService +{ + private readonly UserDbContext _dbContext; + private readonly NotepadDataService _notepadDataService; + + public TestNotepadDataService() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new UserDbContext(options); + _notepadDataService = new NotepadDataService(_dbContext); + } + + [Fact] + public void GetNotepad_Success() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Descritpion", IsUser = false }); + _dbContext.Users.Add(new UserEntity + { Id = 42, Username = "Username", Email = "email@example.com", Password = "password", IsAdmin = true }); + var notepad = new NotepadEntity { UserId = 42, InquiryId = 42, Notes = "These are some notes" }; + _dbContext.Notepads.Add(notepad); + _dbContext.SaveChanges(); + + var result = _notepadDataService.GetNotepadFromUserAndInquiryId(42, 42); + + Assert.Equal(notepad,result); + } + + [Fact] + public void GetNotepad_Fail_UserNotFound() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Descritpion", IsUser = false }); + _dbContext.Users.Add(new UserEntity + { Id = 42, Username = "Username", Email = "email@example.com", Password = "password", IsAdmin = true }); + var notepad = new NotepadEntity { UserId = 42, InquiryId = 42, Notes = "These are some notes" }; + _dbContext.Notepads.Add(notepad); + _dbContext.SaveChanges(); + Assert.Throws(() => + { + _notepadDataService.GetNotepadFromUserAndInquiryId(10, 42); + }); + } + + [Fact] + public void GetNotepad_Fail_InquiryNotFound() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Descritpion", IsUser = false }); + _dbContext.Users.Add(new UserEntity + { Id = 42, Username = "Username", Email = "email@example.com", Password = "password", IsAdmin = true }); + var notepad = new NotepadEntity { UserId = 42, InquiryId = 42, Notes = "These are some notes" }; + _dbContext.Notepads.Add(notepad); + _dbContext.SaveChanges(); + Assert.Throws(() => + { + _notepadDataService.GetNotepadFromUserAndInquiryId(42, 10); + }); + } + + [Fact] + public void GetNotepad_Fail_NotepadNotFound() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 1, Title = "Titre", Description = "Descritpion", IsUser = false }); + _dbContext.Users.Add(new UserEntity + { Id = 42, Username = "Username", Email = "email@example.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + Assert.Throws(() => + { + _notepadDataService.GetNotepadFromUserAndInquiryId(42, 1); + }); + } + + [Fact] + public void SetNotepad_Success() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Descritpion", IsUser = false }); + _dbContext.Users.Add(new UserEntity + { Id = 42, Username = "Username", Email = "email@example.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + var notepad = new NotepadEntity { UserId = 42, InquiryId = 42, Notes = "Some notes again" }; + _notepadDataService.SetNotepadFromUserAndInquiryId(42,42, "Some notes again"); + _dbContext.SaveChanges(); + + var result = _notepadDataService.GetNotepadFromUserAndInquiryId(42, 42); + + Assert.Equal(notepad.UserId,result.UserId); + Assert.Equal(notepad.InquiryId,result.InquiryId); + Assert.Equal(notepad.Notes,result.Notes); + } + + [Fact] + public void SetNotepad_Fail_UserNotFound() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Descritpion", IsUser = false }); + _dbContext.Users.Add(new UserEntity + { Id = 42, Username = "Username", Email = "email@example.com", Password = "password", IsAdmin = true }); + var notepad = new NotepadEntity { UserId = 42, InquiryId = 42, Notes = "These are some notes" }; + _dbContext.SaveChanges(); + Assert.Throws(() => + { + _notepadDataService.SetNotepadFromUserAndInquiryId(10, 42, "Some notes"); + }); + } + + [Fact] + public void SetNotepad_Fail_InquiryNotFound() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Descritpion", IsUser = false }); + _dbContext.Users.Add(new UserEntity + { Id = 42, Username = "Username", Email = "email@example.com", Password = "password", IsAdmin = true }); + var notepad = new NotepadEntity { UserId = 42, InquiryId = 42, Notes = "These are some notes" }; + _dbContext.SaveChanges(); + Assert.Throws(() => + { + _notepadDataService.SetNotepadFromUserAndInquiryId(42, 10, "Some notes"); + }); + } + + [Fact] + public void SetNotepad_Fail_NotepadAlreadyExists() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Descritpion", IsUser = false }); + _dbContext.Users.Add(new UserEntity + { Id = 42, Username = "Username", Email = "email@example.com", Password = "password", IsAdmin = true }); + var notepad = new NotepadEntity { UserId = 42, InquiryId = 42, Notes = "Some notes" }; + _dbContext.Notepads.Add(notepad); + _dbContext.SaveChanges(); + Assert.Throws(() => + { + _notepadDataService.SetNotepadFromUserAndInquiryId(42, 42, "Some notes"); + }); + } + + [Fact] + public void UpdateNotepad_Success() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Descritpion", IsUser = false }); + _dbContext.Users.Add(new UserEntity + { Id = 42, Username = "Username", Email = "email@example.com", Password = "password", IsAdmin = true }); + var notepad = new NotepadEntity { UserId = 42, InquiryId = 42, Notes = "Some notes" }; + _dbContext.Notepads.Add(notepad); + _dbContext.SaveChanges(); + _notepadDataService.UpdateNotepadFromUserAndInquiryId(42,42, "New Notes"); + _dbContext.SaveChanges(); + Assert.Equal("New Notes", _notepadDataService.GetNotepadFromUserAndInquiryId(42,42).Notes); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Service/TestSolutionDataService.cs b/API_SQLuedo/TestEF/Service/TestSolutionDataService.cs new file mode 100644 index 0000000..be0b73d --- /dev/null +++ b/API_SQLuedo/TestEF/Service/TestSolutionDataService.cs @@ -0,0 +1,75 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; + +namespace TestEF.Service; + +public class TestSolutionDataService +{ + private readonly UserDbContext _dbContext; + private readonly SolutionDataService _solutionDataService; + + public TestSolutionDataService() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new UserDbContext(options); + _solutionDataService = new SolutionDataService(_dbContext); + } + + [Fact] + public void GetSolution_Success() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Description", IsUser = false }); + var solution = new SolutionEntity + { + MurdererFirstName = "Maxime", + MurdererLastName = "Sapountzis", + MurderPlace = "La cuisine", + MurderWeapon = "Le couteau", + Explaination = "Parce que", + OwnerId = 42, + }; + _dbContext.Solutions.Add(solution); + _dbContext.SaveChanges(); + + var result = _solutionDataService.GetSolutionByInquiryId(42); + + Assert.Equal(solution.MurdererFirstName,result.MurdererFirstName); + Assert.Equal(solution.MurdererLastName,result.MurdererLastName); + Assert.Equal(solution.MurderPlace,result.MurderPlace); + Assert.Equal(solution.MurderWeapon,result.MurderWeapon); + Assert.Equal(solution.Explaination,result.Explaination); + Assert.Equal(solution.OwnerId,result.OwnerId); + } + + [Fact] + public void GetSolution_NotFound() + { + _dbContext.Inquiries.Add(new InquiryEntity + { Id = 42, Title = "Titre", Description = "Description", IsUser = false }); + var solution = new SolutionEntity + { + MurdererFirstName = "Maxime", + MurdererLastName = "Sapountzis", + MurderPlace = "La cuisine", + MurderWeapon = "Le couteau", + Explaination = "Parce que", + OwnerId = 42, + }; + _dbContext.Solutions.Add(solution); + _dbContext.SaveChanges(); + + Assert.Throws(() => + { + _solutionDataService.GetSolutionByInquiryId(10); + }); + } +} \ No newline at end of file From 6c7970fda70b7cb9961055782ad89ba24e34fa7e Mon Sep 17 00:00:00 2001 From: masapountz Date: Mon, 1 Apr 2024 17:58:00 +0200 Subject: [PATCH 22/30] =?UTF-8?q?D=C3=A9but=20Tests=20Unitaires=20sur=20le?= =?UTF-8?q?=20QueryService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../API/Service/QueryDataServiceApi.cs | 4 +- .../ServiceAPI/UnitTestQueryDataServiceApi.cs | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 API_SQLuedo/TestAPI/ServiceAPI/UnitTestQueryDataServiceApi.cs diff --git a/API_SQLuedo/API/Service/QueryDataServiceApi.cs b/API_SQLuedo/API/Service/QueryDataServiceApi.cs index 284b79c..636f235 100644 --- a/API_SQLuedo/API/Service/QueryDataServiceApi.cs +++ b/API_SQLuedo/API/Service/QueryDataServiceApi.cs @@ -10,8 +10,8 @@ using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace API.Service; -public class QueryDataServiceApi : IQueryService -{ +public class QueryDataServiceApi : IQueryService{ + public QueryDto ExecuteQuery(string query, string database) { string connectionString = diff --git a/API_SQLuedo/TestAPI/ServiceAPI/UnitTestQueryDataServiceApi.cs b/API_SQLuedo/TestAPI/ServiceAPI/UnitTestQueryDataServiceApi.cs new file mode 100644 index 0000000..1f82a44 --- /dev/null +++ b/API_SQLuedo/TestAPI/ServiceAPI/UnitTestQueryDataServiceApi.cs @@ -0,0 +1,50 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Model.OrderCriteria; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using API.Service; +using Model; +using Newtonsoft.Json; +using StubbedContextLib; + +namespace TestAPI.ServiceAPI +{ + public class UnitTestQueryDataServiceApi + { + private readonly StubbedContext _dbContext; + private readonly QueryDataServiceApi _queryService; + + public UnitTestQueryDataServiceApi() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new StubbedContext(options); + _queryService = new QueryDataServiceApi(); + + } + + [Fact] + public void ExecuteQuery_Success_When_Select_Users() + { + + var jsonResult = _queryService.ExecuteQuery("Select * from \"User\";", "SQLuedo"); + var result = JsonConvert.DeserializeObject(jsonResult.Result); + + Assert.NotNull(result); + Assert.Equal(11, result.Count()); + + } + + } +} From fd18a3e0995473c5ba111cda30d51316245bfc04 Mon Sep 17 00:00:00 2001 From: masapountz Date: Mon, 1 Apr 2024 19:15:00 +0200 Subject: [PATCH 23/30] =?UTF-8?q?D=C3=A9but=20test=20Controller=20et=20sup?= =?UTF-8?q?pression=20des=20test=20service=20car=20impossible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/TestAPI/QueryUnitTest.cs | 92 +++++++++++++++++++ .../ServiceAPI/UnitTestQueryDataServiceApi.cs | 50 ---------- 2 files changed, 92 insertions(+), 50 deletions(-) create mode 100644 API_SQLuedo/TestAPI/QueryUnitTest.cs delete mode 100644 API_SQLuedo/TestAPI/ServiceAPI/UnitTestQueryDataServiceApi.cs diff --git a/API_SQLuedo/TestAPI/QueryUnitTest.cs b/API_SQLuedo/TestAPI/QueryUnitTest.cs new file mode 100644 index 0000000..4c149e6 --- /dev/null +++ b/API_SQLuedo/TestAPI/QueryUnitTest.cs @@ -0,0 +1,92 @@ +using API.Controllers; +using Dto; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging.Abstractions; +using Moq; +using Shared; +using TestAPI.Extensions; + +namespace TestAPI; + +public class QueryUnitTest +{ + private readonly Mock> _queryService; + + public QueryUnitTest() + { + _queryService = new Mock>(); + } + + [Fact] + public void Select_Users_Success() + { + var userList = GetUsersData(); + _queryService.Setup(x => x.ExecuteQuery("Select * from \"User\";","SQLuedo")) + .Returns(new QueryDto{Result = userList.ToString()}); + var queryController = new QueryController(new NullLogger(), _queryService.Object); + + var queryResult = queryController.ExecuteQuery("Select * from \"User\";", "SQLuedo"); + + if (queryResult is OkObjectResult okObjectResult) + { + + Assert.NotNull(okObjectResult); + } + } + + [Fact] + public void Select_Users_Failed_Cause_Database_Doesnt_Exists() + { + var userList = GetUsersData(); + _queryService.Setup(x => x.ExecuteQuery("Select * from \"User\";", "SQLuedo")) + .Returns(new QueryDto { Result = userList.ToString() }); + var queryController = new QueryController(new NullLogger(), _queryService.Object); + + var queryResult = queryController.ExecuteQuery("Select * from \"User\";", "LABASEDEDONNEES"); + + if (queryResult is StatusCodeResult statusCodeResult && statusCodeResult.StatusCode == 204) + + { + Assert.IsNotType(queryResult); + } + } + + + private List GetUsersData() + { + List usersData = new List(4) + { + new( + 0, + "Useruser", + "motdepasse", + "adressemail@gmail.com", + true + ), + new + ( + 1, + "Leuser", + "motdepasse", + "deuxadresse@gmail.com", + false + ), + new + ( + 2, + "gygyggyg", + "ennodlavehc", + "thirdadress@gmail.com", + false + ), + new + ( + "ferferf", + "h_nh_78", + "fourthadress@gmail.com", + false + ), + }; + return usersData; + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestAPI/ServiceAPI/UnitTestQueryDataServiceApi.cs b/API_SQLuedo/TestAPI/ServiceAPI/UnitTestQueryDataServiceApi.cs deleted file mode 100644 index 1f82a44..0000000 --- a/API_SQLuedo/TestAPI/ServiceAPI/UnitTestQueryDataServiceApi.cs +++ /dev/null @@ -1,50 +0,0 @@ -using DbContextLib; -using DbDataManager.Service; -using Entities; -using Microsoft.Data.Sqlite; -using Microsoft.EntityFrameworkCore; -using Model.OrderCriteria; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using API.Service; -using Model; -using Newtonsoft.Json; -using StubbedContextLib; - -namespace TestAPI.ServiceAPI -{ - public class UnitTestQueryDataServiceApi - { - private readonly StubbedContext _dbContext; - private readonly QueryDataServiceApi _queryService; - - public UnitTestQueryDataServiceApi() - { - var connection = new SqliteConnection("DataSource=:memory:"); - connection.Open(); - var options = new DbContextOptionsBuilder() - .UseSqlite(connection) - .Options; - - _dbContext = new StubbedContext(options); - _queryService = new QueryDataServiceApi(); - - } - - [Fact] - public void ExecuteQuery_Success_When_Select_Users() - { - - var jsonResult = _queryService.ExecuteQuery("Select * from \"User\";", "SQLuedo"); - var result = JsonConvert.DeserializeObject(jsonResult.Result); - - Assert.NotNull(result); - Assert.Equal(11, result.Count()); - - } - - } -} From 8349f43f8a3d60930e9c8771e7c33a9a8e1e81ef Mon Sep 17 00:00:00 2001 From: masapountz Date: Mon, 1 Apr 2024 19:24:22 +0200 Subject: [PATCH 24/30] Fin des TU sur le QueryController --- API_SQLuedo/TestAPI/QueryUnitTest.cs | 114 +++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/API_SQLuedo/TestAPI/QueryUnitTest.cs b/API_SQLuedo/TestAPI/QueryUnitTest.cs index 4c149e6..94f4b03 100644 --- a/API_SQLuedo/TestAPI/QueryUnitTest.cs +++ b/API_SQLuedo/TestAPI/QueryUnitTest.cs @@ -1,4 +1,5 @@ using API.Controllers; +using Castle.Components.DictionaryAdapter.Xml; using Dto; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging.Abstractions; @@ -51,6 +52,92 @@ public class QueryUnitTest } } + [Fact] + public void Get_Tables_Success() + { + var tablesList = GetTables(); + _queryService.Setup(x => x.GetTables("SQLuedo")) + .Returns(new QueryDto { Result = tablesList.ToString() }); + var queryController = new QueryController(new NullLogger(), _queryService.Object); + + var queryResult = queryController.GetTables("SQLuedo"); + + if (queryResult is OkObjectResult okObjectResult) + { + + Assert.NotNull(okObjectResult); + } + } + + [Fact] + public void Get_Tables_Failed_Cause_Database_Doesnt_Exist() + { + var tablesList = GetTables(); + _queryService.Setup(x => x.GetTables("SQLuedo")) + .Returns(new QueryDto { Result = tablesList.ToString() }); + var queryController = new QueryController(new NullLogger(), _queryService.Object); + + var queryResult = queryController.GetTables("LABSEEEEEEEEEEEEEEEEEEEE"); + + if (queryResult is OkObjectResult okObjectResult) + { + + Assert.NotNull(okObjectResult); + } + } + + + [Fact] + public void Get_Columns_Success() + { + var tablesList = GetColumns(); + _queryService.Setup(x => x.GetColumns("SQLuedo","User")) + .Returns(new QueryDto { Result = tablesList.ToString() }); + var queryController = new QueryController(new NullLogger(), _queryService.Object); + + var queryResult = queryController.GetColumns("SQLuedo","User"); + + if (queryResult is OkObjectResult okObjectResult) + { + + Assert.NotNull(okObjectResult); + } + } + + [Fact] + public void Get_Columns_Failed_Cause_Database_Doesnt_Exist() + { + var tablesList = GetColumns(); + _queryService.Setup(x => x.GetColumns("SQLuedo", "User")) + .Returns(new QueryDto { Result = tablesList.ToString() }); + var queryController = new QueryController(new NullLogger(), _queryService.Object); + + var queryResult = queryController.GetColumns("UDHUE", "User"); + + if (queryResult is OkObjectResult okObjectResult) + { + + Assert.NotNull(okObjectResult); + } + } + + [Fact] + public void Get_Columns_Failed_Cause_Table_Doesnt_Exist() + { + var tablesList = GetColumns(); + _queryService.Setup(x => x.GetColumns("SQLuedo", "User")) + .Returns(new QueryDto { Result = tablesList.ToString() }); + var queryController = new QueryController(new NullLogger(), _queryService.Object); + + var queryResult = queryController.GetColumns("SQLuedo", "GEGEIU"); + + if (queryResult is OkObjectResult okObjectResult) + { + + Assert.NotNull(okObjectResult); + } + } + private List GetUsersData() { @@ -89,4 +176,31 @@ public class QueryUnitTest }; return usersData; } + + + private List GetColumns() + { + List columns = new List(4) + { + "Id", + "Name", + "Password", + "IsAdmin" + }; + return columns; + } + + + + private List GetTables() + { + List columns = new List(4) + { + "User", + "Solution", + "Inquiry", + "Success" + }; + return columns; + } } \ No newline at end of file From a10242ce28ed8a898a0d4a014e3f162936f86c82 Mon Sep 17 00:00:00 2001 From: masapountz Date: Mon, 1 Apr 2024 20:23:45 +0200 Subject: [PATCH 25/30] Test pas sur la c'est du docker (ChatGPT) --- .../Service/UnitTestQueryDataServiceAPI.cs | 107 ++++++++++++++++++ API_SQLuedo/TestAPI/TestAPI.csproj | 1 + 2 files changed, 108 insertions(+) create mode 100644 API_SQLuedo/TestAPI/Service/UnitTestQueryDataServiceAPI.cs diff --git a/API_SQLuedo/TestAPI/Service/UnitTestQueryDataServiceAPI.cs b/API_SQLuedo/TestAPI/Service/UnitTestQueryDataServiceAPI.cs new file mode 100644 index 0000000..80be72c --- /dev/null +++ b/API_SQLuedo/TestAPI/Service/UnitTestQueryDataServiceAPI.cs @@ -0,0 +1,107 @@ +using Xunit; +using Npgsql; +using Docker.DotNet; +using Docker.DotNet.Models; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using API.Service; + +public class QueryDataServiceApiTests : IAsyncLifetime +{ + private string _connectionString; + private string _containerId; + private const string DatabaseName = "SQLuedo"; + + public async Task InitializeAsync() + { + // Start a PostgreSQL container + var dockerClient = new DockerClientConfiguration(new Uri("npipe://./pipe/docker_engine")).CreateClient(); + var response = await dockerClient.Containers.CreateContainerAsync(new CreateContainerParameters + { + Image = "postgres:alpine3.19", + HostConfig = new HostConfig + { + PortBindings = new Dictionary> + { + { "5432", new List { new PortBinding { HostPort = "5432" } } } + } + }, + Env = new List { "POSTGRES_PASSWORD=root" } + }); + + _containerId = response.ID; + + await dockerClient.Containers.StartContainerAsync(_containerId, new ContainerStartParameters()); + await Task.Delay(5000); + + _connectionString = $"Host=localhost;Port=5432;Username=postgres;Password=root;Database={DatabaseName}"; + using (var connection = new NpgsqlConnection(_connectionString)) + { + await connection.OpenAsync(); + using (var command = new NpgsqlCommand($"SELECT 1 FROM pg_database WHERE datname = '{DatabaseName}'", connection)) + { + var result = await command.ExecuteScalarAsync(); + if (result == null) + { + // Create the database only if it does not exist + using (var createCommand = new NpgsqlCommand($"CREATE DATABASE {DatabaseName}", connection)) + { + await createCommand.ExecuteNonQueryAsync(); + } + } + } + } + } + + + public async Task DisposeAsync() + { + var dockerClient = new DockerClientConfiguration(new Uri("npipe://./pipe/docker_engine")).CreateClient(); + await dockerClient.Containers.StopContainerAsync(_containerId, new ContainerStopParameters()); + await dockerClient.Containers.RemoveContainerAsync(_containerId, new ContainerRemoveParameters()); + } + + [Fact] + public void ExecuteQuery_ReturnsErrorMessage_WhenDatabaseNameIsEmpty() + { + // Arrange + var service = new QueryDataServiceApi(); + + // Act + var result = service.ExecuteQuery("SELECT * FROM table", ""); + + // Assert + Assert.Equal("Le nom de la base de données est requis.", result.Result); + } + + // Add more tests as needed + + [Fact] + public void GetTables_ReturnsTables_WhenDatabaseNameIsProvided() + { + // Arrange + var service = new QueryDataServiceApi(); + + // Act + var result = service.GetTables(DatabaseName); + + // Assert + Assert.NotNull(result.Result); + // Add more assertions as needed + } + + [Fact] + public void GetColumns_ReturnsColumns_WhenDatabaseNameAndTableNameAreProvided() + { + // Arrange + var service = new QueryDataServiceApi(); + + // Act + var result = service.GetColumns(DatabaseName, "table_name"); + + // Assert + Assert.NotNull(result.Result); + // Add more assertions as needed + } +} diff --git a/API_SQLuedo/TestAPI/TestAPI.csproj b/API_SQLuedo/TestAPI/TestAPI.csproj index a6cc9e9..10a3887 100644 --- a/API_SQLuedo/TestAPI/TestAPI.csproj +++ b/API_SQLuedo/TestAPI/TestAPI.csproj @@ -11,6 +11,7 @@ + all From bfa15606f772527608a60ecbc50a382c12532bda Mon Sep 17 00:00:00 2001 From: masapountz Date: Mon, 1 Apr 2024 20:25:55 +0200 Subject: [PATCH 26/30] =?UTF-8?q?Suppression=20du=20test=20c'=C3=A9tait=20?= =?UTF-8?q?nul?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/UnitTestQueryDataServiceAPI.cs | 107 ------------------ 1 file changed, 107 deletions(-) delete mode 100644 API_SQLuedo/TestAPI/Service/UnitTestQueryDataServiceAPI.cs diff --git a/API_SQLuedo/TestAPI/Service/UnitTestQueryDataServiceAPI.cs b/API_SQLuedo/TestAPI/Service/UnitTestQueryDataServiceAPI.cs deleted file mode 100644 index 80be72c..0000000 --- a/API_SQLuedo/TestAPI/Service/UnitTestQueryDataServiceAPI.cs +++ /dev/null @@ -1,107 +0,0 @@ -using Xunit; -using Npgsql; -using Docker.DotNet; -using Docker.DotNet.Models; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using API.Service; - -public class QueryDataServiceApiTests : IAsyncLifetime -{ - private string _connectionString; - private string _containerId; - private const string DatabaseName = "SQLuedo"; - - public async Task InitializeAsync() - { - // Start a PostgreSQL container - var dockerClient = new DockerClientConfiguration(new Uri("npipe://./pipe/docker_engine")).CreateClient(); - var response = await dockerClient.Containers.CreateContainerAsync(new CreateContainerParameters - { - Image = "postgres:alpine3.19", - HostConfig = new HostConfig - { - PortBindings = new Dictionary> - { - { "5432", new List { new PortBinding { HostPort = "5432" } } } - } - }, - Env = new List { "POSTGRES_PASSWORD=root" } - }); - - _containerId = response.ID; - - await dockerClient.Containers.StartContainerAsync(_containerId, new ContainerStartParameters()); - await Task.Delay(5000); - - _connectionString = $"Host=localhost;Port=5432;Username=postgres;Password=root;Database={DatabaseName}"; - using (var connection = new NpgsqlConnection(_connectionString)) - { - await connection.OpenAsync(); - using (var command = new NpgsqlCommand($"SELECT 1 FROM pg_database WHERE datname = '{DatabaseName}'", connection)) - { - var result = await command.ExecuteScalarAsync(); - if (result == null) - { - // Create the database only if it does not exist - using (var createCommand = new NpgsqlCommand($"CREATE DATABASE {DatabaseName}", connection)) - { - await createCommand.ExecuteNonQueryAsync(); - } - } - } - } - } - - - public async Task DisposeAsync() - { - var dockerClient = new DockerClientConfiguration(new Uri("npipe://./pipe/docker_engine")).CreateClient(); - await dockerClient.Containers.StopContainerAsync(_containerId, new ContainerStopParameters()); - await dockerClient.Containers.RemoveContainerAsync(_containerId, new ContainerRemoveParameters()); - } - - [Fact] - public void ExecuteQuery_ReturnsErrorMessage_WhenDatabaseNameIsEmpty() - { - // Arrange - var service = new QueryDataServiceApi(); - - // Act - var result = service.ExecuteQuery("SELECT * FROM table", ""); - - // Assert - Assert.Equal("Le nom de la base de données est requis.", result.Result); - } - - // Add more tests as needed - - [Fact] - public void GetTables_ReturnsTables_WhenDatabaseNameIsProvided() - { - // Arrange - var service = new QueryDataServiceApi(); - - // Act - var result = service.GetTables(DatabaseName); - - // Assert - Assert.NotNull(result.Result); - // Add more assertions as needed - } - - [Fact] - public void GetColumns_ReturnsColumns_WhenDatabaseNameAndTableNameAreProvided() - { - // Arrange - var service = new QueryDataServiceApi(); - - // Act - var result = service.GetColumns(DatabaseName, "table_name"); - - // Assert - Assert.NotNull(result.Result); - // Add more assertions as needed - } -} From b19801a21c72917e0937d5b4b49df51d263a6ead Mon Sep 17 00:00:00 2001 From: masapountz Date: Tue, 2 Apr 2024 01:02:23 +0200 Subject: [PATCH 27/30] =?UTF-8?q?Ajout=20de=20quelques=20test=20pour=20le?= =?UTF-8?q?=20coverage=20=C3=A0=20cause=20du=20QueryController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/Shared/Mapper/LessonMapper.cs | 4 --- API_SQLuedo/TestAPI/BlackListUnitTest.cs | 19 ++++++++++++- .../TestEF/Mapper/InquiryMapperUnitTest.cs | 4 +-- .../Service/TestBlackListDataService.cs | 27 ++++++++++++++++++- .../TestEF/Service/TestInquiryDataService.cs | 26 ++++++++++++++++++ 5 files changed, 72 insertions(+), 8 deletions(-) diff --git a/API_SQLuedo/Shared/Mapper/LessonMapper.cs b/API_SQLuedo/Shared/Mapper/LessonMapper.cs index 157338e..bd69152 100644 --- a/API_SQLuedo/Shared/Mapper/LessonMapper.cs +++ b/API_SQLuedo/Shared/Mapper/LessonMapper.cs @@ -16,10 +16,6 @@ public static class LessonMapper return new LessonDto(model.Id, model.Title, model.LastPublisher, model.LastEdit, model.Content.Select(c => c.FromEntityToDto()).ToList()); } - public static LessonDto FromEntityToDtoPost(this LessonEntity model) - { - return new LessonDto(model.Id, model.Title, model.LastPublisher, model.LastEdit); - } public static LessonEntity FromModelToEntity(this Lesson model) { diff --git a/API_SQLuedo/TestAPI/BlackListUnitTest.cs b/API_SQLuedo/TestAPI/BlackListUnitTest.cs index aea91ad..a40f3f9 100644 --- a/API_SQLuedo/TestAPI/BlackListUnitTest.cs +++ b/API_SQLuedo/TestAPI/BlackListUnitTest.cs @@ -153,7 +153,24 @@ public class BlackListUnitTest Assert.True(GetBlackList().SequenceEqual(valeur as IEnumerable, new BlackListDtoEqualityComparer())); } } - + + [Fact] + public void Get_0_BannedUsers_OrderedByNone() + { + _blackListService.Setup(x => x.GetBannedUsers(1, 10, BlackListOdrerCriteria.None)) + .Returns(new List()); + var blackListController = new BlackListController(new NullLogger(), _blackListService.Object); + + var result = blackListController.GetBannedUsers(1, 10, BlackListOdrerCriteria.None); + Assert.Equal(typeof(StatusCodeResult), result.GetType()); + if (result is NotFoundObjectResult notFoundObjectResult) + { + var valeur = notFoundObjectResult.Value; + + Assert.NotNull(valeur); + } + } + [Fact] public void GetNbBannedUsers() { diff --git a/API_SQLuedo/TestEF/Mapper/InquiryMapperUnitTest.cs b/API_SQLuedo/TestEF/Mapper/InquiryMapperUnitTest.cs index aa69fd7..b7faad8 100644 --- a/API_SQLuedo/TestEF/Mapper/InquiryMapperUnitTest.cs +++ b/API_SQLuedo/TestEF/Mapper/InquiryMapperUnitTest.cs @@ -78,10 +78,10 @@ namespace TestEF.Mapper public void TestDtoToModel() { InquiryDto inquiry = new InquiryDto(_id, _title, _description, _isUser); - var inquiryMod = inquiry.FromDtoToEntity(); + var inquiryMod = inquiry.FromDtoToModel(); Assert.NotNull(inquiryMod); - Assert.IsType(inquiryMod); + Assert.IsType(inquiryMod); Assert.Equal(1, inquiryMod.Id); Assert.Equal(_title, inquiryMod.Title); Assert.Equal(_description, inquiryMod.Description); diff --git a/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs index b1a7f0c..6f14eb9 100644 --- a/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs @@ -109,7 +109,7 @@ public class TestBlackListDataService } [Fact] - public void GetBannedUser_Success_Positive_Value() + public void GetBannedUser_Success_Positive_Value_Ordered_None() { _dbContext.BlackLists.Add(new BlackListEntity { Email = "email@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); _dbContext.BlackLists.Add(new BlackListEntity { Email = "eemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); @@ -119,6 +119,31 @@ public class TestBlackListDataService Assert.Equal(3, banResult.Count()); } + [Fact] + public void GetBannedUser_Success_Positive_Value_Ordered_Email() + { + _dbContext.BlackLists.Add(new BlackListEntity { Email = "email@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eeemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.SaveChanges(); + var banResult = _blackListDataService.GetBannedUsers(1, 3, BlackListOdrerCriteria.ByEmail); + Assert.Equal(3, banResult.Count()); + } + + + [Fact] + public void GetBannedUser_Success_Positive_Value_Ordered_ExpirationDate() + { + _dbContext.BlackLists.Add(new BlackListEntity { Email = "email@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eeemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.SaveChanges(); + var banResult = _blackListDataService.GetBannedUsers(1, 3, BlackListOdrerCriteria.ByExpirationDate); + Assert.Equal(3, banResult.Count()); + } + + + [Fact] public void GetBannedUser_Success_Negative_Value() { diff --git a/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs index bb9e322..78ce84f 100644 --- a/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs @@ -89,6 +89,32 @@ public class TestInquiryDataService Assert.Equal(2, result.Count()); } + [Fact] + public void GetInquiries_OrderedById_ReturnsCorrectNumberOfInquiries() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.Inquiries.Add(new InquiryEntity { Id = 2, Title = "Test2", Description = "Desc2", IsUser = false }); + _dbContext.Inquiries.Add(new InquiryEntity { Id = 3, Title = "Test3", Description = "Desc3", IsUser = true }); + _dbContext.SaveChanges(); + + var result = _inquiryDataService.GetInquiries(1, 2, InquiryOrderCriteria.ById); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetInquiries_OrderedDefault_ReturnsCorrectNumberOfInquiries() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.Inquiries.Add(new InquiryEntity { Id = 2, Title = "Test2", Description = "Desc2", IsUser = false }); + _dbContext.Inquiries.Add(new InquiryEntity { Id = 3, Title = "Test3", Description = "Desc3", IsUser = true }); + _dbContext.SaveChanges(); + + var result = _inquiryDataService.GetInquiries(1, 2, default); + + Assert.Equal(2, result.Count()); + } + [Fact] public void GetInquiryById_ReturnsCorrectInquiry() { From f025be2bd080e7a0f4d6ecb8fe2c545f40f4efa8 Mon Sep 17 00:00:00 2001 From: masapountz Date: Tue, 2 Apr 2024 01:22:47 +0200 Subject: [PATCH 28/30] Ajout de tests et tentative de Mock une ArgumentException --- API_SQLuedo/TestAPI/LessonUnitTest.cs | 17 +++++++++++++++++ .../TestEF/Service/TestBlackListDataService.cs | 11 +++++++++++ .../TestEF/Service/TestInquiryDataService.cs | 13 +++++++++++++ 3 files changed, 41 insertions(+) diff --git a/API_SQLuedo/TestAPI/LessonUnitTest.cs b/API_SQLuedo/TestAPI/LessonUnitTest.cs index 186dc09..28e286b 100644 --- a/API_SQLuedo/TestAPI/LessonUnitTest.cs +++ b/API_SQLuedo/TestAPI/LessonUnitTest.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Moq; using Shared; using TestAPI.Extensions; +using Xunit.Sdk; namespace TestAPI; @@ -101,6 +102,22 @@ public class LessonUnitTest } } + [Fact] + public void GetLessonIdFail_Argument_Exception() + { + _lessonService.Setup(x => x.GetLessonById(10000)) + .Throws(); + var lessonsController = new LessonsController(_lessonService.Object, new NullLogger()); + + var result = lessonsController.GetLessonById(10000); + + if (result is NotFoundObjectResult nfObjectResult) + { + Assert.NotNull(nfObjectResult); + } + } + + [Fact] public void GetLessonTitleSuccess() { diff --git a/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs index 6f14eb9..08a8329 100644 --- a/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs @@ -142,6 +142,17 @@ public class TestBlackListDataService Assert.Equal(3, banResult.Count()); } + [Fact] + public void GetBannedUser_Success_Positive_Value_Ordered_Default() + { + _dbContext.BlackLists.Add(new BlackListEntity { Email = "email@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.BlackLists.Add(new BlackListEntity { Email = "eeemail@email.com", ExpirationDate = new DateOnly(2024, 03, 30) }); + _dbContext.SaveChanges(); + var banResult = _blackListDataService.GetBannedUsers(1, 3,default); + Assert.Equal(3, banResult.Count()); + } + [Fact] diff --git a/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs index 78ce84f..2a64386 100644 --- a/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs @@ -102,6 +102,19 @@ public class TestInquiryDataService Assert.Equal(2, result.Count()); } + [Fact] + public void GetInquiries_OrderedByDefault_ReturnsCorrectNumberOfInquiries() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.Inquiries.Add(new InquiryEntity { Id = 2, Title = "Test2", Description = "Desc2", IsUser = false }); + _dbContext.Inquiries.Add(new InquiryEntity { Id = 3, Title = "Test3", Description = "Desc3", IsUser = true }); + _dbContext.SaveChanges(); + + var result = _inquiryDataService.GetInquiries(1, 2, default); + + Assert.Equal(2, result.Count()); + } + [Fact] public void GetInquiries_OrderedDefault_ReturnsCorrectNumberOfInquiries() { From 8b1f2280bc18e2893697b8609c600ad6cce1a175 Mon Sep 17 00:00:00 2001 From: masapountz Date: Tue, 2 Apr 2024 01:43:25 +0200 Subject: [PATCH 29/30] 80 %? --- API_SQLuedo/TestAPI/LessonUnitTest.cs | 30 +++++++++++ API_SQLuedo/TestAPI/SuccessesUnitTest.cs | 66 ++++++++++++++++++++++++ API_SQLuedo/TestAPI/UserUnitTest.cs | 62 +++++++++++++++++++++- 3 files changed, 157 insertions(+), 1 deletion(-) diff --git a/API_SQLuedo/TestAPI/LessonUnitTest.cs b/API_SQLuedo/TestAPI/LessonUnitTest.cs index 28e286b..152b868 100644 --- a/API_SQLuedo/TestAPI/LessonUnitTest.cs +++ b/API_SQLuedo/TestAPI/LessonUnitTest.cs @@ -162,6 +162,21 @@ public class LessonUnitTest } } + [Fact] + public void GetLessonTitleFail_Argument_Exception() + { + _lessonService.Setup(x => x.GetLessonByTitle("title")) + .Throws(); + var lessonsController = new LessonsController(_lessonService.Object, new NullLogger()); + + var result = lessonsController.GetLessonByTitle("title"); + + if (result is NotFoundObjectResult nfObjectResult) + { + Assert.NotNull(nfObjectResult); + } + } + [Fact] public void DeleteLessonSuccess() { @@ -230,6 +245,21 @@ public class LessonUnitTest } } + [Fact] + public void CreateLessonFail_Argument_Exception() + { + _lessonService.Setup(x => x.CreateLesson(35672653, "duehduheudheu nouveau titre", "Le deudhe éditeur", new DateOnly(2024, 03, 16))) + .Throws(); + var lessonsController = new LessonsController(_lessonService.Object, new NullLogger()); + + var result = lessonsController.CreateLesson(new LessonDto(35672653, "duehduheudheu nouveau titre", "Le deudhe éditeur", new DateOnly(2024, 03, 16))); + + if (result is NotFoundObjectResult nfObjectResult) + { + Assert.NotNull(nfObjectResult); + } + } + [Fact] public void UpdateLessonSuccess() { diff --git a/API_SQLuedo/TestAPI/SuccessesUnitTest.cs b/API_SQLuedo/TestAPI/SuccessesUnitTest.cs index f8dc28c..153469b 100644 --- a/API_SQLuedo/TestAPI/SuccessesUnitTest.cs +++ b/API_SQLuedo/TestAPI/SuccessesUnitTest.cs @@ -145,6 +145,23 @@ public class SuccessesUnitTest } } + [Fact] + public void GetSuccessInquiryIdFail_Argument_Exception() + { + _successService.Setup(x => x.GetSuccessesByInquiryId(1000)) + .Throws(); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var sucessesResult = successesController.GetSuccessByInquiryId(1000); + if (sucessesResult is NotFoundObjectResult nfObjectResult) + { + var valeur = nfObjectResult.Value; + + Assert.NotNull(valeur); + } + } + [Fact] public void GetSuccessUserIdSuccess() { @@ -217,6 +234,23 @@ public class SuccessesUnitTest } } + [Fact] + public void GetSuccessUserIdFail_Argument_Exception() + { + _successService.Setup(x => x.GetSuccessesByUserId(1000)) + .Throws(); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var sucessesResult = successesController.GetSuccessByUserId(1000); + if (sucessesResult is NotFoundObjectResult nfObjectResult) + { + var valeur = nfObjectResult.Value; + + Assert.NotNull(valeur); + } + } + [Fact] public void DeleteSuccessSuccess() { @@ -318,6 +352,22 @@ public class SuccessesUnitTest } } + [Fact] + public void CreateSuccessFail_Exception() + { + _successService.Setup(x => x.CreateSuccess(89889, 82837, true)) + .Throws(); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var successesResult = successesController.CreateSuccess(new SuccessDto(89889, 82837, true)); + + if (successesResult is NotFoundObjectResult notFoundObjectResult) + { + Assert.NotNull(notFoundObjectResult); + } + } + [Fact] public void UpdateSuccessSuccess() { @@ -386,6 +436,22 @@ public class SuccessesUnitTest } } + [Fact] + public void UpdateSuccessFail_Throw_Exception() + { + _successService.Setup(x => x.UpdateSuccess(108871, 117683, new SuccessDto(1, 2, true))) + .Throws(); + var successesController = + new SuccessesController(_successService.Object, new NullLogger()); + + var successesResult = successesController.UpdateSuccess(108871, 117683, new SuccessDto(1, 2, true)); + + if (successesResult is NotFoundObjectResult notFoundObjectResult) + { + Assert.NotNull(notFoundObjectResult); + } + } + private List GetSuccessesData() diff --git a/API_SQLuedo/TestAPI/UserUnitTest.cs b/API_SQLuedo/TestAPI/UserUnitTest.cs index 6109618..848e264 100644 --- a/API_SQLuedo/TestAPI/UserUnitTest.cs +++ b/API_SQLuedo/TestAPI/UserUnitTest.cs @@ -171,7 +171,7 @@ public class UserUnitTest [Fact] - public void GetUserIdFail__Argument_Exception_Negative_Id() + public void GetUserIdFail_Negative_Id() { var userList = GetUsersData(); _userService.Setup(x => x.GetUserById(1)) @@ -189,6 +189,22 @@ public class UserUnitTest } } + [Fact] + public void GetUserIdFail_Argument_Exception() + { + _userService.Setup(x => x.GetUserById(10000)) + .Throws(); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.GetUserById(10000); + if (userResult is NotFoundObjectResult nfObjectResult) + { + var valeur = nfObjectResult.Value; + + Assert.NotNull(valeur); + } + } + [Fact] public void GetUserUsernameSuccess() { @@ -212,6 +228,22 @@ public class UserUnitTest } } + [Fact] + public void GetUserUsernameFail_Argument_Exception() + { + _userService.Setup(x => x.GetUserByUsername("Usererererrere")) + .Throws(); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.GetUserByUsername("Usererererrere"); + if (userResult is NotFoundObjectResult nfObjectResult) + { + var valeur = nfObjectResult.Value; + + Assert.NotNull(valeur); + } + } + [Fact] public void GetUserEmailSuccess() { @@ -308,6 +340,34 @@ public class UserUnitTest } } + [Fact] + public void DeleteUser_By_Username_Success() + { + _userService.Setup(x => x.DeleteUserByUsername("Damn")) + .Returns(true); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.DeleteUserByUsername("Damn"); + if (userResult is OkObjectResult okObjectResult) + { + Assert.Null(okObjectResult.Value); + } + } + + [Fact] + public void DeleteUser_By_Username_Failed() + { + _userService.Setup(x => x.DeleteUserByUsername("IUDHEIUHDEHUDH")) + .Returns(false); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.DeleteUserByUsername("IUDHEIUHDEHUDH"); + if (userResult is NotFoundObjectResult notFoundObjectResult) + { + Assert.Null(notFoundObjectResult.Value); + } + } + [Fact] public void CreateUserSuccess() { From 1f7cba0b221921b97b39932824043a9a0aa1b37b Mon Sep 17 00:00:00 2001 From: masapountz Date: Tue, 2 Apr 2024 02:00:41 +0200 Subject: [PATCH 30/30] Correction d'un security review (Username et password en clean dans le code) --- API_SQLuedo/API/Program.cs | 7 +++++++ .../API/Service/QueryDataServiceApi.cs | 20 ++++++++++++------- API_SQLuedo/API/appsettings.json | 5 ++++- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/API_SQLuedo/API/Program.cs b/API_SQLuedo/API/Program.cs index 559793d..62b1cc3 100644 --- a/API_SQLuedo/API/Program.cs +++ b/API_SQLuedo/API/Program.cs @@ -95,6 +95,13 @@ builder.Services.AddCors(options => }); }); +var configuration = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .Build(); + +builder.Services.AddSingleton(configuration); + var app = builder.Build(); diff --git a/API_SQLuedo/API/Service/QueryDataServiceApi.cs b/API_SQLuedo/API/Service/QueryDataServiceApi.cs index 636f235..f4bff6d 100644 --- a/API_SQLuedo/API/Service/QueryDataServiceApi.cs +++ b/API_SQLuedo/API/Service/QueryDataServiceApi.cs @@ -4,6 +4,7 @@ using Model.OrderCriteria; using Npgsql; using Shared; using Shared.Mapper; +using Microsoft.Extensions.Configuration; using System.Text; using Newtonsoft.Json; using Microsoft.EntityFrameworkCore.Metadata.Internal; @@ -11,11 +12,16 @@ using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace API.Service; public class QueryDataServiceApi : IQueryService{ + private readonly IConfiguration _configuration; + public QueryDataServiceApi(IConfiguration configuration) + { + _configuration = configuration; + } public QueryDto ExecuteQuery(string query, string database) { - string connectionString = - $"Host=localhost;Username=admin;Password=motdepasse;Database={database}"; + string connectionString = _configuration.GetConnectionString("DefaultConnection"); + connectionString = connectionString.Replace("{database}", database); if (string.IsNullOrEmpty(database)) { @@ -67,8 +73,8 @@ public class QueryDataServiceApi : IQueryService{ public QueryDto GetTables(string database) { - string connectionString = - $"Host=localhost;Username=admin;Password=motdepasse;Database={database}"; + string connectionString = _configuration.GetConnectionString("DefaultConnection"); + connectionString = connectionString.Replace("{database}", database); try { @@ -120,10 +126,10 @@ public class QueryDataServiceApi : IQueryService{ public QueryDto GetColumns(string database, string table) { - string connectionString = - $"Host=localhost;Username=admin;Password=motdepasse;Database={database}"; + string connectionString = _configuration.GetConnectionString("DefaultConnection"); + connectionString = connectionString.Replace("{database}", database); - using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) + using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) { connection.Open(); using (NpgsqlCommand command = new NpgsqlCommand()) diff --git a/API_SQLuedo/API/appsettings.json b/API_SQLuedo/API/appsettings.json index 10f68b8..639275d 100644 --- a/API_SQLuedo/API/appsettings.json +++ b/API_SQLuedo/API/appsettings.json @@ -5,5 +5,8 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "ConnectionStrings": { + "DefaultConnection": "Host=localhost;Username=admin;Password=motdepasse;Database={database}" + } }