From 2071f8ba32043eb7b20d188920aaba18968441a3 Mon Sep 17 00:00:00 2001 From: "matheo.thierry" Date: Thu, 1 Jun 2023 22:48:10 +0200 Subject: [PATCH] Fix persistance - working | database tests reworked --- notus/Biblioteque_de_Class/Database.cs | 9 +- notus/Biblioteque_de_Class/Logo.cs | 4 + notus/Biblioteque_de_Class/NoteImage.cs | 5 + notus/Biblioteque_de_Class/Tags.cs | 4 + notus/Biblioteque_de_Class/Theme.cs | 4 + notus/Biblioteque_de_Class/User.cs | 2 +- notus/Notus_Console/Program.cs | 16 +- notus/Notus_Persistence/ToJSON.cs | 106 ---------- notus/Notus_Persistence/ToXML.cs | 9 +- notus/Tests/UnitTests_Model/Database.cs | 16 -- notus/Tests/UnitTests_Model/Database_Tests.cs | 181 ++++++++++++++++++ .../{Note.cs => Note_Tests.cs} | 2 +- .../UnitTests_Model/UnitTests_Model.csproj | 4 + .../{User.cs => User_Tests.cs} | 2 +- .../{ToXML.cs => Stub_Tests.cs} | 2 +- notus/Tests/UnitTests_Persistance/ToJson.cs | 16 -- .../UnitTests_Persistance/ToXML_Tests.cs | 12 ++ 17 files changed, 246 insertions(+), 148 deletions(-) delete mode 100644 notus/Notus_Persistence/ToJSON.cs delete mode 100644 notus/Tests/UnitTests_Model/Database.cs create mode 100644 notus/Tests/UnitTests_Model/Database_Tests.cs rename notus/Tests/UnitTests_Model/{Note.cs => Note_Tests.cs} (91%) rename notus/Tests/UnitTests_Model/{User.cs => User_Tests.cs} (91%) rename notus/Tests/UnitTests_Persistance/{ToXML.cs => Stub_Tests.cs} (84%) delete mode 100644 notus/Tests/UnitTests_Persistance/ToJson.cs create mode 100644 notus/Tests/UnitTests_Persistance/ToXML_Tests.cs diff --git a/notus/Biblioteque_de_Class/Database.cs b/notus/Biblioteque_de_Class/Database.cs index 7629ee6..ce2e31d 100644 --- a/notus/Biblioteque_de_Class/Database.cs +++ b/notus/Biblioteque_de_Class/Database.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace Biblioteque_de_Class { - [DataContract(IsReference = true)] + [DataContract] public class Database { [DataMember] @@ -169,7 +169,7 @@ namespace Biblioteque_de_Class { foreach(User existingUser in UserList) { - if(existingUser.Username == user.Username) + if(existingUser.Username == newUsername) { throw new AlreadyUsedException("this username is already used."); } @@ -177,6 +177,11 @@ namespace Biblioteque_de_Class user.Username = newUsername; } + /// + /// vérifier si le nom du theme n'est pas déjà pris + /// + /// + /// public bool VerifThemeNameNotTaken(string name) { foreach (Theme theme in ThemeList) diff --git a/notus/Biblioteque_de_Class/Logo.cs b/notus/Biblioteque_de_Class/Logo.cs index 30d74dd..f96fc27 100644 --- a/notus/Biblioteque_de_Class/Logo.cs +++ b/notus/Biblioteque_de_Class/Logo.cs @@ -1,14 +1,18 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace Biblioteque_de_Class { + [DataContract] public class Logo { + [DataMember] public string Name { get; set; } + [DataMember] public string LogoLink { get; set; } public Logo(string name, string logoLink) diff --git a/notus/Biblioteque_de_Class/NoteImage.cs b/notus/Biblioteque_de_Class/NoteImage.cs index 2471a16..e0a4fa7 100644 --- a/notus/Biblioteque_de_Class/NoteImage.cs +++ b/notus/Biblioteque_de_Class/NoteImage.cs @@ -1,15 +1,20 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace Biblioteque_de_Class { + [DataContract] public class NoteImage { + [DataMember] public string Name { get; set; } + [DataMember] public string ImageLink { get; set; } + [DataMember] public List Position { get; set; } public NoteImage(string name, string imageLink, List position) diff --git a/notus/Biblioteque_de_Class/Tags.cs b/notus/Biblioteque_de_Class/Tags.cs index a0c4ec2..f5d046b 100644 --- a/notus/Biblioteque_de_Class/Tags.cs +++ b/notus/Biblioteque_de_Class/Tags.cs @@ -1,14 +1,18 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace Biblioteque_de_Class { + [DataContract] public class Tags { + [DataMember] public string Name { get; set; } + [DataMember] public string Color { get; set; } public Tags(string name, string color) diff --git a/notus/Biblioteque_de_Class/Theme.cs b/notus/Biblioteque_de_Class/Theme.cs index 15f16e7..b08d299 100644 --- a/notus/Biblioteque_de_Class/Theme.cs +++ b/notus/Biblioteque_de_Class/Theme.cs @@ -1,14 +1,18 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace Biblioteque_de_Class { + [DataContract] public class Theme { + [DataMember] public string Name { get; set; } + [DataMember] public List ColorList { get; private set; } public Theme(string name, List colorList) diff --git a/notus/Biblioteque_de_Class/User.cs b/notus/Biblioteque_de_Class/User.cs index c2cc5d5..2f71861 100644 --- a/notus/Biblioteque_de_Class/User.cs +++ b/notus/Biblioteque_de_Class/User.cs @@ -5,7 +5,7 @@ using System.Runtime.Serialization; namespace Biblioteque_de_Class { - [DataContract(IsReference = true)] + [DataContract] public class User { [DataMember] diff --git a/notus/Notus_Console/Program.cs b/notus/Notus_Console/Program.cs index d6a7874..3e6cc6a 100644 --- a/notus/Notus_Console/Program.cs +++ b/notus/Notus_Console/Program.cs @@ -7,8 +7,12 @@ using System.Security.Cryptography; using System.Text; // load database -PersistenceManager manager = new(new Stub()); -Database db = manager.LoadDatabaseData(); +PersistenceManager managerLoad = new(new Stub()); +Database db = managerLoad.LoadDatabaseData(); + +//save database +PersistenceManager managerSave = new(new ToXML()); +managerSave.SaveDatabaseData(db); // initialization zone============================================================================== @@ -152,6 +156,7 @@ while (arreter) Console.WriteLine("| |"); Console.WriteLine("| 1 / - connection - |"); Console.WriteLine("| 2 / - inscription - |"); + Console.WriteLine("| 3 / - arreter le program - |"); Console.WriteLine("| |"); Console.WriteLine("|-----------------------------------------------|\n"); Console.WriteLine("rentrez votre choix."); @@ -162,6 +167,10 @@ while (arreter) case "2":///Creer un compte inscription = true; break; + case "3":///Arreter le program + arreter = false; + menu = false; + break; default: Console.WriteLine("\nEntrez un choix valide.\n"); break; @@ -1129,4 +1138,5 @@ while (arreter) } } } -//manager.SaveDatabaseData(db); + +managerSave.SaveDatabaseData(db); diff --git a/notus/Notus_Persistence/ToJSON.cs b/notus/Notus_Persistence/ToJSON.cs deleted file mode 100644 index 070ef0b..0000000 --- a/notus/Notus_Persistence/ToJSON.cs +++ /dev/null @@ -1,106 +0,0 @@ -using Biblioteque_de_Class; -using System.Runtime.Serialization; -using System.Runtime.Serialization.Json; -using System.Xml; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.IO; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Notus_Persistance -{ - public class ToJSON : IManager - { - private const string DatabaseDataFilePath = "data.json"; - private const string DefaultThemePath = ""; - private const string DefaultLogoPath = ""; - private static readonly DataContractJsonSerializer DatabasejsonSerializer = new(typeof(Database)); - - public void SaveDatabaseData(List UserList) - { - using (FileStream fileStream = File.Create(DatabaseDataFilePath)) - { - using (var writer = JsonReaderWriterFactory.CreateJsonWriter( - fileStream, - System.Text.Encoding.UTF8, - false, - true))//<- this boolean says that we sant indentation - { - DatabasejsonSerializer.WriteObject(writer, UserList); - } - } - } - - public Database LoadDatabaseData() - { - if (File.Exists(DatabaseDataFilePath)) - { - using (FileStream fileStream = File.OpenRead(DatabaseDataFilePath)) - { - Database? database = (Database?)DatabasejsonSerializer.ReadObject(fileStream); - if (database == null) - { - throw new FileException("Failed to load database. The loaded object is null."); - } - else - { - return database; - } - } - } - else - { - throw new FileException("No data file found."); - } - } - - public List LoadDefaultTheme() - { - if (File.Exists(DefaultThemePath)) - { - using (FileStream fileStream = File.OpenRead(DefaultThemePath)) - { - List? DefaultThemeList = (List?)DatabasejsonSerializer.ReadObject(fileStream); - if (DefaultThemeList == null) - { - throw new FileException("Failed to Default Theme. The loaded object is null."); - } - else - { - return DefaultThemeList; - } - } - } - else - { - throw new FileException("No data file found."); - } - } - public List LoadDefaultLogo() - { - if (File.Exists(DefaultLogoPath)) - { - using (FileStream fileStream = File.OpenRead(DefaultLogoPath)) - { - List? DefaultLogoList = (List?)DatabasejsonSerializer.ReadObject(fileStream); - if (DefaultLogoList == null) - { - throw new FileException("Failed to Default Logo. The loaded object is null."); - } - else - { - return DefaultLogoList; - } - } - } - else - { - throw new FileException("No data file found."); - } - } - } -} diff --git a/notus/Notus_Persistence/ToXML.cs b/notus/Notus_Persistence/ToXML.cs index 0d321b5..f762550 100644 --- a/notus/Notus_Persistence/ToXML.cs +++ b/notus/Notus_Persistence/ToXML.cs @@ -16,7 +16,7 @@ namespace Notus_Persistance private const string DataFilePath = "data.xml"; private const string DefaultThemePath = ""; private const string DefaultLogoPath = ""; - private static readonly DataContractSerializer DatabaseXmlSerializer = new(typeof(Database)); + private static readonly DataContractSerializer DatabaseXmlSerializer = new(typeof(Database), GetKnownTypes()); public void SaveDatabaseData(List UserList) { @@ -26,6 +26,13 @@ namespace Notus_Persistance DatabaseXmlSerializer.WriteObject(writer, UserList); } + private static IEnumerable GetKnownTypes() + { + yield return typeof(User); + yield return typeof(List); + // Add other known types if necessary + } + public Database LoadDatabaseData() { if (File.Exists(DataFilePath)) diff --git a/notus/Tests/UnitTests_Model/Database.cs b/notus/Tests/UnitTests_Model/Database.cs deleted file mode 100644 index f447905..0000000 --- a/notus/Tests/UnitTests_Model/Database.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace UnitTests_Model -{ - public class Database - { - [SetUp] - public void Setup() - { - } - - [Test] - public void Test1() - { - Assert.Pass(); - } - } -} \ No newline at end of file diff --git a/notus/Tests/UnitTests_Model/Database_Tests.cs b/notus/Tests/UnitTests_Model/Database_Tests.cs new file mode 100644 index 0000000..2cbf3b1 --- /dev/null +++ b/notus/Tests/UnitTests_Model/Database_Tests.cs @@ -0,0 +1,181 @@ +using Biblioteque_de_Class; +namespace UnitTests_Model +{ + [TestFixture] + public class Database_Tests + { + private Database database; + + [SetUp] + public void Setup() + { + database = new Database(); + database.UserList.Add(new User("John", "john@example.com", "password123")); + database.UserList.Add(new User("Jane", "jane@example.com", "choco")); + database.UserList.Add(new User("Alice", "alice@example.com", "choco")); + database.DefaultLogoList.Add(new Logo("Logo1", "link1")); + database.DefaultLogoList.Add(new Logo("Logo2", "link2")); + database.DefaultLogoList.Add(new Logo("Logo3", "link3")); + } + + // SearchUser tests + + [Test] + public void SearchUser_UserDoesNotExist_ThrowsException() + { + string searchName = "Bob"; + Assert.Throws(() => database.SearchUser(searchName)); + } + + [Test] + public void SearchUser_CaseInsensitiveSearch_ReturnsMatchingUsers() + { + string searchName = "Alice"; + User searchedUser = database.SearchUser(searchName); + Assert.That(searchedUser.Username, Is.EqualTo("Alice")); + } + + // GetLogoLink tests + [Test] + public void GetLogoLink_LogoExists_ReturnsLogoLink() + { + Assert.That(database.GetLogoLink("Logo2"), Is.EqualTo("link2")); + } + + [Test] + public void GetLogoLink_LogoDoesNotExist_ThrowsException() + { + string logoName = "Logo4"; + Assert.Throws(() => database.GetLogoLink(logoName)); + } + + // GetUser tests + [Test] + public void GetUser_UserExists_ReturnsUser() + { + string userName = "Alice"; + User user = database.GetUser(userName); + Assert.IsNotNull(user); + Assert.That(user.Username, Is.EqualTo(userName)); + } + + [Test] + public void GetUser_UserDoesNotExist_ThrowsException() + { + string userName = "Eve"; + Assert.Throws(() => database.GetUser(userName)); + } + + // ComparePassword tests + [Test] + public void ComparePassword_CorrectPassword_ReturnsTrue() + { + User user = database.UserList[0]; + string password = "password123"; + bool result = Database.ComparePassword(user, password); + Assert.That(result, Is.True); + } + + [Test] + public void ComparePassword_IncorrectPassword_ReturnsFalse() + { + User user = database.UserList[0]; + string password = "incorrectPassword"; + bool result = Database.ComparePassword(user, password); + Assert.That(result, Is.False); + } + + // FindEmail tests + [Test] + public void FindEmail_ExistingEmail_ReturnsTrue() + { + string email = "john@example.com"; + bool result = database.FindEmail(email); + Assert.IsTrue(result); + } + + [Test] + public void FindEmail_NonExistingEmail_ReturnsFalse() + { + string email = "olivedecarglass@example.com"; + bool result = database.FindEmail(email); + Assert.IsFalse(result); + } + + // AddUser tests + [Test] + public void AddUser_ValidUser_AddsUserToList() + { + User user = new User("Bob", "bob@example.com", "password123"); + database.AddUser(user); + Assert.That(database.UserList, Contains.Item(user)); + } + + [Test] + public void AddUser_DuplicateUser_ThrowsException() + { + User user = new User("John", "john@example.com", "password123"); + Assert.Throws(() => database.AddUser(user)); + } + + // GetTheme tests + [Test] + public void GetTheme_ExistingTheme_ReturnsTheme() + { + Theme expectedTheme = new Theme("Theme1", ",,,".Split().ToList()); + database.ThemeList.Add(expectedTheme); + + Theme theme = database.GetTheme("Theme1"); + Assert.IsNotNull(theme); + Assert.That(theme, Is.EqualTo(expectedTheme)); + } + + [Test] + public void GetTheme_NonExistingTheme_ReturnsNull() + { + Assert.Throws(() => database.GetTheme("NonExistingTheme")); + } + + // ChangeUsername tests + [Test] + public void ChangeUsername_CorrectReplaceName_ChangesUsername() + { + User userSelected = database.UserList[0]; + string newUsername = "duberlute"; + + database.ChangeUsername(userSelected, newUsername); + + User updatedUser = database.UserList.Where(u => u.Username == newUsername).First(); + Assert.IsNotNull(updatedUser); + Assert.That(updatedUser.Username, Is.EqualTo(newUsername)); + } + + [Test] + public void ChangeUsername_UsernameAlreadyUsed_ThrowsException() + { + User userNotSelected = database.UserList[2]; + string newUsername = "Jane"; + + Assert.Throws(() => database.ChangeUsername(userNotSelected, newUsername)); + } + + // VerifThemeNameNotTaken tests + [Test] + public void VerifThemeNameNotTaken_NameNotTaken_ReturnsTrue() + { + string themeName = "NewTheme"; + bool result = database.VerifThemeNameNotTaken(themeName); + Assert.IsTrue(result); + } + + [Test] + public void VerifThemeNameNotTaken_NameAlreadyTaken_ReturnsFalse() + { + Theme expectedTheme = new Theme("Theme1", ",,,".Split().ToList()); + database.ThemeList.Add(expectedTheme); + string themeName = "Theme1"; + bool result = database.VerifThemeNameNotTaken(themeName); + Assert.IsFalse(result); + } + } +} diff --git a/notus/Tests/UnitTests_Model/Note.cs b/notus/Tests/UnitTests_Model/Note_Tests.cs similarity index 91% rename from notus/Tests/UnitTests_Model/Note.cs rename to notus/Tests/UnitTests_Model/Note_Tests.cs index 6e42961..34f65b7 100644 --- a/notus/Tests/UnitTests_Model/Note.cs +++ b/notus/Tests/UnitTests_Model/Note_Tests.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace UnitTests_Model { - public class Note + public class Note_Tests { [SetUp] public void Setup() diff --git a/notus/Tests/UnitTests_Model/UnitTests_Model.csproj b/notus/Tests/UnitTests_Model/UnitTests_Model.csproj index 8d82d90..3f9f74f 100644 --- a/notus/Tests/UnitTests_Model/UnitTests_Model.csproj +++ b/notus/Tests/UnitTests_Model/UnitTests_Model.csproj @@ -17,4 +17,8 @@ + + + + diff --git a/notus/Tests/UnitTests_Model/User.cs b/notus/Tests/UnitTests_Model/User_Tests.cs similarity index 91% rename from notus/Tests/UnitTests_Model/User.cs rename to notus/Tests/UnitTests_Model/User_Tests.cs index 6f3f1f2..f7c5aa9 100644 --- a/notus/Tests/UnitTests_Model/User.cs +++ b/notus/Tests/UnitTests_Model/User_Tests.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace UnitTests_Model { - public class User + public class User_Tests { [SetUp] public void Setup() diff --git a/notus/Tests/UnitTests_Persistance/ToXML.cs b/notus/Tests/UnitTests_Persistance/Stub_Tests.cs similarity index 84% rename from notus/Tests/UnitTests_Persistance/ToXML.cs rename to notus/Tests/UnitTests_Persistance/Stub_Tests.cs index 130fec6..7aee95f 100644 --- a/notus/Tests/UnitTests_Persistance/ToXML.cs +++ b/notus/Tests/UnitTests_Persistance/Stub_Tests.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace UnitTests_Persistance { - internal class ToXML + internal class Stub_Tests { } } diff --git a/notus/Tests/UnitTests_Persistance/ToJson.cs b/notus/Tests/UnitTests_Persistance/ToJson.cs deleted file mode 100644 index 0b8ea25..0000000 --- a/notus/Tests/UnitTests_Persistance/ToJson.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace UnitTests_Persistance -{ - public class Tests - { - [SetUp] - public void Setup() - { - } - - [Test] - public void Test1() - { - Assert.Pass(); - } - } -} \ No newline at end of file diff --git a/notus/Tests/UnitTests_Persistance/ToXML_Tests.cs b/notus/Tests/UnitTests_Persistance/ToXML_Tests.cs new file mode 100644 index 0000000..15b3f6c --- /dev/null +++ b/notus/Tests/UnitTests_Persistance/ToXML_Tests.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UnitTests_Persistance +{ + internal class ToXML_Tests + { + } +}