commit 86a87f75cebc3eef231dcbbaa4dd3ecbf6e1e3f5
Author: mirage <119869686+ClementBobin@users.noreply.github.com>
Date: Tue Mar 3 16:22:37 2026 +0100
Add initial project structure and implement basic functionality
- Created MSTestSettings.cs to enable parallel test execution.
- Added StyleTests.cs and TitreTests.cs for unit testing of Style and Titre entities.
- Implemented Webzine.Entity.Tests project with necessary configurations.
- Created SeedDataLocal.cs and SeedDataSpotify.cs for local and Spotify data seeding.
- Established repository contracts for Artiste, Commentaire, Style, and Titre.
- Developed DbEntityRepository and LocalEntityRepository classes.
- Set up Webzine.WebApplication with controllers, logging, and Docker support.
- Configured NLog for logging and added necessary appsettings for development.
- Created initial views and layout for the web application.
- Added Dockerfile and docker-compose configuration for containerization.
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..cd967fc
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,25 @@
+**/.dockerignore
+**/.env
+**/.git
+**/.gitignore
+**/.project
+**/.settings
+**/.toolstarget
+**/.vs
+**/.vscode
+**/.idea
+**/*.*proj.user
+**/*.dbmdl
+**/*.jfm
+**/azds.yaml
+**/bin
+**/charts
+**/docker-compose*
+**/Dockerfile*
+**/node_modules
+**/npm-debug.log
+**/obj
+**/secrets.dev.yaml
+**/values.dev.yaml
+LICENSE
+README.md
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a1d490a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+bin/
+obj/
+/packages/
+riderModule.iml
+/_ReSharper.Caches/
+[Ll]ogs/
+.idea/
\ No newline at end of file
diff --git a/Webzine.Business.Contracts/Webzine.Business.Contracts.csproj b/Webzine.Business.Contracts/Webzine.Business.Contracts.csproj
new file mode 100644
index 0000000..33c0658
--- /dev/null
+++ b/Webzine.Business.Contracts/Webzine.Business.Contracts.csproj
@@ -0,0 +1,24 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+ stylecop.json
+
+
+
+
diff --git a/Webzine.Business/Webzine.Business.csproj b/Webzine.Business/Webzine.Business.csproj
new file mode 100644
index 0000000..33c0658
--- /dev/null
+++ b/Webzine.Business/Webzine.Business.csproj
@@ -0,0 +1,24 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+ stylecop.json
+
+
+
+
diff --git a/Webzine.Documentation/Installation/equipe 1 - dossier de configuration.md b/Webzine.Documentation/Installation/equipe 1 - dossier de configuration.md
new file mode 100644
index 0000000..e69de29
diff --git a/Webzine.Documentation/Rapport/equip 1 - rapport.md b/Webzine.Documentation/Rapport/equip 1 - rapport.md
new file mode 100644
index 0000000..e69de29
diff --git a/Webzine.Documentation/StyleCop/stylecop.json b/Webzine.Documentation/StyleCop/stylecop.json
new file mode 100644
index 0000000..81a3ce9
--- /dev/null
+++ b/Webzine.Documentation/StyleCop/stylecop.json
@@ -0,0 +1,9 @@
+{
+ "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
+ "settings": {
+ "documentationRules": {
+ "companyName": " Equipe 1 - ",
+ "documentationCulture": "fr-FR"
+ }
+ }
+}
diff --git a/Webzine.Documentation/Webzine.Documentation.csproj b/Webzine.Documentation/Webzine.Documentation.csproj
new file mode 100644
index 0000000..37d4531
--- /dev/null
+++ b/Webzine.Documentation/Webzine.Documentation.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/Webzine.EntitiesContext/Webzine.EntitiesContext.csproj b/Webzine.EntitiesContext/Webzine.EntitiesContext.csproj
new file mode 100644
index 0000000..33c0658
--- /dev/null
+++ b/Webzine.EntitiesContext/Webzine.EntitiesContext.csproj
@@ -0,0 +1,24 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+ stylecop.json
+
+
+
+
diff --git a/Webzine.Entity.Tests/ArtisteTests.cs b/Webzine.Entity.Tests/ArtisteTests.cs
new file mode 100644
index 0000000..531248c
--- /dev/null
+++ b/Webzine.Entity.Tests/ArtisteTests.cs
@@ -0,0 +1,55 @@
+namespace Webzine.Entity.Tests
+{
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+ ///
+ /// Tests de l'entité .
+ /// Vérifie que les contraintes imposées (nom du champ, longueur max du champ,
+ /// champ obligatoire, libellé du champ, clé primaire...) sont bien respectées.
+ ///
+ [TestClass]
+ public class ArtisteTests
+ {
+ [TestMethod]
+ public void ArtisteHasIdArtiste()
+ {
+ Common.HasProperty(typeof(Artiste), nameof(Artiste.IdArtiste));
+ }
+
+ [TestMethod]
+ public void ArtisteHasNom()
+ {
+ Common.HasProperty(typeof(Artiste), nameof(Artiste.Nom));
+ }
+
+ [TestMethod]
+ public void ArtisteHasNomTailleMin1()
+ {
+ Common.AttributLongueurMin(typeof(Artiste), nameof(Artiste.Nom), 2);
+ }
+
+ [TestMethod]
+ public void ArtisteHasNomTailleMax50()
+ {
+ Common.AttributLongueurMax(typeof(Artiste), nameof(Artiste.Nom), 50);
+ }
+
+ [TestMethod]
+ public void ArtisteHasNomDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Artiste), nameof(Artiste.Nom), "Nom de l'artiste");
+ }
+
+ [TestMethod]
+ public void ArtisteHasBiographie()
+ {
+ Common.HasProperty(typeof(Artiste), nameof(Artiste.Biographie));
+ }
+
+ [TestMethod]
+ public void ArtisteHasTitres()
+ {
+ Common.HasProperty(typeof(Artiste), nameof(Artiste.Titres));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Webzine.Entity.Tests/CommentaireTests.cs b/Webzine.Entity.Tests/CommentaireTests.cs
new file mode 100644
index 0000000..a5f1ad7
--- /dev/null
+++ b/Webzine.Entity.Tests/CommentaireTests.cs
@@ -0,0 +1,109 @@
+namespace Webzine.Entity.Tests
+{
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+ ///
+ /// Tests de l'entité .
+ /// Vérifie que les contraintes imposées (nom du champ, longueur max du champ,
+ /// champ obligatoire, libellé du champ, clé primaire...) sont bien respectées.
+ ///
+ [TestClass]
+ public class CommentaireTests
+ {
+ [TestMethod]
+ public void CommentaireHasIdCommentaire()
+ {
+ Common.HasProperty(typeof(Commentaire), nameof(Commentaire.IdCommentaire));
+ }
+
+ [TestMethod]
+ public void CommentaireHasContenu()
+ {
+ Common.HasProperty(typeof(Commentaire), nameof(Commentaire.Contenu));
+ }
+
+ [TestMethod]
+ public void CommentaireHasContenuDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Commentaire), nameof(Commentaire.Contenu), "Commentaire");
+ }
+
+ [TestMethod]
+ public void CommentaireHasContenuRequis()
+ {
+ Common.AttributRequis(typeof(Commentaire), nameof(Commentaire.Contenu));
+ }
+
+ [TestMethod]
+ public void CommentaireHasContenuTailleMin10()
+ {
+ Common.AttributLongueurMin(typeof(Commentaire), nameof(Commentaire.Contenu), 10);
+ }
+
+ [TestMethod]
+ public void CommentaireHasContenuTailleMax1000()
+ {
+ Common.AttributLongueurMax(typeof(Commentaire), nameof(Commentaire.Contenu), 1000);
+ }
+
+ [TestMethod]
+ public void CommentaireHasAuteur()
+ {
+ Common.HasProperty(typeof(Commentaire), nameof(Commentaire.Auteur));
+ }
+
+ [TestMethod]
+ public void CommentaireHasAuteurDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Commentaire), nameof(Commentaire.Auteur), "Nom");
+ }
+
+ [TestMethod]
+ public void CommentaireHasAuteurRequis()
+ {
+ Common.AttributRequis(typeof(Commentaire), nameof(Commentaire.Auteur));
+ }
+
+ [TestMethod]
+ public void CommentaireHasAuteurTailleMin2()
+ {
+ Common.AttributLongueurMin(typeof(Commentaire), nameof(Commentaire.Auteur), 2);
+ }
+
+ [TestMethod]
+ public void CommentaireHasAuteurTailleMax30()
+ {
+ Common.AttributLongueurMax(typeof(Commentaire), nameof(Commentaire.Auteur), 30);
+ }
+
+ [TestMethod]
+ public void CommentaireHasDateCreation()
+ {
+ Common.HasProperty(typeof(Commentaire), nameof(Commentaire.DateCreation));
+ }
+
+ [TestMethod]
+ public void CommentaireHasDateCreationRequis()
+ {
+ Common.AttributRequis(typeof(Commentaire), nameof(Commentaire.DateCreation));
+ }
+
+ [TestMethod]
+ public void CommentaireHasDateCreationDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Commentaire), nameof(Commentaire.DateCreation), "Date de création");
+ }
+
+ [TestMethod]
+ public void CommentaireHasIdTitre()
+ {
+ Common.HasProperty(typeof(Commentaire), nameof(Commentaire.IdTitre));
+ }
+
+ [TestMethod]
+ public void CommentaireHasTitre()
+ {
+ Common.HasProperty(typeof(Commentaire), nameof(Commentaire.Titre));
+ }
+ }
+}
diff --git a/Webzine.Entity.Tests/Common.cs b/Webzine.Entity.Tests/Common.cs
new file mode 100644
index 0000000..531ab5d
--- /dev/null
+++ b/Webzine.Entity.Tests/Common.cs
@@ -0,0 +1,90 @@
+namespace Webzine.Entity.Tests
+{
+ using System;
+ using System.ComponentModel.DataAnnotations;
+ using System.Linq;
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+ ///
+ /// Méthodes utilitaires permettant de tester les entités.
+ ///
+ public static class Common
+ {
+ ///
+ /// Vérifie que l'entité possède bien la propriété passée en paramètre.
+ ///
+ /// type de l'entité
+ /// nom de la propriété de l'entité
+ public static void HasProperty(Type typeObjet, string nomPropriete)
+ {
+ var property = typeObjet.GetProperty(nomPropriete);
+ Assert.IsNotNull(property, "La classe " + typeObjet.Name + " doit avoir une propriété '" + nomPropriete + "'.");
+ }
+
+ ///
+ /// Vérifie que l'attribut de l'entité a l'annotation [Display(Name = "xxx")] avec la valeur attendue.
+ ///
+ /// type de l'entité
+ /// nom de la propriété de l'entité
+ /// valeur attendue pour l'affichage de cette propriété
+ public static void AttributDisplay(Type typeObjet, string nomPropriete, string chaineAttendue)
+ {
+ var property = typeObjet.GetProperty(nomPropriete);
+ var annotation = (DisplayAttribute)property.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault();
+ Assert.IsNotNull(annotation, "La propriété '" + nomPropriete + "' n'a pas de libellé approprié. Il manque l'annotation Display.");
+ Assert.AreEqual(chaineAttendue, annotation.Name);
+ }
+
+ ///
+ /// Vérifie que l'attribut de l'entité a l'annotation [MinLength(xx)] avec la longueur attendue.
+ ///
+ /// type de l'entité
+ /// nom de la propriété de l'entité
+ /// longueur maximum
+ public static void AttributLongueurMax(Type typeObjet, string nomPropriete, int max)
+ {
+ var property = typeObjet.GetProperty(nomPropriete);
+ var annotation = (MaxLengthAttribute)property.GetCustomAttributes(typeof(MaxLengthAttribute), false).FirstOrDefault();
+ Assert.IsNotNull(annotation, "La propriété '" + nomPropriete + "' n'a pas de longueur maximum. Il manque l'annotation MaxLength.");
+ Assert.AreEqual(max, annotation.Length, "La propriété '" + nomPropriete + "' ne doit pas pouvoir dépasser " + max + " caractères.");
+ }
+
+ ///
+ /// Vérifie que l'attribut de l'entité a l'annotation [MinLength(xx)] avec la longueur attendue.
+ ///
+ /// type de l'entité
+ /// nom de la propriété de l'entité
+ /// longueur minimum
+ public static void AttributLongueurMin(Type typeObjet, string nomPropriete, int min)
+ {
+ var property = typeObjet.GetProperty(nomPropriete);
+ var annotation = (MinLengthAttribute)property.GetCustomAttributes(typeof(MinLengthAttribute), false).FirstOrDefault();
+ Assert.IsNotNull(annotation, "La propriété '" + nomPropriete + "' n'a pas de longueur minimum. Il manque l'annotation MinLength.");
+ Assert.AreEqual(min, annotation.Length, "La propriété '" + nomPropriete + "' ne avoir au moins " + min + " caractères.");
+ }
+
+ ///
+ /// Vérifie que l'attribut de l'entité a l'annotation [Required].
+ ///
+ /// type de l'entité
+ /// nom de la propriété de l'entité
+ public static void AttributRequis(Type typeObjet, string nomPropriete)
+ {
+ var property = typeObjet.GetProperty(nomPropriete);
+ var annotation = (RequiredAttribute)property.GetCustomAttributes(typeof(RequiredAttribute), false).FirstOrDefault();
+ Assert.IsNotNull(annotation, "La propriété '" + nomPropriete + "' n'est pas obligatoire. Il manque l'annotation Required.");
+ }
+
+ ///
+ /// Vérifie que l'attribut de l'entité n'a pas l'annotation [Url].
+ ///
+ /// type de l'entité
+ /// nom de la propriété de l'entité
+ public static void AttributHasNotUrlValidation(Type typeObjet, string nomPropriete)
+ {
+ var property = typeObjet.GetProperty(nomPropriete);
+ var annotation = (UrlAttribute)property.GetCustomAttributes(typeof(UrlAttribute), false).FirstOrDefault();
+ Assert.IsNull(annotation, "La propriété '" + nomPropriete + "' ne doit pas être une URL obligatoirement. Retirez l'annotation Url.");
+ }
+ }
+}
diff --git a/Webzine.Entity.Tests/MSTestSettings.cs b/Webzine.Entity.Tests/MSTestSettings.cs
new file mode 100644
index 0000000..8b7de71
--- /dev/null
+++ b/Webzine.Entity.Tests/MSTestSettings.cs
@@ -0,0 +1 @@
+[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)]
\ No newline at end of file
diff --git a/Webzine.Entity.Tests/StyleTests.cs b/Webzine.Entity.Tests/StyleTests.cs
new file mode 100644
index 0000000..ac26180
--- /dev/null
+++ b/Webzine.Entity.Tests/StyleTests.cs
@@ -0,0 +1,49 @@
+namespace Webzine.Entity.Tests
+{
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+ ///
+ /// Tests de l'entité .
+ /// Vérifie que les contraintes imposées (nom du champ, longueur max du champ,
+ /// champ obligatoire, libellé du champ, clé primaire...) sont bien respectées.
+ ///
+ [TestClass]
+ public class StyleTests
+ {
+ [TestMethod]
+ public void StyleHasIdStyle()
+ {
+ Common.HasProperty(typeof(Style), nameof(Style.IdStyle));
+ }
+
+ [TestMethod]
+ public void StyleHasLibelle()
+ {
+ Common.HasProperty(typeof(Style), nameof(Style.Libelle));
+ }
+
+ [TestMethod]
+ public void StyleHasLibelleDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Style), nameof(Style.Libelle), "Libellé");
+ }
+
+ [TestMethod]
+ public void StyleHasLibelleRequis()
+ {
+ Common.AttributRequis(typeof(Style), nameof(Style.Libelle));
+ }
+
+ [TestMethod]
+ public void StyleHasLibelleTailleMin2()
+ {
+ Common.AttributLongueurMin(typeof(Style), nameof(Style.Libelle), 2);
+ }
+
+ [TestMethod]
+ public void StyleHasLibelleTailleMax50()
+ {
+ Common.AttributLongueurMax(typeof(Style), nameof(Style.Libelle), 50);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Webzine.Entity.Tests/TitreTests.cs b/Webzine.Entity.Tests/TitreTests.cs
new file mode 100644
index 0000000..9908434
--- /dev/null
+++ b/Webzine.Entity.Tests/TitreTests.cs
@@ -0,0 +1,241 @@
+namespace Webzine.Entity.Tests
+{
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+ ///
+ /// Tests de l'entité .
+ /// Vérifie que les contraintes imposées (nom du champ, longueur max du champ,
+ /// champ obligatoire, libellé du champ, clé primaire...) sont bien respectées.
+ ///
+ [TestClass]
+ public class TitreTests
+ {
+ [TestMethod]
+ public void TitreHasIdTitre()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.IdTitre));
+ }
+
+ [TestMethod]
+ public void TitreHasIdArtiste()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.IdArtiste));
+ }
+
+ [TestMethod]
+ public void TitreHasArtiste()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.Artiste));
+ }
+
+ [TestMethod]
+ public void TitreHasLibelle()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.Libelle));
+ }
+
+ [TestMethod]
+ public void TitreHasLibelleDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Titre), nameof(Titre.Libelle), "Titre");
+ }
+
+ [TestMethod]
+ public void TitreHasLibelleRequis()
+ {
+ Common.AttributRequis(typeof(Titre), nameof(Titre.Libelle));
+ }
+
+ [TestMethod]
+ public void TitreHasLibelleTailleMin1()
+ {
+ Common.AttributLongueurMin(typeof(Titre), nameof(Titre.Libelle), 1);
+ }
+
+ [TestMethod]
+ public void TitreHasLibelleTailleMax200()
+ {
+ Common.AttributLongueurMax(typeof(Titre), nameof(Titre.Libelle), 200);
+ }
+
+ [TestMethod]
+ public void TitreHasChronique()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.Chronique));
+ }
+
+ [TestMethod]
+ public void TitreHasChroniqueRequis()
+ {
+ Common.AttributRequis(typeof(Titre), nameof(Titre.Chronique));
+ }
+
+ [TestMethod]
+ public void TitreHasChroniqueTailleMin10()
+ {
+ Common.AttributLongueurMin(typeof(Titre), nameof(Titre.Chronique), 10);
+ }
+
+ [TestMethod]
+ public void TitreHasChroniqueTailleMax4000()
+ {
+ Common.AttributLongueurMax(typeof(Titre), nameof(Titre.Chronique), 4000);
+ }
+
+ [TestMethod]
+ public void TitreHasDateCreation()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.DateCreation));
+ }
+
+ [TestMethod]
+ public void TitreHasDateCreationRequis()
+ {
+ Common.AttributRequis(typeof(Titre), nameof(Titre.DateCreation));
+ }
+
+ [TestMethod]
+ public void TitreHasDateCreationDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Titre), nameof(Titre.DateCreation), "Date de création");
+ }
+
+ [TestMethod]
+ public void TitreHasDuree()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.Duree));
+ }
+
+ [TestMethod]
+ public void TitreHasDureeDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Titre), nameof(Titre.Duree), "Durée en secondes");
+ }
+
+ [TestMethod]
+ public void TitreHasDateSortie()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.DateSortie));
+ }
+
+ [TestMethod]
+ public void TitreHasDateSortieRequis()
+ {
+ Common.AttributRequis(typeof(Titre), nameof(Titre.DateSortie));
+ }
+
+ [TestMethod]
+ public void TitreHasDateSortieDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Titre), nameof(Titre.DateSortie), "Date de sortie");
+ }
+
+ [TestMethod]
+ public void TitreHasUrlJaquette()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.UrlJaquette));
+ }
+
+ [TestMethod]
+ public void TitreHasUrlJaquetteRequis()
+ {
+ Common.AttributRequis(typeof(Titre), nameof(Titre.UrlJaquette));
+ }
+
+ [TestMethod]
+ public void TitreHasUrlJaquetteDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Titre), nameof(Titre.UrlJaquette), "Jaquette de l'album");
+ }
+
+ [TestMethod]
+ public void TitreHasUrlJaquetteTailleMax250()
+ {
+ Common.AttributLongueurMax(typeof(Titre), nameof(Titre.UrlJaquette), 250);
+ }
+
+ [TestMethod]
+ public void TitreHasUrlEcoute()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.UrlEcoute));
+ }
+
+ [TestMethod]
+ public void TitreHasUrlEcouteDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Titre), nameof(Titre.UrlEcoute), "URL d'écoute");
+ }
+
+ [TestMethod]
+ public void TitreHasUrlEcouteTailleMin13()
+ {
+ Common.AttributLongueurMin(typeof(Titre), nameof(Titre.UrlEcoute), 13);
+ }
+
+ [TestMethod]
+ public void TitreHasUrlEcouteTailleMax250()
+ {
+ Common.AttributLongueurMax(typeof(Titre), nameof(Titre.UrlEcoute), 250);
+ }
+
+ [TestMethod]
+ public void TitreHasNbLectures()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.NbLectures));
+ }
+
+ [TestMethod]
+ public void TitreHasNbLecturesDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Titre), nameof(Titre.NbLectures), "Nombre de lectures");
+ }
+
+ [TestMethod]
+ public void TitreHasNbLecturesRequis()
+ {
+ Common.AttributRequis(typeof(Titre), nameof(Titre.NbLectures));
+ }
+
+ [TestMethod]
+ public void TitreHasNbLikes()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.NbLikes));
+ }
+
+ [TestMethod]
+ public void TitreHasNbLikesDisplayValid()
+ {
+ Common.AttributDisplay(typeof(Titre), nameof(Titre.NbLikes), "Nombre de likes");
+ }
+
+ [TestMethod]
+ public void TitreHasNbLikesRequis()
+ {
+ Common.AttributRequis(typeof(Titre), nameof(Titre.NbLikes));
+ }
+
+ [TestMethod]
+ public void TitreHasAlbum()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.Album));
+ }
+
+ [TestMethod]
+ public void TitreHasAlbumRequis()
+ {
+ Common.AttributRequis(typeof(Titre), nameof(Titre.Album));
+ }
+
+ [TestMethod]
+ public void TitreHasCommentaires()
+ {
+ Common.HasProperty(typeof(Titre), nameof(Titre.Commentaires));
+ }
+
+ [TestMethod]
+ public void TitreUrlJaquetteeIsNotMandatory()
+ {
+ Common.AttributHasNotUrlValidation(typeof(Titre), nameof(Titre.UrlJaquette));
+ }
+ }
+}
diff --git a/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj b/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj
new file mode 100644
index 0000000..2e335bf
--- /dev/null
+++ b/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj
@@ -0,0 +1,28 @@
+
+
+
+ net10.0
+ latest
+ enable
+ enable
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+ stylecop.json
+
+
+
+
diff --git a/Webzine.Entity/Fixtures/SeedDataLocal.cs b/Webzine.Entity/Fixtures/SeedDataLocal.cs
new file mode 100644
index 0000000..71eb46f
--- /dev/null
+++ b/Webzine.Entity/Fixtures/SeedDataLocal.cs
@@ -0,0 +1,5 @@
+namespace Webzine.EntitiesContext;
+
+public class SeedDataLocal
+{
+}
\ No newline at end of file
diff --git a/Webzine.Entity/Fixtures/SeedDataSpotify.cs b/Webzine.Entity/Fixtures/SeedDataSpotify.cs
new file mode 100644
index 0000000..71bd7fc
--- /dev/null
+++ b/Webzine.Entity/Fixtures/SeedDataSpotify.cs
@@ -0,0 +1,6 @@
+namespace Webzine.EntitiesContext;
+
+public class SeedDataSpotify
+{
+
+}
\ No newline at end of file
diff --git a/Webzine.Entity/Webzine.Entity.csproj b/Webzine.Entity/Webzine.Entity.csproj
new file mode 100644
index 0000000..33c0658
--- /dev/null
+++ b/Webzine.Entity/Webzine.Entity.csproj
@@ -0,0 +1,24 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+ stylecop.json
+
+
+
+
diff --git a/Webzine.Repository.Contracts/IArtisteRepository.cs b/Webzine.Repository.Contracts/IArtisteRepository.cs
new file mode 100644
index 0000000..1e4a369
--- /dev/null
+++ b/Webzine.Repository.Contracts/IArtisteRepository.cs
@@ -0,0 +1,17 @@
+// using Webzine.Entity;
+
+namespace Webzine.Repository.Contracts
+{
+ public interface IArtisteRepository
+ {
+ // void Add(Artiste artiste);
+
+ // void Delete(Artiste artiste);
+
+ // Artiste Find(int id);
+
+ // IEnumerable FindAll();
+
+ // void Update(Artiste artiste);
+ }
+}
\ No newline at end of file
diff --git a/Webzine.Repository.Contracts/ICommentaireRepository.cs b/Webzine.Repository.Contracts/ICommentaireRepository.cs
new file mode 100644
index 0000000..f1608b2
--- /dev/null
+++ b/Webzine.Repository.Contracts/ICommentaireRepository.cs
@@ -0,0 +1,15 @@
+// using Webzine.Entity;
+
+namespace Webzine.Repository.Contracts
+{
+ public interface ICommentaireRepository
+ {
+ // void Add(Commentaire commentaire);
+
+ // void Delete(Commentaire commentaire);
+
+ // Commentaire Find(int id);
+
+ // IEnumerable FindAll();
+ }
+}
\ No newline at end of file
diff --git a/Webzine.Repository.Contracts/IStyleRepository.cs b/Webzine.Repository.Contracts/IStyleRepository.cs
new file mode 100644
index 0000000..cceeae7
--- /dev/null
+++ b/Webzine.Repository.Contracts/IStyleRepository.cs
@@ -0,0 +1,17 @@
+// using Webzine.Entity;
+
+namespace Webzine.Repository.Contracts
+{
+ public interface IStyleRepository
+ {
+ // void Add(Style style);
+
+ // void Delete(Style style);
+
+ // Style Find(int id);
+
+ // IEnumerable