Aller au contenu

Tests

phil/edit-lock-bundle

Les tests du bundle

tests/Unit couvre les clés, les détenteurs et les baux ainsi que leur association ; EditLocks — prise, renouvellement, attente, expiration, l'ensemble et ses parties, pulsations, reprise, politique, départ, purge, courses, et revendications abandonnées par le magasin, réessayées puis abandonnées — ; BlockSaves ; le même contrat sur les deux dépôts (celui de Doctrine sur SQLite en mémoire, ses tables créées à partir de l'association) ; les revendications Doctrine dans leur transaction, annulées lorsqu'elles échouent ; deux revendications concurrentes sur un fichier SQLite ouvert deux fois — l'ensemble et une partie revendiqués pendant que l'autre est au milieu de sa revendication, qui attend, abandonne, puis trouve le premier bail — ; les Turbo Streams et le diffuseur sur un hub d'enregistrement et sur un hub injoignable ; chaque réponse des points de terminaison et les jetons CSRF qu'ils acceptent et refusent ; ClientConfig ; ainsi que la configuration, les services et les réglages ajoutés au préalable du bundle.

tests/Integration rejoue les mêmes revendications concurrentes sur MySQL et PostgreSQL, chacune ignorée sauf si PHIL_TEST_MYSQL_URL ou PHIL_TEST_POSTGRESQL_URL pointe vers un serveur ; php vendor/bin/phil-dev services up démarre les deux, et php vendor/bin/phil-dev services test exécute la suite sur eux.

tests/Functional démarre un noyau avec FrameworkBundle, DoctrineBundle sur SQLite, MercureBundle, phil/ujo-bundle et le bundle, et fait jouer deux rédacteurs sur une page par les routes : baux, un enregistrement, une pulsation, la présence, une reprise refusée puis autorisée, un retrait, le départ, chaque requête avec son jeton et son témoin CSRF, les requêtes sans eux refusées ; ce que le hub d'enregistrement a reçu est vérifié flux par flux. MercureHubTest publie par un vrai hub et relit la mise à jour en tant qu'abonné ; il est ignoré sauf si un hub répond à MERCURE_URL, par défaut http://127.0.0.1:3999/.well-known/mercure :

docker run -d -p 3999:80 -e SERVER_NAME=':80' \
    -e MERCURE_PUBLISHER_JWT_KEY='!ChangeThisMercureHubJWTSecretKey!' \
    -e MERCURE_SUBSCRIBER_JWT_KEY='!ChangeThisMercureHubJWTSecretKey!' dunglas/mercure

Lorsque le bundle est installé seul, où le répartiteur d'événements est un prérequis de développement, la suite fonctionnelle est ignorée.

tests/js exécute les modules purs avec l'exécuteur de tests de Node : les requêtes de bail et leur jeton CSRF, les instantanés et leurs modifications, la présence et la liste des rédacteurs, les Turbo Streams, les libellés.

Depuis la racine du monodépôt, puis depuis le bundle :

vendor/bin/phpunit packages/edit-lock-bundle/tests
node --import ./tests/js/register.mjs --test tests/js     # from packages/edit-lock-bundle

Chaque ligne de src/ est soumise au seuil de mutation du monodépôt : chaque mutant est tué.

Vérifications dans un navigateur

Le contrôleur est vérifié à la main avec deux rédacteurs — deux profils de navigateur, ou deux noms d'hôte du même site, afin que chacun garde sa propre session — sur une page avec Stimulus, l'éditeur de blocs, le contrôleur, les routes, un hub et un magasin de blocs. Chaque vérification indique quoi faire et ce qui doit se produire.

DomaineActionRésultat attendu
BailA tape dans un paragrapheB voit A dans la liste des rédacteurs, le paragraphe encadré avec le nom de A et fermé, le texte de A apparaissant à mesure que A tape
RepriseB, qui y est autorisé, clique sur Take overB détient le bloc ; la copie de A est fermée avec le nom de B, et A est prévenu que le bloc a été repris
Nouveau blocA appuie sur Entrée à la fin d'un paragraphe et tapeB voit le nouveau paragraphe apparaître juste après, détenu par A
Rédacteur tardifUn troisième rédacteur ouvre la pageLa page montre chaque bloc enregistré, tiré du magasin de blocs
DépartB ferme la pageB quitte la liste des rédacteurs, et le bloc de B s'ouvre pour A
Sans hubDésactivez Mercure et rechargezLes verrous s'affichent encore, à la pulsation suivante ; les enregistrements atteignent les autres lorsqu'ils rechargent

Tester une application qui l'utilise

Configurez store: memory et mercure.enabled: false dans l'environnement de test, ou gardez Doctrine sur la base de données de test et donnez à mercure.hub un hub qui enregistre, comme le fait le noyau fonctionnel du bundle. Dans les tests unitaires, construisez les pièces directement :

$locks = new EditLocks(new InMemoryLeaseRepository(), new MockClock(), 30, new WritersPolicy());
$locks->acquire(LeaseKey::of('article:42', 'aB3x'), Holder::of('7', 'Ada'));