Haerte Verwaltungsflows und Zahlungsabgleich
This commit is contained in:
@@ -2,6 +2,11 @@
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
if (PHP_SAPI !== 'cli') {
|
||||
http_response_code(403);
|
||||
exit("Dieses Skript ist nur fuer die Kommandozeile gedacht.\n");
|
||||
}
|
||||
|
||||
require __DIR__ . '/dev-db.php';
|
||||
|
||||
$baseUrl = rtrim((string)(getenv('SMOKE_BASE_URL') ?: 'http://127.0.0.1:8080'), '/');
|
||||
@@ -11,7 +16,7 @@ $password = 'BillingCapTest123!';
|
||||
|
||||
/**
|
||||
* @param array<string,string> $cookies
|
||||
* @return array{status:int, body:string}
|
||||
* @return array{status:int, body:string, location:?string}
|
||||
*/
|
||||
function bc_request(string $url, array &$cookies, string $method = 'GET', ?string $postBody = null): array
|
||||
{
|
||||
@@ -43,6 +48,7 @@ function bc_request(string $url, array &$cookies, string $method = 'GET', ?strin
|
||||
$body = @file_get_contents($url, false, $context);
|
||||
$responseHeaders = $http_response_header ?? [];
|
||||
$status = 0;
|
||||
$location = null;
|
||||
|
||||
foreach ($responseHeaders as $header) {
|
||||
if (preg_match('~^HTTP/\S+\s+(\d{3})~', $header, $m) === 1) {
|
||||
@@ -51,9 +57,28 @@ function bc_request(string $url, array &$cookies, string $method = 'GET', ?strin
|
||||
if (preg_match('/^Set-Cookie:\s*([^=;]+)=([^;]+)/i', $header, $m) === 1) {
|
||||
$cookies[$m[1]] = $m[2];
|
||||
}
|
||||
if (preg_match('/^Location:\s*(.+)$/i', $header, $m) === 1) {
|
||||
$location = trim($m[1]);
|
||||
}
|
||||
}
|
||||
|
||||
return ['status' => $status, 'body' => (string)$body];
|
||||
return ['status' => $status, 'body' => (string)$body, 'location' => $location];
|
||||
}
|
||||
|
||||
function bc_follow_redirect(array $response, array &$cookies, string $baseUrl): array
|
||||
{
|
||||
if ($response['status'] < 300 || $response['status'] >= 400 || $response['location'] === null) {
|
||||
return $response;
|
||||
}
|
||||
|
||||
$location = (string)$response['location'];
|
||||
if (preg_match('~^https?://~i', $location) === 1) {
|
||||
$url = $location;
|
||||
} else {
|
||||
$url = $baseUrl . '/' . ltrim($location, '/');
|
||||
}
|
||||
|
||||
return bc_request($url, $cookies);
|
||||
}
|
||||
|
||||
function bc_csrf(string $body): string
|
||||
@@ -121,38 +146,38 @@ bc_request("{$baseUrl}/login.php", $cookies, 'POST', http_build_query([
|
||||
|
||||
// 9 aktive Teilnehmer vorhanden (Cap 10) -> ein aktives Anlegen muss klappen (10/10).
|
||||
$page = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies);
|
||||
$body10 = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
$body10 = bc_follow_redirect(bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
'aktion' => 'anlegen',
|
||||
'csrf_token' => bc_csrf($page['body']),
|
||||
'name' => 'Zehntes Mitglied',
|
||||
'email' => "billingcap-tenth-{$suffix}@test.local",
|
||||
'paypalname' => '',
|
||||
'aktiv' => '1',
|
||||
]));
|
||||
])), $cookies, $baseUrl);
|
||||
bc_assert('10. aktives Mitglied bei Cap 10 wird angelegt', str_contains($body10['body'], 'wurde angelegt'), $failures, $passes);
|
||||
|
||||
// Jetzt bei 10/10 -> ein weiteres aktives Anlegen muss abgelehnt werden.
|
||||
$page = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies);
|
||||
$body11 = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
$body11 = bc_follow_redirect(bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
'aktion' => 'anlegen',
|
||||
'csrf_token' => bc_csrf($page['body']),
|
||||
'name' => 'Elftes Mitglied',
|
||||
'email' => "billingcap-eleventh-{$suffix}@test.local",
|
||||
'paypalname' => '',
|
||||
'aktiv' => '1',
|
||||
]));
|
||||
])), $cookies, $baseUrl);
|
||||
bc_assert('11. aktives Mitglied bei Cap 10 wird abgelehnt', str_contains($body11['body'], 'maximal 10 aktive Mitglieder'), $failures, $passes);
|
||||
bc_assert('11. Mitglied wurde nicht in der DB angelegt', (int)$pdo->query("SELECT COUNT(*) FROM participants WHERE tenant_id = {$tenantId} AND email = 'billingcap-eleventh-{$suffix}@test.local'")->fetchColumn() === 0, $failures, $passes);
|
||||
|
||||
// Inaktives Anlegen bei vollem Cap muss weiterhin moeglich sein.
|
||||
$page = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies);
|
||||
$bodyInactive = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
$bodyInactive = bc_follow_redirect(bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
'aktion' => 'anlegen',
|
||||
'csrf_token' => bc_csrf($page['body']),
|
||||
'name' => 'Inaktives Mitglied',
|
||||
'email' => "billingcap-inactive-{$suffix}@test.local",
|
||||
'paypalname' => '',
|
||||
]));
|
||||
])), $cookies, $baseUrl);
|
||||
bc_assert('Inaktives Mitglied bei vollem Cap wird angelegt', str_contains($bodyInactive['body'], 'wurde angelegt'), $failures, $passes);
|
||||
|
||||
$inactiveId = (int)$pdo->query("SELECT id FROM participants WHERE tenant_id = {$tenantId} AND email = 'billingcap-inactive-{$suffix}@test.local'")->fetchColumn();
|
||||
@@ -160,45 +185,45 @@ bc_assert('Neu angelegtes Mitglied ist tatsaechlich inaktiv', (int)$pdo->query("
|
||||
|
||||
// Aktivieren des inaktiven Mitglieds bei vollem Cap muss abgelehnt werden.
|
||||
$page = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies);
|
||||
$bodyActivateBlocked = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
$bodyActivateBlocked = bc_follow_redirect(bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
'aktion' => 'aktivieren',
|
||||
'csrf_token' => bc_csrf($page['body']),
|
||||
'mitgliedID' => (string)$inactiveId,
|
||||
]));
|
||||
])), $cookies, $baseUrl);
|
||||
bc_assert('Aktivieren bei vollem Cap wird abgelehnt', str_contains($bodyActivateBlocked['body'], 'maximal 10 aktive Mitglieder'), $failures, $passes);
|
||||
bc_assert('Mitglied ist nach abgelehntem Aktivieren weiterhin inaktiv', (int)$pdo->query("SELECT active FROM participants WHERE id = {$inactiveId}")->fetchColumn() === 0, $failures, $passes);
|
||||
|
||||
// Ein aktives Mitglied deaktivieren (Platz schaffen), dann klappt Aktivieren.
|
||||
$freeUpId = $extraParticipantIds[0];
|
||||
$page = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies);
|
||||
bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
bc_follow_redirect(bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
'aktion' => 'deaktivieren',
|
||||
'csrf_token' => bc_csrf($page['body']),
|
||||
'mitgliedID' => (string)$freeUpId,
|
||||
]));
|
||||
])), $cookies, $baseUrl);
|
||||
|
||||
$page = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies);
|
||||
$bodyActivateOk = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
$bodyActivateOk = bc_follow_redirect(bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
'aktion' => 'aktivieren',
|
||||
'csrf_token' => bc_csrf($page['body']),
|
||||
'mitgliedID' => (string)$inactiveId,
|
||||
]));
|
||||
])), $cookies, $baseUrl);
|
||||
bc_assert('Aktivieren nach Platzschaffen (Deaktivierung) klappt', str_contains($bodyActivateOk['body'], 'wurde aktiviert'), $failures, $passes);
|
||||
|
||||
// bearbeitenspeichern: ein weiteres inaktives Mitglied anlegen, dann per
|
||||
// Bearbeiten-Formular aktivieren versuchen, wieder bei vollem Cap (10/10).
|
||||
$page = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies);
|
||||
bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
bc_follow_redirect(bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
'aktion' => 'anlegen',
|
||||
'csrf_token' => bc_csrf($page['body']),
|
||||
'name' => 'Editier-Testmitglied',
|
||||
'email' => "billingcap-edit-{$suffix}@test.local",
|
||||
'paypalname' => '',
|
||||
]));
|
||||
])), $cookies, $baseUrl);
|
||||
$editId = (int)$pdo->query("SELECT id FROM participants WHERE tenant_id = {$tenantId} AND email = 'billingcap-edit-{$suffix}@test.local'")->fetchColumn();
|
||||
|
||||
$page = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies);
|
||||
$bodyEditBlocked = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
$bodyEditBlocked = bc_follow_redirect(bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
'aktion' => 'bearbeitenspeichern',
|
||||
'csrf_token' => bc_csrf($page['body']),
|
||||
'mitgliedID' => (string)$editId,
|
||||
@@ -206,19 +231,19 @@ $bodyEditBlocked = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, '
|
||||
'email' => "billingcap-edit-{$suffix}@test.local",
|
||||
'paypalname' => '',
|
||||
'aktiv' => '1',
|
||||
]));
|
||||
])), $cookies, $baseUrl);
|
||||
bc_assert('bearbeitenspeichern-Reaktivierung bei vollem Cap wird abgelehnt', str_contains($bodyEditBlocked['body'], 'maximal 10 aktive Mitglieder'), $failures, $passes);
|
||||
|
||||
// Editieren ohne Statuswechsel (bleibt inaktiv) muss weiterhin klappen.
|
||||
$page = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies);
|
||||
$bodyEditOk = bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
$bodyEditOk = bc_follow_redirect(bc_request("{$baseUrl}/mitarbeiterverwalten.php", $cookies, 'POST', http_build_query([
|
||||
'aktion' => 'bearbeitenspeichern',
|
||||
'csrf_token' => bc_csrf($page['body']),
|
||||
'mitgliedID' => (string)$editId,
|
||||
'name' => 'Editier-Testmitglied Neu',
|
||||
'email' => "billingcap-edit-{$suffix}@test.local",
|
||||
'paypalname' => '',
|
||||
]));
|
||||
])), $cookies, $baseUrl);
|
||||
bc_assert('bearbeitenspeichern ohne Aktivierung bei vollem Cap klappt', str_contains($bodyEditOk['body'], 'wurde gespeichert'), $failures, $passes);
|
||||
|
||||
// Aufraeumen
|
||||
|
||||
Reference in New Issue
Block a user