108 lines
4.1 KiB
PHP
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(),
|
|
);
|
|
}
|
|
}
|