@@ -509,216 +509,3 @@ echo -e "${CYAN}========================================${NC}"
509509# ── Colors ────────────────────────────────────────────────────────────────────
510510RED=' \033[0;31m' ; GREEN=' \033[0;32m' ; YELLOW=' \033[1;33m'
511511CYAN=' \033[0;36m' ; NC=' \033[0m'
512-
513- pass () { echo -e " ${GREEN} [PASS]${NC} $1 " ; (( PASS++ )) ; }
514- fail () { echo -e " ${RED} [FAIL]${NC} $1 " ; (( FAIL++ )) ; }
515- info () { echo -e " ${CYAN} [INFO]${NC} $1 " ; }
516- warn () { echo -e " ${YELLOW} [WARN]${NC} $1 " ; }
517-
518- echo -e " ${CYAN} ======================================${NC} "
519- echo -e " ${CYAN} Lab ${LAB_ID} : ${LAB_NAME}${NC} "
520- echo -e " ${CYAN} Module: ${MODULE}${NC} "
521- echo -e " ${CYAN} ======================================${NC} "
522- APP_PORT=8442
523- MOCK_PORT=8763
524- KC_PORT=8542
525- LDAP_PORT=3887
526- MH_PORT=8742
527- MOCK_URL=" http://localhost:${MOCK_PORT} "
528-
529- APP_CONTAINER=" glpi-i05-app"
530- MOCK_CONTAINER=" glpi-i05-mock"
531-
532- # ── Cleanup trap ──────────────────────────────────────────────────────────────
533- NO_CLEANUP=false
534- [[ " ${1:- } " == " --no-cleanup" ]] && NO_CLEANUP=true
535-
536- cleanup () {
537- if [[ " ${NO_CLEANUP} " == " false" ]]; then
538- info " Phase 4: Cleanup"
539- docker compose -f " ${COMPOSE_FILE} " down -v --remove-orphans 2> /dev/null || true
540- info " Cleanup complete"
541- else
542- warn " Skipping cleanup (--no-cleanup)"
543- fi
544- }
545- trap cleanup EXIT
546-
547- echo " "
548-
549- # ── PHASE 1: Setup ────────────────────────────────────────────────────────────
550- info " Phase 1: Setup"
551- docker compose -f " ${COMPOSE_FILE} " up -d
552- info " Waiting 60s for GLPI stack to initialize..."
553- sleep 60
554-
555- # ── PHASE 2: Health Checks ────────────────────────────────────────────────────
556- info " Phase 2: Health Checks"
557-
558- if docker ps --format ' {{.Names}}' | grep -q " ^${APP_CONTAINER} $" ; then
559- pass " GLPI app container running"
560- else
561- fail " GLPI app container not running"
562- fi
563-
564- if docker ps --format ' {{.Names}}' | grep -q " ^${MOCK_CONTAINER} $" ; then
565- pass " WireMock container running"
566- else
567- fail " WireMock container not running"
568- fi
569-
570- # App health
571- if curl -sf " http://localhost:${APP_PORT} /" > /dev/null 2>&1 ; then
572- pass " GLPI web interface responds"
573- else
574- warn " GLPI web interface not yet ready"
575- fi
576-
577- # WireMock health
578- if curl -sf " ${MOCK_URL} /__admin/health" > /dev/null; then
579- pass " WireMock admin health OK"
580- else
581- fail " WireMock admin health unreachable"
582- fi
583-
584- # Keycloak
585- if curl -sf " http://localhost:${KC_PORT} /realms/master" > /dev/null 2>&1 ; then
586- pass " Keycloak master realm accessible"
587- else
588- warn " Keycloak not yet ready"
589- fi
590-
591- # LDAP
592- if ldapsearch -x -H ldap://localhost:${LDAP_PORT} -b dc=lab,dc=local \
593- -D cn=admin,dc=lab,dc=local -w LdapLab05! cn=admin > /dev/null 2>&1 ; then
594- pass " OpenLDAP bind successful"
595- else
596- warn " OpenLDAP bind failed"
597- fi
598-
599- # Mailhog
600- if curl -sf " http://localhost:${MH_PORT} /" > /dev/null 2>&1 ; then
601- pass " Mailhog web UI accessible"
602- else
603- warn " Mailhog web UI not ready"
604- fi
605-
606- # ── PHASE 3: Integration Tests ────────────────────────────────────────────────
607- info " Phase 3: Integration Tests (Zammad REST API via WireMock)"
608-
609- # 3a: Register Zammad tickets stub
610- info " 3a: Registering Zammad GET /api/v1/tickets stub..."
611- HTTP_STATUS=$( curl -sf -o /dev/null -w " %{http_code}" \
612- -X POST " ${MOCK_URL} /__admin/mappings" \
613- -H " Content-Type: application/json" \
614- -d ' {
615- "request": {"method": "GET", "url": "/api/v1/tickets"},
616- "response": {
617- "status": 200,
618- "headers": {"Content-Type": "application/json"},
619- "body": "[{\"id\":1,\"number\":\"10001\",\"title\":\"GLPI escalation test\",\"state\":{\"name\":\"open\"},\"priority\":{\"name\":\"2 normal\"},\"created_at\":\"2025-01-01T00:00:00Z\"}]"
620- }
621- }' || echo " 000" )
622- if [ " ${HTTP_STATUS} " = " 201" ]; then
623- pass " WireMock Zammad GET /api/v1/tickets stub registered (201)"
624- else
625- fail " WireMock Zammad ticket stub registration failed (HTTP ${HTTP_STATUS} )"
626- fi
627-
628- # Register Zammad ticket create stub
629- HTTP_STATUS=$( curl -sf -o /dev/null -w " %{http_code}" \
630- -X POST " ${MOCK_URL} /__admin/mappings" \
631- -H " Content-Type: application/json" \
632- -d ' {
633- "request": {"method": "POST", "url": "/api/v1/tickets"},
634- "response": {
635- "status": 201,
636- "headers": {"Content-Type": "application/json"},
637- "body": "{\"id\":42,\"number\":\"10042\",\"title\":\"GLPI escalated ticket\",\"state\":{\"name\":\"open\"}}"
638- }
639- }' || echo " 000" )
640- if [ " ${HTTP_STATUS} " = " 201" ]; then
641- pass " WireMock Zammad POST /api/v1/tickets stub registered"
642- else
643- fail " WireMock Zammad POST ticket stub failed (HTTP ${HTTP_STATUS} )"
644- fi
645-
646- # 3b: Verify Zammad API mock responds
647- if curl -sf " ${MOCK_URL} /api/v1/tickets" | grep -q ' GLPI escalation test' ; then
648- pass " WireMock Zammad GET /api/v1/tickets returns ticket JSON"
649- else
650- fail " WireMock Zammad GET /api/v1/tickets returned unexpected response"
651- fi
652-
653- # 3c: Integration env vars in GLPI container
654- if docker exec " ${APP_CONTAINER} " env 2> /dev/null | grep -q ' ZAMMAD_URL=' ; then
655- pass " ZAMMAD_URL env var present in GLPI container"
656- else
657- fail " ZAMMAD_URL env var missing from GLPI container"
658- fi
659-
660- if docker exec " ${APP_CONTAINER} " env 2> /dev/null | grep -q ' ZAMMAD_TOKEN=' ; then
661- pass " ZAMMAD_TOKEN env var present in GLPI container"
662- else
663- fail " ZAMMAD_TOKEN env var missing from GLPI container"
664- fi
665-
666- # 3d: Container-to-WireMock connectivity
667- if docker exec " ${APP_CONTAINER} " curl -sf http://glpi-i05-mock:8080/__admin/health > /dev/null 2>&1 ; then
668- pass " GLPI container can reach WireMock (glpi-i05-mock:8080)"
669- else
670- fail " GLPI container cannot reach WireMock"
671- fi
672-
673- # 3e: Simulate GLPI → Zammad ticket escalation via WireMock
674- if docker exec " ${APP_CONTAINER} " curl -sf \
675- -X POST http://glpi-i05-mock:8080/api/v1/tickets \
676- -H ' Content-Type: application/json' \
677- -H " Authorization: Token token=lab-zammad-token-05" \
678- -d ' {"title":"GLPI escalated ticket","group":"Support","customer_id":2}' 2> /dev/null | grep -q ' GLPI escalated' ; then
679- pass " GLPI → Zammad ticket creation call succeeds (via WireMock)"
680- else
681- warn " GLPI → Zammad ticket creation not verified (app may need full setup)"
682- fi
683-
684- # 3f: Volume assertions
685- if docker volume ls | grep -q ' glpi-i05-app-data' ; then
686- pass " GLPI app data volume exists"
687- else
688- fail " GLPI app data volume missing"
689- fi
690-
691- # ── Results ───────────────────────────────────────────────────────────────────
692- echo " "
693- echo -e " ${CYAN} ========================================${NC} "
694- echo -e " Lab ${LAB_ID} Complete"
695- echo -e " ${GREEN} PASS: ${PASS}${NC} | ${RED} FAIL: ${FAIL}${NC} "
696- echo -e " ${CYAN} ========================================${NC} "
697-
698- [ " ${FAIL} " -gt 0 ] && exit 1 || exit 0
699-
700- # TODO: Add module-specific functional tests here
701- # Example:
702- # if curl -sf http://localhost:80/health > /dev/null 2>&1; then
703- # pass "Health endpoint responds"
704- # else
705- # fail "Health endpoint not reachable"
706- # fi
707-
708- warn " Functional tests for Lab 17-05 pending implementation"
709-
710- # ── PHASE 4: Cleanup ──────────────────────────────────────────────────────────
711- info " Phase 4: Cleanup"
712- docker compose -f " ${COMPOSE_FILE} " down -v --remove-orphans
713- info " Cleanup complete"
714-
715- # ── Results ───────────────────────────────────────────────────────────────────
716- echo " "
717- echo -e " ${CYAN} ======================================${NC} "
718- echo -e " Lab ${LAB_ID} Complete"
719- echo -e " ${GREEN} PASS: ${PASS}${NC} | ${RED} FAIL: ${FAIL}${NC} "
720- echo -e " ${CYAN} ======================================${NC} "
721-
722- if [ " ${FAIL} " -gt 0 ]; then
723- exit 1
724- fi
0 commit comments