11#! /usr/bin/env bash
2- # test-lab-07-03.sh — Lab 07-03: Advanced Features
3- # Module 07: Mattermost team messaging
4- # mattermost with TLS, resource limits, and production-grade configuration
2+ # test-lab-07-03.sh — Lab 07-03: Mattermost Advanced Features
3+ # Tests: resource limits, MaxFileSize, S3 storage, perf settings, MinIO
54set -euo pipefail
6-
7- LAB_ID=" 07-03"
8- LAB_NAME=" Advanced Features"
9- MODULE=" mattermost"
105COMPOSE_FILE=" docker/docker-compose.advanced.yml"
11- PASS=0
12- FAIL=0
6+ PASS=0; FAIL=0
7+ pass () { echo " [PASS] $1 " ; PASS=$(( PASS+ 1 )) ; }
8+ fail () { echo " [FAIL] $1 " ; FAIL=$(( FAIL+ 1 )) ; }
9+ section () { echo ; echo " === $1 ===" ; }
10+ MM_API=" http://localhost:8065/api/v4"
1311
14- # ── Colors ────────────────────────────────────────────────────────────────────
15- RED=' \033[0;31m' ; GREEN=' \033[0;32m' ; YELLOW=' \033[1;33m'
16- CYAN=' \033[0;36m' ; NC=' \033[0m'
12+ section " Container health"
13+ for c in mm-adv-db mm-adv-redis mm-adv-minio mm-adv-smtp mm-adv-app; do
14+ if docker inspect --format ' {{.State.Running}}' " $c " 2> /dev/null | grep -q true ; then
15+ pass " Container $c is running"
16+ else
17+ fail " Container $c is not running"
18+ fi
19+ done
1720
18- pass () { echo -e " ${GREEN} [PASS]${NC} $1 " ; (( PASS++ )) ; }
19- fail () { echo -e " ${RED} [FAIL]${NC} $1 " ; (( FAIL++ )) ; }
20- info () { echo -e " ${CYAN} [INFO]${NC} $1 " ; }
21- warn () { echo -e " ${YELLOW} [WARN]${NC} $1 " ; }
21+ section " PostgreSQL connectivity"
22+ if docker compose -f " $COMPOSE_FILE " exec -T db pg_isready -U mmuser -d mattermost 2> /dev/null | grep -q " accepting" ; then
23+ pass " PostgreSQL accepting connections"
24+ else
25+ fail " PostgreSQL not ready"
26+ fi
2227
23- echo -e " ${CYAN} ======================================${NC} "
24- echo -e " ${CYAN} Lab ${LAB_ID} : ${LAB_NAME}${NC} "
25- echo -e " ${CYAN} Module: ${MODULE}${NC} "
26- echo -e " ${CYAN} ======================================${NC} "
27- echo " "
28+ section " MinIO S3 health"
29+ MINIO_STATUS=$( curl -sf http://localhost:9000/minio/health/live 2> /dev/null; echo $? ) || MINIO_STATUS=1
30+ if [ " $MINIO_STATUS " = " 0" ]; then
31+ pass " MinIO S3 health endpoint reachable"
32+ else
33+ HTTP_MINIO=$( curl -sw ' %{http_code}' -o /dev/null http://localhost:9000/minio/health/live 2> /dev/null) || HTTP_MINIO=" 000"
34+ if [ " $HTTP_MINIO " = " 200" ]; then
35+ pass " MinIO S3 health endpoint HTTP 200"
36+ else
37+ fail " MinIO S3 health endpoint returned $HTTP_MINIO "
38+ fi
39+ fi
2840
29- # ── PHASE 1: Setup ────────────────────────────────────────────────────────────
30- info " Phase 1: Setup"
31- docker compose -f " ${COMPOSE_FILE} " up -d
32- info " Waiting 30s for ${MODULE} to initialize..."
33- sleep 30
41+ section " Mattermost API ping"
42+ PING=$( curl -sf " $MM_API /system/ping" 2> /dev/null) || PING=" "
43+ if echo " $PING " | grep -q " status" ; then
44+ pass " Mattermost API /system/ping reachable"
45+ else
46+ fail " Mattermost API /system/ping failed"
47+ fi
3448
35- # ── PHASE 2: Health Checks ────────────────────────────────────────────────────
36- info " Phase 2: Health Checks"
49+ section " Admin user creation"
50+ REGISTER=$( curl -sf -X POST " $MM_API /users" \
51+ -H " Content-Type: application/json" \
52+ -d ' {"email":"admin@lab.local","username":"admin03","password":"Lab03Admin!","first_name":"Admin","last_name":"Lab03"}' 2> /dev/null) || REGISTER=" "
53+ if echo " $REGISTER " | grep -q ' "id"' ; then
54+ pass " Admin user created"
55+ elif echo " $REGISTER " | grep -q " already" ; then
56+ pass " Admin user already exists"
57+ else
58+ fail " Admin user registration failed: $REGISTER "
59+ fi
3760
38- if docker compose -f " ${COMPOSE_FILE} " ps | grep -q " running\|Up" ; then
39- pass " Container is running"
61+ section " Admin login"
62+ TOKEN_RESP=$( curl -si -X POST " $MM_API /users/login" \
63+ -H " Content-Type: application/json" \
64+ -d ' {"login_id":"admin03","password":"Lab03Admin!"}' 2> /dev/null) || TOKEN_RESP=" "
65+ MM_TOKEN=$( echo " $TOKEN_RESP " | grep -i " ^Token:" | awk ' {print $2}' | tr -d ' [:space:]' ) || MM_TOKEN=" "
66+ if [ -n " $MM_TOKEN " ]; then
67+ pass " Admin login successful, token obtained"
4068else
41- fail " Container is not running "
69+ fail " Admin login failed "
4270fi
4371
44- # ── PHASE 3: Functional Tests ─────────────────────────────────────────────────
45- info " Phase 3: Functional Tests (Lab 03 — Advanced Features)"
72+ section " MaxFileSize in container env"
73+ MM_ENV=$( docker inspect mm-adv-app --format ' {{json .Config.Env}}' 2> /dev/null) || MM_ENV=" []"
74+ if echo " $MM_ENV " | grep -q " MM_FILESETTINGS_MAXFILESIZE=524288000" ; then
75+ pass " MM_FILESETTINGS_MAXFILESIZE=524288000 set in container"
76+ else
77+ fail " MM_FILESETTINGS_MAXFILESIZE=524288000 not found in container env"
78+ fi
4679
47- # TODO: Add module-specific functional tests here
48- # Example:
49- # if curl -sf http://localhost:8065/health > /dev/null 2>&1; then
50- # pass "Health endpoint responds"
51- # else
52- # fail "Health endpoint not reachable"
53- # fi
80+ section " Performance settings in container env"
81+ if echo " $MM_ENV " | grep -q " MM_SERVICESETTINGS_READTIMEOUT=300" ; then
82+ pass " MM_SERVICESETTINGS_READTIMEOUT=300 set"
83+ else
84+ fail " MM_SERVICESETTINGS_READTIMEOUT=300 not found"
85+ fi
86+ if echo " $MM_ENV " | grep -q " MM_SERVICESETTINGS_MAXLOGINRETRIES=3" ; then
87+ pass " MM_SERVICESETTINGS_MAXLOGINRETRIES=3 set"
88+ else
89+ fail " MM_SERVICESETTINGS_MAXLOGINRETRIES=3 not found"
90+ fi
5491
55- warn " Functional tests for Lab 07-03 pending implementation"
92+ section " Resource limits check"
93+ MM_MEM=$( docker inspect mm-adv-app --format ' {{.HostConfig.Memory}}' 2> /dev/null) || MM_MEM=" 0"
94+ if [ " $MM_MEM " = " 1073741824" ]; then
95+ pass " mm-adv-app memory limit = 1G (1073741824 bytes)"
96+ else
97+ fail " mm-adv-app memory limit: expected 1073741824, got $MM_MEM "
98+ fi
5699
57- # ── PHASE 4: Cleanup ──────────────────────────────────────────────────────────
58- info " Phase 4: Cleanup"
59- docker compose -f " ${COMPOSE_FILE} " down -v --remove-orphans
60- info " Cleanup complete"
100+ section " MaxFileSize via API config"
101+ if [ -n " $MM_TOKEN " ]; then
102+ CONFIG=$( curl -sf -H " Authorization: Bearer $MM_TOKEN " " $MM_API /config" 2> /dev/null) || CONFIG=" "
103+ if echo " $CONFIG " | grep -q ' "MaxFileSize":524288000' ; then
104+ pass " API config MaxFileSize = 524288000"
105+ else
106+ fail " API config MaxFileSize not 524288000"
107+ fi
108+ else
109+ fail " Skipping API config check (no token)"
110+ fi
61111
62- # ── Results ───────────────────────────────────────────────────────────────────
63- echo " "
64- echo -e " ${CYAN} ======================================${NC} "
65- echo -e " Lab ${LAB_ID} Complete"
66- echo -e " ${GREEN} PASS: ${PASS}${NC} | ${RED} FAIL: ${FAIL}${NC} "
67- echo -e " ${CYAN} ======================================${NC} "
112+ section " S3 file settings via API"
113+ if [ -n " $MM_TOKEN " ] && [ -n " $CONFIG " ]; then
114+ if echo " $CONFIG " | grep -q ' "DriverName":"amazons3"' ; then
115+ pass " FileSettings DriverName = amazons3"
116+ else
117+ fail " FileSettings DriverName not amazons3"
118+ fi
119+ else
120+ fail " Skipping S3 API check (no token or config)"
121+ fi
68122
69- if [ " ${FAIL} " -gt 0 ]; then
70- exit 1
123+ section " Redis connectivity"
124+ REDIS_PONG=$( docker compose -f " $COMPOSE_FILE " exec -T redis redis-cli PING 2> /dev/null | tr -d ' [:space:]' ) || REDIS_PONG=" "
125+ if [ " $REDIS_PONG " = " PONG" ]; then
126+ pass " Redis PING responded"
127+ else
128+ fail " Redis PING failed"
71129fi
130+
131+ echo
132+ echo " ====================================="
133+ echo " Mattermost Lab 07-03 Results"
134+ echo " PASS: $PASS FAIL: $FAIL "
135+ echo " ====================================="
136+ [ " $FAIL " -eq 0 ] && exit 0 || exit 1
0 commit comments