open_workshop/open_workshop_mqtt/run-tests.sh
matthias.lotz 90e3422e8b fix: Repariere alle Unit Tests - SessionDetector jetzt produktionsreif
-  Alle 26 Tests grün (0 failed, 0 errors)
- Phase 2 ist damit 100% fertig!

Tests repariert:
- test_session_detector.py: Alle 7 Tests an env-passing angepasst
  - SessionDetector(device.id, device.name) statt SessionDetector(device)
  - process_power_event(env, power, ts) statt process_power_event(power, ts)
- test_mqtt_mocked.py: Alle 4 Service-Tests korrigiert
  - start_connection_with_env(connection_id, env) Signatur
  - stop_connection(connection_id) Parameter hinzugefügt
  - IotBridgeService direkt instanziiert
  - device.topic_pattern statt nicht-existierendem device_id

Verbesserungen:
- run-tests.sh: Klare Ausgabe mit ✓✓✓ ALL TESTS PASSED ✓✓✓
- run-tests.sh: Parsed Odoo Test-Output korrekt
- run-tests.sh: Exit Code (0=success, 1=failure)

Test-Coverage:
- SessionDetector State Machine vollständig getestet
- Alle 5 States: IDLE/STARTING/STANDBY/WORKING/STOPPING
- Debounce Logic: Start + Stop Timer
- Duration Tracking: Standby/Working Zeiten
- Timeout Detection: 20s Message Timeout
- State Recovery: Nach Restart

SessionDetector ist produktionsreif!
2026-01-30 16:46:35 +01:00

116 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
# Odoo Module Tests - OWS_MQTT Database
# Container: hobbyhimmel_odoo_18-dev, DB: hobbyhimmel_odoo_18_db
set -e
MODULE="open_workshop_mqtt"
DB_NAME="OWS_MQTT"
TIMEOUT=120
DB_CONTAINER="hobbyhimmel_odoo_18-dev_db"
ODOO_CONTAINER="hobbyhimmel_odoo_18-dev"
# Log im Projektverzeichnis
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_FILE="${SCRIPT_DIR}/test_$(date +%Y%m%d_%H%M%S).log"
echo "=== Checking containers ==="
if ! docker ps --format '{{.Names}}' | grep -q "^${DB_CONTAINER}$"; then
echo "✗ DB Container ${DB_CONTAINER} not running!"
exit 1
fi
if ! docker ps --format '{{.Names}}' | grep -q "^${ODOO_CONTAINER}$"; then
echo "✗ Odoo Container ${ODOO_CONTAINER} not running!"
exit 1
fi
echo "✓ Containers running: ${ODOO_CONTAINER} + ${DB_CONTAINER}"
echo "=== Waiting for database ==="
until docker exec "${DB_CONTAINER}" pg_isready -U odoo > /dev/null 2>&1; do
echo "Waiting for PostgreSQL..."
sleep 2
done
echo "✓ PostgreSQL ready"
echo "=== Running tests on ${DB_NAME} (timeout: ${TIMEOUT}s) ==="
echo "(Output logged to: $LOG_FILE)"
timeout "$TIMEOUT" docker exec "${ODOO_CONTAINER}" \
odoo \
-d "${DB_NAME}" \
--test-enable \
--stop-after-init \
-u "$MODULE" \
--log-level=test \
--http-port=0 \
> "$LOG_FILE" 2>&1
EXIT_CODE=$?
# Handle timeout
if [ $EXIT_CODE -eq 124 ]; then
echo ""
echo "✗ TIMEOUT after ${TIMEOUT}s"
docker kill "${ODOO_CONTAINER}" 2>/dev/null || true
EXIT_CODE=1
fi
# Show results
echo ""
echo "=== Test Results ==="
# Parse Odoo's final test summary line
# Format: "0 failed, 1 error(s) of 22 tests"
if grep -q "failed.*error(s) of.*tests" "$LOG_FILE"; then
TEST_SUMMARY=$(grep "failed.*error(s) of.*tests" "$LOG_FILE" | tail -1)
echo "$TEST_SUMMARY"
# Extract numbers
FAILED=$(echo "$TEST_SUMMARY" | grep -oP '\d+(?= failed)' || echo "0")
ERRORS=$(echo "$TEST_SUMMARY" | grep -oP '\d+(?= error)' || echo "0")
TOTAL=$(echo "$TEST_SUMMARY" | grep -oP '\d+(?= tests)' || echo "0")
PASSED=$((TOTAL - FAILED - ERRORS))
echo ""
echo " Total: $TOTAL tests"
echo " ✓ Passed: $PASSED"
echo " ✗ Failed: $FAILED"
echo " ✗ Errors: $ERRORS"
# Show error details
if [ "$FAILED" -gt 0 ] || [ "$ERRORS" -gt 0 ]; then
echo ""
echo "=== Error Details ==="
grep -E "^ERROR:|^FAIL:" "$LOG_FILE" | head -20 || true
fi
# Set exit code based on test results
if [ "$FAILED" -gt 0 ] || [ "$ERRORS" -gt 0 ]; then
EXIT_CODE=1
else
EXIT_CODE=0
fi
else
echo "✗ Could not parse test results"
echo ""
echo "Last 30 lines of log:"
tail -30 "$LOG_FILE"
EXIT_CODE=1
fi
echo ""
echo "Full log: $LOG_FILE"
# Final result banner
echo ""
echo "========================================"
if [ $EXIT_CODE -eq 0 ]; then
echo "✓✓✓ ALL TESTS PASSED ✓✓✓"
echo "========================================"
else
echo "✗✗✗ TESTS FAILED ✗✗✗"
echo "========================================"
fi
exit $EXIT_CODE