🦉 CrumbForest Tests

Tests für das CrumbForest Scanner-System - einfach, übersichtlich, und "naked" wie das Projekt selbst!

🧪 Test-Philosophie

Passend zur "naked" Projekt-Philosophie:
- ✅ Keine komplexen Mocking-Frameworks
- ✅ Klare Trennung: Unit vs Integration
- ✅ Einfache Patterns, leicht verständlich
- ✅ Separate Test-Datenbank
- ✅ Schnelle Unit-Tests, gründliche Integration-Tests

📂 Struktur

tests/
├── Unit/               # Schnelle, isolierte Tests
│   ├── ConfigTest.php  # .env-Parsing, Config-Validierung
│   └── AuthTest.php    # JWT-Token-Logik (ohne DB)
│
├── Integration/        # Tests mit echter Datenbank
│   └── ApiAuthTest.php # Kompletter Login-Flow
│
└── Fixtures/           # Test-Daten (future)

🚀 Erste Schritte

1. Test-Datenbank erstellen

mysql -u root -p
CREATE DATABASE crumbforest_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON crumbforest_test.* TO 'crumbforest_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

2. Dependencies installieren

composer install

3. Tests ausführen

# Alle Tests
./vendor/bin/phpunit

# Nur Unit-Tests (schnell, keine DB)
./vendor/bin/phpunit --testsuite Unit

# Nur Integration-Tests
./vendor/bin/phpunit --testsuite Integration

📋 Vorhandene Tests

Unit Tests

ConfigTest.php (14 Tests)
- ✅ Config kann geladen werden
- ✅ Database-Konfiguration vorhanden
- ✅ getValue() mit/ohne Default
- ✅ JWT, Upload, AI-Konfiguration
- ✅ Manufacturers & Device Types Listen
- ✅ Timezone wird korrekt gesetzt

AuthTest.php (8 Tests)
- ✅ JWT-Token kann dekodiert werden
- ✅ Abgelaufene Tokens werden erkannt
- ✅ Falsche Secrets werden abgelehnt
- ✅ Token enthält erwartete Felder
- ✅ JWT-Secret ist nicht Default
- ✅ JWT-Expiry ist sinnvoll

Integration Tests

ApiAuthTest.php (9 Tests)
- ✅ Erfolgreicher Login mit korrekten Credentials
- ✅ Login fehlschlägt bei falschen Credentials
- ✅ Login fehlschlägt bei nicht-existentem User
- ✅ Token kann validiert werden
- ✅ Admin-User hat Admin-Rechte
- ✅ Normaler User hat keine Admin-Rechte
- ✅ Ungültige Tokens werden abgelehnt
- ✅ Fehlender Authorization Header
- ✅ Last Login wird aktualisiert

✍️ Neue Tests schreiben

Unit Test Template

<?php
namespace CrumbForest\Tests\Unit;

use PHPUnit\Framework\TestCase;

class MyNewTest extends TestCase
{
    protected function setUp(): void
    {
        // Setup vor jedem Test
    }

    public function testSomething(): void
    {
        // Arrange - Test vorbereiten
        $input = 'test';

        // Act - Funktion aufrufen
        $result = myFunction($input);

        // Assert - Ergebnis prüfen
        $this->assertEquals('expected', $result);
    }
}

Integration Test Template

<?php
namespace CrumbForest\Tests\Integration;

use CrumbForest\Database\Database;
use PHPUnit\Framework\TestCase;

class MyApiTest extends TestCase
{
    private Database $db;

    protected function setUp(): void
    {
        $this->db = new Database();
        // Test-Daten vorbereiten
    }

    public function testDatabaseOperation(): void
    {
        // Test mit echter Datenbank
    }
}

🔧 Nützliche Commands

# Einzelnen Test ausführen
./vendor/bin/phpunit tests/Unit/ConfigTest.php

# Mit Verbose-Output
./vendor/bin/phpunit --verbose

# Mit Code Coverage (benötigt Xdebug)
./vendor/bin/phpunit --coverage-html coverage/

# Test-Filter (nur Tests mit "Login" im Namen)
./vendor/bin/phpunit --filter Login

# Stop on Failure
./vendor/bin/phpunit --stop-on-failure

📊 Code Coverage

Wenn Xdebug installiert ist:

./vendor/bin/phpunit --coverage-html coverage/

Dann öffnen: coverage/index.html

🐛 Troubleshooting

"Database connection failed"

# Test-Datenbank prüfen
mysql -u crumbforest_user -p crumbforest_test -e "SELECT 1;"

# Credentials in phpunit.xml prüfen
cat phpunit.xml | grep DB_

"Class not found"

# Autoloader neu generieren
composer dump-autoload -o

"No tests executed"

# PHPUnit-Version prüfen
./vendor/bin/phpunit --version

# Test-Pfade prüfen
./vendor/bin/phpunit --list-tests

📝 Best Practices

  1. Unit Tests zuerst: Schnell, isoliert, keine externen Dependencies
  2. Test-DB nutzen: NIE gegen Production-Datenbank testen!
  3. Arrange-Act-Assert: Klare Struktur in jedem Test
  4. Sprechende Namen: testUserCanLoginWithValidCredentials()
  5. Ein Konzept pro Test: Nicht zu viel auf einmal testen
  6. Setup/Teardown nutzen: Gemeinsamen Code wiederverwenden

🎯 Nächste Schritte

Potenzielle Test-Erweiterungen:

  • [ ] DatabaseTest.php - PDO-Wrapper testen
  • [ ] ScannerServiceTest.php - Business Logic
  • [ ] NetboxClientTest.php - API-Integration (mit Mock)
  • [ ] ApiScansTest.php - CRUD für Scans
  • [ ] Frontend-Tests (optional, mit Playwright/Cypress)

🤝 Contributing

Neue Tests hinzufügen:
1. Passende Test-Suite wählen (Unit vs Integration)
2. Template kopieren
3. Test schreiben (Arrange → Act → Assert)
4. Ausführen: ./vendor/bin/phpunit
5. In git committen


Merksatz: Tests sind wie die Eulen im Wald - sie passen auf, dass nichts schiefgeht! 🦉