Commit 80b8cb0381a83eb9aa39175a08fa04407936a3fc
1 parent
f8f0e2f2
Exists in
master
and in
1 other branch
- 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
Showing
4 changed files
with
246 additions
and
8 deletions
Show diff stats
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 | ... | ... |