From 4e60b513844f816e5d25d378b20d280ca7448cce Mon Sep 17 00:00:00 2001 From: masapountz Date: Sat, 30 Mar 2024 22:23:17 +0100 Subject: [PATCH 01/11] =?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 0161832d9ef0fa22756719f4c5469bcc860de9ab Mon Sep 17 00:00:00 2001 From: masapountz Date: Mon, 1 Apr 2024 03:08:28 +0200 Subject: [PATCH 02/11] 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 6c7970fda70b7cb9961055782ad89ba24e34fa7e Mon Sep 17 00:00:00 2001 From: masapountz Date: Mon, 1 Apr 2024 17:58:00 +0200 Subject: [PATCH 03/11] =?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 04/11] =?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 05/11] 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 06/11] 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 07/11] =?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 08/11] =?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 09/11] 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 10/11] 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 11/11] 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}" + } }