Files
mareike/tests/Unit/BankStatementRulesetTest.php
T
2026-09-09 16:55:08 +02:00

108 lines
4.1 KiB
PHP

<?php
namespace Tests\Unit;
use App\EventPaymentModules\Modules\AccountTransferPaymentModule;
use App\Models\PaymentMethod;
use App\ValueObjects\BankStatementRuleset;
use Tests\TestCase;
/**
* Wie sich der app-weite Standard aus config/bankStatement.php und ein Tenant-Override zueinander
* verhalten -- und dass das Ruleset nicht in den Event-Snapshot rutscht.
*
* Braucht den Framework-Kontext (config()), aber keine Datenbank.
*/
class BankStatementRulesetTest extends TestCase
{
public function test_empty_configuration_falls_back_to_the_app_default(): void
{
$ruleset = new AccountTransferPaymentModule()->statementRuleset([]);
$this->assertSame(';', $ruleset->delimiter);
$this->assertSame('', $ruleset->enclosure);
$this->assertSame('Windows-1252', $ruleset->charset);
$this->assertSame('Buchungstag', $ruleset->column('payment_date'));
$this->assertSame([], $ruleset->missingRequiredColumns());
}
/**
* Der Override gilt ganz oder gar nicht: Wer die Spalten seiner Bank einträgt, bekommt nicht
* daneben noch die Spaltennamen der GLS untergeschoben und sucht den Fehler an der falschen Stelle.
*/
public function test_a_tenant_override_replaces_the_column_mapping_entirely(): void
{
$ruleset = new AccountTransferPaymentModule()->statementRuleset([
AccountTransferPaymentModule::OPTION_STATEMENT_RULESET => [
'delimiter' => ',',
'enclosure' => '"',
'columns' => [
'payment_date' => 'Datum',
'purpose' => 'Zweck',
'amount' => 'Summe',
],
],
]);
$this->assertSame(',', $ruleset->delimiter);
$this->assertSame('"', $ruleset->enclosure);
$this->assertSame('Datum', $ruleset->column('payment_date'));
// Nicht aus dem App-Standard ergänzt:
$this->assertNull($ruleset->column('payer_iban'));
}
/** Das Frontend schickt das Ruleset als JSON-String durch das generische Options-Formular. */
public function test_accepts_the_override_as_json_string(): void
{
$ruleset = new AccountTransferPaymentModule()->statementRuleset([
AccountTransferPaymentModule::OPTION_STATEMENT_RULESET => json_encode([
'delimiter' => "\t",
'columns' => ['payment_date' => 'Datum', 'purpose' => 'Zweck', 'amount' => 'Summe'],
]),
]);
$this->assertSame("\t", $ruleset->delimiter);
$this->assertSame('Datum', $ruleset->column('payment_date'));
}
public function test_reports_a_missing_required_column(): void
{
$ruleset = BankStatementRuleset::fromConfiguration([
'columns' => ['payment_date' => 'Datum', 'purpose' => 'Zweck'],
]);
$this->assertSame(['amount'], $ruleset->missingRequiredColumns());
}
/**
* Das Kontoauszug-Format beschreibt die Bank, nicht die Zusage an die Teilnehmenden. Im
* Event-Snapshot eingefroren ließe sich nach einem Bankwechsel für laufende Aktionen nichts mehr
* importieren -- IBAN und Kontoinhaber frieren dagegen weiterhin pro Aktion ein.
*/
public function test_the_ruleset_is_stripped_from_the_event_snapshot(): void
{
$configuration = [
'account_owner' => 'Kasse',
'iban' => 'DE02120300000000202051',
AccountTransferPaymentModule::OPTION_STATEMENT_RULESET => ['delimiter' => ','],
];
$snapshot = PaymentMethod::stripTenantScopedOptions(
PaymentMethod::PAYMENT_ACCOUNT_TRANSACTION,
$configuration,
);
$this->assertArrayNotHasKey(AccountTransferPaymentModule::OPTION_STATEMENT_RULESET, $snapshot);
$this->assertSame('Kasse', $snapshot['account_owner']);
$this->assertSame('DE02120300000000202051', $snapshot['iban']);
}
public function test_the_ruleset_option_is_the_only_tenant_scoped_one(): void
{
$this->assertSame(
[AccountTransferPaymentModule::OPTION_STATEMENT_RULESET],
new AccountTransferPaymentModule()->tenantScopedOptionKeys(),
);
}
}