Commit 80b8cb0381a83eb9aa39175a08fa04407936a3fc

Authored by Etienne Pallier
1 parent f8f0e2f2
Exists in master and in 1 other branch dev

- Nouveau super test : cycle de vie complet d'un matériel (v3.7.9.50)

- dernier dernier test... (CREATED => V => T => ARCHIVED)
- bugfix (en cours) des actions documents/admission et documents/sortie
qui ne marchent plus car on ne leur passe pas un id mais un nom de
doc...
- Nombreuses refactorisations dans les tests
README.md
... ... @@ -53,14 +53,13 @@ Logiciel testé et validé sur les configurations suivantes :
53 53  
54 54 VERSION ACTUELLE
55 55  
56   -Date: 26/06/2020
57   -Version: 3.7.9.49
  56 +Date: 29/06/2020
  57 +Version: 3.7.9.50
58 58 Author: EP
59 59 Commentaire:
60   - - TEST3 : Ajout (terminé) d'un 3ème (et DERNIER) gros test générique des vues index et view de Materiels (/materiels/index et /view) qui teste le CONTENU des vues pour TOUS les materiels de la BD de test (fixture), aussi bien dans la vue index globale que dans CHAQUE vue détaillée de chaque matériel (et surtout en vérifiant aussi la liste des entités associées (suivis,emprunts,documents)
61   - - bugfix autorisations d'affichage des boutons d'action sur documents dans materiels/view/
62   - - Nombreuses refactorisations
63   - - ...
  60 + - Nouveau (et dernier dernier) super test ajouté : test du cycle de vie complet d'un matériel (CREATED => ... => ARCHIVED)
  61 + - bugfix (en cours) des actions documents/admission et documents/sortie qui ne marchent plus car on ne leur passe pas un id mais un nom de doc...
  62 + - Nombreuses refactorisations dans les tests
64 63  
65 64 - Amélioration page /pages/acls
66 65  
... ...
src/Controller/AppController.php
... ... @@ -641,6 +641,7 @@ class AppController extends Controller
641 641 $this->d("$condition_on_status evalué à "); $this->d2($condition_on_status_result);
642 642 //if ($action=='printLabelRuban') { debug("coucou2"); exit; }
643 643 // Si condition statut non respectée => access denied
  644 + //if ($action=='admission') {debug("here"); exit;}
644 645 if (! $condition_on_status_result) return FALSE;
645 646  
646 647 //if ($this->name=='Suivis') exit;
... ...
src/Controller/DocumentsController.php
... ... @@ -60,6 +60,7 @@ class DocumentsController extends AppController
60 60 $this->setAuthorizationsForAction('admissionPdf', 'admission', ['user'=>-1, 'resp'=>-1]);
61 61 // Action 'sortie'
62 62 $this->setAuthorizationsForAction('sortie', ['ARCHIVED',0], ['user'=>-1, 'resp'=>-1]);
  63 + $this->setAuthorizationsForAction('sortiePdf', 'sortie', ['user'=>-1, 'resp'=>-1]);
