Skip to content

Commit ab662df

Browse files
committed
feat(integration): INT-09 SuiteCRM<->FreePBX CTI env vars + test
1 parent 42b7ead commit ab662df

3 files changed

Lines changed: 81 additions & 15 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ jobs:
188188
run: docker compose -f docker/docker-compose.sso.yml down -v
189189

190190
lab-05-smoke:
191-
name: Lab 05 — INT-04 SuiteCRM↔Keycloak SAML (LDAP seed + federation + SAML client)
191+
name: Lab 05 — INT-04 SuiteCRM↔Keycloak SAML + INT-09 SuiteCRM↔FreePBX CTI
192192
runs-on: ubuntu-latest
193193
needs: validate
194194
continue-on-error: true

docker/docker-compose.integration.yml

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,18 @@
22
# IT-Stack: SuiteCRM — Lab 05: Advanced Integration
33
# Module 12 · Phase 3 · Lab 05
44
# =============================================================================
5-
# Services: MariaDB · OpenLDAP · Keycloak · WireMock (Odoo-mock) · Mailhog · SuiteCRM
5+
# Services: MariaDB · Redis · OpenLDAP · LDAP-seed · Keycloak · WireMock · Mailhog · SuiteCRM · Cron
66
# Ports: SuiteCRM:8362 WireMock:8363 Keycloak:8461 LDAP:3895 Mailhog:8661
77
# Credentials:
88
# DB root: RootLab05!
99
# SuiteCRM DB: suitecrm / SuiteLab05!
1010
# SuiteCRM UI: admin / Admin05!
11-
# Keycloak: admin / Admin05!
12-
# LDAP: cn=admin,dc=lab,dc=local / LdapLab05!
13-
# What's new vs Lab 04:
14-
# + WireMock 3.x simulates Odoo JSONRPC API (customer/account sync)
15-
# + WireMock also mocks Nextcloud CalDAV endpoint
16-
# + SuiteCRM integration env vars: ODOO_URL, ODOO_DB, NEXTCLOUD_URL
17-
# + Redis session cache retained from Lab 03
18-
# + Dedicated cron container retained
19-
# Integration tested: SuiteCRM ↔ Odoo (customer sync), SuiteCRM ↔ Nextcloud (CalDAV)
11+
# Keycloak: admin / Admin05! realm: it-stack
12+
# LDAP admin: cn=admin,dc=lab,dc=local / LdapLab05!
13+
# What's new vs Lab 04 (INT-09 additions):
14+
# + FREEPBX_URL, FREEPBX_AMI_HOST, FREEPBX_AMI_PORT env vars added
15+
# + WireMock also mocks FreePBX REST API (/api/rest.php) and AMI HTTP shim
16+
# + Integration tested: SuiteCRM ↔ FreePBX CTI (click-to-call originate)
2017
# =============================================================================
2118

2219
name: it-stack-suitecrm-lab05
@@ -241,6 +238,14 @@ services:
241238
NEXTCLOUD_URL: http://suitecrm-i05-mock:8080
242239
NEXTCLOUD_USER: admin
243240
NEXTCLOUD_CALDAV_PATH: /remote.php/dav/calendars/admin
241+
# FreePBX CTI integration (via WireMock — INT-09)
242+
FREEPBX_URL: http://suitecrm-i05-mock:8080
243+
FREEPBX_AMI_HOST: suitecrm-i05-mock
244+
FREEPBX_AMI_PORT: "5038"
245+
FREEPBX_AMI_USER: admin
246+
FREEPBX_AMI_PASSWORD: Admin05!
247+
FREEPBX_SIP_CHANNEL: SIP
248+
FREEPBX_OUTBOUND_CONTEXT: suitecrm-cti-outbound
244249
# Mail relay
245250
SUITECRM_SMTP_HOST: suitecrm-i05-mail
246251
SUITECRM_SMTP_PORT: "1025"

tests/labs/test-lab-12-05.sh

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#!/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)
33
# Module 12: SuiteCRM CRM
44
# Services: MariaDB · Redis · OpenLDAP · LDAP-seed · Keycloak · WireMock · Mailhog · SuiteCRM · Cron
55
# Ports: SuiteCRM:8362 WireMock:8363 KC:8461 LDAP:3895 MH:8661
66
# 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
78
set -euo pipefail
89

910
LAB_ID="12-05"
@@ -36,7 +37,8 @@ trap cleanup EXIT
3637

3738
echo -e "${CYAN}============================================================${NC}"
3839
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}"
4042
echo -e "${CYAN}============================================================${NC}"
4143
echo ""
4244

@@ -369,10 +371,69 @@ else
369371
fail "SUITECRM_LDAP_BASE_DN does not use FreeIPA-style path"
370372
fi
371373

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) ─────────────────────────────────────────────────
373434
echo ""
374435
echo -e "${CYAN}============================================================${NC}"
375-
echo -e " Lab ${LAB_ID} INT-04 Complete"
436+
echo -e " Lab ${LAB_ID} INT-04 + INT-09 Complete"
376437
echo -e " ${GREEN}PASS: ${PASS}${NC} | ${RED}FAIL: ${FAIL}${NC}"
377438
echo -e "${CYAN}============================================================${NC}"
378439

0 commit comments

Comments
 (0)