En quittant notre dernière escale, nos hôtes nous ont demander de présenter des informations validées sur notre équipée. Heureusement, nous avons dans Salamanca une bibliothèque qui permet de vérifier aisément la saisie de données : Data Rules !

Pour rendre un système d'information utile et efficace, il ne suffit pas de l'alimenter en données, il faut aussi en assurer la cohérence.

La première exigence qui en découle est de valider les informations fournies si possible dés leur saisie et avant leur sauvegarde dans la base de données.

Dans le modèle entité dessiné avec Salamanca, on peut associer à chaque attribut des règles de validation prédéfinies en fonction de spécifications métier telles que :

  • valeur par défaut ; par exemple, le statut du projet est "Nouveau" par défaut
  • autorisation de la valeur null ; par exemple, un projet doit avoir un nom
  • longueur maximum ; par exemple, le nom du projet ne dépasse pas 32 caractères
Ces propriétés sur les attributs d'une entité constituent le premier niveau de règles métier. Elles sont implémentées non seulement dans la base de données sous forme de contraintes, mais aussi dans la couche objet sous forme d'attributs (au sens .NET) liés aux propriétés de l'objet. Par exemple :
[NotNullRule]
[StringLengthRule(32)]
public string Nom
{
...
}

Profitons d'avoir configuré notre projet de tests pour valider que ces règles métier sont vérifiées lors de la sauvegarde d'un projet.

Pour faciliter l'exécution de notre série de tests, nous initialisons chacun avec des données valides pour une instance de Projet défini pour la classe de test :

[TestInitialize()]
public void MyTestInitialize()
{
Client c = new Client(DataMappers);
c.Nom = "Jean Dupond";
Projet = new Projet(c, DataMappers);
Projet.Nom = "Mon projet";
}

Pour tester que le nom saisi dépasse la longueur maximale, nous ajoutons un test avec "un nom de projet vraiment trop long" et nous vérifions que

  • la méthode Validate(string propertyName) d'un objet DomainEntity renvoit FAUX
  • qu'une BrokenRulesException est levée lorsqu'on sauvegarde une instance non valide
[TestMethod]
[ExpectedException(typeof(BrokenRulesException))]
public void CannotValidateNomNull()
{
    Assert.IsTrue(Projet.Validate());
    Projet.Nom = null;
    Assert.IsFalse(Projet.Validate("Nom"));
    Projet.Save();
}

Le code complet de notre classe se résume à la validation d'une série de 3 tests :

  • On doit pouvoir sauvegardé une instance de Projet avec un nom valide
  • On ne doit pas pouvoir sauvegardé une instance de Projet avec un nom vide (NULL)
  • On ne doit pas pouvoir sauvegardé une instance de Projet avec un nom trop long (> 32 caractères)
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Salamanca.DataRules;
using NourY.Eproject.Model;

namespace NourY.Eproject.Tests.Model
{
    [TestClass]
    public class ProjetTest : UnitTestBase, IProjetContainer
    {
        [TestMethod]
        [DeploymentItem("..\\eProject_ABord_Tests.mdf")]
        public void CanSaveAndValidateProjet()
        {
            Assert.IsTrue(Projet.Validate());
            Projet.Save();
        }

        [TestMethod]
        [ExpectedException(typeof(BrokenRulesException))]
        public void CannotValidateNomNull()
        {
            Assert.IsTrue(Projet.Validate());
            Projet.Nom = null;
            Assert.IsFalse(Projet.Validate("Nom"));
            Projet.Save();
        }

        [TestMethod]
        [ExpectedException(typeof(BrokenRulesException))]
        public void CannotValidateNomTooLong()
        {
            Assert.IsTrue(Projet.Validate());
            Projet.Nom = "Un nom de projet vraiment trop long";
            Assert.IsFalse(Projet.Validate("Nom"));
            Projet.Save();
        }

        [TestInitialize()]
        public void MyTestInitialize()
        {
            Client c = new Client(DataMappers);
            c.Nom = "Jean Dupond";
            Projet = new Projet(c, DataMappers);
            Projet.Nom = "Mon projet";
        }

        public Projet Projet
        {
            get { return _Projet; }
            set { _Projet = value; }
        }

        private Projet _Projet;
    }
}

Les règles de validation sur les attributs des entités s'avère donc non seulement aisées à mettre en place mais également implémentées de manière concise dans la couche objet. Pour valider des champs avec des règles avancées tels qu'une adresse email, un numéro de téléphone ou un code postal, nous pouvons exploité la puissance des expressions régulières à travers des règles de type RegexRule.

Cette exploration "forcée" de la bibliothèque DataRule entre deux escales nous ouvre déjà un horizon bien dégagé du côté de la consolidation des données de nos applications métier. A suivre avec leur utilisation dans le cadre d'activités métier...