Enable Discovery debug logging for production troubleshooting

- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
This commit is contained in:
2025-08-11 20:13:26 +02:00
parent 59fd3dd3b1
commit 55a330b223
3683 changed files with 2956207 additions and 16948 deletions

View File

@@ -0,0 +1,264 @@
<?php
declare(strict_types=1);
use App\Framework\DateTime\FrozenClock;
use App\Framework\Http\Session\Session;
use App\Framework\Http\Session\SessionId;
use App\Framework\Http\Session\SessionKey;
use App\Framework\Random\TestableRandomGenerator;
use App\Framework\Security\CsrfTokenGenerator;
beforeEach(function () {
$this->clock = new FrozenClock();
$this->randomGenerator = new TestableRandomGenerator();
$this->csrfTokenGenerator = new CsrfTokenGenerator($this->randomGenerator);
$this->sessionId = SessionId::fromString('testflashmanagersessionidlong123');
$this->session = new Session($this->sessionId, $this->clock, $this->csrfTokenGenerator);
$this->session->fromArray([]);
});
describe('FlashManager Core Functionality', function () {
test('can mark items for deletion', function () {
$flashManager = $this->session->flashManager;
$flashManager->mark('validation_errors', 'contact_form');
$flashManager->mark('form_data', 'contact_form');
expect($flashManager->isMarked('validation_errors', 'contact_form'))->toBeTrue();
expect($flashManager->isMarked('form_data', 'contact_form'))->toBeTrue();
expect($flashManager->isMarked('validation_errors', 'login_form'))->toBeFalse();
});
test('can unmark items', function () {
$flashManager = $this->session->flashManager;
$flashManager->mark('validation_errors', 'contact_form');
expect($flashManager->isMarked('validation_errors', 'contact_form'))->toBeTrue();
$flashManager->unmark('validation_errors', 'contact_form');
expect($flashManager->isMarked('validation_errors', 'contact_form'))->toBeFalse();
});
test('can mark multiple items at once', function () {
$flashManager = $this->session->flashManager;
$flashManager->markMultiple('validation_errors', ['contact_form', 'login_form', 'register_form']);
expect($flashManager->isMarked('validation_errors', 'contact_form'))->toBeTrue();
expect($flashManager->isMarked('validation_errors', 'login_form'))->toBeTrue();
expect($flashManager->isMarked('validation_errors', 'register_form'))->toBeTrue();
});
test('tracks marked items correctly', function () {
$flashManager = $this->session->flashManager;
$flashManager->mark('validation_errors', 'form1');
$flashManager->mark('validation_errors', 'form2');
$flashManager->mark('form_data', 'form1');
expect($flashManager->hasMarkedItems('validation_errors'))->toBeTrue();
expect($flashManager->hasMarkedItems('form_data'))->toBeTrue();
expect($flashManager->hasMarkedItems('csrf'))->toBeFalse();
$markedValidationKeys = $flashManager->getMarkedKeys('validation_errors');
expect($markedValidationKeys)->toBe(['form1', 'form2']);
$markedFormKeys = $flashManager->getMarkedKeys('form_data');
expect($markedFormKeys)->toBe(['form1']);
});
});
describe('FlashManager Session Data Filtering', function () {
test('filters out marked validation errors', function () {
// 1. Session mit Validation Errors füllen
$this->session->validation->add('contact_form', ['email' => ['Invalid email']]);
$this->session->validation->add('login_form', ['password' => ['Too short']]);
// 2. Eine Form zum Löschen markieren
$this->session->flashManager->mark(SessionKey::VALIDATION_ERRORS->value, 'contact_form');
// 3. Gefilterte Session-Daten sollten nur unmarkierte Daten enthalten
$filteredData = $this->session->all();
expect($filteredData)->toHaveKey(SessionKey::VALIDATION_ERRORS->value);
expect($filteredData[SessionKey::VALIDATION_ERRORS->value])->not->toHaveKey('contact_form');
expect($filteredData[SessionKey::VALIDATION_ERRORS->value])->toHaveKey('login_form');
// 4. Ungefilterte Daten sollten noch alle Daten enthalten
$unfilteredData = $this->session->all(includeMarkedForDeletion: true);
expect($unfilteredData[SessionKey::VALIDATION_ERRORS->value])->toHaveKey('contact_form');
expect($unfilteredData[SessionKey::VALIDATION_ERRORS->value])->toHaveKey('login_form');
});
test('filters out marked form data', function () {
// 1. Session mit Form Data füllen
$this->session->form->store('contact_form', ['name' => 'John', 'email' => 'john@test.com']);
$this->session->form->store('login_form', ['username' => 'john']);
// 2. Eine Form zum Löschen markieren
$this->session->flashManager->mark(SessionKey::FORM_DATA->value, 'contact_form');
// 3. Gefilterte Daten sollten nur unmarkierte Daten enthalten
$filteredData = $this->session->all();
expect($filteredData[SessionKey::FORM_DATA->value])->not->toHaveKey('contact_form');
expect($filteredData[SessionKey::FORM_DATA->value])->toHaveKey('login_form');
});
test('removes empty components after filtering', function () {
// 1. Session mit nur einer Validation Error
$this->session->validation->add('contact_form', ['email' => ['Invalid']]);
// 2. Diese eine Error zum Löschen markieren
$this->session->flashManager->mark(SessionKey::VALIDATION_ERRORS->value, 'contact_form');
// 3. Nach dem Filtern sollte die ganze Komponente entfernt werden
$filteredData = $this->session->all();
expect($filteredData)->not->toHaveKey(SessionKey::VALIDATION_ERRORS->value);
});
test('filters multiple components simultaneously', function () {
// 1. Session mit verschiedenen Daten füllen
$this->session->validation->add('contact_form', ['email' => ['Invalid']]);
$this->session->form->store('contact_form', ['name' => 'John']);
$this->session->flash->add('success', 'Data saved');
// 2. Validation und Form Data markieren
$this->session->flashManager->mark(SessionKey::VALIDATION_ERRORS->value, 'contact_form');
$this->session->flashManager->mark(SessionKey::FORM_DATA->value, 'contact_form');
// 3. Beide sollten gefiltert werden, Flash sollte bleiben
$filteredData = $this->session->all();
expect($filteredData)->not->toHaveKey(SessionKey::VALIDATION_ERRORS->value);
expect($filteredData)->not->toHaveKey(SessionKey::FORM_DATA->value);
expect($filteredData)->toHaveKey(SessionKey::FLASH->value);
});
});
describe('FlashManager with ValidationErrorBag Integration', function () {
test('getAndFlash marks validation errors for deletion', function () {
// 1. Validation Errors hinzufügen
$this->session->validation->add('contact_form', [
'email' => ['Invalid email format'],
'name' => ['Name is required'],
]);
// 2. Mit getAndFlash abrufen
$errors = $this->session->validation->getAndFlash('contact_form');
// 3. Errors sollten zurückgegeben werden
expect($errors['email'])->toBe(['Invalid email format']);
expect($errors['name'])->toBe(['Name is required']);
// 4. Sollten zum Löschen markiert sein
expect($this->session->flashManager->isMarked(SessionKey::VALIDATION_ERRORS->value, 'contact_form'))->toBeTrue();
// 5. Nach Session-Save sollten sie nicht mehr da sein
$filteredData = $this->session->all();
expect($filteredData)->not->toHaveKey(SessionKey::VALIDATION_ERRORS->value);
});
test('get without flash does not mark for deletion', function () {
// 1. Validation Errors hinzufügen
$this->session->validation->add('contact_form', ['email' => ['Invalid']]);
// 2. Mit normalem get() abrufen
$errors = $this->session->validation->get('contact_form');
// 3. Errors sollten zurückgegeben werden
expect($errors['email'])->toBe(['Invalid']);
// 4. Sollten NICHT zum Löschen markiert sein
expect($this->session->flashManager->isMarked(SessionKey::VALIDATION_ERRORS->value, 'contact_form'))->toBeFalse();
// 5. Sollten nach Session-Save noch da sein
$filteredData = $this->session->all();
expect($filteredData[SessionKey::VALIDATION_ERRORS->value])->toHaveKey('contact_form');
});
});
describe('FlashManager with FormDataStorage Integration', function () {
test('getAndFlash marks form data for deletion', function () {
// 1. Form Data hinzufügen
$formData = ['name' => 'John Doe', 'email' => 'john@example.com'];
$this->session->form->store('contact_form', $formData);
// 2. Mit getAndFlash abrufen
$retrievedData = $this->session->form->getAndFlash('contact_form');
// 3. Daten sollten zurückgegeben werden
expect($retrievedData)->toBe($formData);
// 4. Sollten zum Löschen markiert sein
expect($this->session->flashManager->isMarked(SessionKey::FORM_DATA->value, 'contact_form'))->toBeTrue();
// 5. Nach Session-Save sollten sie nicht mehr da sein
$filteredData = $this->session->all();
expect($filteredData)->not->toHaveKey(SessionKey::FORM_DATA->value);
});
test('getFieldAndFlash marks form data for deletion', function () {
// 1. Form Data hinzufügen
$this->session->form->store('contact_form', ['name' => 'John', 'email' => 'john@test.com']);
// 2. Einzelnes Feld mit Flash abrufen
$name = $this->session->form->getFieldAndFlash('contact_form', 'name');
// 3. Feldwert sollte zurückgegeben werden
expect($name)->toBe('John');
// 4. Ganze Form sollte zum Löschen markiert sein
expect($this->session->flashManager->isMarked(SessionKey::FORM_DATA->value, 'contact_form'))->toBeTrue();
});
});
describe('FlashManager Edge Cases', function () {
test('marking empty data does nothing', function () {
// 1. Leere Validation Errors abrufen mit Flash
$errors = $this->session->validation->getAndFlash('nonexistent_form');
// 2. Sollte leeres Array zurückgeben
expect($errors)->toBe([]);
// 3. Sollte NICHT markiert werden
expect($this->session->flashManager->isMarked(SessionKey::VALIDATION_ERRORS->value, 'nonexistent_form'))->toBeFalse();
});
test('clearAllMarkings removes all markings', function () {
// 1. Mehrere Markierungen setzen
$this->session->flashManager->mark('validation_errors', 'form1');
$this->session->flashManager->mark('form_data', 'form2');
// 2. Alle Markierungen löschen
$this->session->flashManager->clearAllMarkings();
// 3. Keine Markierungen sollten mehr existieren
expect($this->session->flashManager->isMarked('validation_errors', 'form1'))->toBeFalse();
expect($this->session->flashManager->isMarked('form_data', 'form2'))->toBeFalse();
expect($this->session->flashManager->getMarkedItems())->toBe([]);
});
test('filtering preserves non-marked data structure', function () {
// 1. Komplexe Session-Struktur erstellen
$this->session->set('user_id', 123);
$this->session->validation->add('form1', ['error1' => ['msg1']]);
$this->session->validation->add('form2', ['error2' => ['msg2']]);
$this->session->form->store('form1', ['data1' => 'value1']);
$this->session->flash->add('info', 'Information');
// 2. Nur form1 markieren
$this->session->flashManager->mark(SessionKey::VALIDATION_ERRORS->value, 'form1');
// 3. Gefilterte Daten sollten korrekte Struktur haben
$filteredData = $this->session->all();
expect($filteredData['user_id'])->toBe(123);
expect($filteredData[SessionKey::VALIDATION_ERRORS->value])->toHaveKey('form2');
expect($filteredData[SessionKey::VALIDATION_ERRORS->value])->not->toHaveKey('form1');
expect($filteredData[SessionKey::FORM_DATA->value])->toHaveKey('form1'); // Nicht markiert
expect($filteredData[SessionKey::FLASH->value])->toHaveKey('info');
});
});