From 714b54ed06dc85b28eb5a82b28c76b63707c4fd7 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 21 May 2018 07:22:38 +0200 Subject: [PATCH] Refactor and rename test code. --- app/Import/Configuration/FileConfigurator.php | 276 ---------------- .../Configuration/SpectreConfigurator.php | 235 ------------- .../JobConfiguration/FileJobConfiguration.php | 10 +- .../SpectreJobConfiguration.php | 2 - app/Import/Storage/ImportArrayStorage.php | 2 - .../TransactionTypeRepositoryInterface.php | 1 - app/Services/Github/Request/GithubRequest.php | 1 - app/Services/IP/IPRetrievalInterface.php | 1 - .../Internal/Support/AccountServiceTrait.php | 1 - .../Internal/Support/BillServiceTrait.php | 1 - .../Internal/Support/JournalServiceTrait.php | 1 - .../Support/TransactionServiceTrait.php | 1 - .../Configuration/Bunq/HaveAccounts.php | 174 ---------- .../Configuration/Spectre/HaveAccounts.php | 155 --------- .../Information/GetSpectreCustomerTrait.php | 12 +- .../File/ConfigurationInterface.php | 4 +- .../File/ConfigureMappingHandler.php | 2 +- .../File/ConfigureRolesHandler.php | 2 +- .../File/ConfigureUploadHandler.php | 6 +- .../File/NewFileJobHandler.php | 4 +- .../Spectre/AuthenticateConfig.php | 1 - .../Spectre/ChooseAccount.php | 1 - .../Spectre/ChooseLoginHandler.php | 1 - .../JobConfiguration/Spectre/NewConfig.php | 1 - .../Spectre/SpectreJobConfig.php | 1 - .../Import/Routine/Fake/StageFinalHandler.php | 1 - .../Import/Routine/File/CSVProcessor.php | 1 - .../Routine/File/FileProcessorInterface.php | 1 - .../Spectre/StageImportDataHandler.php | 1 - .../Routine/Spectre/StageNewHandler.php | 1 - tests/CreatesApplication.php | 1 - .../FileJobConfigurationTest.php | 8 +- .../File/ConfigureMappingHandlerTest.php | 23 +- .../File/ConfigureRolesHandlerTest.php | 34 +- .../File/ConfigureUploadHandlerTest.php | 12 +- .../File/NewFileJobHandlerTest.php | 14 +- .../Routine/Spectre/StageNewHandlerTest.php | 309 +++++++++++++++++- 37 files changed, 363 insertions(+), 939 deletions(-) delete mode 100644 app/Import/Configuration/FileConfigurator.php delete mode 100644 app/Import/Configuration/SpectreConfigurator.php delete mode 100644 app/Support/Import/Configuration/Bunq/HaveAccounts.php delete mode 100644 app/Support/Import/Configuration/Spectre/HaveAccounts.php rename app/Support/Import/{Configuration => JobConfiguration}/File/ConfigurationInterface.php (92%) rename app/Support/Import/{Configuration => JobConfiguration}/File/ConfigureMappingHandler.php (99%) rename app/Support/Import/{Configuration => JobConfiguration}/File/ConfigureRolesHandler.php (99%) rename app/Support/Import/{Configuration => JobConfiguration}/File/ConfigureUploadHandler.php (97%) rename app/Support/Import/{Configuration => JobConfiguration}/File/NewFileJobHandler.php (98%) rename tests/Unit/Support/Import/{Configuration => JobConfiguration}/File/ConfigureMappingHandlerTest.php (94%) rename tests/Unit/Support/Import/{Configuration => JobConfiguration}/File/ConfigureRolesHandlerTest.php (92%) rename tests/Unit/Support/Import/{Configuration => JobConfiguration}/File/ConfigureUploadHandlerTest.php (92%) rename tests/Unit/Support/Import/{Configuration => JobConfiguration}/File/NewFileJobHandlerTest.php (95%) diff --git a/app/Import/Configuration/FileConfigurator.php b/app/Import/Configuration/FileConfigurator.php deleted file mode 100644 index 75961f6866..0000000000 --- a/app/Import/Configuration/FileConfigurator.php +++ /dev/null @@ -1,276 +0,0 @@ -. - */ -declare(strict_types=1); - -namespace FireflyIII\Import\Configuration; - -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Models\ImportJob; -use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; -use FireflyIII\Support\Import\Configuration\File\Initial; -use FireflyIII\Support\Import\Configuration\File\Map; -use FireflyIII\Support\Import\Configuration\File\Roles; -use FireflyIII\Support\Import\Configuration\File\UploadConfig; -use Log; - -/** - * @deprecated - * @codeCoverageIgnore - * Class FileConfigurator. - */ -class FileConfigurator -{ - /** @var array */ - private $defaultConfig - = [ - 'stage' => 'initial', - 'has-headers' => false, // assume - 'date-format' => 'Ymd', // assume - 'delimiter' => ',', // assume - 'import-account' => 0, // none, - 'specifics' => [], // none - 'column-count' => 0, // unknown - 'column-roles' => [], // unknown - 'column-do-mapping' => [], // not yet set which columns must be mapped - 'column-mapping-config' => [], // no mapping made yet. - 'file-type' => 'csv', // assume - 'has-config-file' => true, - 'apply-rules' => true, - 'auto-start' => false, - ]; - /** @var ImportJob */ - private $job; - /** @var ImportJobRepositoryInterface */ - private $repository; - - // give job default config: - /** @var string */ - private $warning = ''; - - /** - * FileConfigurator constructor. - */ - public function __construct() - { - Log::debug('Created FileConfigurator'); - } - - /** - * Store any data from the $data array into the job. - * - * @param array $data - * - * @return bool - * - * @throws FireflyException - */ - public function configureJob(array $data): bool - { - if (null === $this->job) { - throw new FireflyException('Cannot call configureJob() without a job.'); - } - /** @var ConfigurationInterface $object */ - $object = app($this->getConfigurationClass()); - $object->setJob($this->job); - $result = $object->storeConfiguration($data); - $this->warning = $object->getWarningMessage(); - - return $result; - } - - /** - * Return the data required for the next step in the job configuration. - * - * @return array - * - * @throws FireflyException - */ - public function getNextData(): array - { - if (null === $this->job) { - throw new FireflyException('Cannot call getNextData() without a job.'); - } - /** @var ConfigurationInterface $object */ - $object = app($this->getConfigurationClass()); - $object->setJob($this->job); - - return $object->getData(); - } - - /** - * @return string - * - * @throws FireflyException - */ - public function getNextView(): string - { - if (null === $this->job) { - throw new FireflyException('Cannot call getNextView() without a job.'); - } - $config = $this->getConfig(); - $stage = $config['stage'] ?? 'initial'; - switch ($stage) { - case 'initial': // has nothing, no file upload or anything. - return 'import.file.initial'; - case 'upload-config': // has file, needs file config. - return 'import.file.upload-config'; - case 'roles': // has configured file, needs roles. - return 'import.file.roles'; - case 'map': // has roles, needs mapping. - return 'import.file.map'; - } - throw new FireflyException(sprintf('No view for stage "%s"', $stage)); - } - - /** - * Return possible warning to user. - * - * @return string - * - * @throws FireflyException - */ - public function getWarningMessage(): string - { - if (null === $this->job) { - throw new FireflyException('Cannot call getWarningMessage() without a job.'); - } - - return $this->warning; - } - - /** - * @return bool - * - * @throws FireflyException - */ - public function isJobConfigured(): bool - { - if (null === $this->job) { - throw new FireflyException('Cannot call isJobConfigured() without a job.'); - } - $config = $this->getConfig(); - $stage = $config['stage'] ?? 'initial'; - if ('ready' === $stage) { - Log::debug('isJobConfigured returns true'); - - return true; - } - Log::debug('isJobConfigured returns false'); - - return false; - } - - /** - * @param ImportJob $job - */ - public function setJob(ImportJob $job) - { - Log::debug(sprintf('FileConfigurator::setJob(#%d: %s)', $job->id, $job->key)); - $this->job = $job; - $this->repository = app(ImportJobRepositoryInterface::class); - $this->repository->setUser($job->user); - - // set number of steps to 100: - $extendedStatus = $this->getExtendedStatus(); - $extendedStatus['steps'] = 6; - $extendedStatus['done'] = 0; - $this->setExtendedStatus($extendedStatus); - - $config = $this->getConfig(); - $newConfig = array_merge($this->defaultConfig, $config); - $this->repository->setConfiguration($job, $newConfig); - } - - /** - * Short hand method. - * - * @return array - */ - private function getConfig(): array - { - return $this->repository->getConfiguration($this->job); - } - - /** - * @return string - * - * @throws FireflyException - */ - private function getConfigurationClass(): string - { - $config = $this->getConfig(); - $stage = $config['stage'] ?? 'initial'; - $class = false; - Log::debug(sprintf('Now in getConfigurationClass() for stage "%s"', $stage)); - - switch ($stage) { - case 'initial': // has nothing, no file upload or anything. - $class = Initial::class; - break; - case 'upload-config': // has file, needs file config. - $class = UploadConfig::class; - break; - case 'roles': // has configured file, needs roles. - $class = Roles::class; - break; - case 'map': // has roles, needs mapping. - $class = Map::class; - break; - default: - break; - } - - if (false === $class || 0 === \strlen($class)) { - throw new FireflyException(sprintf('Cannot handle job stage "%s" in getConfigurationClass().', $stage)); - } - if (!class_exists($class)) { - throw new FireflyException(sprintf('Class %s does not exist in getConfigurationClass().', $class)); // @codeCoverageIgnore - } - Log::debug(sprintf('Configuration class is "%s"', $class)); - - return $class; - } - - /** - * Shorthand method to return the extended status. - * - * @codeCoverageIgnore - * - * @return array - */ - private function getExtendedStatus(): array - { - return $this->repository->getExtendedStatus($this->job); - } - - /** - * Shorthand method to set the extended status. - * - * @codeCoverageIgnore - * - * @param array $extended - */ - private function setExtendedStatus(array $extended): void - { - $this->repository->setExtendedStatus($this->job, $extended); - - } -} diff --git a/app/Import/Configuration/SpectreConfigurator.php b/app/Import/Configuration/SpectreConfigurator.php deleted file mode 100644 index a71953ed4b..0000000000 --- a/app/Import/Configuration/SpectreConfigurator.php +++ /dev/null @@ -1,235 +0,0 @@ -. - */ -declare(strict_types=1); - -namespace FireflyIII\Import\Configuration; - -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Models\ImportJob; -use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; -use FireflyIII\Support\Import\Configuration\Spectre\HaveAccounts; -use Log; - -/** - * @deprecated - * @codeCoverageIgnore - * Class SpectreConfigurator. - */ -class SpectreConfigurator implements ConfiguratorInterface -{ - /** @var ImportJob */ - private $job; - - /** @var ImportJobRepositoryInterface */ - private $repository; - - /** @var string */ - private $warning = ''; - - /** - * ConfiguratorInterface constructor. - */ - public function __construct() - { - } - - /** - * Store any data from the $data array into the job. - * - * @param array $data - * - * @return bool - * - * @throws FireflyException - */ - public function configureJob(array $data): bool - { - if (null === $this->job) { - throw new FireflyException('Cannot call configureJob() without a job.'); - } - $stage = $this->getConfig()['stage'] ?? 'initial'; - Log::debug(sprintf('in getNextData(), for stage "%s".', $stage)); - switch ($stage) { - case 'have-accounts': - /** @var HaveAccounts $class */ - $class = app(HaveAccounts::class); - $class->setJob($this->job); - $class->storeConfiguration($data); - - // update job for next step and set to "configured". - $config = $this->getConfig(); - $config['stage'] = 'have-account-mapping'; - $this->repository->setConfiguration($this->job, $config); - - return true; - default: - throw new FireflyException(sprintf('Cannot store configuration when job is in state "%s"', $stage)); - break; - } - } - - /** - * Return the data required for the next step in the job configuration. - * - * @return array - * - * @throws FireflyException - */ - public function getNextData(): array - { - if (null === $this->job) { - throw new FireflyException('Cannot call configureJob() without a job.'); - } - $config = $this->getConfig(); - $stage = $config['stage'] ?? 'initial'; - - Log::debug(sprintf('in getNextData(), for stage "%s".', $stage)); - switch ($stage) { - case 'has-token': - // simply redirect to Spectre. - $config['is-redirected'] = true; - $config['stage'] = 'user-logged-in'; - $status = 'configured'; - - // update config and status: - $this->repository->setConfiguration($this->job, $config); - $this->repository->setStatus($this->job, $status); - - return $this->repository->getConfiguration($this->job); - case 'have-accounts': - /** @var HaveAccounts $class */ - $class = app(HaveAccounts::class); - $class->setJob($this->job); - - return $class->getData(); - default: - return []; - } - } - - /** - * @return string - * - * @throws FireflyException - */ - public function getNextView(): string - { - if (null === $this->job) { - throw new FireflyException('Cannot call configureJob() without a job.'); - } - $stage = $this->getConfig()['stage'] ?? 'initial'; - Log::debug(sprintf('in getNextView(), for stage "%s".', $stage)); - switch ($stage) { - case 'has-token': - // redirect to Spectre. - Log::info('User is being redirected to Spectre.'); - - return 'import.spectre.redirect'; - case 'have-accounts': - return 'import.spectre.accounts'; - default: - return ''; - } - } - - /** - * Return possible warning to user. - * - * @return string - */ - public function getWarningMessage(): string - { - return $this->warning; - } - - /** - * @return bool - * - * @throws FireflyException - */ - public function isJobConfigured(): bool - { - if (null === $this->job) { - throw new FireflyException('Cannot call configureJob() without a job.'); - } - $stage = $this->getConfig()['stage'] ?? 'initial'; - Log::debug(sprintf('in isJobConfigured(), for stage "%s".', $stage)); - switch ($stage) { - case 'has-token': - case 'have-accounts': - Log::debug('isJobConfigured returns false'); - - return false; - default: - Log::debug('isJobConfigured returns true'); - - return true; - } - } - - /** - * @param ImportJob $job - */ - public function setJob(ImportJob $job): void - { - // make repository - $this->repository = app(ImportJobRepositoryInterface::class); - $this->repository->setUser($job->user); - - // set default config: - $defaultConfig = [ - 'has-token' => false, - 'token' => '', - 'token-expires' => 0, - 'token-url' => '', - 'is-redirected' => false, - 'customer' => null, - 'login' => null, - 'stage' => 'initial', - 'accounts' => '', - 'accounts-mapped' => '', - 'auto-start' => true, - 'apply-rules' => true, - ]; - $currentConfig = $this->repository->getConfiguration($job); - $finalConfig = array_merge($defaultConfig, $currentConfig); - - // set default extended status: - $extendedStatus = $this->repository->getExtendedStatus($job); - $extendedStatus['steps'] = 6; - - // save to job: - $job = $this->repository->setConfiguration($job, $finalConfig); - $job = $this->repository->setExtendedStatus($job, $extendedStatus); - $this->job = $job; - - } - - /** - * Shorthand method. - * - * @return array - */ - private function getConfig(): array - { - return $this->repository->getConfiguration($this->job); - } -} diff --git a/app/Import/JobConfiguration/FileJobConfiguration.php b/app/Import/JobConfiguration/FileJobConfiguration.php index 5306484a30..48254d7115 100644 --- a/app/Import/JobConfiguration/FileJobConfiguration.php +++ b/app/Import/JobConfiguration/FileJobConfiguration.php @@ -28,11 +28,11 @@ namespace FireflyIII\Import\JobConfiguration; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\ImportJob; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; -use FireflyIII\Support\Import\Configuration\File\ConfigurationInterface; -use FireflyIII\Support\Import\Configuration\File\ConfigureMappingHandler; -use FireflyIII\Support\Import\Configuration\File\ConfigureRolesHandler; -use FireflyIII\Support\Import\Configuration\File\ConfigureUploadHandler; -use FireflyIII\Support\Import\Configuration\File\NewFileJobHandler; +use FireflyIII\Support\Import\JobConfiguration\File\ConfigurationInterface; +use FireflyIII\Support\Import\JobConfiguration\File\ConfigureMappingHandler; +use FireflyIII\Support\Import\JobConfiguration\File\ConfigureRolesHandler; +use FireflyIII\Support\Import\JobConfiguration\File\ConfigureUploadHandler; +use FireflyIII\Support\Import\JobConfiguration\File\NewFileJobHandler; use Illuminate\Support\MessageBag; /** diff --git a/app/Import/JobConfiguration/SpectreJobConfiguration.php b/app/Import/JobConfiguration/SpectreJobConfiguration.php index 4304881f3f..f75ba7a1b5 100644 --- a/app/Import/JobConfiguration/SpectreJobConfiguration.php +++ b/app/Import/JobConfiguration/SpectreJobConfiguration.php @@ -37,8 +37,6 @@ use Log; /** * Class SpectreJobConfiguration - * - * @package FireflyIII\Import\JobConfiguration */ class SpectreJobConfiguration implements JobConfigurationInterface { diff --git a/app/Import/Storage/ImportArrayStorage.php b/app/Import/Storage/ImportArrayStorage.php index bf95a6e296..3cb5ccfebd 100644 --- a/app/Import/Storage/ImportArrayStorage.php +++ b/app/Import/Storage/ImportArrayStorage.php @@ -46,8 +46,6 @@ use Log; * Creates new transactions based upon arrays. Will first check the array for duplicates. * * Class ImportArrayStorage - * - * @package FireflyIII\Import\Storage */ class ImportArrayStorage { diff --git a/app/Repositories/TransactionType/TransactionTypeRepositoryInterface.php b/app/Repositories/TransactionType/TransactionTypeRepositoryInterface.php index 976f48196d..0e84c6dbff 100644 --- a/app/Repositories/TransactionType/TransactionTypeRepositoryInterface.php +++ b/app/Repositories/TransactionType/TransactionTypeRepositoryInterface.php @@ -28,7 +28,6 @@ use FireflyIII\Models\TransactionType; /** * Interface TransactionTypeRepositoryInterface * - * @package FireflyIII\Repositories\TransactionType */ interface TransactionTypeRepositoryInterface { diff --git a/app/Services/Github/Request/GithubRequest.php b/app/Services/Github/Request/GithubRequest.php index 8c2175baaa..3e7a5ca5d6 100644 --- a/app/Services/Github/Request/GithubRequest.php +++ b/app/Services/Github/Request/GithubRequest.php @@ -26,7 +26,6 @@ namespace FireflyIII\Services\Github\Request; /** * Interface GithubRequest * - * @package FireflyIII\Services\Github\Request */ interface GithubRequest { diff --git a/app/Services/IP/IPRetrievalInterface.php b/app/Services/IP/IPRetrievalInterface.php index 5bd2966e4a..f8a36580b4 100644 --- a/app/Services/IP/IPRetrievalInterface.php +++ b/app/Services/IP/IPRetrievalInterface.php @@ -26,7 +26,6 @@ namespace FireflyIII\Services\IP; /** * Interface IPRetrievalInterface * - * @package FireflyIII\Services\IP */ interface IPRetrievalInterface { diff --git a/app/Services/Internal/Support/AccountServiceTrait.php b/app/Services/Internal/Support/AccountServiceTrait.php index 7fd65fb224..e4a48fced5 100644 --- a/app/Services/Internal/Support/AccountServiceTrait.php +++ b/app/Services/Internal/Support/AccountServiceTrait.php @@ -42,7 +42,6 @@ use Validator; /** * Trait AccountServiceTrait * - * @package FireflyIII\Services\Internal\Support */ trait AccountServiceTrait { diff --git a/app/Services/Internal/Support/BillServiceTrait.php b/app/Services/Internal/Support/BillServiceTrait.php index 2f60a8cf39..4c34e7c7d0 100644 --- a/app/Services/Internal/Support/BillServiceTrait.php +++ b/app/Services/Internal/Support/BillServiceTrait.php @@ -31,7 +31,6 @@ use Illuminate\Support\Collection; /** * Trait BillServiceTrait * - * @package FireflyIII\Services\Internal\Support */ trait BillServiceTrait { diff --git a/app/Services/Internal/Support/JournalServiceTrait.php b/app/Services/Internal/Support/JournalServiceTrait.php index 99e5376852..afd16844e5 100644 --- a/app/Services/Internal/Support/JournalServiceTrait.php +++ b/app/Services/Internal/Support/JournalServiceTrait.php @@ -32,7 +32,6 @@ use FireflyIII\Models\TransactionJournal; /** * Trait JournalServiceTrait * - * @package FireflyIII\Services\Internal\Support */ trait JournalServiceTrait { diff --git a/app/Services/Internal/Support/TransactionServiceTrait.php b/app/Services/Internal/Support/TransactionServiceTrait.php index 2a0769df52..1355afebbe 100644 --- a/app/Services/Internal/Support/TransactionServiceTrait.php +++ b/app/Services/Internal/Support/TransactionServiceTrait.php @@ -42,7 +42,6 @@ use Log; /** * Trait TransactionServiceTrait * - * @package FireflyIII\Services\Internal\Support */ trait TransactionServiceTrait { diff --git a/app/Support/Import/Configuration/Bunq/HaveAccounts.php b/app/Support/Import/Configuration/Bunq/HaveAccounts.php deleted file mode 100644 index 5d26c752d2..0000000000 --- a/app/Support/Import/Configuration/Bunq/HaveAccounts.php +++ /dev/null @@ -1,174 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace FireflyIII\Support\Import\Configuration\Bunq; - -use FireflyIII\Models\Account; -use FireflyIII\Models\AccountType; -use FireflyIII\Models\ImportJob; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; - -/** - * @codeCoverageIgnore - * @deprecated - * Class HaveAccounts - */ -class HaveAccounts -{ - /** @var ImportJob */ - private $job; - - /** - * Get the data necessary to show the configuration screen. - * - * @return array - */ - public function getData(): array - { - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); - /** @var CurrencyRepositoryInterface $currencyRepository */ - $currencyRepository = app(CurrencyRepositoryInterface::class); - $config = $this->job->configuration; - $collection = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); - $defaultCurrency = app('amount')->getDefaultCurrency(); - $dbAccounts = []; - /** @var Account $dbAccount */ - foreach ($collection as $dbAccount) { - $id = $dbAccount->id; - $currencyId = (int)$accountRepository->getMetaValue($dbAccount, 'currency_id'); - $currency = $currencyRepository->findNull($currencyId); - $dbAccounts[$id] = [ - 'account' => $dbAccount, - 'currency' => $currency ?? $defaultCurrency, - ]; - } - - // loop Bunq accounts: - /** - * @var int $index - * @var array $bunqAccount - */ - foreach ($config['accounts'] as $index => $bunqAccount) { - // find accounts with currency code - $code = $bunqAccount['currency']; - $selection = $this->filterAccounts($dbAccounts, $code); - $config['accounts'][$index]['iban'] = $this->getIban($bunqAccount); - $config['accounts'][$index]['options'] = $selection; - } - - return [ - 'config' => $config, - ]; - } - - /** - * Return possible warning to user. - * - * @return string - */ - public function getWarningMessage(): string - { - return ''; - } - - /** - * @param ImportJob $job - * - * @return ConfigurationInterface - */ - public function setJob(ImportJob $job) - { - $this->job = $job; - - return $this; - } - - /** - * Store the result. - * - * @param array $data - * - * @return bool - */ - public function storeConfiguration(array $data): bool - { - $accounts = $data['bunq_account_id'] ?? []; - $mapping = []; - foreach ($accounts as $bunqId) { - $bunqId = (int)$bunqId; - $doImport = (int)($data['do_import'][$bunqId] ?? 0.0) === 1; - $account = (int)($data['import'][$bunqId] ?? 0.0); - if ($doImport) { - $mapping[$bunqId] = $account; - } - } - $config = $this->job->configuration; - $config['accounts-mapped'] = $mapping; - $this->job->configuration = $config; - $this->job->save(); - - return true; - } - - /** - * @param array $dbAccounts - * @param string $code - * - * @return array - */ - private function filterAccounts(array $dbAccounts, string $code): array - { - $accounts = []; - foreach ($dbAccounts as $accountId => $data) { - if ($data['currency']->code === $code) { - $accounts[$accountId] = [ - 'name' => $data['account']['name'], - 'iban' => $data['account']['iban'], - ]; - } - } - - return $accounts; - } - - /** - * @param array $bunqAccount - * - * @return string - */ - private function getIban(array $bunqAccount): string - { - $iban = ''; - if (\is_array($bunqAccount['alias'])) { - foreach ($bunqAccount['alias'] as $alias) { - if ($alias['type'] === 'IBAN') { - $iban = $alias['value']; - } - } - } - - return $iban; - } -} diff --git a/app/Support/Import/Configuration/Spectre/HaveAccounts.php b/app/Support/Import/Configuration/Spectre/HaveAccounts.php deleted file mode 100644 index 5b78979850..0000000000 --- a/app/Support/Import/Configuration/Spectre/HaveAccounts.php +++ /dev/null @@ -1,155 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace FireflyIII\Support\Import\Configuration\Spectre; - - -use FireflyIII\Models\Account; -use FireflyIII\Models\AccountType; -use FireflyIII\Models\ImportJob; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; -use FireflyIII\Support\Import\Configuration\ConfigurationInterface; -use Illuminate\Support\Collection; - -/** - * @deprecated - * @codeCoverageIgnore - * Class HaveAccounts - */ -class HaveAccounts -{ - /** @var ImportJob */ - private $job; - - /** - * Get the data necessary to show the configuration screen. - * - * @return array - */ - public function getData(): array - { - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); - /** @var CurrencyRepositoryInterface $currencyRepository */ - $currencyRepository = app(CurrencyRepositoryInterface::class); - $config = $this->job->configuration; - $collection = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); - $defaultCurrency = app('amount')->getDefaultCurrency(); - $dbAccounts = []; - /** @var Account $dbAccount */ - foreach ($collection as $dbAccount) { - $id = $dbAccount->id; - $currencyId = (int)$dbAccount->getMeta('currency_id'); - $currency = $currencyRepository->find($currencyId); - $dbAccounts[$id] = [ - 'account' => $dbAccount, - 'currency' => null === $currency->id ? $defaultCurrency : $currency, - ]; - } - - // loop Spectre accounts: - /** - * @var int $index - * @var array $spectreAccount - */ - foreach ($config['accounts'] as $index => $spectreAccount) { - // find accounts with currency code - $code = $spectreAccount['currency_code']; - $selection = $this->filterAccounts($dbAccounts, $code); - $config['accounts'][$index]['options'] = app('expandedform')->makeSelectList($selection); - } - - - return [ - 'config' => $config, - ]; - } - - /** - * Return possible warning to user. - * - * @return string - */ - public function getWarningMessage(): string - { - return ''; - } - - /** - * @param ImportJob $job - * - * @return ConfigurationInterface - */ - public function setJob(ImportJob $job) - { - $this->job = $job; - - return $this; - } - - /** - * Store the result. - * - * @param array $data - * - * @return bool - */ - public function storeConfiguration(array $data): bool - { - $accounts = $data['spectre_account_id'] ?? []; - $mapping = []; - foreach ($accounts as $spectreId) { - $spectreId = (int)$spectreId; - $doImport = (int)($data['do_import'][$spectreId] ?? 0.0) === 1; - $account = (int)($data['import'][$spectreId] ?? 0.0); - if ($doImport) { - $mapping[$spectreId] = $account; - } - } - $config = $this->job->configuration; - $config['accounts-mapped'] = $mapping; - $this->job->configuration = $config; - $this->job->save(); - - return true; - } - - /** - * @param array $dbAccounts - * @param string $code - * - * @return Collection - */ - private function filterAccounts(array $dbAccounts, string $code): Collection - { - $collection = new Collection; - foreach ($dbAccounts as $accountId => $data) { - if ($data['currency']->code === $code) { - $collection->push($data['account']); - } - } - - return $collection; - } -} diff --git a/app/Support/Import/Information/GetSpectreCustomerTrait.php b/app/Support/Import/Information/GetSpectreCustomerTrait.php index b5f4f9b63b..62660e7a48 100644 --- a/app/Support/Import/Information/GetSpectreCustomerTrait.php +++ b/app/Support/Import/Information/GetSpectreCustomerTrait.php @@ -33,7 +33,6 @@ use Log; /** * Trait GetSpectreCustomerTrait * - * @package FireflyIII\Support\Import\Information */ trait GetSpectreCustomerTrait { @@ -52,9 +51,11 @@ trait GetSpectreCustomerTrait /** @var NewCustomerRequest $request */ $request = app(NewCustomerRequest::class); $request->setUser($importJob->user); + // todo what if customer is still null? $customer = $request->getCustomer(); } + Log::debug('The customer is not null.'); return $customer; @@ -72,7 +73,7 @@ trait GetSpectreCustomerTrait $customer = null; // check users preferences. - $preference = app('preferences')->getForUser($importJob->user, 'spectre_customer'); + $preference = app('preferences')->getForUser($importJob->user, 'spectre_customer', null); if (null !== $preference) { Log::debug('Customer is in user configuration'); $customer = new Customer($preference->data); @@ -96,9 +97,10 @@ trait GetSpectreCustomerTrait } Log::debug(sprintf('Skip customer with name "%s"', $current->getIdentifier())); } - - // store in preferences. - app('preferences')->setForUser($importJob->user, 'spectre_customer', $customer->toArray()); + if (null !== $customer) { + // store in preferences. + app('preferences')->setForUser($importJob->user, 'spectre_customer', $customer->toArray()); + } return $customer; } diff --git a/app/Support/Import/Configuration/File/ConfigurationInterface.php b/app/Support/Import/JobConfiguration/File/ConfigurationInterface.php similarity index 92% rename from app/Support/Import/Configuration/File/ConfigurationInterface.php rename to app/Support/Import/JobConfiguration/File/ConfigurationInterface.php index de8fd0cf85..084d56ca25 100644 --- a/app/Support/Import/Configuration/File/ConfigurationInterface.php +++ b/app/Support/Import/JobConfiguration/File/ConfigurationInterface.php @@ -1,7 +1,7 @@ configuration = []; $job->save(); - // mock classes: - $trait = $this->mock(GetSpectreCustomerTrait::class); - $llRequest = $this->mock(ListLoginsRequest::class); - $lcRequest = $this->mock(ListCustomersRequest::class); + // fake Spectre customer: + $fakeCustomer = new Customer( + [ + 'id' => 1, + 'identifier' => 'fake', + 'secret' => 'Dumbledore dies', + ] + ); - // mock calls for list logins + // mock classes: + $llRequest = $this->mock(ListLoginsRequest::class); + $lcRequest = $this->mock(ListCustomersRequest::class); + $ncRequest = $this->mock(NewCustomerRequest::class); + $repository = $this->mock(ImportJobRepositoryInterface::class); + + + // mock calls for list logins (return empty list for now). + $llRequest->shouldReceive('setUser')->once(); + $llRequest->shouldReceive('setCustomer')->once(); + $llRequest->shouldReceive('call')->once(); + $llRequest->shouldReceive('getLogins')->once()->andReturn([]); + + // mock calls for list customers (return empty list). + $lcRequest->shouldReceive('setUser')->once(); + $lcRequest->shouldReceive('call')->once(); + $lcRequest->shouldReceive('getCustomers')->once()->andReturn([]); + + // create new customer: + $ncRequest->shouldReceive('setUser')->once(); + $ncRequest->shouldReceive('getCustomer')->once()->andReturn($fakeCustomer); + + // mock calls for repository: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('getConfiguration')->once()->withArgs([Mockery::any()])->andReturn([]); + + // mock call for preferences + Preferences::shouldReceive('getForUser')->once()->withArgs([Mockery::any(), 'spectre_customer', null])->andReturnNull(); + + + $handler = new StageNewHandler; + $handler->setImportJob($job); + try { + $handler->run(); + } catch (FireflyException $e) { + $this->assertTrue(false, $e->getMessage()); + } + } + + /** + * run() with zero logins and an existing customer (from preferences). + * + * @covers \FireflyIII\Support\Import\Information\GetSpectreCustomerTrait + * @covers \FireflyIII\Support\Import\Routine\Spectre\StageNewHandler + */ + public function testRunExistingCustomer(): void + { + $job = new ImportJob; + $job->user_id = $this->user()->id; + $job->key = 'sn_a_' . random_int(1, 1000); + $job->status = 'new'; + $job->stage = 'new'; + $job->provider = 'spectre'; + $job->file_type = ''; + $job->configuration = []; + $job->save(); + + $fakeCustomerPreference = new Preference; + $fakeCustomerPreference->name = 'spectre_customer'; + $fakeCustomerPreference->data = [ + 'id' => 1, + 'identifier' => 'fake', + 'secret' => 'Dumbledore dies', + ]; + + // mock classes: + $llRequest = $this->mock(ListLoginsRequest::class); + $repository = $this->mock(ImportJobRepositoryInterface::class); + + + // mock calls for list logins (return empty list for now). $llRequest->shouldReceive('setUser')->once(); $llRequest->shouldReceive('setCustomer')->once(); $llRequest->shouldReceive('call')->once(); $llRequest->shouldReceive('getLogins')->once()->andReturn([]); // mock call for preferences - // todo here we are - Preferences::shouldReceive('getForUser'); + Preferences::shouldReceive('getForUser')->once()->withArgs([Mockery::any(), 'spectre_customer', null])->andReturn($fakeCustomerPreference); + // mock calls for repository: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('getConfiguration')->once()->withArgs([Mockery::any()])->andReturn([]); $handler = new StageNewHandler; $handler->setImportJob($job); - $handler->run(); + try { + $handler->run(); + } catch (FireflyException $e) { + $this->assertTrue(false, $e->getMessage()); + } + } + + /** + * run() with zero logins and multiple customers at Spectre (none in prefs) + * + * @covers \FireflyIII\Support\Import\Information\GetSpectreCustomerTrait + * @covers \FireflyIII\Support\Import\Routine\Spectre\StageNewHandler + */ + public function testRunMultiCustomer(): void + { + $job = new ImportJob; + $job->user_id = $this->user()->id; + $job->key = 'sn_a_' . random_int(1, 1000); + $job->status = 'new'; + $job->stage = 'new'; + $job->provider = 'spectre'; + $job->file_type = ''; + $job->configuration = []; + $job->save(); + + // fake Spectre customer: + $fakeCustomer = new Customer( + [ + 'id' => 1, + 'identifier' => 'fake', + 'secret' => 'Dumbledore dies', + ] + ); + + $correctCustomer = new Customer( + [ + 'id' => 1, + 'identifier' => 'default_ff3_customer', + 'secret' => 'Firefly III', + ] + ); + + // mock classes: + $llRequest = $this->mock(ListLoginsRequest::class); + $lcRequest = $this->mock(ListCustomersRequest::class); + $ncRequest = $this->mock(NewCustomerRequest::class); + $repository = $this->mock(ImportJobRepositoryInterface::class); + + // mock calls for list logins (return empty list for now). + $llRequest->shouldReceive('setUser')->once(); + $llRequest->shouldReceive('setCustomer')->once(); + $llRequest->shouldReceive('call')->once(); + $llRequest->shouldReceive('getLogins')->once()->andReturn([]); + + // mock calls for list customers (return empty list). + $lcRequest->shouldReceive('setUser')->once(); + $lcRequest->shouldReceive('call')->once(); + $lcRequest->shouldReceive('getCustomers')->once()->andReturn([$fakeCustomer, $correctCustomer]); + + // mock calls for repository: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('getConfiguration')->once()->withArgs([Mockery::any()])->andReturn([]); + + // mock call for preferences + Preferences::shouldReceive('getForUser')->withArgs([Mockery::any(), 'spectre_customer', null])->andReturnNull()->once(); + Preferences::shouldReceive('setForUser')->withArgs([Mockery::any(), 'spectre_customer', $correctCustomer->toArray()])->once(); + + $handler = new StageNewHandler; + $handler->setImportJob($job); + try { + $handler->run(); + } catch (FireflyException $e) { + $this->assertTrue(false, $e->getMessage()); + } + } + + /** + * run() with one login and multiple customers at Spectre (none in prefs) + * + * @covers \FireflyIII\Support\Import\Information\GetSpectreCustomerTrait + * @covers \FireflyIII\Support\Import\Routine\Spectre\StageNewHandler + */ + public function testRunMultiCustomerLogin(): void + { + $job = new ImportJob; + $job->user_id = $this->user()->id; + $job->key = 'sn_a_' . random_int(1, 1000); + $job->status = 'new'; + $job->stage = 'new'; + $job->provider = 'spectre'; + $job->file_type = ''; + $job->configuration = []; + $job->save(); + + // fake Spectre customer: + $fakeCustomer = new Customer( + [ + 'id' => 1, + 'identifier' => 'fake', + 'secret' => 'Dumbledore dies', + ] + ); + + $correctCustomer = new Customer( + [ + 'id' => 1, + 'identifier' => 'default_ff3_customer', + 'secret' => 'Firefly III', + ] + ); + + // fake login: + $holder = new Holder([]); + $attempt = new Attempt( + [ + 'api_mode' => 'x', + 'api_version' => 4, + 'automatic_fetch' => true, + 'categorize' => true, + 'created_at' => '2018-05-21 12:00:00', + 'consent_given_at' => '2018-05-21 12:00:00', + 'consent_types' => ['transactions'], + 'custom_fields' => [], + 'daily_refresh' => true, + 'device_type' => 'mobile', + 'user_agent' => 'Mozilla/x', + 'remote_ip' => '127.0.0.1', + 'exclude_accounts' => [], + 'fail_at' => '2018-05-21 12:00:00', + 'fail_error_class' => 'err', + 'fail_message' => 'message', + 'fetch_scopes' => [], + 'finished' => true, + 'finished_recent' => true, + 'from_date' => '2018-05-21 12:00:00', + 'id' => 1, + 'interactive' => true, + 'locale' => 'en', + 'partial' => true, + 'show_consent_confirmation' => true, + 'stages' => [], + 'store_credentials' => true, + 'success_at' => '2018-05-21 12:00:00', + 'to_date' => '2018-05-21 12:00:00', + 'updated_at' => '2018-05-21 12:00:00', + ] + ); + $login = new Login( + [ + 'consent_given_at' => '2018-05-21 12:00:00', + 'consent_types' => ['transactions'], + 'country_code' => 'NL', + 'created_at' => '2018-05-21 12:00:00', + 'updated_at' => '2018-05-21 12:00:00', + 'customer_id' => '1', + 'daily_refresh' => true, + 'holder_info' => $holder->toArray(), + 'id' => 123, + 'last_attempt' => $attempt->toArray(), + 'last_success_at' => '2018-05-21 12:00:00', + 'next_refresh_possible_at' => '2018-05-21 12:00:00', + 'provider_code' => 'XF', + 'provider_id' => '123', + 'provider_name' => 'Fake', + 'show_consent_confirmation' => true, + 'status' => 'active', + 'store_credentials' => true, + ] + ); + + // mock classes: + $llRequest = $this->mock(ListLoginsRequest::class); + $lcRequest = $this->mock(ListCustomersRequest::class); + $ncRequest = $this->mock(NewCustomerRequest::class); + $repository = $this->mock(ImportJobRepositoryInterface::class); + + // mock calls for list logins (return empty list for now). + $llRequest->shouldReceive('setUser')->once(); + $llRequest->shouldReceive('setCustomer')->once(); + $llRequest->shouldReceive('call')->once(); + $llRequest->shouldReceive('getLogins')->once()->andReturn([$login]); + + // mock calls for list customers (return empty list). + $lcRequest->shouldReceive('setUser')->once(); + $lcRequest->shouldReceive('call')->once(); + $lcRequest->shouldReceive('getCustomers')->once()->andReturn([$fakeCustomer, $correctCustomer]); + + // mock call for preferences + Preferences::shouldReceive('getForUser')->withArgs([Mockery::any(), 'spectre_customer', null])->andReturnNull()->once(); + Preferences::shouldReceive('setForUser')->withArgs([Mockery::any(), 'spectre_customer', $correctCustomer->toArray()])->once(); + + // mock calls for repository: + $repository->shouldReceive('setUser')->once(); + $repository->shouldReceive('getConfiguration')->once()->withArgs([Mockery::any()])->andReturn([]); + $repository->shouldReceive('setConfiguration')->once() + ->withArgs([Mockery::any(), ['all-logins' => [$login->toArray()]]]); + + $handler = new StageNewHandler; + $handler->setImportJob($job); + try { + $handler->run(); + } catch (FireflyException $e) { + $this->assertTrue(false, $e->getMessage()); + } } } \ No newline at end of file