63 64  
64 65 } // setAuthorizations
65 66  
... ...
tests/TestCase/Controller/MaterielsControllerTest.php
... ... @@ -99,13 +99,23 @@ class MaterielsControllerTest extends General {
99 99 'date_acquisition' => '19-04-2016',
100 100 //'date_acquisition' => '19-04-2019',
101 101 // pas obligatoire, mais plus cohérent car c'est le statut minimum
102   - 'status' => 'CREATED',
  102 + ////'status' => 'CREATED',
103 103 /*
104 104 'nom_responsable' => 'Jacques Utilisateur',
105 105 'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu'
106 106 'nom_createur' => 'Pallier Etienne',
107 107 'nom_modificateur' => 'Jean Administration',
108 108 */
  109 +
  110 + // CHAMPS NECESSAIRES POUR MATERIEL VALIDATED :
  111 + /*
  112 + 'date_reception' => '2016-04-19',
  113 + 'nom_responsable' => 'Lorem ipsum dolor sit amet',
  114 + 'fournisseur_id' => 1
  115 + 'organisme_id' => 1,
  116 + 'prix_ht' => 75,
  117 + 'numero_commande' => 'Lorem ipsum dolor sit amet',
  118 + */
109 119 ];
110 120  
111 121 /*
... ... @@ -807,7 +817,7 @@ class MaterielsControllerTest extends General {
807 817 $this->get('/materiels/index');
808 818 $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role." Le matériel s'ajoute alors que le champ obligatoire ".$mandatoryField." n'est pas rempli");
809 819  
810   - $this->tearDown();
  820 + ////$this->tearDown();
811 821 }
812 822  
813 823 // Test de l'action "Copier ce materiel" (= materiel/add/id) sur tous les roles
... ... @@ -2357,7 +2367,234 @@ class MaterielsControllerTest extends General {
2357 2367 public function OFF_testActionDeleteMateriel($role) {
2358 2368 $this->_testActionDeleteEntity($role);
2359 2369 }
  2370 +
  2371 +
  2372 + private function _assertFlashMessageIsAsExpectedForAction($action, $SUCCESS=true) {
  2373 + $expected_flash_message = 'Le matériel a bien été ';
  2374 + switch($action) {
  2375 + case 'add':
  2376 + $expected_flash_message .= 'ajouté';
  2377 + break;
  2378 + case 'edit':
  2379 + $expected_flash_message .= 'modifié';
  2380 + break;
  2381 + case 'delete':
  2382 + $expected_flash_message .= 'supprimé';
  2383 + break;
  2384 + case 'statusCreated':
  2385 + $expected_flash_message .= 'rétrogradé au statut CREATED';
  2386 + break;
  2387 + case 'statusValidated':
  2388 + $expected_flash_message .= 'validé';
  2389 + if (!$SUCCESS) $expected_flash_message = "Pour valider un matériel, les champs suivants ne doivent pas être vides :";
  2390 + /*
  2391 + Date de reception,
  2392 + Nom utilisateur,
  2393 + Fournisseur,
  2394 + Organisme,
  2395 + Prix,
  2396 + et Numéro de commande";
  2397 + */
  2398 + break;
  2399 + case 'statusTobearchived': $expected_flash_message = "La sortie d'inventaire a bien été demandée"; break;
  2400 + case 'statusArchived': $expected_flash_message .= "archivé (sorti de l'inventaire)"; break;
  2401 + }
  2402 + $flash_message = isset($_SESSION['Flash']) ? $_SESSION['Flash']['flash'][0]['message']:[];
  2403 + if ($flash_message) {
  2404 + // Assert a flash message in the 'flash' key.
  2405 + // Test message partiel
  2406 + $msg_error = "Le message flash est incorrect : ($flash_message) au lieu de ($expected_flash_message)";
  2407 + if ($action == 'statusValidated') $this->assertTrue(strpos($flash_message, $expected_flash_message)===0, $msg_error);
  2408 + else {
  2409 + if ($SUCCESS) {
  2410 + $this->assertTrue(strpos($flash_message, $expected_flash_message)===0, $msg_error);
  2411 + // Test message complet
  2412 + $this->assertFlashMessage($expected_flash_message, 'flash');
  2413 + //$this->assertEquals($expected_flash_message, $flash_message);
  2414 + }
  2415 + else {
  2416 + $this->assertFalse(strpos($flash_message, $expected_flash_message)===0, $msg_error);
  2417 + $this->assertTrue(strpos($flash_message, "Désolé, vous n'êtes pas autorisé à accéder à cette zone.")===0, $msg_error);
  2418 + }
  2419 + }
  2420 + }
  2421 + }
  2422 +
  2423 + private function _doActionAndCheckResult($action, $id=null, $SUCCESS=true, $data=[], $controller=null) {
  2424 + $action_link = Inflector::dasherize($action); // statusValidated => status-validated
  2425 + //$this->post("/materiels/$action_link/$id");
  2426 + //$this->post("/materiels/$action", $data);
  2427 + if (!$controller) $controller = 'materiels';
  2428 + //$full_action = "/materiels/$action_link";
  2429 + $full_action = "/$controller/$action_link";
  2430 + if ($id) $full_action .= "/$id";
  2431 + //debug($full_action);
  2432 + $this->post($full_action, $data);
  2433 + //if ($action =='statusValidated') return;
  2434 + $this->assertResponseSuccess();
  2435 + $this->_assertFlashMessageIsAsExpectedForAction($action, $SUCCESS);
  2436 + }
  2437 +
  2438 + private function _checkMaterielStatusChangedTo($id,$new_status) {
  2439 + $m = $this->Materiels->get($id);
  2440 + $this->assertSame($m->status, $new_status);
  2441 + }
  2442 +
  2443 + private function _testMaterielCannotBeModifiedAnymoreExceptIfDevalidated($id) {
  2444 +
  2445 + // On sauve le statut courant
  2446 + $m = $this->Materiels->get($id);
  2447 + $current_status = $m->status;
  2448 +
  2449 + // 1) On vérifie qu'on ne peut plus modifier le matériel (car VALIDATED+)
  2450 + $action = 'edit';
  2451 + $new_data = [
  2452 + 'designation' => 'Nouveau nom modifié',
  2453 + ];
  2454 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=false, $new_data);
  2455 +
  2456 + // 2) On vérifie qu'on peut le modifier si on le dévalide :
  2457 + $action = 'statusCreated';
  2458 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=true);
  2459 + $this->_checkMaterielStatusChangedTo($id,'CREATED');
  2460 + $action = 'edit';
  2461 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=true, $new_data);
  2462 + $m = $this->Materiels->get($id);
  2463 + $this->assertSame($m->designation, 'Nouveau nom modifié');
  2464 +
  2465 + // 3) On valide à nouveau pour passer à VALIDATED
  2466 + $new_status = 'VALIDATED';
  2467 + $action = 'statusValidated';
  2468 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=true);
  2469 + $this->_checkMaterielStatusChangedTo($id,$new_status);
  2470 +
  2471 + $statuses = [
  2472 + 'TOBEARCHIVED' => 'statusTobearchived',
  2473 + 'ARCHIVED' => 'statusArchived'
  2474 + ];
  2475 + // 4) On repasse au statut courant (du début) si on n'y est pas encore
  2476 + foreach ($statuses as $new_status=>$new_status_action) {
  2477 + $m = $this->Materiels->get($id);
  2478 + if ($m->status == $current_status) break;
  2479 + $this->_doActionAndCheckResult($new_status_action, $id, $SUCCESS=true);
  2480 + $this->_checkMaterielStatusChangedTo($id,$new_status);
  2481 + }
  2482 +
  2483 + }
  2484 +
  2485 + /**
  2486 + * Test du cycle de vie complet d'un matériel
  2487 + *
  2488 + * On teste les états-transitions d'un matériel, le passage progressif d'un état à un autre :
  2489 + * CREATED => VALIDATED => TBA => ARCHIVED
  2490 + * (on teste aussi toutes les actions qui sont possibles ou pas à chaque état)
  2491 + *
  2492 + */
  2493 + public function testMaterielLifeCycle() {
  2494 +
  2495 + // On teste avec le profil SUPERADMIN car il a (presque) tous les droits
  2496 + $this->authAs('SUPER');
  2497 + // Nb materiels au départ dans la BD
  2498 + $nbentities = $this->getNbEntitiesExpectedInIndexView();
  2499 + $this->_checkNbEntitiesInIndexViewIsAsExpected('materiels', $nbentities);
  2500 + // Données minimum à "poster" pour créer un nouveau matériel
  2501 + $data = $this->getNewEntityWithAllMandatoryFields();
  2502 +
  2503 + /*
  2504 + * 1) NAISSANCE, création => CREATED
  2505 + */
  2506 + $new_status = 'CREATED';
  2507 + $action = 'add';
  2508 + $this->_doActionAndCheckResult($action, null, $SUCCESS=true, $data);
  2509 + $nbentities++;
  2510 + $this->_checkNbEntitiesInIndexViewIsAsExpected('materiels', $nbentities);
  2511 + // On récupère ce dernier matériel créé from BD
  2512 + $m = $this->Materiels->find()->last();
  2513 + $id = $m->id;
  2514 + // On vérifie que le statut du matos a bien changé
  2515 + $this->_checkMaterielStatusChangedTo($id,$new_status);
  2516 + //$this->assertSame($m->status, $new_status);
  2517 + // On vérifie qu'on NE peut PAS sortir le doc d'admission (DocumentsController)
  2518 + $this->_doActionAndCheckResult('admission', $id, $SUCCESS=false, [], 'documents');
  2519 +
  2520 + /*
  2521 + * 2) Validation => VALIDATED
  2522 + */
  2523 + $new_status = 'VALIDATED';
  2524 + //$action_link = 'status-validated';
  2525 +
  2526 + // a) FAIL car manque des données pour valider
  2527 + $action = 'statusValidated';
  2528 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=false);
  2529 +
  2530 + // b) On ajoute les données manquantes
  2531 + // CHAMPS NECESSAIRES POUR MATERIEL VALIDATED :
  2532 + $new_data = [
  2533 + 'date_reception' => '2016-04-19',
  2534 + 'nom_responsable' => 'Lorem ipsum dolor sit amet',
  2535 + 'fournisseur_id' => 1,
  2536 + 'organisme_id' => 1,
  2537 + 'prix_ht' => 75,
  2538 + 'numero_commande' => 'Lorem ipsum dolor sit amet',
  2539 + ];
  2540 + $action = 'edit';
  2541 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=true, $new_data);
  2542 +
  2543 + // c) SUCCESS car on a toutes les données nécessaires
  2544 + $action = 'statusValidated';
  2545 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=true);
  2546 + // On vérifie que le statut du matos a bien changé
  2547 + $this->_checkMaterielStatusChangedTo($id,$new_status);
  2548 +
  2549 + // d) On vérifie qu'on peut dévalider ce materiel pour le repasser à l'état CREATED
  2550 + $this->_testMaterielCannotBeModifiedAnymoreExceptIfDevalidated($id);
  2551 + //$this->_checkMaterielStatusChangedTo($id,$new_status);
