From 1bf6bdb3ed79b847191d8def21927395196d7b1b Mon Sep 17 00:00:00 2001 From: clchieu Date: Sun, 17 Mar 2024 00:49:47 +0100 Subject: [PATCH 01/26] =?UTF-8?q?:construction=5Fworker:=20Ajout=20de=20de?= =?UTF-8?q?s=20context=20dans=20les=20fichiers=20=C3=A0=20ignorer=20pour?= =?UTF-8?q?=20la=20couverture=20de=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 483215f..50ca3ac 100644 --- a/.drone.yml +++ b/.drone.yml @@ -30,7 +30,7 @@ steps: sonar_token: from_secret: SECRET_SONAR_LOGIN project_key: API_SQLuedo - coverage_exclusions: "Test*/**" + coverage_exclusions: "(Test*/**|*Context*/**)" commands: - cd API_SQLuedo/ - dotnet restore API_SQLuedo.sln From 977152026c914c25d94f8086847cc64db2165a03 Mon Sep 17 00:00:00 2001 From: clchieu Date: Sun, 17 Mar 2024 01:02:16 +0100 Subject: [PATCH 02/26] =?UTF-8?q?:construction=5Fworker:=20Ajout=20de=20de?= =?UTF-8?q?s=20context=20dans=20les=20fichiers=20=C3=A0=20ignorer=20pour?= =?UTF-8?q?=20la=20couverture=20de=20tests,=20deuxieme=20essai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 50ca3ac..876e963 100644 --- a/.drone.yml +++ b/.drone.yml @@ -30,7 +30,7 @@ steps: sonar_token: from_secret: SECRET_SONAR_LOGIN project_key: API_SQLuedo - coverage_exclusions: "(Test*/**|*Context*/**)" + coverage_exclusions: "Test*/**, *Context*/**" commands: - cd API_SQLuedo/ - dotnet restore API_SQLuedo.sln From ef1f7306ac3a58105f6d9f2445207c9f4cd229ce Mon Sep 17 00:00:00 2001 From: clchieu Date: Sun, 17 Mar 2024 01:08:02 +0100 Subject: [PATCH 03/26] =?UTF-8?q?:construction=5Fworker:=20Ajout=20de=20de?= =?UTF-8?q?s=20context=20dans=20les=20fichiers=20=C3=A0=20ignorer=20pour?= =?UTF-8?q?=20la=20couverture=20de=20tests,=20troisieme=20essai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 876e963..0e3e55e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -30,7 +30,7 @@ steps: sonar_token: from_secret: SECRET_SONAR_LOGIN project_key: API_SQLuedo - coverage_exclusions: "Test*/**, *Context*/**" + coverage_exclusions: "**/Test*/**,**/*Context*/**" commands: - cd API_SQLuedo/ - dotnet restore API_SQLuedo.sln From 32ef338221078bb49598fb5f752fce15eec7d57d Mon Sep 17 00:00:00 2001 From: clchieu Date: Sun, 17 Mar 2024 01:11:48 +0100 Subject: [PATCH 04/26] :construction_worker: Ajout des program.cs de l'exclusion --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 0e3e55e..d9da154 100644 --- a/.drone.yml +++ b/.drone.yml @@ -30,7 +30,7 @@ steps: sonar_token: from_secret: SECRET_SONAR_LOGIN project_key: API_SQLuedo - coverage_exclusions: "**/Test*/**,**/*Context*/**" + coverage_exclusions: "**/Test*/**,**/*Context*/**,**/Program.cs" commands: - cd API_SQLuedo/ - dotnet restore API_SQLuedo.sln From 0aac223ecd9da57ee11049a5fe36f8be71fa00d9 Mon Sep 17 00:00:00 2001 From: Nestisse Date: Sun, 17 Mar 2024 02:59:14 +0100 Subject: [PATCH 05/26] =?UTF-8?q?D=C3=A9but=20des=20tests=20unitaires=20su?= =?UTF-8?q?r=20le=20service=20ef?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/DbContextLib/UserDbContext.cs | 3 +- .../Service/LessonDataService.cs | 81 +++----- .../Service/ParagraphDataService.cs | 2 +- .../TestEF/Service/TestInquiryDataService.cs | 147 +++++++++++++++ .../TestEF/Service/TestLessonDataService.cs | 105 +++++++++++ .../Service/TestParagraphDataService.cs | 145 +++++++++++++++ .../TestEF/Service/TestSuccessDataService.cs | 174 ++++++++++++++++++ 7 files changed, 603 insertions(+), 54 deletions(-) create mode 100644 API_SQLuedo/TestEF/Service/TestInquiryDataService.cs create mode 100644 API_SQLuedo/TestEF/Service/TestLessonDataService.cs create mode 100644 API_SQLuedo/TestEF/Service/TestParagraphDataService.cs create mode 100644 API_SQLuedo/TestEF/Service/TestSuccessDataService.cs diff --git a/API_SQLuedo/DbContextLib/UserDbContext.cs b/API_SQLuedo/DbContextLib/UserDbContext.cs index b4de5c2..849189c 100644 --- a/API_SQLuedo/DbContextLib/UserDbContext.cs +++ b/API_SQLuedo/DbContextLib/UserDbContext.cs @@ -23,12 +23,11 @@ namespace DbContextLib protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { + base.OnConfiguring(optionsBuilder); if (!optionsBuilder.IsConfigured) { optionsBuilder.UseNpgsql("Host=localhost;Database=SQLuedo;Username=admin;Password=motdepasse"); } - - base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder builder) diff --git a/API_SQLuedo/DbDataManager/Service/LessonDataService.cs b/API_SQLuedo/DbDataManager/Service/LessonDataService.cs index bb7ced6..aa67a64 100644 --- a/API_SQLuedo/DbDataManager/Service/LessonDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/LessonDataService.cs @@ -23,10 +23,12 @@ public class LessonDataService : ILessonService { page = 1; } + if (number <= 0) { number = 10; } + IQueryable query = DbContext.Lessons.Skip((page - 1) * number).Take(number); switch (orderCriteria) { @@ -73,64 +75,41 @@ public class LessonDataService : ILessonService public bool DeleteLesson(int id) { - using (UserDbContext context = new UserDbContext(new DbContextOptions())) - { - var lessonEntity = context.Lessons.FirstOrDefault(l => l.Id == id); - if (lessonEntity == null) - { - return false; - } - - context.Lessons.Remove(lessonEntity); - context.SaveChangesAsync(); - return true; - } + var lessonEntity = DbContext.Lessons.FirstOrDefault(l => l.Id == id); + if (lessonEntity == null) + return false; + + DbContext.Lessons.Remove(lessonEntity); + DbContext.SaveChanges(); + return true; } public LessonEntity UpdateLesson(int id, LessonEntity lesson) { - using (UserDbContext context = new UserDbContext(new DbContextOptions())) - { - var updatingLesson = context.Lessons.FirstOrDefault(l => l.Id == id); - if (updatingLesson == null) - { - throw new ArgumentException("Impossible de trouver la leçon", nameof(id)); - } - - foreach (var pptt in typeof(LessonEntity).GetProperties() - .Where(p => p.CanWrite && p.Name != nameof(LessonEntity.Id))) - { - pptt.SetValue(updatingLesson, pptt.GetValue(lesson)); - } - - context.SaveChangesAsync(); - return updatingLesson; - } + var updatingLesson = DbContext.Lessons.FirstOrDefault(l => l.Id == id); + if (updatingLesson == null) + throw new ArgumentException("Impossible de trouver la leçon", nameof(id)); + + updatingLesson.Title = lesson.Title; + updatingLesson.LastPublisher = lesson.LastPublisher; + updatingLesson.LastEdit = lesson.LastEdit; + + DbContext.SaveChanges(); + return updatingLesson; } + public LessonEntity CreateLesson(int id, string title, string lastPublisher, DateOnly lastEdit) { - using (UserDbContext context = new UserDbContext(new DbContextOptions())) + var newLessonEntity = new LessonEntity() { - DateTime date = DateTime.Now; - var newLessonEntity = new LessonEntity() - { - Title = title, - LastPublisher = lastPublisher, - LastEdit = lastEdit, - }; - var lesson = context.Lessons.FirstOrDefault(l => l.Id == id); - if (lesson == null && id > 0) - { - newLessonEntity.Id = id; - context.Lessons.Add(newLessonEntity); - context.SaveChangesAsync(); - throw new ArgumentException( - $"Erreur, l'ID {id} est déjà utilisé pour une autre leçon, un id par a été attribué."); - } - - context.Lessons.Add(newLessonEntity); - context.SaveChangesAsync(); - return newLessonEntity; - } + Id = id > 0 && DbContext.Lessons.All(l => l.Id != id) ? id : 0, + Title = title, + LastPublisher = lastPublisher, + LastEdit = lastEdit, + }; + + DbContext.Lessons.Add(newLessonEntity); + DbContext.SaveChanges(); + return newLessonEntity; } } \ No newline at end of file diff --git a/API_SQLuedo/DbDataManager/Service/ParagraphDataService.cs b/API_SQLuedo/DbDataManager/Service/ParagraphDataService.cs index 5486813..4c77183 100644 --- a/API_SQLuedo/DbDataManager/Service/ParagraphDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/ParagraphDataService.cs @@ -85,7 +85,7 @@ public class ParagraphDataService : IParagraphService } DbContext.Paragraphs.Remove(paragraphEntity); - DbContext.SaveChangesAsync(); + DbContext.SaveChanges(); return true; } diff --git a/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs new file mode 100644 index 0000000..d1fe4f4 --- /dev/null +++ b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs @@ -0,0 +1,147 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Model.OrderCriteria; + +namespace TestEF.Service; + +public class TestInquiryDataService +{ + private readonly UserDbContext _dbContext; + private readonly InquiryDataService _inquiryDataService; + + public TestInquiryDataService() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new UserDbContext(options); + _inquiryDataService = new InquiryDataService(_dbContext); + } + + [Fact] + public void GetInquiries_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.None); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetInquiryById_ReturnsCorrectInquiry() + { + _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.SaveChanges(); + + var result = _inquiryDataService.GetInquiryById(1); + + Assert.Equal("Test1", result.Title); + } + + [Fact] + public void GetInquiryByTitle_ReturnsCorrectInquiry() + { + _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.SaveChanges(); + + var result = _inquiryDataService.GetInquiryByTitle("Test1"); + + Assert.Equal(1, result.Id); + } + + [Fact] + public void CreateInquiry_AddsNewInquiry() + { + var result = _inquiryDataService.CreateInquiry("Test", "Desc", true); + + Assert.Equal(1, _dbContext.Inquiries.Count()); + Assert.Equal("Test", result.Title); + } + + [Fact] + public void DeleteInquiry_RemovesInquiry() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.SaveChanges(); + + _inquiryDataService.DeleteInquiry(1); + + Assert.Empty(_dbContext.Inquiries); + } + + [Fact] + public void UpdateInquiry_UpdatesExistingInquiry() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.SaveChanges(); + + var updatedInquiry = new InquiryEntity { Id = 1, Title = "Updated", Description = "Desc", IsUser = false }; + var result = _inquiryDataService.UpdateInquiry(1, updatedInquiry); + + Assert.Equal("Updated", result.Title); + } + + [Fact] + public void GetInquiries_WithBadPage_ReturnsClassicInquiries() + { + _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.SaveChanges(); + + var result = _inquiryDataService.GetInquiries(-1, 2, InquiryOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetInquiryById_WithoutId_ThrowsException() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.SaveChanges(); + + Assert.Throws(() => _inquiryDataService.GetInquiryById(2)); + } + + [Fact] + public void GetInquiryByTitle_WithoutTitle_ThrowsException() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.SaveChanges(); + + Assert.Throws(() => _inquiryDataService.GetInquiryByTitle("Test2")); + } + + [Fact] + public void DeleteInquiry_WithoutId_ReturnsFalse() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.SaveChanges(); + + var result = _inquiryDataService.DeleteInquiry(2); + + Assert.False(result); + } + + [Fact] + public void UpdateInquiry_WithoutId_ThrowsException() + { + _dbContext.Inquiries.Add(new InquiryEntity { Id = 1, Title = "Test1", Description = "Desc1", IsUser = true }); + _dbContext.SaveChanges(); + + var updatedInquiry = new InquiryEntity { Id = 2, Title = "Updated", Description = "Desc", IsUser = false }; + + Assert.Throws(() => _inquiryDataService.UpdateInquiry(2, updatedInquiry)); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Service/TestLessonDataService.cs b/API_SQLuedo/TestEF/Service/TestLessonDataService.cs new file mode 100644 index 0000000..386d007 --- /dev/null +++ b/API_SQLuedo/TestEF/Service/TestLessonDataService.cs @@ -0,0 +1,105 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Model.OrderCriteria; + +namespace TestEF.Service; + +public class TestLessonDataService +{ + private readonly UserDbContext _dbContext; + private readonly LessonDataService _lessonDataService; + + public TestLessonDataService() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new UserDbContext(options); + _lessonDataService = new LessonDataService(_dbContext); + } + + [Fact] + public void GetLessons_ReturnsCorrectNumberOfLessons() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 2, Title = "Test2", LastPublisher = "Publisher2", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 3, Title = "Test3", LastPublisher = "Publisher3", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + var result = _lessonDataService.GetLessons(1, 2, LessonOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetLessonById_ReturnsCorrectLesson() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 2, Title = "Test2", LastPublisher = "Publisher2", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + var result = _lessonDataService.GetLessonById(1); + + Assert.Equal("Test1", result.Title); + } + + [Fact] + public void GetLessonByTitle_ReturnsCorrectLesson() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 2, Title = "Test2", LastPublisher = "Publisher2", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + var result = _lessonDataService.GetLessonByTitle("Test1"); + + Assert.Equal(1, result.Id); + } + + [Fact] + public void CreateLesson_AddsNewLesson() + { + var result = _lessonDataService.CreateLesson(1, "Test", "Publisher", DateOnly.MinValue); + + Assert.Equal(1, _dbContext.Lessons.Count()); + Assert.Equal("Test", result.Title); + } + + [Fact] + public void DeleteLesson_RemovesLesson() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + _lessonDataService.DeleteLesson(1); + + Assert.Empty(_dbContext.Lessons); + } + + [Fact] + public void UpdateLesson_UpdatesExistingLesson() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + var updatedLesson = new LessonEntity + { Id = 1, Title = "Updated", LastPublisher = "Publisher", LastEdit = DateOnly.MinValue }; + var result = _lessonDataService.UpdateLesson(1, updatedLesson); + + Assert.Equal("Updated", result.Title); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Service/TestParagraphDataService.cs b/API_SQLuedo/TestEF/Service/TestParagraphDataService.cs new file mode 100644 index 0000000..b7a6538 --- /dev/null +++ b/API_SQLuedo/TestEF/Service/TestParagraphDataService.cs @@ -0,0 +1,145 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Model.OrderCriteria; + +namespace TestEF.Service; + +public class TestParagraphDataService +{ + private readonly UserDbContext _dbContext; + private readonly ParagraphDataService _paragraphDataService; + private readonly LessonEntity _lesson; + + public TestParagraphDataService() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new UserDbContext(options); + _lesson = new LessonEntity + { + Id = 1, Title = "Test", LastPublisher = "Publisher", LastEdit = DateOnly.MinValue + }; + _paragraphDataService = new ParagraphDataService(_dbContext); + } + + [Fact] + public void GetParagraphs_ReturnsCorrectNumberOfParagraphs() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContentContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 2, ContentContent = "ContentContent2", ContentTitle = "ContentTitl2", Title = "Test2", + Content = "Content2", Info = "Info2", Query = "Query2", Comment = "Comment2", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 3, ContentContent = "ContentContent3", ContentTitle = "ContentTitle3", Title = "Test3", + Content = "Content3", Info = "Info3", Query = "Query3", Comment = "Comment3", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.GetParagraphs(1, 2, ParagraphOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetParagraphById_ReturnsCorrectParagraph() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContenContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 2, ContentContent = "ContenContent2", ContentTitle = "ContentTitle2", Title = "Test2", + Content = "Content2", Info = "Info2", Query = "Query2", Comment = "Comment2", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.GetParagraphById(1); + + Assert.Equal("Test1", result.Title); + } + + [Fact] + public void CreateParagraph_AddsNewParagraph() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.CreateParagraph("ContentTitle", "ContentContent", "Test", "Content", "Info", + "Query", "Comment", 1); + + Assert.Equal(1, _dbContext.Paragraphs.Count()); + Assert.Equal("Test", result.Title); + } + + [Fact] + public void DeleteParagraph_RemovesParagraph() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContenContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + + _dbContext.SaveChanges(); + + var b = _paragraphDataService.DeleteParagraph(1); + + Assert.Empty(_dbContext.Paragraphs); + } + + [Fact] + public void UpdateParagraph_UpdatesExistingParagraph() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContenContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var updatedParagraph = new ParagraphEntity + { + Id = 1, ContentContent = "ContenContent1", ContentTitle = "ContentTitle1", Title = "Updated", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }; + var result = _paragraphDataService.UpdateParagraph(1, updatedParagraph); + + Assert.Equal("Updated", result.Title); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Service/TestSuccessDataService.cs b/API_SQLuedo/TestEF/Service/TestSuccessDataService.cs new file mode 100644 index 0000000..eb0aa7e --- /dev/null +++ b/API_SQLuedo/TestEF/Service/TestSuccessDataService.cs @@ -0,0 +1,174 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Model.OrderCriteria; + +namespace TestEF.Service; + +public class TestSuccessDataService +{ + private readonly UserDbContext _dbContext; + private readonly SuccessDataService _successDataService; + private readonly List _users = new(); + private readonly List _inquiries = new(); + + public TestSuccessDataService() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new UserDbContext(options); + _successDataService = new SuccessDataService(_dbContext); + + _users.AddRange(new List + { + new() + { + Id = 1, + Username = "Pseudo", + Password = "Password", + Email = "Email@gmail.com", + IsAdmin = true + }, + new() + { + Id = 2, + Username = "Pseudo2", + Password = "Password2", + Email = "Email2@gmail.com", + IsAdmin = false + }, + new() + { + Id = 3, + Username = "Pseudo3", + Password = "Password3", + Email = "Email3@gmail.com", + IsAdmin = false + } + }); + + _inquiries.AddRange(new List + { + new() + { + Id = 1, + Title = "Title", + Description = "Description", + IsUser = false + }, + new() + { + Id = 2, + Title = "Title2", + Description = "Description2", + IsUser = true + }, + new() + { + Id = 3, + Title = "Title3", + Description = "Description3", + IsUser = false + } + }); + _dbContext.Users.AddRange(_users); + _dbContext.Inquiries.AddRange(_inquiries); + _dbContext.SaveChanges(); + } + + [Fact] + public void GetSuccesses_ReturnsCorrectNumberOfSuccesses() + { + var success1 = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; + var success2 = new SuccessEntity { UserId = 2, InquiryId = 2, IsFinished = false }; + var success3 = new SuccessEntity { UserId = 3, InquiryId = 3, IsFinished = true }; + + _dbContext.Successes.AddRange(success1, success2, success3); + _dbContext.SaveChanges(); + + var result = _successDataService.GetSuccesses(1, 2, SuccessOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetSuccessesByUserId_ReturnsCorrectSuccesses() + { + var success1 = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; + var success2 = new SuccessEntity { UserId = 1, InquiryId = 2, IsFinished = false }; + + _dbContext.Successes.AddRange(success1, success2); + _dbContext.SaveChanges(); + + var result = _successDataService.GetSuccessesByUserId(1); + + Assert.Equal(2, result.Count()); + } +/* + [Fact] + public void GetSuccessesByInquiryId_ReturnsCorrectSuccesses() + { + _dbContext.Inquiries.Add( + new InquiryEntity + { + Id = 4, + Title = "Title3", + Description = "Description3", + IsUser = false + } + ); + _dbContext.SaveChanges(); + + var success1 = new SuccessEntity { UserId = 1, InquiryId = 4, IsFinished = true }; + var success2 = new SuccessEntity { UserId = 2, InquiryId = 4, IsFinished = false }; + + _dbContext.Successes.AddRange(success1, success2); + _dbContext.SaveChanges(); + + var result = _successDataService.GetSuccessesByInquiryId(4); + + Assert.Equal(2, result.Count()); + }*/ + + [Fact] + public void DeleteSuccess_RemovesSuccess() + { + var success = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; + + _dbContext.Successes.Add(success); + _dbContext.SaveChanges(); + + _successDataService.DeleteSuccess(1, 1); + + Assert.Empty(_dbContext.Successes); + } + + [Fact] + public void UpdateSuccess_UpdatesExistingSuccess() + { + var success = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; + + _dbContext.Successes.Add(success); + _dbContext.SaveChanges(); + + var updatedSuccess = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = false }; + var result = _successDataService.UpdateSuccess(1, 1, updatedSuccess); + + Assert.False(result.IsFinished); + } + + [Fact] + public void CreateSuccess_AddsNewSuccess() + { + var result = _successDataService.CreateSuccess(1, 3, true); + + Assert.Single(_dbContext.Successes); + Assert.True(result.IsFinished); + } +} \ No newline at end of file From 4ea53b072ebc54d180d2ec202ed2b9ffce7141ab Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Sun, 17 Mar 2024 10:25:38 +0100 Subject: [PATCH 06/26] Ajout des tests de UserDataService --- .../TestEF/Service/TestUserDataService.cs | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 API_SQLuedo/TestEF/Service/TestUserDataService.cs diff --git a/API_SQLuedo/TestEF/Service/TestUserDataService.cs b/API_SQLuedo/TestEF/Service/TestUserDataService.cs new file mode 100644 index 0000000..040f600 --- /dev/null +++ b/API_SQLuedo/TestEF/Service/TestUserDataService.cs @@ -0,0 +1,152 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Model.OrderCriteria; + +namespace TestEF.Service; + +public class TestUserDataService +{ + private readonly UserDbContext _dbContext; + private readonly UserDataService _userDataService; + + public TestUserDataService() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new UserDbContext(options); + _userDataService = new UserDataService(_dbContext); + } + + [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.SaveChanges(); + var result = _userDataService.GetUsers(1, 2, UserOrderCriteria.None); + Assert.Equal(2, result.Count()); + } + + [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.SaveChanges(); + var result = _userDataService.GetUserById(1); + Assert.Equal("Test1", 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.SaveChanges(); + var result = _userDataService.GetUserByUsername("Test1"); + Assert.Equal(1, result.Id); + } + + [Fact] + public void CreateUser_AddsNewUser() + { + var result = _userDataService.CreateUser("Test42", "password", "eamil@example1.com", true); + Assert.Equal(1, _dbContext.Users.Count()); + Assert.Equal("Test42", result.Username); + } + + [Fact] + public void DeleteUser_RemovesUser() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + _userDataService.DeleteUser(1); + Assert.Empty(_dbContext.Inquiries); + } + + [Fact] + public void UpdateUser_UpdatesExistingUser() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + + var updatedUser = new UserEntity() { Id = 1, Username = "Updated", Email = "updated@example.com", Password = "updated", IsAdmin = false }; + var result = _userDataService.UpdateUser(1, updatedUser); + + Assert.Equal("Updated", result.Username); + Assert.Equal("updated@example.com", result.Email); + Assert.Equal("updated", result.Password); + Assert.False(result.IsAdmin); + } + + [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.SaveChanges(); + + var result = _userDataService.GetUsers(-1, 2, UserOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } + + [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.SaveChanges(); + + var result = _userDataService.GetUsers(1, -42, UserOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetUserById_WithoutId_ThrowsException() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + Assert.Throws(() => _userDataService.GetUserById(2)); + } + + [Fact] + public void GetUserByUsername_WithoutUsername_ThrowsException() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + + Assert.Throws(() => _userDataService.GetUserByUsername("Test2")); + } + + [Fact] + public void DeleteUser_WithoutId_ReturnsFalse() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + + var result = _userDataService.DeleteUser(2); + + Assert.False(result); + } + + [Fact] + public void UpdateUser_WithoutId_ThrowsException() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + + var updatedUser = new UserEntity() { Id = 1, Username = "Updated", Email = "updated@email.com", Password = "updated", IsAdmin = false }; + + Assert.Throws(() => _userDataService.UpdateUser(2, updatedUser)); + } +} \ No newline at end of file From 0a2aa5ea92c34e58986ed8b596881687fac1c07d Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Sun, 17 Mar 2024 11:16:09 +0100 Subject: [PATCH 07/26] Test de toutes les classes de Model --- API_SQLuedo/Dto/UserDTO.cs | 14 ++---- API_SQLuedo/Model/Solution.cs | 10 ++--- API_SQLuedo/Shared/Mapper/SolutionMapper.cs | 4 +- API_SQLuedo/TestEF/Dto/TestUserDTO.cs | 43 +++++++++++++++++++ .../TestEF/Mapper/SolutionMapperUnitTest.cs | 4 +- API_SQLuedo/TestEF/Model/BlackListTest.cs | 32 ++++++++++++++ API_SQLuedo/TestEF/Model/InquiryTableTest.cs | 24 +++++++++++ API_SQLuedo/TestEF/Model/InquiryTest.cs | 26 +++++++++++ API_SQLuedo/TestEF/Model/LessonTest.cs | 26 +++++++++++ API_SQLuedo/TestEF/Model/NotepadTest.cs | 36 ++++++++++++++++ API_SQLuedo/TestEF/Model/ParagraphTest.cs | 32 ++++++++++++++ API_SQLuedo/TestEF/Model/SolutionTest.cs | 42 ++++++++++++++++++ API_SQLuedo/TestEF/Model/SuccessTest.cs | 24 +++++++++++ API_SQLuedo/TestEF/Model/UserTest.cs | 28 ++++++++++++ 14 files changed, 326 insertions(+), 19 deletions(-) create mode 100644 API_SQLuedo/TestEF/Model/BlackListTest.cs create mode 100644 API_SQLuedo/TestEF/Model/InquiryTableTest.cs create mode 100644 API_SQLuedo/TestEF/Model/InquiryTest.cs create mode 100644 API_SQLuedo/TestEF/Model/LessonTest.cs create mode 100644 API_SQLuedo/TestEF/Model/NotepadTest.cs create mode 100644 API_SQLuedo/TestEF/Model/ParagraphTest.cs create mode 100644 API_SQLuedo/TestEF/Model/SolutionTest.cs create mode 100644 API_SQLuedo/TestEF/Model/SuccessTest.cs create mode 100644 API_SQLuedo/TestEF/Model/UserTest.cs diff --git a/API_SQLuedo/Dto/UserDTO.cs b/API_SQLuedo/Dto/UserDTO.cs index 076daa8..e035608 100644 --- a/API_SQLuedo/Dto/UserDTO.cs +++ b/API_SQLuedo/Dto/UserDTO.cs @@ -34,28 +34,22 @@ return $"{Id}\t{Username}\t{Email}\t{IsAdmin}"; } - public override bool Equals(object obj) + public bool Equals(UserDto? other) { - if (object.ReferenceEquals(obj, null)) + if (object.ReferenceEquals(other, null)) { return false; } - if (object.ReferenceEquals(this, obj)) + if (object.ReferenceEquals(this, other)) { return true; } - if (this.GetType() != obj.GetType()) + if (this.GetType() != other.GetType()) { return false; } - - return this.Equals(obj as UserDto); - } - - public bool Equals(UserDto other) - { return (this.Id == other.Id); } diff --git a/API_SQLuedo/Model/Solution.cs b/API_SQLuedo/Model/Solution.cs index 8d167f8..72d912c 100644 --- a/API_SQLuedo/Model/Solution.cs +++ b/API_SQLuedo/Model/Solution.cs @@ -7,30 +7,30 @@ public class Solution public string MurdererLastName { get; set; } public string MurderPlace { get; set; } public string MurderWeapon { get; set; } - public string Explanation { get; set; } + public string Explaination { get; set; } public Solution() { } public Solution(int ownerId, string murdererFirstName, string murdererLastName, string murderPlace, - string murderWeapon, string explanation) + string murderWeapon, string explaination) { OwnerId = ownerId; MurdererFirstName = murdererFirstName; MurdererLastName = murdererLastName; MurderPlace = murderPlace; MurderWeapon = murderWeapon; - Explanation = explanation; + Explaination = explaination; } public Solution(string murdererFirstName, string murdererLastName, string murderPlace, string murderWeapon, - string explanation) + string explaination) { MurdererFirstName = murdererFirstName; MurdererLastName = murdererLastName; MurderPlace = murderPlace; MurderWeapon = murderWeapon; - Explanation = explanation; + Explaination = explaination; } } \ No newline at end of file diff --git a/API_SQLuedo/Shared/Mapper/SolutionMapper.cs b/API_SQLuedo/Shared/Mapper/SolutionMapper.cs index 8d7a246..8e1ccdb 100644 --- a/API_SQLuedo/Shared/Mapper/SolutionMapper.cs +++ b/API_SQLuedo/Shared/Mapper/SolutionMapper.cs @@ -21,7 +21,7 @@ public static class SolutionMapper public static SolutionDto FromModelToDto(this Solution model) { return new SolutionDto(model.OwnerId, model.MurdererFirstName, model.MurdererLastName, model.MurderPlace, - model.MurderWeapon, model.Explanation); + model.MurderWeapon, model.Explaination); } public static SolutionDto FromEntityToDto(this SolutionEntity entity) @@ -43,7 +43,7 @@ public static class SolutionMapper MurdererLastName = model.MurdererLastName, MurderPlace = model.MurderPlace, MurderWeapon = model.MurderWeapon, - Explaination = model.Explanation + Explaination = model.Explaination }; } diff --git a/API_SQLuedo/TestEF/Dto/TestUserDTO.cs b/API_SQLuedo/TestEF/Dto/TestUserDTO.cs index 97ad011..fd7ff27 100644 --- a/API_SQLuedo/TestEF/Dto/TestUserDTO.cs +++ b/API_SQLuedo/TestEF/Dto/TestUserDTO.cs @@ -42,5 +42,48 @@ namespace TestEF.Dto Assert.Equal(Password, user.Password); Assert.True(user.IsAdmin); } + + [Fact] + public void TestToString() + { + UserDto user = new UserDto(Id, Username, Password, Email, IsAdmin); + Assert.Equal($"{Id}\t{Username}\t{Email}\t{IsAdmin}", user.ToString()); + } + + [Fact] + public void TestEqualsWithSameAttributesValues() + { + UserDto user1 = new UserDto(Id, Username, Password, Email, IsAdmin); + UserDto user2 = new UserDto(Id, Username, Password, Email, IsAdmin); + Assert.True(user1.Equals(user2)); + } + + [Fact] + public void TestEqualsWithNullReference() + { + UserDto user = new UserDto(Id, Username, Password, Email, IsAdmin); + Assert.False(user.Equals(null)); + } + + [Fact] + public void TestEqualsWithSameReference() + { + UserDto user = new UserDto(Id, Username, Password, Email, IsAdmin); + Assert.True(user.Equals(user)); + } + + [Fact] + public void TestEqualsWithDifferentType() + { + UserDto user = new UserDto(Id, Username, Password, Email, IsAdmin); + Assert.False(user.Equals("Tests")); + } + + [Fact] + public void TestGetHashCode() + { + UserDto user = new UserDto(Id, Username, Password, Email, IsAdmin); + Assert.Equal(Id, user.GetHashCode()); + } } } \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Mapper/SolutionMapperUnitTest.cs b/API_SQLuedo/TestEF/Mapper/SolutionMapperUnitTest.cs index 30258d2..35a7621 100644 --- a/API_SQLuedo/TestEF/Mapper/SolutionMapperUnitTest.cs +++ b/API_SQLuedo/TestEF/Mapper/SolutionMapperUnitTest.cs @@ -52,7 +52,7 @@ namespace TestEF.Mapper Assert.Equal(_murdererLastName, solutionMod.MurdererLastName); Assert.Equal(_murderPlace, solutionMod.MurderPlace); Assert.Equal(_murderWeapon, solutionMod.MurderWeapon); - Assert.Equal(_explanation, solutionMod.Explanation); + Assert.Equal(_explanation, solutionMod.Explaination); } @@ -85,7 +85,7 @@ namespace TestEF.Mapper Assert.Equal(_murdererLastName, solutionMod.MurdererLastName); Assert.Equal(_murderPlace, solutionMod.MurderPlace); Assert.Equal(_murderWeapon, solutionMod.MurderWeapon); - Assert.Equal(_explanation, solutionMod.Explanation); + Assert.Equal(_explanation, solutionMod.Explaination); } diff --git a/API_SQLuedo/TestEF/Model/BlackListTest.cs b/API_SQLuedo/TestEF/Model/BlackListTest.cs new file mode 100644 index 0000000..e3216c3 --- /dev/null +++ b/API_SQLuedo/TestEF/Model/BlackListTest.cs @@ -0,0 +1,32 @@ +using Model; + +namespace TestEF.Model; + +public class BlackListTest +{ + [Fact] + void TestConstructorWithRightParameters() + { + BlackList blackList = new BlackList("example@email.com", DateOnly.FromDateTime(DateTime.Now)); + Assert.Equal("example@email.com", blackList.Email); + Assert.Equal(DateOnly.FromDateTime(DateTime.Now), blackList.ExpirationDate); + } + + [Fact] + void TestConstructorWithNullEmail() + { + Assert.Throws(() => + { + BlackList blackList = new BlackList(null, DateOnly.FromDateTime(DateTime.Now)); + }); + } + + [Fact] + void TestConstructorWithAnteriorDate() + { + Assert.Throws(() => + { + BlackList blackList = new BlackList("example@email.com", DateOnly.FromDateTime(DateTime.Parse("2024/01/01 00:00:00"))); + }); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Model/InquiryTableTest.cs b/API_SQLuedo/TestEF/Model/InquiryTableTest.cs new file mode 100644 index 0000000..2bf2735 --- /dev/null +++ b/API_SQLuedo/TestEF/Model/InquiryTableTest.cs @@ -0,0 +1,24 @@ +using Model; + +namespace TestEF.Model; + +public class InquiryTableTest +{ + [Fact] + void TestEmptyContructor() + { + InquiryTable inquiry = new InquiryTable(); + Assert.Equal(0,inquiry.OwnerId); + Assert.Null(inquiry.ConnectionInfo); + Assert.Null(inquiry.DatabaseName); + } + + [Fact] + void TestFullContructor() + { + InquiryTable inquiry = new InquiryTable(1,"Database","Connection"); + Assert.Equal(1,inquiry.OwnerId); + Assert.Equal("Connection",inquiry.ConnectionInfo); + Assert.Equal("Database",inquiry.DatabaseName); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Model/InquiryTest.cs b/API_SQLuedo/TestEF/Model/InquiryTest.cs new file mode 100644 index 0000000..e1e6701 --- /dev/null +++ b/API_SQLuedo/TestEF/Model/InquiryTest.cs @@ -0,0 +1,26 @@ +using Model; + +namespace TestEF.Model; + +public class InquiryTest +{ + [Fact] + void TestEmptyContructor() + { + Inquiry inquiry = new Inquiry(); + Assert.Equal(0,inquiry.Id); + Assert.Null(inquiry.Title); + Assert.Null(inquiry.Description); + Assert.False(inquiry.IsUser); + } + + [Fact] + void TestFullContructor() + { + Inquiry inquiry = new Inquiry(1,"Title","Description",true); + Assert.Equal(1,inquiry.Id); + Assert.Equal("Title",inquiry.Title); + Assert.Equal("Description",inquiry.Description); + Assert.True(inquiry.IsUser); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Model/LessonTest.cs b/API_SQLuedo/TestEF/Model/LessonTest.cs new file mode 100644 index 0000000..2a081b2 --- /dev/null +++ b/API_SQLuedo/TestEF/Model/LessonTest.cs @@ -0,0 +1,26 @@ +using Model; + +namespace TestEF.Model; + +public class LessonTest +{ + [Fact] + void TestConstructorWithoutId() + { + Lesson lesson = new Lesson("Title", "JohnDoe", DateOnly.FromDateTime(DateTime.Now)); + Assert.Equal(0, lesson.Id); + Assert.Equal("Title", lesson.Title); + Assert.Equal("JohnDoe", lesson.LastPublisher); + Assert.Equal(DateOnly.FromDateTime(DateTime.Now), lesson.LastEdit); + } + + [Fact] + void TestConstructorWithId() + { + Lesson lesson = new Lesson(42,"Title", "JohnDoe", DateOnly.FromDateTime(DateTime.Now)); + Assert.Equal(42, lesson.Id); + Assert.Equal("Title", lesson.Title); + Assert.Equal("JohnDoe", lesson.LastPublisher); + Assert.Equal(DateOnly.FromDateTime(DateTime.Now), lesson.LastEdit); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Model/NotepadTest.cs b/API_SQLuedo/TestEF/Model/NotepadTest.cs new file mode 100644 index 0000000..e07909d --- /dev/null +++ b/API_SQLuedo/TestEF/Model/NotepadTest.cs @@ -0,0 +1,36 @@ +using Model; + +namespace TestEF.Model; + +public class NotepadTest +{ + [Fact] + void TestEmptyConstructor() + { + Notepad notepad = new Notepad(); + Assert.Equal(0, notepad.Id); + Assert.Equal(0, notepad.UserId); + Assert.Equal(0, notepad.InquiryId); + Assert.Null(notepad.Notes); + } + + [Fact] + void TestConstructorWithoutId() + { + Notepad notepad = new Notepad(42,42,"Notes"); + Assert.Equal(0, notepad.Id); + Assert.Equal(42, notepad.UserId); + Assert.Equal(42, notepad.InquiryId); + Assert.Equal("Notes",notepad.Notes); + } + + [Fact] + void TestConstructorWithId() + { + Notepad notepad = new Notepad(42,42,42,"Notes"); + Assert.Equal(42, notepad.Id); + Assert.Equal(42, notepad.UserId); + Assert.Equal(42, notepad.InquiryId); + Assert.Equal("Notes",notepad.Notes); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Model/ParagraphTest.cs b/API_SQLuedo/TestEF/Model/ParagraphTest.cs new file mode 100644 index 0000000..3507b2a --- /dev/null +++ b/API_SQLuedo/TestEF/Model/ParagraphTest.cs @@ -0,0 +1,32 @@ +using Model; + +namespace TestEF.Model; + +public class ParagraphTest +{ + [Fact] + void TestConstructorWithoutId() + { + Paragraph paragraph = new Paragraph("Title", "Content","Info","Query","Comment"); + Assert.Equal(0, paragraph.Id); + Assert.Equal(0, paragraph.LessonId); + Assert.Equal("Title", paragraph.ContentTitle); + Assert.Equal("Content", paragraph.ContentContent); + Assert.Equal("Info", paragraph.Info); + Assert.Equal("Query", paragraph.Query); + Assert.Equal("Comment", paragraph.Comment); + } + + [Fact] + void TestConstructorWithId() + { + Paragraph paragraph = new Paragraph(42,"Title", "Content","Info","Query","Comment",42); + Assert.Equal(42, paragraph.Id); + Assert.Equal(42, paragraph.LessonId); + Assert.Equal("Title", paragraph.ContentTitle); + Assert.Equal("Content", paragraph.ContentContent); + Assert.Equal("Info", paragraph.Info); + Assert.Equal("Query", paragraph.Query); + Assert.Equal("Comment", paragraph.Comment); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Model/SolutionTest.cs b/API_SQLuedo/TestEF/Model/SolutionTest.cs new file mode 100644 index 0000000..95e329a --- /dev/null +++ b/API_SQLuedo/TestEF/Model/SolutionTest.cs @@ -0,0 +1,42 @@ +using Model; + +namespace TestEF.Model; + +public class SolutionTest +{ + [Fact] + void TestEmptyConstructor() + { + Solution solution = new Solution(); + Assert.Equal(0,solution.OwnerId); + Assert.Null(solution.MurdererFirstName); + Assert.Null(solution.MurdererLastName); + Assert.Null(solution.MurderPlace); + Assert.Null(solution.MurderWeapon); + Assert.Null(solution.Explaination); + } + + [Fact] + void TestConstructorWithoutId() + { + Solution solution = new Solution("John","Doe","Bedroom","Knife","Because"); + Assert.Equal(0,solution.OwnerId); + Assert.Equal("John",solution.MurdererFirstName); + Assert.Equal("Doe",solution.MurdererLastName); + Assert.Equal("Bedroom",solution.MurderPlace); + Assert.Equal("Knife",solution.MurderWeapon); + Assert.Equal("Because",solution.Explaination); + } + + [Fact] + void TestConstructorWithId() + { + Solution solution = new Solution(42,"John","Doe","Bedroom","Knife","Because"); + Assert.Equal(42,solution.OwnerId); + Assert.Equal("John",solution.MurdererFirstName); + Assert.Equal("Doe",solution.MurdererLastName); + Assert.Equal("Bedroom",solution.MurderPlace); + Assert.Equal("Knife",solution.MurderWeapon); + Assert.Equal("Because",solution.Explaination); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Model/SuccessTest.cs b/API_SQLuedo/TestEF/Model/SuccessTest.cs new file mode 100644 index 0000000..152979a --- /dev/null +++ b/API_SQLuedo/TestEF/Model/SuccessTest.cs @@ -0,0 +1,24 @@ +using Model; + +namespace TestEF.Model; + +public class SuccessTest +{ + [Fact] + void TestEmptyConstructor() + { + Success success = new Success(); + Assert.Equal(0,success.UserId); + Assert.Equal(0,success.InquiryId); + Assert.False(success.IsFinished); + } + + [Fact] + void TestFullConstructor() + { + Success success = new Success(42,42,true); + Assert.Equal(42,success.UserId); + Assert.Equal(42,success.InquiryId); + Assert.True(success.IsFinished); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestEF/Model/UserTest.cs b/API_SQLuedo/TestEF/Model/UserTest.cs new file mode 100644 index 0000000..1ca3e68 --- /dev/null +++ b/API_SQLuedo/TestEF/Model/UserTest.cs @@ -0,0 +1,28 @@ +using Model; + +namespace TestEF.Model; + +public class UserTest +{ + [Fact] + void TestEmptyConstructor() + { + User user = new User(); + Assert.Equal(0,user.Id); + Assert.Null(user.Username); + Assert.Null(user.Email); + Assert.Null(user.Password); + Assert.False(user.IsAdmin); + } + + [Fact] + void TestFullConstructor() + { + User user = new User(42,"Username","Password","Email",true); + Assert.Equal(42,user.Id); + Assert.Equal("Username",user.Username); + Assert.Equal("Email",user.Email); + Assert.Equal("Password",user.Password); + Assert.True(user.IsAdmin); + } +} \ No newline at end of file From 40e422d778065470b7bbd984a16ecf60afa5b5fc Mon Sep 17 00:00:00 2001 From: Nestisse Date: Sun, 17 Mar 2024 11:29:53 +0100 Subject: [PATCH 08/26] =?UTF-8?q?Ajout=20de=20la=20m=C3=A9thode=20equals?= =?UTF-8?q?=20dans=20userdto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/Dto/UserDTO.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/API_SQLuedo/Dto/UserDTO.cs b/API_SQLuedo/Dto/UserDTO.cs index e035608..d3aa536 100644 --- a/API_SQLuedo/Dto/UserDTO.cs +++ b/API_SQLuedo/Dto/UserDTO.cs @@ -36,21 +36,27 @@ public bool Equals(UserDto? other) { - if (object.ReferenceEquals(other, null)) + return (this.Id == other?.Id); + } + + public override bool Equals(object? obj) + { + if (object.ReferenceEquals(obj, null)) { return false; } - if (object.ReferenceEquals(this, other)) + if (object.ReferenceEquals(this, obj)) { return true; } - if (this.GetType() != other.GetType()) + if (this.GetType() != obj.GetType()) { return false; } - return (this.Id == other.Id); + + return this.Equals(obj as UserDto); } public override int GetHashCode() From 80de049dc3ef995e4f68f794627a5040a1efc470 Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Sun, 17 Mar 2024 11:31:32 +0100 Subject: [PATCH 09/26] Augmentation du coverage pour tous les DataService de DbDataManager --- .../TestEF/Service/TestInquiryDataService.cs | 53 ++++- .../TestEF/Service/TestLessonDataService.cs | 82 ++++++- .../Service/TestParagraphDataService.cs | 219 +++++++++++++++++- .../TestEF/Service/TestSuccessDataService.cs | 77 +++++- 4 files changed, 427 insertions(+), 4 deletions(-) diff --git a/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs index d1fe4f4..1a6fb96 100644 --- a/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestInquiryDataService.cs @@ -25,7 +25,7 @@ public class TestInquiryDataService } [Fact] - public void GetInquiries_ReturnsCorrectNumberOfInquiries() + public void GetInquiries_WithNoneCriteria_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 }); @@ -36,6 +36,45 @@ public class TestInquiryDataService Assert.Equal(2, result.Count()); } + + [Fact] + public void GetInquiries_OrderedByTitle_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.ByTitle); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetInquiries_OrderedByDescription_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.ByDescription); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetInquiries_OrderedByIsUser_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.ByIsUser); + + Assert.Equal(2, result.Count()); + } [Fact] public void GetInquiryById_ReturnsCorrectInquiry() @@ -104,6 +143,18 @@ public class TestInquiryDataService Assert.Equal(2, result.Count()); } + + [Fact] + public void GetInquiries_WithBadNumber_ReturnsClassicInquiries() + { + _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.SaveChanges(); + + var result = _inquiryDataService.GetInquiries(1, -42, InquiryOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } [Fact] public void GetInquiryById_WithoutId_ThrowsException() diff --git a/API_SQLuedo/TestEF/Service/TestLessonDataService.cs b/API_SQLuedo/TestEF/Service/TestLessonDataService.cs index 386d007..a0de30f 100644 --- a/API_SQLuedo/TestEF/Service/TestLessonDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestLessonDataService.cs @@ -25,7 +25,7 @@ public class TestLessonDataService } [Fact] - public void GetLessons_ReturnsCorrectNumberOfLessons() + public void GetLessons_WithNoneCriteria_ReturnsCorrectNumberOfLessons() { _dbContext.Lessons.Add(new LessonEntity { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); @@ -39,6 +39,86 @@ public class TestLessonDataService Assert.Equal(2, result.Count()); } + + [Fact] + public void GetLessons_OrderedByTitle_ReturnsCorrectNumberOfLessons() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 2, Title = "Test2", LastPublisher = "Publisher2", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 3, Title = "Test3", LastPublisher = "Publisher3", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + var result = _lessonDataService.GetLessons(1, 2, LessonOrderCriteria.ByTitle); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetLessons_OrderedByLastPublisher_ReturnsCorrectNumberOfLessons() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 2, Title = "Test2", LastPublisher = "Publisher2", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 3, Title = "Test3", LastPublisher = "Publisher3", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + var result = _lessonDataService.GetLessons(1, 2, LessonOrderCriteria.ByLastPublisher); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetLessons_OrderedByLastEdit_ReturnsCorrectNumberOfLessons() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 2, Title = "Test2", LastPublisher = "Publisher2", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 3, Title = "Test3", LastPublisher = "Publisher3", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + var result = _lessonDataService.GetLessons(1, 2, LessonOrderCriteria.ByLastEdit); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetLessons_WithBadPage_ReturnsCorrectNumberOfLessons() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 2, Title = "Test2", LastPublisher = "Publisher2", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 3, Title = "Test3", LastPublisher = "Publisher3", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + var result = _lessonDataService.GetLessons(-42, 2, LessonOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetLessons_WithBadNumber_ReturnsCorrectNumberOfLessons() + { + _dbContext.Lessons.Add(new LessonEntity + { Id = 1, Title = "Test1", LastPublisher = "Publisher1", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 2, Title = "Test2", LastPublisher = "Publisher2", LastEdit = DateOnly.MinValue }); + _dbContext.Lessons.Add(new LessonEntity + { Id = 3, Title = "Test3", LastPublisher = "Publisher3", LastEdit = DateOnly.MinValue }); + _dbContext.SaveChanges(); + + var result = _lessonDataService.GetLessons(1, -42, LessonOrderCriteria.None); + + Assert.Equal(3, result.Count()); + } [Fact] public void GetLessonById_ReturnsCorrectLesson() diff --git a/API_SQLuedo/TestEF/Service/TestParagraphDataService.cs b/API_SQLuedo/TestEF/Service/TestParagraphDataService.cs index b7a6538..a160d25 100644 --- a/API_SQLuedo/TestEF/Service/TestParagraphDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestParagraphDataService.cs @@ -30,7 +30,7 @@ public class TestParagraphDataService } [Fact] - public void GetParagraphs_ReturnsCorrectNumberOfParagraphs() + public void GetParagraphs_WithoutCriteria_ReturnsCorrectNumberOfParagraphs() { _dbContext.Lessons.Add(_lesson); _dbContext.SaveChanges(); @@ -59,6 +59,223 @@ public class TestParagraphDataService Assert.Equal(2, result.Count()); } + + [Fact] + public void GetParagraphs_OrderdByTitle_ReturnsCorrectNumberOfParagraphs() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContentContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 2, ContentContent = "ContentContent2", ContentTitle = "ContentTitl2", Title = "Test2", + Content = "Content2", Info = "Info2", Query = "Query2", Comment = "Comment2", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 3, ContentContent = "ContentContent3", ContentTitle = "ContentTitle3", Title = "Test3", + Content = "Content3", Info = "Info3", Query = "Query3", Comment = "Comment3", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.GetParagraphs(1, 2, ParagraphOrderCriteria.ByTitle); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetParagraphs_OrderedByContent_ReturnsCorrectNumberOfParagraphs() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContentContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 2, ContentContent = "ContentContent2", ContentTitle = "ContentTitl2", Title = "Test2", + Content = "Content2", Info = "Info2", Query = "Query2", Comment = "Comment2", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 3, ContentContent = "ContentContent3", ContentTitle = "ContentTitle3", Title = "Test3", + Content = "Content3", Info = "Info3", Query = "Query3", Comment = "Comment3", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.GetParagraphs(1, 2, ParagraphOrderCriteria.ByContent); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetParagraphs_OrderedByQuery_ReturnsCorrectNumberOfParagraphs() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContentContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 2, ContentContent = "ContentContent2", ContentTitle = "ContentTitl2", Title = "Test2", + Content = "Content2", Info = "Info2", Query = "Query2", Comment = "Comment2", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 3, ContentContent = "ContentContent3", ContentTitle = "ContentTitle3", Title = "Test3", + Content = "Content3", Info = "Info3", Query = "Query3", Comment = "Comment3", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.GetParagraphs(1, 2, ParagraphOrderCriteria.ByQuery); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetParagraphs_OrderedByInfo_ReturnsCorrectNumberOfParagraphs() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContentContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 2, ContentContent = "ContentContent2", ContentTitle = "ContentTitl2", Title = "Test2", + Content = "Content2", Info = "Info2", Query = "Query2", Comment = "Comment2", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 3, ContentContent = "ContentContent3", ContentTitle = "ContentTitle3", Title = "Test3", + Content = "Content3", Info = "Info3", Query = "Query3", Comment = "Comment3", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.GetParagraphs(1, 2, ParagraphOrderCriteria.ByInfo); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetParagraphs_OrderedByComment_ReturnsCorrectNumberOfParagraphs() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContentContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 2, ContentContent = "ContentContent2", ContentTitle = "ContentTitl2", Title = "Test2", + Content = "Content2", Info = "Info2", Query = "Query2", Comment = "Comment2", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 3, ContentContent = "ContentContent3", ContentTitle = "ContentTitle3", Title = "Test3", + Content = "Content3", Info = "Info3", Query = "Query3", Comment = "Comment3", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.GetParagraphs(1, 2, ParagraphOrderCriteria.ByComment); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetParagraphs_WithBadPage_ReturnsCorrectNumberOfParagraphs() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContentContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 2, ContentContent = "ContentContent2", ContentTitle = "ContentTitl2", Title = "Test2", + Content = "Content2", Info = "Info2", Query = "Query2", Comment = "Comment2", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 3, ContentContent = "ContentContent3", ContentTitle = "ContentTitle3", Title = "Test3", + Content = "Content3", Info = "Info3", Query = "Query3", Comment = "Comment3", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.GetParagraphs(-42, 2, ParagraphOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetParagraphs_WithBadNumber_ReturnsCorrectNumberOfParagraphs() + { + _dbContext.Lessons.Add(_lesson); + _dbContext.SaveChanges(); + + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 1, ContentContent = "ContentContent1", ContentTitle = "ContentTitle1", Title = "Test1", + Content = "Content1", Info = "Info1", Query = "Query1", Comment = "Comment1", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 2, ContentContent = "ContentContent2", ContentTitle = "ContentTitl2", Title = "Test2", + Content = "Content2", Info = "Info2", Query = "Query2", Comment = "Comment2", + LessonId = 1 + }); + _dbContext.Paragraphs.Add(new ParagraphEntity + { + Id = 3, ContentContent = "ContentContent3", ContentTitle = "ContentTitle3", Title = "Test3", + Content = "Content3", Info = "Info3", Query = "Query3", Comment = "Comment3", + LessonId = 1 + }); + _dbContext.SaveChanges(); + + var result = _paragraphDataService.GetParagraphs(1, -42, ParagraphOrderCriteria.None); + + Assert.Equal(3, result.Count()); + } [Fact] public void GetParagraphById_ReturnsCorrectParagraph() diff --git a/API_SQLuedo/TestEF/Service/TestSuccessDataService.cs b/API_SQLuedo/TestEF/Service/TestSuccessDataService.cs index eb0aa7e..4c2ce59 100644 --- a/API_SQLuedo/TestEF/Service/TestSuccessDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestSuccessDataService.cs @@ -83,7 +83,7 @@ public class TestSuccessDataService } [Fact] - public void GetSuccesses_ReturnsCorrectNumberOfSuccesses() + public void GetSuccesses_WithoutCriteria_ReturnsCorrectNumberOfSuccesses() { var success1 = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; var success2 = new SuccessEntity { UserId = 2, InquiryId = 2, IsFinished = false }; @@ -96,6 +96,81 @@ public class TestSuccessDataService Assert.Equal(2, result.Count()); } + + [Fact] + public void GetSuccesses_OrderedByUserId_ReturnsCorrectNumberOfSuccesses() + { + var success1 = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; + var success2 = new SuccessEntity { UserId = 2, InquiryId = 2, IsFinished = false }; + var success3 = new SuccessEntity { UserId = 3, InquiryId = 3, IsFinished = true }; + + _dbContext.Successes.AddRange(success1, success2, success3); + _dbContext.SaveChanges(); + + var result = _successDataService.GetSuccesses(1, 2, SuccessOrderCriteria.ByUserId); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetSuccesses_OrderedByInquiryId_ReturnsCorrectNumberOfSuccesses() + { + var success1 = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; + var success2 = new SuccessEntity { UserId = 2, InquiryId = 2, IsFinished = false }; + var success3 = new SuccessEntity { UserId = 3, InquiryId = 3, IsFinished = true }; + + _dbContext.Successes.AddRange(success1, success2, success3); + _dbContext.SaveChanges(); + + var result = _successDataService.GetSuccesses(1, 2, SuccessOrderCriteria.ByInquiryId); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetSuccesses_OrderedByIsFinished_ReturnsCorrectNumberOfSuccesses() + { + var success1 = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; + var success2 = new SuccessEntity { UserId = 2, InquiryId = 2, IsFinished = false }; + var success3 = new SuccessEntity { UserId = 3, InquiryId = 3, IsFinished = true }; + + _dbContext.Successes.AddRange(success1, success2, success3); + _dbContext.SaveChanges(); + + var result = _successDataService.GetSuccesses(1, 2, SuccessOrderCriteria.ByIsFinished); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetSuccesses_WithBadPage_ReturnsCorrectNumberOfSuccesses() + { + var success1 = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; + var success2 = new SuccessEntity { UserId = 2, InquiryId = 2, IsFinished = false }; + var success3 = new SuccessEntity { UserId = 3, InquiryId = 3, IsFinished = true }; + + _dbContext.Successes.AddRange(success1, success2, success3); + _dbContext.SaveChanges(); + + var result = _successDataService.GetSuccesses(-42, 2, SuccessOrderCriteria.None); + + Assert.Equal(2, result.Count()); + } + + [Fact] + public void GetSuccesses_WithBadNumber_ReturnsCorrectNumberOfSuccesses() + { + var success1 = new SuccessEntity { UserId = 1, InquiryId = 1, IsFinished = true }; + var success2 = new SuccessEntity { UserId = 2, InquiryId = 2, IsFinished = false }; + var success3 = new SuccessEntity { UserId = 3, InquiryId = 3, IsFinished = true }; + + _dbContext.Successes.AddRange(success1, success2, success3); + _dbContext.SaveChanges(); + + var result = _successDataService.GetSuccesses(1, -42, SuccessOrderCriteria.None); + + Assert.Equal(3, result.Count()); + } [Fact] public void GetSuccessesByUserId_ReturnsCorrectSuccesses() From 9ceb4bed66e2145fcfc20f39b0942884f201bcf0 Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Thu, 21 Mar 2024 10:53:27 +0100 Subject: [PATCH 10/26] =?UTF-8?q?Changement=20des=20mots=20de=20passe=20da?= =?UTF-8?q?ns=20le=20contexte=20stubb=C3=A9=20car=20ils=20ne=20corresponda?= =?UTF-8?q?ient=20pas=20aux=20r=C3=A8gles=20du=20site?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/API/Controllers/UserController.cs | 2 +- API_SQLuedo/StubbedContextLib/StubbedContext.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/API_SQLuedo/API/Controllers/UserController.cs b/API_SQLuedo/API/Controllers/UserController.cs index fb57815..786186a 100644 --- a/API_SQLuedo/API/Controllers/UserController.cs +++ b/API_SQLuedo/API/Controllers/UserController.cs @@ -59,7 +59,7 @@ namespace API.Controllers catch (ArgumentException) { logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'username {username}.", username); - return NotFound(); + return NotFound("Utilisateur non trouvé !"); } } diff --git a/API_SQLuedo/StubbedContextLib/StubbedContext.cs b/API_SQLuedo/StubbedContextLib/StubbedContext.cs index db6995b..aca9691 100644 --- a/API_SQLuedo/StubbedContextLib/StubbedContext.cs +++ b/API_SQLuedo/StubbedContextLib/StubbedContext.cs @@ -21,7 +21,7 @@ public class StubbedContext : UserDbContext Id = 1, Username = "johnny", Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( - password: "motdepasse", + password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, @@ -34,7 +34,7 @@ public class StubbedContext : UserDbContext Id = 2, Username = "maxime", Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( - password: "motdepasse", + password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, @@ -47,7 +47,7 @@ public class StubbedContext : UserDbContext Id = 3, Username = "clement", Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( - password: "motdepasse", + password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, @@ -60,7 +60,7 @@ public class StubbedContext : UserDbContext Id = 4, Username = "erwan", Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( - password: "motdepasse", + password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, @@ -73,7 +73,7 @@ public class StubbedContext : UserDbContext Id = 5, Username = "victor", Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( - password: "motdepasse", + password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, From 0648340c09196cbf3112ead328a76a4ab908e147 Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Thu, 21 Mar 2024 11:22:34 +0100 Subject: [PATCH 11/26] =?UTF-8?q?Changement=20de=20l'algorithme=20de=20has?= =?UTF-8?q?hage=20de=20mot=20de=20passe=20pour=20correspondre=20=C3=A0=20c?= =?UTF-8?q?elui=20utilis=C3=A9=20en=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StubbedContextLib/StubbedContext.cs | 26 ++++++++++++------- .../StubbedContextLib.csproj | 1 + 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/API_SQLuedo/StubbedContextLib/StubbedContext.cs b/API_SQLuedo/StubbedContextLib/StubbedContext.cs index aca9691..b015ebc 100644 --- a/API_SQLuedo/StubbedContextLib/StubbedContext.cs +++ b/API_SQLuedo/StubbedContextLib/StubbedContext.cs @@ -1,5 +1,6 @@ using System.Security.Cryptography; using DbContextLib; +using DevOne.Security.Cryptography.BCrypt; using Entities; using Microsoft.AspNetCore.Cryptography.KeyDerivation; using Microsoft.EntityFrameworkCore; @@ -20,12 +21,13 @@ public class StubbedContext : UserDbContext { Id = 1, Username = "johnny", - Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( + /*Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, - numBytesRequested: 256 / 8)), + numBytesRequested: 256 / 8)),*/ + Password = BCryptHelper.HashPassword("Motdepasse", BCryptHelper.GenerateSalt()), Email = "Johnny.RATTON@etu.uca.fr", IsAdmin = true }, @@ -33,12 +35,13 @@ public class StubbedContext : UserDbContext { Id = 2, Username = "maxime", - Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( + /*Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, - numBytesRequested: 256 / 8)), + numBytesRequested: 256 / 8)),*/ + Password = BCryptHelper.HashPassword("Motdepasse", BCryptHelper.GenerateSalt()), Email = "Maxime.SAPOUNTZIS@etu.uca.fr", IsAdmin = true }, @@ -46,12 +49,13 @@ public class StubbedContext : UserDbContext { Id = 3, Username = "clement", - Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( + /*Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, - numBytesRequested: 256 / 8)), + numBytesRequested: 256 / 8)),*/ + Password = BCryptHelper.HashPassword("Motdepasse", BCryptHelper.GenerateSalt()), Email = "Clement.CHIEU@etu.uca.fr", IsAdmin = true }, @@ -59,12 +63,13 @@ public class StubbedContext : UserDbContext { Id = 4, Username = "erwan", - Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( + /*Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, - numBytesRequested: 256 / 8)), + numBytesRequested: 256 / 8)),*/ + Password = BCryptHelper.HashPassword("Motdepasse", BCryptHelper.GenerateSalt()), Email = "Erwan.MENAGER@etu.uca.fr", IsAdmin = true }, @@ -72,12 +77,13 @@ public class StubbedContext : UserDbContext { Id = 5, Username = "victor", - Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( + /*Password = Convert.ToBase64String(KeyDerivation.Pbkdf2( password: "Motdepasse", salt: RandomNumberGenerator.GetBytes(128 / 8), prf: KeyDerivationPrf.HMACSHA256, iterationCount: 100000, - numBytesRequested: 256 / 8)), + numBytesRequested: 256 / 8)),*/ + Password = BCryptHelper.HashPassword("Motdepasse", BCryptHelper.GenerateSalt()), Email = "Victor.GABORIT@etu.uca.fr", IsAdmin = true }); diff --git a/API_SQLuedo/StubbedContextLib/StubbedContextLib.csproj b/API_SQLuedo/StubbedContextLib/StubbedContextLib.csproj index c87b24a..8600f45 100644 --- a/API_SQLuedo/StubbedContextLib/StubbedContextLib.csproj +++ b/API_SQLuedo/StubbedContextLib/StubbedContextLib.csproj @@ -11,6 +11,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive From 39e332cf4b96fb7f23a4007849e2d666b8a9c1c9 Mon Sep 17 00:00:00 2001 From: clchieu Date: Sun, 24 Mar 2024 17:37:06 +0100 Subject: [PATCH 12/26] Essai sur la ci --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index d9da154..7f59e59 100644 --- a/.drone.yml +++ b/.drone.yml @@ -24,11 +24,11 @@ steps: - name: code-inspection image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dronesonarplugin-dotnet8 - secrets: [ SECRET_SONAR_LOGIN ] + secrets: [ TRY_SECERT ] environment: sonar_host: https://codefirst.iut.uca.fr/sonar/ sonar_token: - from_secret: SECRET_SONAR_LOGIN + from_secret: TRY_SECERT project_key: API_SQLuedo coverage_exclusions: "**/Test*/**,**/*Context*/**,**/Program.cs" commands: From d557cf48763c4221e0d7eb8032bc67f814fbe778 Mon Sep 17 00:00:00 2001 From: clchieu Date: Sun, 24 Mar 2024 17:39:35 +0100 Subject: [PATCH 13/26] =?UTF-8?q?R=C3=A9tablissement=20de=20la=20ci-cd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 7f59e59..d9da154 100644 --- a/.drone.yml +++ b/.drone.yml @@ -24,11 +24,11 @@ steps: - name: code-inspection image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dronesonarplugin-dotnet8 - secrets: [ TRY_SECERT ] + secrets: [ SECRET_SONAR_LOGIN ] environment: sonar_host: https://codefirst.iut.uca.fr/sonar/ sonar_token: - from_secret: TRY_SECERT + from_secret: SECRET_SONAR_LOGIN project_key: API_SQLuedo coverage_exclusions: "**/Test*/**,**/*Context*/**,**/Program.cs" commands: From cc1903ebfd1a1700ecf56d2db779bff4af766b31 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Sun, 24 Mar 2024 19:16:40 +0100 Subject: [PATCH 14/26] ajout d'un route GetByEmail pour dans UserController --- API_SQLuedo/API/Controllers/UserController.cs | 16 +++++++ API_SQLuedo/API/Service/UserDataServiceAPI.cs | 1 + .../DbDataManager/Service/UserDataService.cs | 11 +++++ API_SQLuedo/Shared/IUserService.cs | 1 + API_SQLuedo/TestAPI/UserUnitTest.cs | 42 +++++++++++++++++++ .../TestEF/Service/TestUserDataService.cs | 18 ++++++++ 6 files changed, 89 insertions(+) diff --git a/API_SQLuedo/API/Controllers/UserController.cs b/API_SQLuedo/API/Controllers/UserController.cs index fb57815..dc05be0 100644 --- a/API_SQLuedo/API/Controllers/UserController.cs +++ b/API_SQLuedo/API/Controllers/UserController.cs @@ -62,6 +62,22 @@ namespace API.Controllers return NotFound(); } } + [HttpGet("user/email/{email}")] + [ProducesResponseType(typeof(UserDto), 200)] + [ProducesResponseType(typeof(string), 404)] + public IActionResult GetByEmail(string email) + { + try + { + logger.LogInformation("[INFORMATION] Utilisateur avec l'username {email} a été trouvé.", email); + return Ok(userService.GetUserByEmail(email)); + } + catch (ArgumentException) + { + logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'username {email}.", email); + return NotFound(); + } + } [HttpDelete("user/{id:int}")] [ProducesResponseType(typeof(UserDto), 200)] diff --git a/API_SQLuedo/API/Service/UserDataServiceAPI.cs b/API_SQLuedo/API/Service/UserDataServiceAPI.cs index 72bca16..4100f76 100644 --- a/API_SQLuedo/API/Service/UserDataServiceAPI.cs +++ b/API_SQLuedo/API/Service/UserDataServiceAPI.cs @@ -17,6 +17,7 @@ public class UserDataServiceApi(IUserService userService) : IUserSer public UserDto GetUserById(int id) => userService.GetUserById(id).FromEntityToDto(); public UserDto GetUserByUsername(string username) => userService.GetUserByUsername(username).FromEntityToDto(); + public UserDto GetUserByEmail(string email) => userService.GetUserByEmail(email).FromEntityToDto(); public bool DeleteUser(int id) => userService.DeleteUser(id); diff --git a/API_SQLuedo/DbDataManager/Service/UserDataService.cs b/API_SQLuedo/DbDataManager/Service/UserDataService.cs index ebb3ba5..e9a175a 100644 --- a/API_SQLuedo/DbDataManager/Service/UserDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/UserDataService.cs @@ -37,6 +37,17 @@ public class UserDataService : IUserService return userEntity; } + public UserEntity GetUserByEmail(string email) + { + var userEntity = DbContext.Users.FirstOrDefault(u => u.Email == email); + if (userEntity == null) + { + throw new ArgumentException("Impossible de trouver l'utilisateur", nameof(email)); + } + + return userEntity; + } + public IEnumerable GetUsers(int page, int number, UserOrderCriteria orderCriteria) { if (page <= 0) diff --git a/API_SQLuedo/Shared/IUserService.cs b/API_SQLuedo/Shared/IUserService.cs index d1d458a..f052a84 100644 --- a/API_SQLuedo/Shared/IUserService.cs +++ b/API_SQLuedo/Shared/IUserService.cs @@ -7,6 +7,7 @@ namespace Shared public IEnumerable GetUsers(int page, int number, UserOrderCriteria orderCriteria); public TUser GetUserById(int id); public TUser GetUserByUsername(string username); + public TUser GetUserByEmail(string email); public bool DeleteUser(int id); public TUser UpdateUser(int id, TUser user); public TUser CreateUser(string username, string password, string email, bool isAdmin); diff --git a/API_SQLuedo/TestAPI/UserUnitTest.cs b/API_SQLuedo/TestAPI/UserUnitTest.cs index 1dc5b4e..027e74a 100644 --- a/API_SQLuedo/TestAPI/UserUnitTest.cs +++ b/API_SQLuedo/TestAPI/UserUnitTest.cs @@ -117,6 +117,28 @@ public class UserUnitTest Assert.True(valeur.IsAdmin); } } + [Fact] + public void GetUserEmailSuccess() + { + var userList = GetUsersData(); + _userService.Setup(x => x.GetUserByEmail("adressemail@gmail.com")) + .Returns(userList[0]); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.GetByEmail("adressemail@gmail.com"); + if (userResult is OkObjectResult okObjectResult) + { + UserDto valeur = okObjectResult.Value as UserDto; + + Assert.NotNull(valeur); + Assert.IsType(valeur); + Assert.Contains(valeur, userList); + Assert.Equal("adressemail@gmail.com", valeur.Email); + Assert.Equal("Useruser", valeur.Username); + Assert.Equal("motdepasse", valeur.Password); + Assert.True(valeur.IsAdmin); + } + } [Fact] public void GetUserUsernameFail() @@ -138,6 +160,26 @@ public class UserUnitTest Assert.False(userList == valeur); } } + [Fact] + public void GetUserEmailFail() + { + var userList = GetUsersData(); + _userService.Setup(x => x.GetUserByEmail("adressemail@gmail.com")) + .Returns(userList[0]); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.GetByEmail("GYIIieihhh"); + + if (userResult is NotFoundObjectResult nfObjectResult) + { + var valeur = nfObjectResult.Value; + + Assert.NotNull(valeur); + Assert.IsNotType(valeur); + Assert.DoesNotContain(valeur, userList); + Assert.False(userList == valeur); + } + } [Fact] public void DeleteUserSuccess() diff --git a/API_SQLuedo/TestEF/Service/TestUserDataService.cs b/API_SQLuedo/TestEF/Service/TestUserDataService.cs index 040f600..c998b72 100644 --- a/API_SQLuedo/TestEF/Service/TestUserDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestUserDataService.cs @@ -54,6 +54,15 @@ public class TestUserDataService var result = _userDataService.GetUserByUsername("Test1"); 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.SaveChanges(); + var result = _userDataService.GetUserByEmail("example@email.com"); + Assert.Equal(1, result.Id); + } [Fact] public void CreateUser_AddsNewUser() @@ -127,6 +136,15 @@ public class TestUserDataService Assert.Throws(() => _userDataService.GetUserByUsername("Test2")); } + + [Fact] + public void GetUserByEmail_WithoutUsername_ThrowsException() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + + Assert.Throws(() => _userDataService.GetUserByEmail("test@test")); + } [Fact] public void DeleteUser_WithoutId_ReturnsFalse() From 8640499d751cbe78a4df0b23f8feb84b96231629 Mon Sep 17 00:00:00 2001 From: clchieu Date: Mon, 25 Mar 2024 11:41:58 +0100 Subject: [PATCH 15/26] Ajout de la connexion string avec des variables d'environnement --- API_SQLuedo/DbContextLib/UserDbContext.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/API_SQLuedo/DbContextLib/UserDbContext.cs b/API_SQLuedo/DbContextLib/UserDbContext.cs index 849189c..4ae7447 100644 --- a/API_SQLuedo/DbContextLib/UserDbContext.cs +++ b/API_SQLuedo/DbContextLib/UserDbContext.cs @@ -26,7 +26,11 @@ namespace DbContextLib base.OnConfiguring(optionsBuilder); if (!optionsBuilder.IsConfigured) { - optionsBuilder.UseNpgsql("Host=localhost;Database=SQLuedo;Username=admin;Password=motdepasse"); + string host = Environment.GetEnvironmentVariable("DB_HOST") ?? "localhost"; + string database = Environment.GetEnvironmentVariable("DB_DATABASE") ?? "SQLuedo"; + string username = Environment.GetEnvironmentVariable("DB_USERNAME") ?? "admin"; + string password = Environment.GetEnvironmentVariable("DB_PASSWORD") ?? "motdepasse"; + optionsBuilder.UseNpgsql($"Host={host};Database={database};Username={username};Password={password}"); } } From bcfb7b3e9329d8840c020c131d127f9a13ce0c4e Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Mon, 25 Mar 2024 19:13:55 +0100 Subject: [PATCH 16/26] =?UTF-8?q?Ajout=20de=20tout=20le=20n=C3=A9cessaire?= =?UTF-8?q?=20pour=20g=C3=A9rer=20la=20Blacklist=20(controller,=20services?= =?UTF-8?q?,=20etc)=20accompagn=C3=A9=20de=20tests=20unitaires.=20Aussi=20?= =?UTF-8?q?ajout=20de=20m=C3=A9thodes=20manquantes=20sur=20les=20UserContr?= =?UTF-8?q?oller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../API/Controllers/BlackListController.cs | 88 +++++++++ API_SQLuedo/API/Controllers/UserController.cs | 50 +++++ API_SQLuedo/API/Program.cs | 3 + .../API/Service/BlackListDataServiceAPI.cs | 27 +++ API_SQLuedo/API/Service/UserDataServiceAPI.cs | 14 +- .../Service/BlackListDataService.cs | 85 +++++++++ .../DbDataManager/Service/UserDataService.cs | 52 +++++ .../OrderCriteria/BlackListOdrerCriteria.cs | 6 + ...rCriteria.cs => BlackListOrderCriteria.cs} | 0 API_SQLuedo/Shared/IBlackListService.cs | 12 ++ API_SQLuedo/Shared/IUserService.cs | 3 + API_SQLuedo/TestAPI/BlackListUnitTest.cs | 178 ++++++++++++++++++ .../BlackListDto.EqualityComparer.cs | 16 ++ API_SQLuedo/TestAPI/UserUnitTest.cs | 40 +++- .../Service/TestBlackListDataService.cs | 87 +++++++++ .../TestEF/Service/TestUserDataService.cs | 108 +++++++++++ 16 files changed, 767 insertions(+), 2 deletions(-) create mode 100644 API_SQLuedo/API/Controllers/BlackListController.cs create mode 100644 API_SQLuedo/API/Service/BlackListDataServiceAPI.cs create mode 100644 API_SQLuedo/DbDataManager/Service/BlackListDataService.cs create mode 100644 API_SQLuedo/Model/OrderCriteria/BlackListOdrerCriteria.cs rename API_SQLuedo/Model/OrderCriteria/{UserOrderCriteria.cs => BlackListOrderCriteria.cs} (100%) create mode 100644 API_SQLuedo/Shared/IBlackListService.cs create mode 100644 API_SQLuedo/TestAPI/BlackListUnitTest.cs create mode 100644 API_SQLuedo/TestAPI/Extensions/BlackListDto.EqualityComparer.cs create mode 100644 API_SQLuedo/TestEF/Service/TestBlackListDataService.cs diff --git a/API_SQLuedo/API/Controllers/BlackListController.cs b/API_SQLuedo/API/Controllers/BlackListController.cs new file mode 100644 index 0000000..7f2bc56 --- /dev/null +++ b/API_SQLuedo/API/Controllers/BlackListController.cs @@ -0,0 +1,88 @@ +using Dto; +using Entities; +using Microsoft.AspNetCore.Mvc; +using Model.OrderCriteria; +using Shared; +using Shared.Mapper; + +namespace API.Controllers; + +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) + { + var users = blackListService.GetBannedUsers(page, number, orderCriteria).ToList(); + if (users.Count == 0) + { + logger.LogError("[ERREUR] Aucun email banni trouvé."); + return StatusCode(204); + } + + logger.LogInformation("[INFORMATION] {nb} Email(s) banni(s) trouvé(s)", users.Count); + return Ok(users); + } + + [HttpGet("user/ban/number")] + [ProducesResponseType(typeof(UserDto), 200)] + [ProducesResponseType(typeof(string), 204)] + public IActionResult GetNumberOfBannedUsers() + { + var nb = blackListService.GetNumberOfBannedUsers(); + logger.LogInformation("[INFORMATION] {nb} Email(s) banni(s) trouvé(s)", nb); + return Ok(nb); + } + + [HttpPost("user/ban")] + [ProducesResponseType(typeof(UserDto), 200)] + [ProducesResponseType(typeof(string), 404)] + public IActionResult GetUserBannedByEmail([FromBody] string email) + { + var res = blackListService.GetUserBannedByEmail(email); + if (res != null) + { + logger.LogInformation("[INFORMATION] Utilisateur banni avec l'email {email} a été trouvé.", email); + return Ok(res); + } + logger.LogError("[ERREUR] Aucun utilisateur banni trouvé avec l'email {email}.", email); + return NotFound("Utilisateur non trouvé !"); + } + + [HttpDelete("user/ban/{username:alpha}")] + [ProducesResponseType(typeof(UserDto), 200)] + [ProducesResponseType(typeof(string), 404)] + public IActionResult BanUser(string username) + { + var success = blackListService.BanUser(username); + if (success) + { + logger.LogInformation("[INFORMATION] L'utilisateur avec le pseudo {username} a été banni pour 2 ans.", username); + return Ok(); + } + else + { + logger.LogError("[ERREUR] Aucun utilisateur trouvé avec le pseudo {username}.", username); + return NotFound(); + } + } + + [HttpPost("user/unban")] + [ProducesResponseType(typeof(UserDto), 200)] + [ProducesResponseType(typeof(string), 404)] + public IActionResult UnbanUser([FromBody] string email) + { + var success = blackListService.UnbanUser(email); + if (success) + { + logger.LogInformation("[INFORMATION] L'utilisateur avec l'email {email} a été débanni.", email); + return Ok(); + } + else + { + logger.LogError("[ERREUR] Aucun utilisateur banni trouvé avec l'email {email}.", email); + return NotFound(); + } + } +} \ No newline at end of file diff --git a/API_SQLuedo/API/Controllers/UserController.cs b/API_SQLuedo/API/Controllers/UserController.cs index b45a836..0d8a3cc 100644 --- a/API_SQLuedo/API/Controllers/UserController.cs +++ b/API_SQLuedo/API/Controllers/UserController.cs @@ -28,6 +28,38 @@ namespace API.Controllers logger.LogInformation("[INFORMATION] {nb} Utilisateur(s) trouvé(s)", users.Count); return Ok(users); } + + [HttpGet("users/not-admin/{page:int}/{number:int}")] + [ProducesResponseType(typeof(UserDto), 200)] + [ProducesResponseType(typeof(string), 204)] + public IActionResult GetNotAdminUsers(int page, int number, UserOrderCriteria orderCriteria) + { + var users = userService.GetNotAdminUsers(page, number, orderCriteria).ToList(); + if (users.Count == 0) + { + logger.LogError("[ERREUR] Aucun utilisateur trouvé."); + return StatusCode(204); + } + + logger.LogInformation("[INFORMATION] {nb} Utilisateur(s) trouvé(s)", users.Count); + return Ok(users); + } + + [HttpGet("users/number")] + [ProducesResponseType(typeof(UserDto), 200)] + [ProducesResponseType(typeof(string), 204)] + public IActionResult GetNumberOfUsers() + { + var users = userService.GetNumberOfUsers(); + if (users == 0) + { + logger.LogError("[ERREUR] Aucun utilisateur trouvé."); + return StatusCode(204); + } + + logger.LogInformation("[INFORMATION] {users} Utilisateur(s) trouvé(s)", users); + return Ok(new KeyValuePair("nbUsers", users)); + } [HttpGet("user/{id:int}")] [ProducesResponseType(typeof(UserDto), 200)] @@ -96,6 +128,24 @@ namespace API.Controllers return NotFound(); } } + + [HttpDelete("user/username/{username:alpha}")] + [ProducesResponseType(typeof(UserDto), 200)] + [ProducesResponseType(typeof(string), 404)] + public IActionResult DeleteUserByUsername(string username) + { + var success = userService.DeleteUserByUsername(username); + if (success) + { + logger.LogInformation("[INFORMATION] L'utilisateur avec le pseudo {username} a été supprimé.", username); + return Ok(); + } + else + { + logger.LogError("[ERREUR] Aucun utilisateur trouvé avec le pseudo {username}.", username); + return NotFound(); + } + } [HttpPost] [ProducesResponseType(typeof(UserDto), 201)] diff --git a/API_SQLuedo/API/Program.cs b/API_SQLuedo/API/Program.cs index 529a451..e34c27e 100644 --- a/API_SQLuedo/API/Program.cs +++ b/API_SQLuedo/API/Program.cs @@ -22,6 +22,9 @@ builder.Services.AddSwaggerGen(); builder.Services.AddScoped, UserDataService>(); builder.Services.AddScoped, UserDataServiceApi>(); +builder.Services.AddScoped, BlackListDataService>(); +builder.Services.AddScoped, BlackListDataServiceAPI>(); + builder.Services.AddScoped, InquiryDataService>(); builder.Services.AddScoped, InquiryDataServiceApi>(); diff --git a/API_SQLuedo/API/Service/BlackListDataServiceAPI.cs b/API_SQLuedo/API/Service/BlackListDataServiceAPI.cs new file mode 100644 index 0000000..cac7fc8 --- /dev/null +++ b/API_SQLuedo/API/Service/BlackListDataServiceAPI.cs @@ -0,0 +1,27 @@ +using Dto; +using Entities; +using Model.OrderCriteria; +using Shared; +using Shared.Mapper; + +namespace API.Service; + +public class BlackListDataServiceAPI (IBlackListService userService) : IBlackListService +{ + public IEnumerable GetBannedUsers(int page, int number, BlackListOdrerCriteria orderCriteria) => + userService.GetBannedUsers(page, number, orderCriteria).Select(b => b.FromEntityToDto()); + + public int GetNumberOfBannedUsers() => userService.GetNumberOfBannedUsers(); + public BlackListDto? GetUserBannedByEmail(string email) + { + var res = userService.GetUserBannedByEmail(email); + if (res == null) + { + return null; + } + return res.FromEntityToDto(); + } + + public bool BanUser(string username) => userService.BanUser(username); + public bool UnbanUser(string email) => userService.UnbanUser(email); +} \ No newline at end of file diff --git a/API_SQLuedo/API/Service/UserDataServiceAPI.cs b/API_SQLuedo/API/Service/UserDataServiceAPI.cs index 4100f76..273e5f0 100644 --- a/API_SQLuedo/API/Service/UserDataServiceAPI.cs +++ b/API_SQLuedo/API/Service/UserDataServiceAPI.cs @@ -13,13 +13,25 @@ public class UserDataServiceApi(IUserService userService) : IUserSer var usersEntities = userService.GetUsers(page, number, orderCriteria); return usersEntities.Select(e => e.FromEntityToDto()).ToList(); } - + + public IEnumerable GetNotAdminUsers(int page, int number, UserOrderCriteria orderCriteria) + { + var usersEntities = userService.GetNotAdminUsers(page, number, orderCriteria); + return usersEntities.Select(e => e.FromEntityToDto()).ToList(); + } + + public int GetNumberOfUsers() + { + return userService.GetNumberOfUsers(); + } public UserDto GetUserById(int id) => userService.GetUserById(id).FromEntityToDto(); public UserDto GetUserByUsername(string username) => userService.GetUserByUsername(username).FromEntityToDto(); public UserDto GetUserByEmail(string email) => userService.GetUserByEmail(email).FromEntityToDto(); public bool DeleteUser(int id) => userService.DeleteUser(id); + + public bool DeleteUserByUsername(string username) => userService.DeleteUserByUsername(username); public UserDto UpdateUser(int id, UserDto user) => userService.UpdateUser(id, user.FromDtoToEntity()).FromEntityToDto(); diff --git a/API_SQLuedo/DbDataManager/Service/BlackListDataService.cs b/API_SQLuedo/DbDataManager/Service/BlackListDataService.cs new file mode 100644 index 0000000..31a0723 --- /dev/null +++ b/API_SQLuedo/DbDataManager/Service/BlackListDataService.cs @@ -0,0 +1,85 @@ +using DbContextLib; +using Entities; +using Microsoft.EntityFrameworkCore; +using Model.OrderCriteria; +using Shared; + +namespace DbDataManager.Service; + +public class BlackListDataService : IBlackListService +{ + private UserDbContext DbContext { get; set; } + + public BlackListDataService(UserDbContext context) + { + DbContext = context; + context.Database.EnsureCreated(); + } + + public int GetNumberOfBannedUsers() + { + return DbContext.BlackLists.Count(); + } + public IEnumerable GetBannedUsers(int page, int number, BlackListOdrerCriteria orderCriteria) + { + if (page <= 0) + { + page = 1; + } + + if (number <= 0) + { + number = 10; + } + IQueryable query = DbContext.BlackLists.Skip((page - 1) * number).Take(number); + switch (orderCriteria) + { + case BlackListOdrerCriteria.None: + break; + case BlackListOdrerCriteria.ByEmail: + query = query.OrderBy(s => s.Email); + break; + case BlackListOdrerCriteria.ByExpirationDate: + query = query.OrderBy(s => s.ExpirationDate); + break; + default: + break; + } + + var blackList = query.ToList(); + return blackList; + } + public BlackListEntity? GetUserBannedByEmail(string email) + { + var blackListEntity = DbContext.BlackLists.FirstOrDefault(b => b.Email == email); + return blackListEntity; + } + + public bool BanUser(string username) + { + var userEntity = DbContext.Users.FirstOrDefault(u => u.Username == username); + if (userEntity == null) + { + return false; + } + + DbContext.BlackLists.Add(new BlackListEntity + { Email = userEntity.Email, ExpirationDate = DateOnly.FromDateTime(DateTime.Now.AddYears(2)) }); + DbContext.Users.Remove(userEntity); + DbContext.SaveChangesAsync(); + return true; + } + + public bool UnbanUser(string email) + { + var blackListEntity = DbContext.BlackLists.FirstOrDefault(b => b.Email == email); + if (blackListEntity == null) + { + return false; + } + + DbContext.BlackLists.Remove(blackListEntity); + DbContext.SaveChangesAsync(); + return true; + } +} \ No newline at end of file diff --git a/API_SQLuedo/DbDataManager/Service/UserDataService.cs b/API_SQLuedo/DbDataManager/Service/UserDataService.cs index e9a175a..4676d15 100644 --- a/API_SQLuedo/DbDataManager/Service/UserDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/UserDataService.cs @@ -83,6 +83,45 @@ public class UserDataService : IUserService return users; } + public IEnumerable GetNotAdminUsers(int page, int number, UserOrderCriteria orderCriteria) + { + if (page <= 0) + { + page = 1; + } + if (number <= 0) + { + number = 10; + } + IQueryable query = DbContext.Users.Where(u => u.IsAdmin == false).Skip((page - 1) * number).Take(number); + switch (orderCriteria) + { + case UserOrderCriteria.None: + break; + case UserOrderCriteria.ById: + query = query.OrderBy(s => s.Id); + break; + case UserOrderCriteria.ByUsername: + query = query.OrderBy(s => s.Username); + break; + case UserOrderCriteria.ByEmail: + query = query.OrderBy(s => s.Email); + break; + case UserOrderCriteria.ByIsAdmin: + query = query.OrderBy(s => s.IsAdmin); + break; + default: + break; + } + + var users = query.ToList(); + return users; + } + public int GetNumberOfUsers() + { + return DbContext.Users.Count(); + } + public bool DeleteUser(int id) { var userEntity = DbContext.Users.FirstOrDefault(u => u.Id == id); @@ -96,6 +135,19 @@ public class UserDataService : IUserService return true; } + public bool DeleteUserByUsername(string username) + { + var userEntity = DbContext.Users.FirstOrDefault(u => u.Username == username); + if (userEntity == null) + { + return false; + } + + DbContext.Users.Remove(userEntity); + DbContext.SaveChangesAsync(); + return true; + } + public UserEntity UpdateUser(int id, UserEntity user) { var updatingUser = DbContext.Users.FirstOrDefault(u => u.Id == id); diff --git a/API_SQLuedo/Model/OrderCriteria/BlackListOdrerCriteria.cs b/API_SQLuedo/Model/OrderCriteria/BlackListOdrerCriteria.cs new file mode 100644 index 0000000..9d906fc --- /dev/null +++ b/API_SQLuedo/Model/OrderCriteria/BlackListOdrerCriteria.cs @@ -0,0 +1,6 @@ +namespace Model.OrderCriteria; + +public enum BlackListOdrerCriteria +{ + None, ByEmail, ByExpirationDate +} \ No newline at end of file diff --git a/API_SQLuedo/Model/OrderCriteria/UserOrderCriteria.cs b/API_SQLuedo/Model/OrderCriteria/BlackListOrderCriteria.cs similarity index 100% rename from API_SQLuedo/Model/OrderCriteria/UserOrderCriteria.cs rename to API_SQLuedo/Model/OrderCriteria/BlackListOrderCriteria.cs diff --git a/API_SQLuedo/Shared/IBlackListService.cs b/API_SQLuedo/Shared/IBlackListService.cs new file mode 100644 index 0000000..5be6d7a --- /dev/null +++ b/API_SQLuedo/Shared/IBlackListService.cs @@ -0,0 +1,12 @@ +using Model.OrderCriteria; + +namespace Shared; + +public interface IBlackListService +{ + public IEnumerable GetBannedUsers(int page, int number, BlackListOdrerCriteria orderCriteria); + public int GetNumberOfBannedUsers(); + public TBlackList? GetUserBannedByEmail(string email); + public bool BanUser(string username); + public bool UnbanUser(string email); +} \ No newline at end of file diff --git a/API_SQLuedo/Shared/IUserService.cs b/API_SQLuedo/Shared/IUserService.cs index f052a84..06051a9 100644 --- a/API_SQLuedo/Shared/IUserService.cs +++ b/API_SQLuedo/Shared/IUserService.cs @@ -5,10 +5,13 @@ namespace Shared public interface IUserService { public IEnumerable GetUsers(int page, int number, UserOrderCriteria orderCriteria); + public IEnumerable GetNotAdminUsers(int page, int number, UserOrderCriteria orderCriteria); + public int GetNumberOfUsers(); public TUser GetUserById(int id); public TUser GetUserByUsername(string username); public TUser GetUserByEmail(string email); public bool DeleteUser(int id); + public bool DeleteUserByUsername(string username); public TUser UpdateUser(int id, TUser user); public TUser CreateUser(string username, string password, string email, bool isAdmin); } diff --git a/API_SQLuedo/TestAPI/BlackListUnitTest.cs b/API_SQLuedo/TestAPI/BlackListUnitTest.cs new file mode 100644 index 0000000..5bdd550 --- /dev/null +++ b/API_SQLuedo/TestAPI/BlackListUnitTest.cs @@ -0,0 +1,178 @@ +using API.Controllers; +using Dto; +using Entities; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging.Abstractions; +using Model.OrderCriteria; +using Moq; +using Shared; +using TestAPI.Extensions; + +namespace TestAPI; + +public class BlackListUnitTest +{ + private readonly Mock> _blackListService; + + public BlackListUnitTest() + { + _blackListService = new Mock>(); + } + [Fact] + public void IsBanned() + { + _blackListService.Setup(x => x.GetUserBannedByEmail("email@example.com")) + .Returns(new BlackListDto { Email = "email@example.com", ExpirationDate = DateOnly.FromDateTime(DateTime.Now)}); + var usersController = new BlackListController(new NullLogger(), _blackListService.Object); + var result = usersController.GetUserBannedByEmail("email@example.com"); + Assert.Equal(typeof(OkObjectResult), result.GetType()); + } + + [Fact] + public void IsBannedNotFound() + { + _blackListService.Setup(x => x.GetUserBannedByEmail("example@notfound.com")) + .Returns(null); + var usersController = new BlackListController(new NullLogger(), _blackListService.Object); + var result = usersController.GetUserBannedByEmail("example@notfound.com"); + Assert.Equal(typeof(NotFoundObjectResult), result.GetType()); + } + + [Fact] + public void BanUser() + { + _blackListService.Setup(x => x.BanUser("Test1")) + .Returns(true); + var usersController = new BlackListController(new NullLogger(), _blackListService.Object); + + var userResult = usersController.BanUser("Test1"); + Assert.Equal(typeof(OkResult), userResult.GetType()); + } + + [Fact] + public void BanUserNotFound() + { + _blackListService.Setup(x => x.BanUser("Test1")) + .Returns(true); + var usersController = new BlackListController(new NullLogger(), _blackListService.Object); + + var userResult = usersController.BanUser("Test42"); + Assert.Equal(typeof(NotFoundResult), userResult.GetType()); + } + + [Fact] + public void UnbanUser() + { + _blackListService.Setup(x => x.UnbanUser("example@email.com")) + .Returns(true); + var usersController = new BlackListController(new NullLogger(), _blackListService.Object); + + var userResult = usersController.UnbanUser("example@email.com"); + Assert.Equal(typeof(OkResult), userResult.GetType()); + } + + [Fact] + public void UnbanUserNotFound() + { + _blackListService.Setup(x => x.UnbanUser("example@email.com")) + .Returns(false); + var usersController = new BlackListController(new NullLogger(), _blackListService.Object); + + var userResult = usersController.UnbanUser("example@email.com"); + Assert.Equal(typeof(NotFoundResult), userResult.GetType()); + } + + [Fact] + public void GetBannedUsers_NoneOrderCriteria() + { + _blackListService.Setup(x => x.GetBannedUsers(1,10,BlackListOdrerCriteria.None)) + .Returns(new List() + { + new BlackListDto { Email = "example1@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) }, + new BlackListDto { Email = "example2@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) }, + new BlackListDto { Email = "example3@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) } + }); + var blackListController = new BlackListController(new NullLogger(), _blackListService.Object); + + var result = blackListController.GetUsers(1,10,BlackListOdrerCriteria.None); + Assert.Equal(typeof(OkObjectResult), result.GetType()); + if (result is OkObjectResult okObjectResult) + { + var valeur = okObjectResult.Value; + + Assert.NotNull(valeur); + Assert.Equal(GetBlackList().ToString(), valeur.ToString()); + Assert.True(GetBlackList().SequenceEqual(valeur as IEnumerable, new BlackListDtoEqualityComparer())); + } + } + + [Fact] + public void GetBannedUsers_OrderByEmail() + { + _blackListService.Setup(x => x.GetBannedUsers(1,10,BlackListOdrerCriteria.ByEmail)) + .Returns(new List() + { + new BlackListDto { Email = "example1@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) }, + new BlackListDto { Email = "example2@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) }, + new BlackListDto { Email = "example3@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) } + }); + var blackListController = new BlackListController(new NullLogger(), _blackListService.Object); + + var result = blackListController.GetUsers(1,10,BlackListOdrerCriteria.ByEmail); + Assert.Equal(typeof(OkObjectResult), result.GetType()); + if (result is OkObjectResult okObjectResult) + { + var valeur = okObjectResult.Value; + + Assert.NotNull(valeur); + Assert.Equal(GetBlackList().ToString(), valeur.ToString()); + Assert.True(GetBlackList().SequenceEqual(valeur as IEnumerable, new BlackListDtoEqualityComparer())); + } + } + + [Fact] + public void GetBannedUsers_OrderedByExpirationDate() + { + _blackListService.Setup(x => x.GetBannedUsers(1,10,BlackListOdrerCriteria.ByExpirationDate)) + .Returns(new List() + { + new BlackListDto { Email = "example1@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) }, + new BlackListDto { Email = "example2@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) }, + new BlackListDto { Email = "example3@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) } + }); + var blackListController = new BlackListController(new NullLogger(), _blackListService.Object); + + var result = blackListController.GetUsers(1,10,BlackListOdrerCriteria.ByExpirationDate); + Assert.Equal(typeof(OkObjectResult), result.GetType()); + if (result is OkObjectResult okObjectResult) + { + var valeur = okObjectResult.Value; + + Assert.NotNull(valeur); + Assert.Equal(GetBlackList().ToString(), valeur.ToString()); + Assert.True(GetBlackList().SequenceEqual(valeur as IEnumerable, new BlackListDtoEqualityComparer())); + } + } + + [Fact] + public void GetNbBannedUsers() + { + _blackListService.Setup(x => x.GetNumberOfBannedUsers()) + .Returns(10); + var usersController = new BlackListController(new NullLogger(), _blackListService.Object); + + var userResult = usersController.GetNumberOfBannedUsers(); + Assert.Equal(typeof(OkObjectResult), userResult.GetType()); + Assert.Equal(10, (userResult as OkObjectResult).Value); + } + + private IEnumerable GetBlackList() + { + return new List() + { + new BlackListDto { Email = "example1@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) }, + new BlackListDto { Email = "example2@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) }, + new BlackListDto { Email = "example3@email.com" , ExpirationDate = DateOnly.FromDateTime(DateTime.Now) } + }; + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestAPI/Extensions/BlackListDto.EqualityComparer.cs b/API_SQLuedo/TestAPI/Extensions/BlackListDto.EqualityComparer.cs new file mode 100644 index 0000000..a5d3732 --- /dev/null +++ b/API_SQLuedo/TestAPI/Extensions/BlackListDto.EqualityComparer.cs @@ -0,0 +1,16 @@ +using Dto; + +namespace TestAPI.Extensions; + +public class BlackListDtoEqualityComparer : EqualityComparer +{ + public override bool Equals(BlackListDto x, BlackListDto y) + { + return x.Email == y.Email; + } + + public override int GetHashCode(BlackListDto obj) + { + return obj.Email.GetHashCode(); + } +} \ No newline at end of file diff --git a/API_SQLuedo/TestAPI/UserUnitTest.cs b/API_SQLuedo/TestAPI/UserUnitTest.cs index 027e74a..39345d0 100644 --- a/API_SQLuedo/TestAPI/UserUnitTest.cs +++ b/API_SQLuedo/TestAPI/UserUnitTest.cs @@ -18,7 +18,25 @@ public class UserUnitTest } [Fact] - public void GetUserListSuccess() + public void GetNumberOfUsers() + { + var userList = GetUsersData(); + _userService.Setup(x => x.GetNumberOfUsers()) + .Returns(userList.Count); + var usersController = new UsersController(new NullLogger(), _userService.Object); + + var userResult = usersController.GetNumberOfUsers(); + + if (userResult is OkObjectResult okObjectResult) + { + var valeur = (okObjectResult.Value as KeyValuePair?); + Assert.NotNull(valeur); + Assert.Equal(userList.Count, valeur.Value.Value); + } + } + + [Fact] + public void GetUsersListSuccess() { var userList = GetUsersData(); _userService.Setup(x => x.GetUsers(1, 4, 0)) @@ -36,6 +54,26 @@ public class UserUnitTest Assert.True(userList.SequenceEqual(valeur as IEnumerable, new UserIdEqualityComparer())); } } + + [Fact] + public void GetNotAdminUsersListSuccess() + { + 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.GetNotAdminUsers(1, 4, 0); + + if (userResult is OkObjectResult okObjectResult) + { + 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())); + } + } [Fact] public void GetUserListFail() diff --git a/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs new file mode 100644 index 0000000..e4bbe1c --- /dev/null +++ b/API_SQLuedo/TestEF/Service/TestBlackListDataService.cs @@ -0,0 +1,87 @@ +using DbContextLib; +using DbDataManager.Service; +using Entities; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Model.OrderCriteria; + +namespace TestEF.Service; + +public class TestBlackListDataService +{ + private readonly UserDbContext _dbContext; + private readonly BlackListDataService _blackListDataService; + + public TestBlackListDataService() + { + var connection = new SqliteConnection("DataSource=:memory:"); + connection.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(connection) + .Options; + + _dbContext = new UserDbContext(options); + _blackListDataService = new BlackListDataService(_dbContext); + } + [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.SaveChanges(); + var banResult = _blackListDataService.BanUser("Test1"); + 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.SaveChanges(); + var banResult1 = _blackListDataService.BanUser("Test1"); + var banResult2 = _blackListDataService.BanUser("Test2"); + var banResult3 = _blackListDataService.BanUser("Test3"); + Assert.True(banResult1); + Assert.True(banResult2); + Assert.True(banResult3); + Assert.Equal(3, _dbContext.BlackLists.Count()); + } + + [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.SaveChanges(); + var banResult = _blackListDataService.BanUser("Test42"); + Assert.False(banResult); + } + + [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.SaveChanges(); + var banResult = _blackListDataService.BanUser("Test1"); + Assert.True(banResult); + Assert.NotNull(_blackListDataService.GetUserBannedByEmail("example1@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.SaveChanges(); + var banResult = _blackListDataService.BanUser("Test1"); + Assert.True(banResult); + Assert.True(_blackListDataService.UnbanUser("example1@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 c998b72..0908398 100644 --- a/API_SQLuedo/TestEF/Service/TestUserDataService.cs +++ b/API_SQLuedo/TestEF/Service/TestUserDataService.cs @@ -34,6 +34,94 @@ public class TestUserDataService var result = _userDataService.GetUsers(1, 2, UserOrderCriteria.None); Assert.Equal(2, result.Count()); } + + [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.SaveChanges(); + var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.None); + Assert.Equal(1, result.Count()); + } + + [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.SaveChanges(); + var result = _userDataService.GetNotAdminUsers(-42, 2, UserOrderCriteria.None); + Assert.Equal(1, result.Count()); + } + + [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.SaveChanges(); + var result = _userDataService.GetNotAdminUsers(1, -42, UserOrderCriteria.None); + Assert.Equal(1, result.Count()); + } + + [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.SaveChanges(); + var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.ById); + Assert.Equal(1, result.Count()); + } + + [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.SaveChanges(); + var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.ByUsername); + Assert.Equal(1, result.Count()); + } + + [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.SaveChanges(); + var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.ByEmail); + Assert.Equal(1, result.Count()); + } + + [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.SaveChanges(); + var result = _userDataService.GetNotAdminUsers(1, 2, UserOrderCriteria.ByIsAdmin); + Assert.Equal(1, result.Count()); + } + + [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.SaveChanges(); + var result = _userDataService.GetNumberOfUsers(); + Assert.Equal(3, result); + } [Fact] public void GetUserById_ReturnsCorrectUser() @@ -80,6 +168,15 @@ public class TestUserDataService _userDataService.DeleteUser(1); Assert.Empty(_dbContext.Inquiries); } + + [Fact] + public void DeleteUserByUsername_RemovesUser() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + _userDataService.DeleteUserByUsername("Test1"); + Assert.Empty(_dbContext.Inquiries); + } [Fact] public void UpdateUser_UpdatesExistingUser() @@ -156,6 +253,17 @@ public class TestUserDataService Assert.False(result); } + + [Fact] + public void DeleteUserByUsername_WithoutExisting_ReturnsFalse() + { + _dbContext.Users.Add(new UserEntity() { Id = 1, Username = "Test1", Email = "example@email.com", Password = "password", IsAdmin = true }); + _dbContext.SaveChanges(); + + var result = _userDataService.DeleteUserByUsername("Test2"); + + Assert.False(result); + } [Fact] public void UpdateUser_WithoutId_ThrowsException() From 83903a96bdf2630f1dc8465e71a001a0b6452738 Mon Sep 17 00:00:00 2001 From: Nestisse Date: Tue, 26 Mar 2024 17:08:42 +0100 Subject: [PATCH 17/26] =?UTF-8?q?Ajout=20du=20d=C3=A9ploiement=20pour=20la?= =?UTF-8?q?=20base=20de=20donn=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .drone.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index d9da154..d9cdc1a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -40,4 +40,19 @@ steps: - reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport" - dotnet publish API_SQLuedo.sln -c Release --no-restore -o CI_PROJECT_DIR/build/release - dotnet sonarscanner end /d:sonar.login=$${sonar_token} - depends_on: [ build ] \ No newline at end of file + depends_on: [ build ] + + - name: deploy-sqluedo-db + image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest + environment: + IMAGENAME: postgres:16.2 + CONTAINERNAME: sqluedo-db + COMMAND: create + OVERWRITE: true + CODEFIRST_CLIENTDRONE_ENV_POSTGRES_USER: + from_secret: db_username + CODEFIRST_CLIENTDRONE_ENV_POSTGRES_PASSWORD: + from_secret: db_password + CODEFIRST_CLIENTDRONE_ENV_POSTGRES_DB: + from_secret: db_database + ADMINS: erwanmenager,maximesapountzis,johnnyratton,victorgaborit,clementchieu \ No newline at end of file From aeede41dadb35b83a800615fad7bbf601aa6ba9e Mon Sep 17 00:00:00 2001 From: Nestisse Date: Tue, 26 Mar 2024 17:10:23 +0100 Subject: [PATCH 18/26] Passage du container en private --- .drone.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.drone.yml b/.drone.yml index d9cdc1a..134b1f8 100644 --- a/.drone.yml +++ b/.drone.yml @@ -49,6 +49,7 @@ steps: CONTAINERNAME: sqluedo-db COMMAND: create OVERWRITE: true + PRIVATE: true CODEFIRST_CLIENTDRONE_ENV_POSTGRES_USER: from_secret: db_username CODEFIRST_CLIENTDRONE_ENV_POSTGRES_PASSWORD: From 4ba856e7d3a7da74052c1d436f3c2c6eedd99746 Mon Sep 17 00:00:00 2001 From: Nestisse Date: Tue, 26 Mar 2024 17:33:41 +0100 Subject: [PATCH 19/26] =?UTF-8?q?Retour=20=C3=A0=20l'ancien=20connection?= =?UTF-8?q?=20string=20en=20pr=C3=A9vision=20de=20la=20nouvelle=20avec=20l?= =?UTF-8?q?a=20variable=20d'environnement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/DbContextLib/UserDbContext.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/API_SQLuedo/DbContextLib/UserDbContext.cs b/API_SQLuedo/DbContextLib/UserDbContext.cs index 4ae7447..8c84706 100644 --- a/API_SQLuedo/DbContextLib/UserDbContext.cs +++ b/API_SQLuedo/DbContextLib/UserDbContext.cs @@ -26,11 +26,8 @@ namespace DbContextLib base.OnConfiguring(optionsBuilder); if (!optionsBuilder.IsConfigured) { - string host = Environment.GetEnvironmentVariable("DB_HOST") ?? "localhost"; - string database = Environment.GetEnvironmentVariable("DB_DATABASE") ?? "SQLuedo"; - string username = Environment.GetEnvironmentVariable("DB_USERNAME") ?? "admin"; - string password = Environment.GetEnvironmentVariable("DB_PASSWORD") ?? "motdepasse"; - optionsBuilder.UseNpgsql($"Host={host};Database={database};Username={username};Password={password}"); + //optionsBuilder.UseNpgsql(Environment.GetEnvironmentVariable("CONNECTION_STRING", EnvironmentVariableTarget.Process)); + optionsBuilder.UseNpgsql("Host=localhost;Database=SQLuedo;Username=admin;Password=motdepasse"); } } From d03d695e6885e84d97849d0a767fb8d81a35ba16 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Wed, 27 Mar 2024 13:24:02 +0100 Subject: [PATCH 20/26] 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 21/26] =?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 22/26] 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 8e0c19eea845394284aa0aad0bda7656e2d17c80 Mon Sep 17 00:00:00 2001 From: clchieu Date: Wed, 27 Mar 2024 16:33:35 +0100 Subject: [PATCH 23/26] Modification mot de passe --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 134b1f8..95ed74b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -56,4 +56,4 @@ steps: from_secret: db_password CODEFIRST_CLIENTDRONE_ENV_POSTGRES_DB: from_secret: db_database - ADMINS: erwanmenager,maximesapountzis,johnnyratton,victorgaborit,clementchieu \ No newline at end of file + ADMINS: erwanmenager,maximesapountzis,johnnyratton,victorgaborit,clementchieu \ No newline at end of file From 823701a57ec4ef4ee646ece67e7e7ab5cc164550 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Wed, 27 Mar 2024 17:50:41 +0100 Subject: [PATCH 24/26] 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 e906584989b13f344004b3f0bd06fe323394d9b0 Mon Sep 17 00:00:00 2001 From: Victor GABORIT Date: Thu, 28 Mar 2024 10:19:53 +0100 Subject: [PATCH 25/26] 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 26/26] =?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() {