|
1 | 1 | #!/usr/bin/env bash |
2 | | -# test-lab-12-05.sh — Lab 12-05: Advanced Integration (INT-04) |
| 2 | +# test-lab-12-05.sh — Lab 12-05: Advanced Integration (INT-04 + INT-09) |
3 | 3 | # Module 12: SuiteCRM CRM |
4 | 4 | # Services: MariaDB · Redis · OpenLDAP · LDAP-seed · Keycloak · WireMock · Mailhog · SuiteCRM · Cron |
5 | 5 | # Ports: SuiteCRM:8362 WireMock:8363 KC:8461 LDAP:3895 MH:8661 |
6 | 6 | # INT-04: Keycloak SAML client provisioning + FreeIPA LDAP federation + SP metadata check |
| 7 | +# INT-09: FreePBX CTI click-to-call WireMock stubs + env var validation |
7 | 8 | set -euo pipefail |
8 | 9 |
|
9 | 10 | LAB_ID="12-05" |
@@ -36,7 +37,8 @@ trap cleanup EXIT |
36 | 37 |
|
37 | 38 | echo -e "${CYAN}============================================================${NC}" |
38 | 39 | echo -e "${CYAN} Lab ${LAB_ID}: ${LAB_NAME} — ${MODULE}${NC}" |
39 | | -echo -e "${CYAN} SuiteCRM ↔ Odoo JSONRPC (WireMock) + Nextcloud CalDAV${NC}" |
| 40 | +echo -e "${CYAN} SuiteCRM ↔ Odoo JSONRPC (WireMock) + Nextcloud CalDAV (INT-04)${NC}" |
| 41 | +echo -e "${CYAN} SuiteCRM ↔ FreePBX CTI click-to-call WireMock stubs (INT-09)${NC}" |
40 | 42 | echo -e "${CYAN}============================================================${NC}" |
41 | 43 | echo "" |
42 | 44 |
|
@@ -369,10 +371,69 @@ else |
369 | 371 | fail "SUITECRM_LDAP_BASE_DN does not use FreeIPA-style path" |
370 | 372 | fi |
371 | 373 |
|
372 | | -# ── Results (INT-04) ────────────────────────────────────────────────────────── |
| 374 | +# ── Phase 3d: FreePBX CTI WireMock Stubs (INT-09) ─────────────────────────── |
| 375 | +section "Phase 3d: FreePBX CTI WireMock Stubs (INT-09)" |
| 376 | +info "Registering WireMock stubs for FreePBX REST API (click-to-call)..." |
| 377 | + |
| 378 | +# FreePBX REST API originate stub |
| 379 | +HTTP_STATUS=$(curl -sf -o /dev/null -w "%{http_code}" \ |
| 380 | + -X POST "${MOCK_URL}/__admin/mappings" \ |
| 381 | + -H "Content-Type: application/json" \ |
| 382 | + -d '{ |
| 383 | + "request": {"method": "POST", "url": "/api/rest.php"}, |
| 384 | + "response": {"status": 200, |
| 385 | + "body": "{\"name\":\"Originate\",\"success\":true,\"channel\":\"SIP/101\"}", |
| 386 | + "headers": {"Content-Type": "application/json"}} |
| 387 | + }' || echo "000") |
| 388 | +[ "${HTTP_STATUS}" = "201" ] \ |
| 389 | + && pass "WireMock stub: FreePBX /api/rest.php originate registered" \ |
| 390 | + || fail "WireMock stub: FreePBX /api/rest.php failed (HTTP $HTTP_STATUS)" |
| 391 | + |
| 392 | +# FreePBX admin config stub |
| 393 | +HTTP_STATUS=$(curl -sf -o /dev/null -w "%{http_code}" \ |
| 394 | + -X POST "${MOCK_URL}/__admin/mappings" \ |
| 395 | + -H "Content-Type: application/json" \ |
| 396 | + -d '{ |
| 397 | + "request": {"method": "GET", "url": "/admin/config.php"}, |
| 398 | + "response": {"status": 200, "body": "<html><title>FreePBX Admin</title></html>"} |
| 399 | + }' || echo "000") |
| 400 | +[ "${HTTP_STATUS}" = "201" ] \ |
| 401 | + && pass "WireMock stub: FreePBX /admin/config.php registered" \ |
| 402 | + || fail "WireMock stub: FreePBX /admin/config.php failed (HTTP $HTTP_STATUS)" |
| 403 | + |
| 404 | +# Verify FreePBX REST mock responds |
| 405 | +if curl -sf -X POST "${MOCK_URL}/api/rest.php" \ |
| 406 | + -H "Content-Type: application/json" \ |
| 407 | + -d '{"action":"Originate","Channel":"SIP/101","Exten":"100","Context":"suitecrm-cti-outbound"}' \ |
| 408 | + | grep -q 'success'; then |
| 409 | + pass "WireMock FreePBX originate returns success" |
| 410 | +else |
| 411 | + fail "WireMock FreePBX originate not responding correctly" |
| 412 | +fi |
| 413 | + |
| 414 | +# Assert FREEPBX_* env vars inside SuiteCRM container |
| 415 | +for envpair in "FREEPBX_URL=http://suitecrm-i05-mock" "FREEPBX_AMI_HOST=suitecrm-i05-mock" "FREEPBX_AMI_PORT=5038" "FREEPBX_AMI_USER=admin"; do |
| 416 | + KEY="${envpair%%=*}" |
| 417 | + VAL="${envpair#*=}" |
| 418 | + if docker exec suitecrm-i05-app env | grep -q "${KEY}=${VAL}"; then |
| 419 | + pass "Env: ${KEY} set correctly" |
| 420 | + else |
| 421 | + fail "Env: ${KEY} not set or wrong in SuiteCRM container" |
| 422 | + fi |
| 423 | +done |
| 424 | + |
| 425 | +# SuiteCRM container → WireMock (FreePBX mock) reachable |
| 426 | +if docker exec suitecrm-i05-app curl -sf \ |
| 427 | + "http://suitecrm-i05-mock:8080/admin/config.php" > /dev/null 2>&1; then |
| 428 | + pass "SuiteCRM container → WireMock (FreePBX mock) reachable" |
| 429 | +else |
| 430 | + fail "SuiteCRM container cannot reach WireMock (FreePBX mock)" |
| 431 | +fi |
| 432 | + |
| 433 | +# ── Results (INT-04 + INT-09) ───────────────────────────────────────────────── |
373 | 434 | echo "" |
374 | 435 | echo -e "${CYAN}============================================================${NC}" |
375 | | -echo -e " Lab ${LAB_ID} INT-04 Complete" |
| 436 | +echo -e " Lab ${LAB_ID} INT-04 + INT-09 Complete" |
376 | 437 | echo -e " ${GREEN}PASS: ${PASS}${NC} | ${RED}FAIL: ${FAIL}${NC}" |
377 | 438 | echo -e "${CYAN}============================================================${NC}" |
378 | 439 |
|
|
0 commit comments