2360 2552  
  2553 + //TODO:
  2554 + // e) On vérifie qu'on peut sortir le doc d'admission (DocumentsController)
  2555 + ////$this->_doActionAndCheckResult('admission', $id, $SUCCESS=true, [], 'documents');
  2556 +
  2557 + /*
  2558 + * 3) Demande archivage => TBA
  2559 + */
  2560 + $new_status = 'TOBEARCHIVED';
  2561 + $action = 'statusTobearchived';
  2562 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=true);
  2563 + $this->_checkMaterielStatusChangedTo($id,$new_status);
  2564 + $this->_testMaterielCannotBeModifiedAnymoreExceptIfDevalidated($id);
  2565 + //$this->_checkMaterielStatusChangedTo($id,$new_status);
  2566 +
  2567 + /*
  2568 + * 4) Sortie d'inventaire (archivage) => ARCHIVED
  2569 + */
  2570 + $new_status = 'ARCHIVED';
  2571 + $action = 'statusArchived';
  2572 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=true);
  2573 + $this->_checkMaterielStatusChangedTo($id,$new_status);
  2574 + $this->_testMaterielCannotBeModifiedAnymoreExceptIfDevalidated($id);
  2575 + //$this->_checkMaterielStatusChangedTo($id,$new_status);
  2576 + //$this->_checkMaterielStatusChangedTo($id,'ARCHIVED');
  2577 + //TODO:
  2578 + // On vérifie qu'on peut afficher le doc de sortie (DocumentsController)
  2579 + ////$this->_doActionAndCheckResult('sortie', $id, $SUCCESS=true, [], 'documents');
  2580 +
  2581 +
  2582 + /*
  2583 + * 5) MORT, suppression définitive de la BD => n'existe plus
  2584 + */
  2585 + //$this->Materiels->delete($m);
  2586 + $action = 'delete';
  2587 + // Check qu'on ne peut pas supprimer le materiel à moins de le devalider d'abord
  2588 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=false);
  2589 + // Pour le supprimer, je dois d'abord le dévalider puis faire en sorte qu'il m'appartienne
  2590 + $this->_doActionAndCheckResult('statusCreated', $id, $SUCCESS=true);
  2591 + $this->_doActionAndCheckResult('edit', $id, $SUCCESS=true, [ 'nom_responsable' => 'user1 SUPER' ]);
  2592 + $this->_doActionAndCheckResult($action, $id, $SUCCESS=true);
  2593 + $nbentities--;
  2594 + $this->_checkNbEntitiesInIndexViewIsAsExpected('materiels', $nbentities);
  2595 +
  2596 + }
  2597 +
2361 2598  
2362 2599  
2363 2600 } // class MaterielsControllerTest
2364 2601 \ No newline at end of file
... ...