From 9abedf3160e6349dff9c540e12e7a2ce6d998776 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 20 Oct 2018 15:50:53 +0200 Subject: [PATCH] Refactored pardsing of description for FinTS import. Added some tests. --- app/Support/FinTS/MetadataParser.php | 37 ++++++++++ .../Routine/FinTS/StageImportDataHandler.php | 16 ++--- .../Unit/Support/FinTS/MetadataParserTest.php | 71 +++++++++++++++++++ 3 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 app/Support/FinTS/MetadataParser.php create mode 100644 tests/Unit/Support/FinTS/MetadataParserTest.php diff --git a/app/Support/FinTS/MetadataParser.php b/app/Support/FinTS/MetadataParser.php new file mode 100644 index 0000000000..37d8debc22 --- /dev/null +++ b/app/Support/FinTS/MetadataParser.php @@ -0,0 +1,37 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Support\FinTS; +use Fhp\Model\StatementOfAccount\Transaction as FinTSTransaction; + +class MetadataParser +{ + function getDescription(FinTSTransaction $transaction) + { + //Given a description like 'EREF+AbcCRED+DE123SVWZ+DefABWA+Ghi' or 'EREF+AbcCRED+DE123SVWZ+Def' return 'Def' + $finTSDescription = $transaction->getDescription1(); + if (preg_match('/SVWZ\+([^\+]*)([A-Z]{4}\+|$)/', $finTSDescription, $matches) === 1) { + return $matches[1]; + } + return $finTSDescription; + } +} \ No newline at end of file diff --git a/app/Support/Import/Routine/FinTS/StageImportDataHandler.php b/app/Support/Import/Routine/FinTS/StageImportDataHandler.php index b8cf816b93..16bb14fafb 100644 --- a/app/Support/Import/Routine/FinTS/StageImportDataHandler.php +++ b/app/Support/Import/Routine/FinTS/StageImportDataHandler.php @@ -34,6 +34,7 @@ use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Support\FinTS\FinTS; +use FireflyIII\Support\FinTS\MetadataParser; use FireflyIII\Support\Import\Routine\File\OpposingAccountMapper; use Illuminate\Support\Facades\Log; @@ -141,11 +142,14 @@ class StageImportDataHandler Log::debug('Both are assets, will make transfer.'); } + $metadataParser = new MetadataParser(); + $description = $metadataParser->getDescription($transaction); + $storeData = [ 'user' => $this->importJob->user_id, 'type' => $type, 'date' => $transaction->getValutaDate()->format('Y-m-d'), - 'description' => $this->getDescription($transaction), + 'description' => $description, 'piggy_bank_id' => null, 'piggy_bank_name' => null, 'bill_id' => null, @@ -182,14 +186,4 @@ class StageImportDataHandler return $storeData; } - - private function getDescription(FinTSTransaction $transaction) - { - //Given a description like 'EREF+AbcCRED+DE123SVWZ+DefABWA+Ghi' or 'EREF+AbcCRED+DE123SVWZ+Def' return 'Def' - $finTSDescription = $transaction->getDescription1(); - if (preg_match('/SVWZ\+([^\+]*)([A-Z]{4}\+|$)/', $finTSDescription, $matches) === 1) { - return $matches[1]; - } - return $finTSDescription; - } } \ No newline at end of file diff --git a/tests/Unit/Support/FinTS/MetadataParserTest.php b/tests/Unit/Support/FinTS/MetadataParserTest.php new file mode 100644 index 0000000000..d986b724e4 --- /dev/null +++ b/tests/Unit/Support/FinTS/MetadataParserTest.php @@ -0,0 +1,71 @@ +. + */ +declare(strict_types=1); + +namespace Tests\Unit\Support\FinTS; + +use Fhp\Model\StatementOfAccount\Transaction as FinTSTransaction; + +use FireflyIII\Support\FinTS\MetadataParser; +use Illuminate\Support\Facades\Log; +use Tests\TestCase; + +class MetadataParserTest extends TestCase +{ + + /** @var MetadataParser */ + private $metadataParser; + + /** + * + */ + public function setUp(): void + { + parent::setUp(); + Log::info(sprintf('Now in %s.', \get_class($this))); + $this->metadataParser = new MetadataParser(); + } + + public function testDescriptionIsCorrectlyExtractedFromBeginning() + { + $transaction = $this->createTransactionWithDescription1('SVWZ+DescriptionABWA+xxx'); + $this->assertEquals('Description', $this->metadataParser->getDescription($transaction)); + } + + public function testDescriptionIsCorrectlyExtractedFromMiddle() + { + $transaction = $this->createTransactionWithDescription1('EREF+AbcCRED+DE123SVWZ+DescriptionABWA+Ghi'); + $this->assertEquals('Description', $this->metadataParser->getDescription($transaction)); + } + + public function testDescriptionIsCorrectlyExtractedFromEnd() + { + $transaction = $this->createTransactionWithDescription1('EREF+AbcCRED+DE123SVWZ+Description'); + $this->assertEquals('Description', $this->metadataParser->getDescription($transaction)); + } + + private function createTransactionWithDescription1(string $description1) + { + $transaction = $this->mock(FinTSTransaction::class); + $transaction->shouldReceive('getDescription1')->atLeast()->once()->andReturn($description1); + return $transaction; + } +}