diff --git a/phpunit.xml b/phpunit.xml index 09f8267509..1bccf75d92 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -36,7 +36,7 @@ - ./tests/Api/Models + ./tests/Api/Models/Account diff --git a/tests/Api/Autocomplete/AccountControllerTest.php b/tests/Api/Autocomplete/AccountControllerTest.php index 857436c5b8..202d7087bb 100644 --- a/tests/Api/Autocomplete/AccountControllerTest.php +++ b/tests/Api/Autocomplete/AccountControllerTest.php @@ -22,9 +22,9 @@ namespace Tests\Api\Autocomplete; -use Tests\TestCase; use Laravel\Passport\Passport; use Log; +use Tests\TestCase; /** * Class AccountControllerTest @@ -41,14 +41,6 @@ class AccountControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - /** - * - */ - public function testBasic(): void - { - $this->assertTrue(true); - } - /** * @covers \FireflyIII\Api\V1\Controllers\Autocomplete\AccountController */ @@ -60,4 +52,12 @@ class AccountControllerTest extends TestCase $response->assertHeader('Content-Type', 'application/json'); } + /** + * + */ + public function testBasic(): void + { + $this->assertTrue(true); + } + } \ No newline at end of file diff --git a/tests/Api/Models/Account/StoreControllerTest.php b/tests/Api/Models/Account/StoreControllerTest.php index 21c0be7f9a..263e80c5f8 100644 --- a/tests/Api/Models/Account/StoreControllerTest.php +++ b/tests/Api/Models/Account/StoreControllerTest.php @@ -22,14 +22,11 @@ namespace Tests\Api\Models\Account; -use Faker\Factory; use Laravel\Passport\Passport; use Log; use Tests\Objects\Field; use Tests\Objects\FieldSet; use Tests\Objects\TestConfiguration; -use Tests\Objects\TestMandatoryField; -use Tests\Objects\TestMandatoryFieldSet; use Tests\TestCase; use Tests\Traits\CollectsValues; use Tests\Traits\RandomValues; @@ -42,6 +39,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -54,323 +60,161 @@ class StoreControllerTest extends TestCase /** * @param array $submission - * emptyDataProvider / storeDataProvider * - * @dataProvider storeDataProvider + * newStoreDataProvider / emptyDataProvider + * + * @dataProvider newStoreDataProvider */ public function testStore(array $submission): void { - $this->someTestData(); - exit; if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); + $this->markTestSkipped('Empty provider.'); } + Log::debug('testStoreUpdated()'); + Log::debug('submission :', $submission['submission']); + Log::debug('expected :', $submission['expected']); + Log::debug('ignore :', $submission['ignore']); // run account store with a minimal data set: - $route = 'api.v1.accounts.store'; - $this->storeAndCompare($route, $submission); + $address = route('api.v1.accounts.store'); + $this->updatedStoreAndCompare($address, $submission); } /** * @return array */ - public function emptyDataProvider(): array + public function newStoreDataProvider(): array { - return [[[]]]; + // some test configs: + $configuration = new TestConfiguration; - } + // default asset account test set: + $defaultAssetSet = new FieldSet(); + $defaultAssetSet->title = 'default_asset_account'; + $defaultAssetSet->addField(Field::createBasic('name', 'uuid')); + $defaultAssetSet->addField(Field::createBasic('type', 'static-asset')); + $defaultAssetSet->addField(Field::createBasic('account_role', 'random-asset-accountRole')); + $configuration->addMandatoryFieldSet($defaultAssetSet); - /** - * @return array - */ - public function storeDataProvider(): array - { - $minimalSets = $this->minimalSets(); - $optionalSets = $this->optionalSets(); - $regenConfig = [ - 'name' => function () { - $faker = Factory::create(); + // expense test set: + $expenseSet = new FieldSet(); + $expenseSet->title = 'expense_account'; + $expenseSet->addField(Field::createBasic('name', 'uuid')); - return $faker->uuid; - }, - 'iban' => function () { - $faker = Factory::create(); + // to make sure expense set ignores the opening balance fields: + $field = new Field; + $field->title = 'type'; + $field->fieldTitle = 'type'; + $field->fieldType = 'static-expense'; + $field->ignorableFields = ['opening_balance', 'opening_balance_date', 'virtual_balance', 'order']; + $expenseSet->addField($field); + $configuration->addMandatoryFieldSet($expenseSet); - return $faker->iban(); - }, - 'account_number' => function () { - $faker = Factory::create(); + // liability test set: + $fieldSet = new FieldSet(); + $fieldSet->title = 'liabilities_account'; + $fieldSet->addField(Field::createBasic('name', 'uuid')); + $fieldSet->addField(Field::createBasic('type', 'static-liabilities')); + $fieldSet->addField(Field::createBasic('liability_type', 'random-liability-type')); + $fieldSet->addField(Field::createBasic('liability_amount', 'random-amount')); + $fieldSet->addField(Field::createBasic('interest', 'random-percentage')); + $fieldSet->addField(Field::createBasic('interest_period', 'random-interest-period')); + $field = new Field; + $field->fieldTitle = 'liability_start_date'; + $field->fieldType = 'random-past-date'; + $field->ignorableFields = ['opening_balance', 'opening_balance_date']; + $field->title = 'liability_start_date'; + $fieldSet->addField($field); + $configuration->addMandatoryFieldSet($fieldSet); - return $faker->iban(); - }, - ]; + // credit card set: + $fieldSet = new FieldSet(); + $fieldSet->title = 'cc_account'; + $fieldSet->addField(Field::createBasic('name', 'uuid')); + $fieldSet->addField(Field::createBasic('type', 'static-asset')); + $fieldSet->addField(Field::createBasic('account_role', 'static-ccAsset')); + $fieldSet->addField(Field::createBasic('credit_card_type', 'static-monthlyFull')); + $fieldSet->addField(Field::createBasic('monthly_payment_date', 'random-past-date')); + $configuration->addMandatoryFieldSet($fieldSet); - return $this->genericDataProvider($minimalSets, $optionalSets, $regenConfig); - } + // optional field sets (for all test configs) + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('active', 'boolean')); + $configuration->addOptionalFieldSet('active', $fieldSet); - /** - * @return \array[][] - */ - private function optionalSets(): array - { - $faker = Factory::create(); - $currencies = [ - 1 => 'EUR', - 2 => 'HUF', - 3 => 'GBP', - 4 => 'UAH', - ]; - $rand = rand(1, 4); + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('iban', 'iban')); + $configuration->addOptionalFieldSet('iban', $fieldSet); + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('bic', 'bic')); + $configuration->addOptionalFieldSet('bic', $fieldSet); - return [ - 'active' => [ - 'fields' => [ - 'active' => $faker->boolean, - ], - ], - 'iban' => [ - 'fields' => [ - 'iban' => $faker->iban(), - ], - ], - 'bic' => [ - 'fields' => [ - 'bic' => $faker->swiftBicNumber, - ], - ], - 'account_number' => [ - 'fields' => [ - 'account_number' => $faker->iban(), - ], - ], - 'ob' => [ - 'fields' => [ - 'opening_balance' => $this->getRandomAmount(), - 'opening_balance_date' => $this->getRandomDateString(), - ], - ], - 'virtual_balance' => [ - 'fields' => [ - 'virtual_balance' => $this->getRandomAmount(), - ], - ], - 'currency_id' => [ - 'fields' => [ - 'currency_id' => $rand, - ], - ], - 'currency_code' => [ - 'fields' => [ - 'currency_code' => $currencies[$rand], - ], - ], - 'order' => [ - 'fields' => [ - 'order' => $faker->numberBetween(1, 5), - ], - ], - 'include_net_worth' => [ - 'fields' => [ - 'include_net_worth' => $faker->boolean, - ], - ], - 'notes' => [ - 'fields' => [ - 'notes' => join(' ', $faker->words(5)), - ], - ], - 'location' => [ - 'fields' => [ - 'latitude' => $faker->latitude, - 'longitude' => $faker->longitude, - 'zoom_level' => $faker->numberBetween(1, 10), - ], - ], - ]; - } + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('account_number', 'account_number')); + $configuration->addOptionalFieldSet('account_number', $fieldSet); - /** - * @return array - */ - private function minimalSets(): array - { - $faker = Factory::create(); + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('opening_balance', 'random-amount')); + $fieldSet->addField(Field::createBasic('opening_balance_date', 'random-past-date')); + $configuration->addOptionalFieldSet('ob', $fieldSet); - return [ - 'asset' => [ - 'parameters' => [], - 'fields' => [ - 'name' => $faker->uuid, - 'type' => 'asset', - 'account_role' => $this->randomAccountRole(), - ], - ], - 'expense' => [ - 'parameters' => [], - 'fields' => [ - 'name' => $faker->uuid, - 'type' => 'expense', - ], - ], - 'liability' => [ - 'parameters' => [], - 'fields' => [ - 'name' => $faker->uuid, - 'type' => 'liabilities', - 'liability_type' => $this->randomLiabilityType(), - 'liability_amount' => $this->getRandomAmount(), - 'liability_start_date' => $this->getRandomDateString(), - 'interest' => $this->getRandomPercentage(), - 'interest_period' => $this->getRandomInterestPeriod(), - ], - 'ignore' => [ - 'opening_balance', 'opening_balance_date', - ], - ], - 'cc' => [ - 'fields' => [ - 'name' => $faker->uuid, - 'type' => 'asset', - 'account_role' => 'ccAsset', - 'credit_card_type' => 'monthlyFull', - 'monthly_payment_date' => $this->getRandomDateString(), + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('virtual_balance', 'random-amount')); + $configuration->addOptionalFieldSet('virtual_balance', $fieldSet); - ], - ], - ]; - } + $fieldSet = new FieldSet; + $field = new Field; + $field->fieldTitle = 'currency_id'; + $field->fieldType = 'random-currency-id'; + $field->ignorableFields = ['currency_code']; + $field->title = 'currency_id'; + $fieldSet->addField($field); + $configuration->addOptionalFieldSet('currency_id', $fieldSet); - public function someTestData(): void - { - // a basic test config set contains - // mandatory fields and X optional fields - // the optional fields will be rotated automatically. - $config = new TestConfiguration; + $fieldSet = new FieldSet; + $field = new Field; + $field->fieldTitle = 'currency_code'; + $field->fieldType = 'random-currency-code'; + $field->ignorableFields = ['currency_id']; + $field->title = 'currency_code'; + $fieldSet->addField($field); + $configuration->addOptionalFieldSet('currency_code', $fieldSet); - // add a set of mandatory fields: - $mandatoryFieldSet = new FieldSet(); - $mandatoryFieldSet->title = 'default_asset_account'; + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('order', 'order')); + $configuration->addOptionalFieldSet('order', $fieldSet); - // name - $mandatoryField = new Field; - $mandatoryField->title = 'name'; - $mandatoryField->fieldTitle = 'name'; - $mandatoryField->fieldPosition = ''; // root - $mandatoryField->fieldType = 'uuid'; // refers to a generator or something? - $mandatoryField->expectedReturnType = 'equal'; // or 'callback' - $mandatoryField->expectedReturn = null; // or the callback - $mandatoryField->ignorableFields = []; - $mandatoryFieldSet->addField($mandatoryField); + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('include_net_worth', 'boolean')); + $configuration->addOptionalFieldSet('include_net_worth', $fieldSet); - // type - $mandatoryField = new Field; - $mandatoryField->title = 'type'; - $mandatoryField->fieldTitle = 'type'; - $mandatoryField->fieldPosition = ''; // root - $mandatoryField->fieldType = 'static-asset'; // refers to a generator or something? - $mandatoryField->expectedReturnType = 'equal'; // or 'callback' - $mandatoryField->expectedReturn = null; // or the callback - $mandatoryField->ignorableFields = []; // something like transactions/0/currency_code - $mandatoryFieldSet->addField($mandatoryField); + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('notes', 'uuid')); + $configuration->addOptionalFieldSet('notes', $fieldSet); - // role - $mandatoryField = new Field; - $mandatoryField->title = 'role'; - $mandatoryField->fieldTitle = 'account_role'; - $mandatoryField->fieldPosition = ''; // root - $mandatoryField->fieldType = 'random-asset-accountRole'; // refers to a generator or something? - $mandatoryField->expectedReturnType = 'equal'; // or 'callback' - $mandatoryField->expectedReturn = null; // or the callback - $mandatoryField->ignorableFields = []; // something like transactions/0/currency_code - $mandatoryFieldSet->addField($mandatoryField); - $config->mandatoryFieldSet = $mandatoryFieldSet; - unset($mandatoryField); - // $mandatoryField = new TestMandatoryField; - // $mandatoryField->title = 'transaction_type'; - // $mandatoryField->fieldTitle = 'type'; - // $mandatoryField->fieldPosition = 'transactions/0'; // not root! - // $mandatoryField->fieldType = 'random-transactionType'; // refers to a generator or something? - // $mandatoryField->expectedReturnType = 'equal'; // or 'callback' - // $mandatoryField->expectedReturn = null; // or the callback - // $mandatoryField->ignorableFields = []; - // $mandatoryFieldSet->addMandatoryField($mandatoryField); + $fieldSet = new FieldSet; + $fieldSet->addField(Field::createBasic('latitude', 'latitude')); + $fieldSet->addField(Field::createBasic('longitude', 'longitude')); + $fieldSet->addField(Field::createBasic('zoom_level', 'random-zoom_level')); + $configuration->addOptionalFieldSet('notes', $fieldSet); - $optionalFieldSet = new FieldSet; - $optionalField = new Field; - $optionalField->title = 'active'; - $optionalField->fieldTitle = 'active'; - $optionalField->fieldPosition = ''; - $optionalField->fieldType = 'boolean'; // refers to a generator or something? - $optionalField->expectedReturnType = 'equal'; // or 'callback' - $optionalField->expectedReturn = null; // or the callback - $optionalField->ignorableFields = []; // something like transactions/0/currency_code - $optionalFieldSet->addField($optionalField, 'active'); - - $optionalField = new Field; - $optionalField->title = 'iban'; - $optionalField->fieldTitle = 'iban'; - $optionalField->fieldPosition = ''; - $optionalField->fieldType = 'iban'; // refers to a generator or something? - $optionalField->expectedReturnType = 'equal'; // or 'callback' - $optionalField->expectedReturn = null; // or the callback - $optionalField->ignorableFields = []; // something like transactions/0/currency_code - $optionalFieldSet->addField($optionalField, 'iban'); - - $config->optionalFieldSet = $optionalFieldSet; // generate submissions - $arr = $config->generateSubmission(); - var_dump($arr); - exit; - // generate expected returns. + $array = $configuration->generateSubmissions(); + $expected = $configuration->generateExpected($array); + $ignored = $configuration->ignores; - $set = [ - // set for withdrawal, copy this for - // other transaction types etc. - // make a CLASS!! - 'identifier' => [ - 'mandatory_fields' => [ - 'name_of_set' => [ - 'fields' => [ - 'basic_text_field' => [ - 'test_value' => function () { - return 'callback'; - }, - 'expected_return_value' => function ($input) { - // the same? - return $input; + // now create a combination for each submission and associated data: + $final = []; + foreach ($array as $index => $submission) { + $final[] = [[ + 'submission' => $submission, + 'expected' => $expected[$index], + 'ignore' => $ignored[$index], + ]]; + } - // a conversion? - return (string)$input; - - // something else entirely? - return 'something else entirely.'; - }, - 'ignore_other_fields' => [ - 'key_to_ignore', - 'sub_array_like_transactions' => [0 => 'field_to_ignore'], - ], - ], - 'another_basic_text_field' => [ - // see above for 'test_value', 'expected_return_value' and 'ignore_other_fields' - ], - 'complex_array_field_like_transactions' => [ - 'transactions' => [ - 0 => [ - 'field_is_here' => [ - 'test_value' => null, // see above - 'expected_return_value' => null, // see above - 'ignore_other_fields' => [], // see above - ], - ], - ], - ], - ], - ], - ], - // these will be permutated - 'optional_fields' => [], - ], - ]; + return $final; } + } \ No newline at end of file diff --git a/tests/Api/Models/Account/UpdateControllerTest.php b/tests/Api/Models/Account/UpdateControllerTest.php index 866894d146..d014ea2767 100644 --- a/tests/Api/Models/Account/UpdateControllerTest.php +++ b/tests/Api/Models/Account/UpdateControllerTest.php @@ -53,6 +53,7 @@ class UpdateControllerTest extends TestCase */ public function testUpdate(array $submission): void { + $this->markTestSkipped('Skipped'); $ignore = [ 'created_at', 'updated_at', @@ -151,7 +152,7 @@ class UpdateControllerTest extends TestCase 'virtual_balance' => [ 'id' => 1, 'fields' => [ - 'virtual_balance' => ['test_value' => number_format($faker->randomFloat(2,10,100), 2)], + 'virtual_balance' => ['test_value' => number_format($faker->randomFloat(2, 10, 100), 2)], ], 'extra_ignore' => [], ], @@ -195,7 +196,7 @@ class UpdateControllerTest extends TestCase 'ob' => [ 'id' => 1, 'fields' => [ - 'opening_balance' => ['test_value' => number_format($faker->randomFloat(2,10,100), 2)], + 'opening_balance' => ['test_value' => number_format($faker->randomFloat(2, 10, 100), 2)], 'opening_balance_date' => ['test_value' => $faker->date('Y-m-d')], ], 'extra_ignore' => [], diff --git a/tests/Api/Models/Attachment/StoreControllerTest.php b/tests/Api/Models/Attachment/StoreControllerTest.php index ccdfea465e..5f03ae7152 100644 --- a/tests/Api/Models/Attachment/StoreControllerTest.php +++ b/tests/Api/Models/Attachment/StoreControllerTest.php @@ -37,33 +37,6 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; - /** - * - */ - public function setUp(): void - { - parent::setUp(); - Passport::actingAs($this->user()); - Log::info(sprintf('Now in %s.', get_class($this))); - } - - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - // run account store with a minimal data set: - $route = 'api.v1.attachments.store'; - $this->storeAndCompare($route, $submission); - } - /** * @return array */ @@ -73,6 +46,15 @@ class StoreControllerTest extends TestCase } + /** + * + */ + public function setUp(): void + { + parent::setUp(); + Passport::actingAs($this->user()); + Log::info(sprintf('Now in %s.', get_class($this))); + } /** * @return array @@ -86,7 +68,6 @@ class StoreControllerTest extends TestCase return $this->genericDataProvider($minimalSets, $optionalSets, $regenConfig); } - /** * @return array */ @@ -135,4 +116,21 @@ class StoreControllerTest extends TestCase ], ]; } + + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + // run account store with a minimal data set: + $route = 'api.v1.attachments.store'; + $this->storeAndCompare($route, $submission); + } } \ No newline at end of file diff --git a/tests/Api/Models/Attachment/UpdateControllerTest.php b/tests/Api/Models/Attachment/UpdateControllerTest.php index 77192a9d3a..aa739e139b 100644 --- a/tests/Api/Models/Attachment/UpdateControllerTest.php +++ b/tests/Api/Models/Attachment/UpdateControllerTest.php @@ -110,7 +110,7 @@ class UpdateControllerTest extends TestCase 'id' => 1, 'fields' => [ 'attachable_type' => ['test_value' => 'TransactionJournal'], - 'attachable_id' => ['test_value' => (string)2], + 'attachable_id' => ['test_value' => (string)2], ], 'extra_ignore' => [], ], diff --git a/tests/Api/Models/AvailableBudget/StoreControllerTest.php b/tests/Api/Models/AvailableBudget/StoreControllerTest.php index 5271a56028..dbb1c569f2 100644 --- a/tests/Api/Models/AvailableBudget/StoreControllerTest.php +++ b/tests/Api/Models/AvailableBudget/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - // run account store with a minimal data set: - $route = 'api.v1.available_budgets.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -85,7 +68,6 @@ class StoreControllerTest extends TestCase return $this->genericDataProvider($minimalSets, $optionalSets, $regenConfig); } - /** * @return array */ @@ -104,7 +86,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -132,4 +113,21 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + // run account store with a minimal data set: + $route = 'api.v1.available_budgets.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/Bill/StoreControllerTest.php b/tests/Api/Models/Bill/StoreControllerTest.php index 2e23cc54aa..6c9829eec8 100644 --- a/tests/Api/Models/Bill/StoreControllerTest.php +++ b/tests/Api/Models/Bill/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - // run account store with a minimal data set: - $route = 'api.v1.bills.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -91,7 +74,6 @@ class StoreControllerTest extends TestCase return $this->genericDataProvider($minimalSets, $optionalSets, $regenConfig); } - /** * @return array */ @@ -114,7 +96,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -197,4 +178,21 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + // run account store with a minimal data set: + $route = 'api.v1.bills.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/Bill/UpdateControllerTest.php b/tests/Api/Models/Bill/UpdateControllerTest.php index 4104b2f99a..abca63ae6c 100644 --- a/tests/Api/Models/Bill/UpdateControllerTest.php +++ b/tests/Api/Models/Bill/UpdateControllerTest.php @@ -140,21 +140,21 @@ class UpdateControllerTest extends TestCase 'extra_ignore' => [], ], - 'active' => [ + 'active' => [ 'id' => 1, 'fields' => [ 'active' => ['test_value' => $faker->boolean], ], 'extra_ignore' => [], ], - 'notes' => [ + 'notes' => [ 'id' => 1, 'fields' => [ 'notes' => ['test_value' => join(' ', $faker->words(5))], ], 'extra_ignore' => [], ], - 'object_group_id' => [ + 'object_group_id' => [ 'id' => 1, 'fields' => [ 'object_group_id' => ['test_value' => (string)$objectGroupId], @@ -168,14 +168,14 @@ class UpdateControllerTest extends TestCase ], 'extra_ignore' => ['object_group_order', 'object_group_id'], ], - 'currency_id' => [ + 'currency_id' => [ 'id' => 1, 'fields' => [ 'currency_id' => ['test_value' => (string)$rand], ], 'extra_ignore' => ['currency_code', 'currency_symbol'], ], - 'currency_code' => [ + 'currency_code' => [ 'id' => 1, 'fields' => [ 'currency_code' => ['test_value' => $currencies[$rand]], diff --git a/tests/Api/Models/Budget/StoreControllerTest.php b/tests/Api/Models/Budget/StoreControllerTest.php index b1bfe16906..9173df7e29 100644 --- a/tests/Api/Models/Budget/StoreControllerTest.php +++ b/tests/Api/Models/Budget/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - // run account store with a minimal data set: - $route = 'api.v1.budgets.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -91,13 +74,13 @@ class StoreControllerTest extends TestCase return $this->genericDataProvider($minimalSets, $optionalSets, $regenConfig); } - /** * @return array */ private function minimalSets(): array { - $faker = Factory::create(); + $faker = Factory::create(); + return [ 'default_budget' => [ 'fields' => [ @@ -107,7 +90,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -130,12 +112,12 @@ class StoreControllerTest extends TestCase $autoBudgetType = $autoBudgetTypes[rand(0, count($autoBudgetTypes) - 1)]; return [ - 'active' => [ + 'active' => [ 'fields' => [ 'active' => $faker->boolean, ], ], - 'auto_budget_id' => [ + 'auto_budget_id' => [ 'fields' => [ 'auto_budget_type' => $autoBudgetType, 'auto_budget_currency_id' => $rand, @@ -143,16 +125,33 @@ class StoreControllerTest extends TestCase 'auto_budget_period' => $repeatFreq, ], ], - 'auto_budget_code' => [ + 'auto_budget_code' => [ 'fields' => [ 'auto_budget_type' => $autoBudgetType, 'auto_budget_currency_code' => $currencies[$rand], 'auto_budget_amount' => number_format($faker->randomFloat(2, 10, 100), 2), 'auto_budget_period' => $repeatFreq, ], - ] + ], ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + // run account store with a minimal data set: + $route = 'api.v1.budgets.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/BudgetLimit/StoreControllerTest.php b/tests/Api/Models/BudgetLimit/StoreControllerTest.php index 86026bfa3d..172c9ea53f 100644 --- a/tests/Api/Models/BudgetLimit/StoreControllerTest.php +++ b/tests/Api/Models/BudgetLimit/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - // run account store with a minimal data set: - $route = 'api.v1.budgets.limits.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -115,7 +98,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -160,4 +142,21 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + // run account store with a minimal data set: + $route = 'api.v1.budgets.limits.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/BudgetLimit/UpdateControllerTest.php b/tests/Api/Models/BudgetLimit/UpdateControllerTest.php index 8b8bf63f8c..a3d9a7ca22 100644 --- a/tests/Api/Models/BudgetLimit/UpdateControllerTest.php +++ b/tests/Api/Models/BudgetLimit/UpdateControllerTest.php @@ -105,7 +105,7 @@ class UpdateControllerTest extends TestCase 'fields' => [ 'currency_id' => ['test_value' => (string)$rand], ], - 'extra_ignore' => ['currency_code','currency_name','currency_symbol'], + 'extra_ignore' => ['currency_code', 'currency_name', 'currency_symbol'], ], 'currency_code' => [ 'id' => 1, @@ -113,7 +113,7 @@ class UpdateControllerTest extends TestCase 'fields' => [ 'currency_code' => ['test_value' => $currencies[$rand]], ], - 'extra_ignore' => ['currency_id','currency_name','currency_symbol'], + 'extra_ignore' => ['currency_id', 'currency_name', 'currency_symbol'], ], 'start' => [ 'id' => 1, diff --git a/tests/Api/Models/Category/StoreControllerTest.php b/tests/Api/Models/Category/StoreControllerTest.php index c421293473..94d6563512 100644 --- a/tests/Api/Models/Category/StoreControllerTest.php +++ b/tests/Api/Models/Category/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.categories.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -108,7 +91,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -125,4 +107,20 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.categories.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/Category/UpdateControllerTest.php b/tests/Api/Models/Category/UpdateControllerTest.php index d8ce962166..e2faa60da3 100644 --- a/tests/Api/Models/Category/UpdateControllerTest.php +++ b/tests/Api/Models/Category/UpdateControllerTest.php @@ -83,19 +83,19 @@ class UpdateControllerTest extends TestCase */ public function updateDataSet(): array { - $faker = Factory::create(); - $set = [ - 'name' => [ + $faker = Factory::create(); + $set = [ + 'name' => [ 'id' => 1, 'fields' => [ 'name' => ['test_value' => $faker->uuid], ], 'extra_ignore' => [], ], - 'notes' => [ + 'notes' => [ 'id' => 1, 'fields' => [ - 'notes' => ['test_value' => join(' ',$faker->words(5))], + 'notes' => ['test_value' => join(' ', $faker->words(5))], ], 'extra_ignore' => [], ], diff --git a/tests/Api/Models/PiggyBank/StoreControllerTest.php b/tests/Api/Models/PiggyBank/StoreControllerTest.php index d9ce390712..dcf879be11 100644 --- a/tests/Api/Models/PiggyBank/StoreControllerTest.php +++ b/tests/Api/Models/PiggyBank/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.piggy_banks.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -110,7 +93,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -160,4 +142,20 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.piggy_banks.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/PiggyBank/UpdateControllerTest.php b/tests/Api/Models/PiggyBank/UpdateControllerTest.php index e81e377060..8408bbb901 100644 --- a/tests/Api/Models/PiggyBank/UpdateControllerTest.php +++ b/tests/Api/Models/PiggyBank/UpdateControllerTest.php @@ -99,7 +99,7 @@ class UpdateControllerTest extends TestCase 'fields' => [ 'account_id' => ['test_value' => (string)$faker->numberBetween(1, 3)], ], - 'extra_ignore' => ['account_name','currency_id','currency_code'], + 'extra_ignore' => ['account_name', 'currency_id', 'currency_code'], ], 'target_amount' => [ 'id' => 1, @@ -146,16 +146,16 @@ class UpdateControllerTest extends TestCase 'object_group_id' => [ 'id' => 1, 'fields' => [ - 'object_group_id' => ['test_value' => (string) $objectGroupId], + 'object_group_id' => ['test_value' => (string)$objectGroupId], ], - 'extra_ignore' => ['object_group_order','object_group_title'], + 'extra_ignore' => ['object_group_order', 'object_group_title'], ], 'object_group_title' => [ 'id' => 1, 'fields' => [ 'object_group_title' => ['test_value' => $objectGroupName], ], - 'extra_ignore' => ['object_group_order','object_group_id'], + 'extra_ignore' => ['object_group_order', 'object_group_id'], ], ]; diff --git a/tests/Api/Models/Recurrence/StoreControllerTest.php b/tests/Api/Models/Recurrence/StoreControllerTest.php index 2d71fe871d..67e7ee32ee 100644 --- a/tests/Api/Models/Recurrence/StoreControllerTest.php +++ b/tests/Api/Models/Recurrence/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.recurrences.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -109,7 +92,7 @@ class StoreControllerTest extends TestCase ['weekly', (string)$faker->numberBetween(1, 7)], ['ndom', (string)$faker->numberBetween(1, 4) . ',' . $faker->numberBetween(1, 7)], ['monthly', (string)$faker->numberBetween(1, 31)], - ['yearly', $faker->dateTimeBetween('-1 year','now')->format('Y-m-d')], + ['yearly', $faker->dateTimeBetween('-1 year', 'now')->format('Y-m-d')], ]; $set = []; @@ -144,7 +127,6 @@ class StoreControllerTest extends TestCase return $set; } - /** * @return \array[][] */ @@ -153,38 +135,38 @@ class StoreControllerTest extends TestCase $faker = Factory::create(); return [ - 'description' => [ + 'description' => [ 'fields' => [ 'description' => $faker->uuid, ], ], - 'nr_of_repetitions' => [ + 'nr_of_repetitions' => [ 'fields' => [ 'nr_of_repetitions' => $faker->numberBetween(1, 2), ], 'remove_fields' => ['repeat_until'], ], - 'apply_rules' => [ + 'apply_rules' => [ 'fields' => [ 'apply_rules' => $faker->boolean, ], ], - 'active' => [ + 'active' => [ 'fields' => [ 'active' => $faker->boolean, ], ], - 'notes' => [ + 'notes' => [ 'fields' => [ 'notes' => $faker->uuid, ], ], - 'repetitions_skip' => [ + 'repetitions_skip' => [ 'fields' => [ 'repetitions' => [ // first entry, set field: [ - 'skip' => $faker->numberBetween(1,3), + 'skip' => $faker->numberBetween(1, 3), ], ], ], @@ -194,12 +176,28 @@ class StoreControllerTest extends TestCase 'repetitions' => [ // first entry, set field: [ - 'weekend' => $faker->numberBetween(1,4), + 'weekend' => $faker->numberBetween(1, 4), ], ], ], - ] + ], ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.recurrences.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/Rule/StoreControllerTest.php b/tests/Api/Models/Rule/StoreControllerTest.php index ff579d713a..314f9da78c 100644 --- a/tests/Api/Models/Rule/StoreControllerTest.php +++ b/tests/Api/Models/Rule/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.rules.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -152,7 +135,6 @@ class StoreControllerTest extends TestCase } - /** * @return \array[][] */ @@ -234,4 +216,20 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.rules.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/RuleGroup/StoreControllerTest.php b/tests/Api/Models/RuleGroup/StoreControllerTest.php index 7537c26117..84a8056e78 100644 --- a/tests/Api/Models/RuleGroup/StoreControllerTest.php +++ b/tests/Api/Models/RuleGroup/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.rule_groups.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -108,7 +91,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -135,4 +117,20 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.rule_groups.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/Tag/StoreControllerTest.php b/tests/Api/Models/Tag/StoreControllerTest.php index d860f0d84d..aaef6095cb 100644 --- a/tests/Api/Models/Tag/StoreControllerTest.php +++ b/tests/Api/Models/Tag/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.tags.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -108,7 +91,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -137,4 +119,20 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.tags.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/Transaction/StoreControllerTest.php b/tests/Api/Models/Transaction/StoreControllerTest.php index 4b77363e71..dccec7acab 100644 --- a/tests/Api/Models/Transaction/StoreControllerTest.php +++ b/tests/Api/Models/Transaction/StoreControllerTest.php @@ -22,6 +22,7 @@ namespace Tests\Api\Models\Transaction; +use DateTimeInterface; use Faker\Factory; use Laravel\Passport\Passport; use Log; @@ -37,6 +38,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +57,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.transactions.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -117,7 +101,7 @@ class StoreControllerTest extends TestCase 'transactions' => [ [ 'type' => $combi[0], - 'date' => $faker->dateTime(null, 'Europe/Amsterdam')->format(\DateTimeInterface::RFC3339), + 'date' => $faker->dateTime(null, 'Europe/Amsterdam')->format(DateTimeInterface::RFC3339), 'amount' => number_format($faker->randomFloat(2, 10, 100), 12), 'description' => $faker->uuid, 'source_id' => $combi[1], @@ -131,7 +115,6 @@ class StoreControllerTest extends TestCase return $set; } - /** * @return \array[][] */ @@ -211,4 +194,20 @@ class StoreControllerTest extends TestCase return $set; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.transactions.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/TransactionCurrency/StoreControllerTest.php b/tests/Api/Models/TransactionCurrency/StoreControllerTest.php index cc51fb34a6..f465b33571 100644 --- a/tests/Api/Models/TransactionCurrency/StoreControllerTest.php +++ b/tests/Api/Models/TransactionCurrency/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.currencies.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -81,19 +64,20 @@ class StoreControllerTest extends TestCase $minimalSets = $this->minimalSets(); $optionalSets = $this->optionalSets(); $regenConfig = [ - 'code' => function () { + 'code' => function () { $faker = Factory::create(); return substr($faker->uuid, 0, 3); }, - 'name' => function () { + 'name' => function () { $faker = Factory::create(); return $faker->uuid; }, 'symbol' => function () { $faker = Factory::create(); - return $faker->randomAscii.$faker->randomAscii; + + return $faker->randomAscii . $faker->randomAscii; }, ]; @@ -113,13 +97,12 @@ class StoreControllerTest extends TestCase 'fields' => [ 'code' => substr($faker->uuid, 0, 3), 'name' => $faker->uuid, - 'symbol' => $faker->randomAscii.$faker->randomAscii, + 'symbol' => $faker->randomAscii . $faker->randomAscii, ], ], ]; } - /** * @return \array[][] */ @@ -133,12 +116,12 @@ class StoreControllerTest extends TestCase 'enabled' => $faker->boolean, ], ], - 'default' => [ + 'default' => [ 'fields' => [ 'default' => $faker->boolean, ], ], - 'decimal_places' => [ + 'decimal_places' => [ 'fields' => [ 'decimal_places' => $faker->numberBetween(1, 6), ], @@ -146,4 +129,20 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.currencies.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/TransactionCurrency/UpdateControllerTest.php b/tests/Api/Models/TransactionCurrency/UpdateControllerTest.php index a970725f0f..78031f5705 100644 --- a/tests/Api/Models/TransactionCurrency/UpdateControllerTest.php +++ b/tests/Api/Models/TransactionCurrency/UpdateControllerTest.php @@ -102,7 +102,7 @@ class UpdateControllerTest extends TestCase 'symbol' => [ 'id' => 'RUB', 'fields' => [ - 'description' => ['test_value' => $faker->randomAscii.$faker->randomAscii], + 'description' => ['test_value' => $faker->randomAscii . $faker->randomAscii], ], 'extra_ignore' => [], ], diff --git a/tests/Api/Models/TransactionLink/StoreControllerTest.php b/tests/Api/Models/TransactionLink/StoreControllerTest.php index a1547baf6d..1c71f89695 100644 --- a/tests/Api/Models/TransactionLink/StoreControllerTest.php +++ b/tests/Api/Models/TransactionLink/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.transaction_links.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -123,7 +106,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -140,4 +122,20 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.transaction_links.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Models/TransactionLink/UpdateControllerTest.php b/tests/Api/Models/TransactionLink/UpdateControllerTest.php index e049b1178e..2407ee7d53 100644 --- a/tests/Api/Models/TransactionLink/UpdateControllerTest.php +++ b/tests/Api/Models/TransactionLink/UpdateControllerTest.php @@ -85,35 +85,35 @@ class UpdateControllerTest extends TestCase { $faker = Factory::create(); $set = [ - 'link_type_id' => [ + 'link_type_id' => [ 'id' => 1, 'fields' => [ - 'link_type_id' => ['test_value' => (string)$faker->numberBetween(1,3)], + 'link_type_id' => ['test_value' => (string)$faker->numberBetween(1, 3)], ], 'extra_ignore' => ['link_type_name'], ], - 'link_type_name' => [ + 'link_type_name' => [ 'id' => 1, 'fields' => [ 'link_type_name' => ['test_value' => 'Refund'], ], 'extra_ignore' => ['link_type_id'], ], - 'inward_id' => [ + 'inward_id' => [ 'id' => 1, 'fields' => [ - 'inward_id' => ['test_value' => (string)$faker->numberBetween(11,20)], + 'inward_id' => ['test_value' => (string)$faker->numberBetween(11, 20)], ], 'extra_ignore' => [], ], - 'outward_id' => [ + 'outward_id' => [ 'id' => 1, 'fields' => [ 'outward_id' => ['test_value' => (string)$faker->numberBetween(11, 30)], ], 'extra_ignore' => [], ], - 'notes' => [ + 'notes' => [ 'id' => 1, 'fields' => [ 'notes' => ['test_value' => join(' ', $faker->words(5))], diff --git a/tests/Api/Models/TransactionLinkType/StoreControllerTest.php b/tests/Api/Models/TransactionLinkType/StoreControllerTest.php index e7b2535060..c286491278 100644 --- a/tests/Api/Models/TransactionLinkType/StoreControllerTest.php +++ b/tests/Api/Models/TransactionLinkType/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.link_types.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -121,7 +104,6 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ @@ -132,4 +114,20 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.link_types.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Webhook/StoreControllerTest.php b/tests/Api/Webhook/StoreControllerTest.php index ea6b53f858..256e7bef8c 100644 --- a/tests/Api/Webhook/StoreControllerTest.php +++ b/tests/Api/Webhook/StoreControllerTest.php @@ -37,6 +37,15 @@ class StoreControllerTest extends TestCase { use RandomValues, TestHelpers, CollectsValues; + /** + * @return array + */ + public function emptyDataProvider(): array + { + return [[[]]]; + + } + /** * */ @@ -47,32 +56,6 @@ class StoreControllerTest extends TestCase Log::info(sprintf('Now in %s.', get_class($this))); } - - /** - * @param array $submission - * - * emptyDataProvider / storeDataProvider - * - * @dataProvider storeDataProvider - */ - public function testStore(array $submission): void - { - if ([] === $submission) { - $this->markTestSkipped('Empty data provider'); - } - $route = 'api.v1.webhooks.store'; - $this->storeAndCompare($route, $submission); - } - - /** - * @return array - */ - public function emptyDataProvider(): array - { - return [[[]]]; - - } - /** * @return array */ @@ -81,12 +64,12 @@ class StoreControllerTest extends TestCase $minimalSets = $this->minimalSets(); $optionalSets = $this->optionalSets(); $regenConfig = [ - 'title' => function () { + 'title' => function () { $faker = Factory::create(); return $faker->uuid; }, - 'url' => function () { + 'url' => function () { $faker = Factory::create(); return str_replace(['http://'], 'https://', $faker->url); @@ -138,15 +121,15 @@ class StoreControllerTest extends TestCase ]; } - /** * @return \array[][] */ private function optionalSets(): array { $faker = Factory::create(); + return [ - 'active' => [ + 'active' => [ 'fields' => [ 'active' => $faker->boolean, ], @@ -154,4 +137,20 @@ class StoreControllerTest extends TestCase ]; } + /** + * @param array $submission + * + * emptyDataProvider / storeDataProvider + * + * @dataProvider storeDataProvider + */ + public function testStore(array $submission): void + { + if ([] === $submission) { + $this->markTestSkipped('Empty data provider'); + } + $route = 'api.v1.webhooks.store'; + $this->storeAndCompare($route, $submission); + } + } \ No newline at end of file diff --git a/tests/Api/Webhook/UpdateControllerTest.php b/tests/Api/Webhook/UpdateControllerTest.php index 3ae221e3cb..0036294611 100644 --- a/tests/Api/Webhook/UpdateControllerTest.php +++ b/tests/Api/Webhook/UpdateControllerTest.php @@ -85,24 +85,26 @@ class UpdateControllerTest extends TestCase { $faker = Factory::create(); $set = [ - 'active' => [ + 'active' => [ 'id' => 1, 'fields' => [ 'active' => ['test_value' => $faker->boolean], ], 'extra_ignore' => [], ], - 'title' => [ + 'title' => [ 'id' => 1, 'fields' => [ 'title' => ['test_value' => $faker->uuid], ], 'extra_ignore' => [], ], - 'trigger' => [ + 'trigger' => [ 'id' => 1, 'fields' => [ - 'trigger' => ['test_value' => $faker->randomElement(['TRIGGER_STORE_TRANSACTION', 'TRIGGER_UPDATE_TRANSACTION', 'TRIGGER_DESTROY_TRANSACTION'])], + 'trigger' => ['test_value' => $faker->randomElement( + ['TRIGGER_STORE_TRANSACTION', 'TRIGGER_UPDATE_TRANSACTION', 'TRIGGER_DESTROY_TRANSACTION'] + )], ], 'extra_ignore' => [], ], @@ -120,7 +122,7 @@ class UpdateControllerTest extends TestCase ], 'extra_ignore' => [], ], - 'url' => [ + 'url' => [ 'id' => 1, 'fields' => [ 'url' => ['test_value' => str_replace(['http://'], 'https://', $faker->url)], diff --git a/tests/CreatesApplication.php b/tests/CreatesApplication.php index 51c1a775d4..a88287c0f5 100644 --- a/tests/CreatesApplication.php +++ b/tests/CreatesApplication.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace Tests; use Illuminate\Contracts\Console\Kernel; +use Illuminate\Foundation\Application; /** * Trait CreatesApplication @@ -36,7 +37,7 @@ trait CreatesApplication /** * Creates the application. * - * @return \Illuminate\Foundation\Application + * @return Application */ public function createApplication() { diff --git a/tests/Objects/Field.php b/tests/Objects/Field.php index de223d4fc1..fd50eb2598 100644 --- a/tests/Objects/Field.php +++ b/tests/Objects/Field.php @@ -12,10 +12,36 @@ class Field { public ?Closure $expectedReturn; public string $expectedReturnType; - public string $fieldPosition; public string $fieldTitle; public string $fieldType; public ?array $ignorableFields; public string $title; + /** + * Field constructor. + */ + public function __construct() + { + $this->expectedReturnType = 'equal'; // or 'callback' + $this->expectedReturn = null; // or the callback + $this->ignorableFields = []; // something like transactions/0/currency_code + //$optionalField->ignorableFields = ['some_field', 'transactions/0/another_field', 'rules/2/another_one',]; // something like transactions/0/currency_code + } + + /** + * @param string $title + * @param string $type + * + * @return static + */ + public static function createBasic(string $title, string $type): self + { + $field = new self; + $field->title = $title; + $field->fieldTitle = $title; + $field->fieldType = $type; + + return $field; + } + } \ No newline at end of file diff --git a/tests/Objects/TestConfiguration.php b/tests/Objects/TestConfiguration.php index cd6b3216c6..e8afd56ef4 100644 --- a/tests/Objects/TestConfiguration.php +++ b/tests/Objects/TestConfiguration.php @@ -11,46 +11,230 @@ use RuntimeException; */ class TestConfiguration { - public FieldSet $mandatoryFieldSet; - public FieldSet $optionalFieldSet; - private array $submission; + public array $mandatoryFieldSets; + public array $optionalFieldSets; + private array $submission; + protected const MAX_ITERATIONS = 3; + public array $ignores; /** * TestConfiguration constructor. */ public function __construct() { - $this->submission = []; + $this->submission = []; + $this->mandatoryFieldSets = []; + $this->optionalFieldSets = []; + $this->ignores = []; + } + + /** + * @param FieldSet $set + */ + public function addMandatoryFieldSet(FieldSet $set) + { + $this->mandatoryFieldSets[] = $set; + } + + public function addOptionalFieldSet(string $key, FieldSet $set) + { + $this->optionalFieldSets[$key] = $set; + } + + /** + * @param array $submissions + * + * @return array + */ + public function generateIgnores(array $submissions): array + { + $ignores = []; + // loop each submission and find its expected return and create + // a return array with the expected values. + /** @var array $submission */ + foreach ($submissions as $index => $submission) { + $ignores[$index] = []; + // loop each field and use the "name" to find it. + /** + * @var string $fieldName + * @var string $fieldValue + */ + foreach ($submission as $fieldTitle => $fieldValue) { + //echo "Now searching for field $fieldTitle on index $index.\n"; + $fieldObject = $this->findField($fieldTitle); + if (null !== $fieldObject) { + if (0 !== count($fieldObject->ignorableFields)) { + /** @var string $ignorableField */ + foreach ($fieldObject->ignorableFields as $ignorableField) { + // explode and put in the right position: + $positions = explode('/', $ignorableField); + if (1 === count($positions)) { + $ignores[$index][$ignorableField] = true; + } + if (3 === count($positions)) { + $root = $positions[0]; + $index = (int)$positions[1]; + $final = $positions[2]; + $ignores[$index][$root][$index][$final] = true; + } + } + } + } + if (null === $fieldObject) { + die('null field object :('); + } + } + } + + return $ignores; + } + + /** + * @param int $index + * @param string $title + * + * @return Field|null + */ + private function findField(string $title): ?Field + { + // since there is no index for optional field sets (they use ID) + // reverse the set and loop them all: + // reason we reverse them is because the last always overrules the first. + $reversed = array_reverse($this->optionalFieldSets); + foreach ($reversed as $fieldSet) { + foreach ($fieldSet->fields as $field) { + if ($title === $field->fieldTitle) { + //echo " found field $title in an optional field set.\n"; + + return $field; + } + } + } + $reversed = array_reverse($this->mandatoryFieldSets); + foreach ($reversed as $fieldSet) { + foreach ($fieldSet->fields as $field) { + if ($title === $field->fieldTitle) { + //echo " found field $title in a mandatory field set.\n"; + + return $field; + } + } + } + + + return null; + } + + /** + * @param array $submissions + * + * @return array + */ + public function generateExpected(array $submissions): array + { + $returns = []; + // loop each submission and find its expected return and create + // a return array with the expected values. + /** @var array $submission */ + foreach ($submissions as $index => $submission) { + $returns[$index] = []; + // loop each field and use the "name" to find it. + /** + * @var string $fieldName + * @var string $fieldValue + */ + foreach ($submission as $fieldTitle => $fieldValue) { + //echo "Now searching for field $fieldTitle on index $index.\n"; + $fieldObject = $this->findField($fieldTitle); + if (null !== $fieldObject) { + if (null === $fieldObject->expectedReturn) { + $returns[$index][$fieldTitle] = $submissions[$index][$fieldTitle]; + } + if (null !== $fieldObject->expectedReturn) { + die('cannot handle closure'); + } + } + if (null === $fieldObject) { + die('null field object :('); + } + } + } + + return $returns; + } + + /** + * @param FieldSet $set + * + * @return array + */ + private function toArray(FieldSet $set): array + { + $ignore = []; + $result = []; + /** @var Field $field */ + foreach ($set->fields as $field) { + $result = $this->parseField($result, $field); + $ignore = array_unique($ignore + $field->ignorableFields); + } + $this->ignores[] = $ignore; + + return $result; } /** * @return array */ - public function generateSubmission(): array + public function generateSubmissions(): array { - // first generate standard submission: + // first generate standard submissions: $this->submission = []; - $standard = []; - /** @var Field $field */ - foreach ($this->mandatoryFieldSet->fields as $field) { - $standard = $this->parseField($standard, $field); - } - $this->submission[] = $standard; - // expand the standard submission with extra sets from the optional field set. - $optionalCount = count($this->optionalFieldSet->fields); - if (0 !== $optionalCount) { - $keys = array_keys($this->optionalFieldSet->fields); - for ($i = 1; $i <= count($keys); $i++) { - $combinations = $this->combinationsOf($i, $keys); - foreach ($combinations as $combination) { - $custom = $standard; - foreach ($combination as $key) { - // add field $key to the standard submission. - $custom = $this->parseField($custom, $this->optionalFieldSet->fields[$key]); + // loop each standard submission: + /** @var FieldSet $set */ + foreach ($this->mandatoryFieldSets as $set) { + $this->submission[] = $this->toArray($set); + + + // expand the standard submission with extra sets from the optional field set. + $setCount = count($this->optionalFieldSets); + //echo "Just created a standard set\n"; + if (0 !== $setCount) { + $keys = array_keys($this->optionalFieldSets); + //echo " keys to consider are: " . join(', ', $keys) . "\n"; + $maxCount = count($keys) > self::MAX_ITERATIONS ? self::MAX_ITERATIONS : count($keys); + for ($i = 1; $i <= $maxCount; $i++) { + $combinationSets = $this->combinationsOf($i, $keys); + //echo " will create " . count($combinationSets) . " extra sets.\n"; + foreach ($combinationSets as $ii => $combinationSet) { + //echo " Set " . ($ii + 1) . "/" . count($combinationSets) . " will consist of:\n"; + // the custom set is born! + + $custom = $this->toArray($set); + // echo " refreshed!\n"; + // echo " " . json_encode($custom) . "\n"; + foreach ($combinationSet as $combination) { + //echo " $combination\n"; + // here we start adding stuff to a copy of the standard submission. + /** @var FieldSet $customSet */ + $customSet = $this->optionalFieldSets[$combination] ?? false; + // echo " there are " . count(array_keys($customSet->fields)) . " field(s) in this custom set\n"; + // loop each field in this custom set and add them, nothing more. + /** @var Field $field */ + foreach ($customSet->fields as $field) { + //echo " added field ".$field->fieldTitle." from custom set ".$combination."\n"; + $custom = $this->parseField($custom, $field); + // for each field, add the ignores to the current index (+1!) of + // ignores. + if (null !== $field->ignorableFields && count($field->ignorableFields) > 0) { + $count = count($this->submission); + $currentIgnoreSet = $this->ignores[$count] ?? []; + $this->ignores[$count] = array_unique(array_values(array_merge($currentIgnoreSet, $field->ignorableFields))); + } + } + } + $this->submission[] = $custom; } - // add custom to $submission: - $this->submission[] = $custom; } } } @@ -58,6 +242,95 @@ class TestConfiguration return $this->submission; } + /** + * @param array $current + * @param Field $field + * + * @return array + */ + private function parseField(array $current, Field $field): array + { + // fieldTitle indicates the position: + $positions = explode('/', $field->fieldTitle); + $count = count($positions); + + if (1 === $count) { + $current[$field->fieldTitle] = $this->generateFieldValue($field->fieldType); + + return $current; + } + if (3 === $count) { + $root = $positions[0]; + $count = (int)$positions[1]; + $final = $positions[2]; + $current[$root] = array_key_exists($root, $current) ? $current[$root] : []; + $current[$root][$count] = array_key_exists($count, $current[$root]) ? $current[$root][$count] : []; + $current[$root][$count][$final] = $this->generateFieldValue($final); + + return $current; + } + throw new RuntimeException(sprintf('Did not expect count %d from fieldTitle "%s".', $count, $field->fieldTitle)); + } + + /** + * @param string $type + * + * @return mixed + */ + private function generateFieldValue(string $type) + { + $faker = Factory::create(); + switch ($type) { + default: + throw new RuntimeException(sprintf('Cannot handle field "%s"', $type)); + case 'uuid': + return $faker->uuid; + case 'static-asset': + return 'asset'; + case 'static-expense': + return 'expense'; + case 'static-liabilities': + return 'liabilities'; + case 'static-ccAsset': + return 'ccAsset'; + case 'static-monthlyFull': + return 'monthlyFull'; + case 'random-liability-type': + return $faker->randomElement(['loan', 'debt', 'mortgage']); + case 'random-amount': + return number_format($faker->randomFloat(2, 10, 100), 2); + case 'random-percentage': + return $faker->randomFloat(2, 1, 99); + case 'random-interest-period': + return $faker->randomElement(['daily', 'monthly', 'yearly']); + case 'random-past-date': + return $faker->dateTimeBetween('-3 years', '-1 years')->format('Y-m-d'); + case 'random-asset-accountRole': + return $faker->randomElement(['defaultAsset', 'savingAsset']); + case 'random-transactionType': + return $faker->randomElement(['withdrawal', 'deposit', 'transfer']); + case 'boolean': + return $faker->boolean; + case 'iban': + case 'account_number': + return $faker->iban(); + case 'bic': + return $faker->swiftBicNumber; + case 'random-currency-id': + return $faker->numberBetween(1, 10); + case 'random-currency-code': + return $faker->randomElement(['EUR', 'USD', 'HUF', 'GBP']); + case 'order': + return $faker->numberBetween(1, 5); + case 'latitude': + return $faker->latitude; + case 'longitude': + return $faker->longitude; + case 'random-zoom_level': + return $faker->numberBetween(1, 12); + } + } + /** * @param $k * @param $xs @@ -84,53 +357,37 @@ class TestConfiguration } /** - * @param string $type - * - * @return mixed + * @param FieldSet $optionalFieldSet */ - private function generateFieldValue(string $type) + public function setOptionalFieldSet(FieldSet $optionalFieldSet): void { - $faker = Factory::create(); - switch ($type) { - default: - throw new RuntimeException(sprintf('Cannot handle field "%s"', $type)); - case 'uuid': - return $faker->uuid; - case 'static-asset': - return 'asset'; - case 'random-asset-accountRole': - return $faker->randomElement(['defaultAsset', 'savingsAsset']); - case 'random-transactionType': - return $faker->randomElement(['withdrawal', 'deposit', 'transfer']); - case 'boolean': - return $faker->boolean; - case 'iban': - return $faker->iban(); - } + $this->optionalFieldSet = $optionalFieldSet; } /** - * @param array $current - * @param Field $field + * @param array $existing + * @param array $config * * @return array */ - private function parseField(array $current, Field $field): array + private function parseIgnorableFields(array $existing, array $config): array { - if ('' === $field->fieldPosition) { - $current[$field->fieldTitle] = $this->generateFieldValue($field->fieldType); - } - if ('' !== $field->fieldPosition) { - $positions = explode('/', $field->fieldPosition); - // since the "positions" array is almost 2 indexes deep at best, we can do some manual fiddling. - $root = $positions[0]; - $count = (int)$positions[1]; - $current[$root] = array_key_exists($root, $current) ? $current[$root] : []; - $current[$root][$count] = array_key_exists($count, $current[$root]) ? $current[$root][$count] : []; - $current[$root][$count][$field->fieldTitle] = $this->generateFieldValue($field->fieldType); + foreach ($config as $field) { + $parts = explode('/', $field); + if (1 === count($parts)) { + $existing[$parts[0]] = true; + } + if (3 === count($parts)) { + $root = $parts[0]; + $index = (int)$parts[1]; + $final = $parts[2]; + $existing[$root][$index][$final] = true; + } + //if ('' !== $field->fieldPosition) { + //$positions = explode('/', $field->fieldPosition); } - return $current; + return $existing; } } \ No newline at end of file diff --git a/tests/TestCase.php b/tests/TestCase.php index ab0eeae795..e78d07fc42 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -32,6 +32,7 @@ use Tests\Traits\CollectsValues; abstract class TestCase extends BaseTestCase { use CreatesApplication, CollectsValues; + protected const MAX_ITERATIONS = 2; /** diff --git a/tests/Traits/CollectsValues.php b/tests/Traits/CollectsValues.php index 4a1e201d70..ff78279d6d 100644 --- a/tests/Traits/CollectsValues.php +++ b/tests/Traits/CollectsValues.php @@ -24,18 +24,6 @@ declare(strict_types=1); namespace Tests\Traits; -use DB; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Models\Account; -use FireflyIII\Models\AccountType; -use FireflyIII\Models\Bill; -use FireflyIII\Models\Budget; -use FireflyIII\Models\Category; -use FireflyIII\Models\PiggyBank; -use FireflyIII\Models\Tag; -use FireflyIII\Models\TransactionCurrency; -use FireflyIII\Models\TransactionJournal; -use FireflyIII\Models\TransactionType; use FireflyIII\User; /** @@ -50,208 +38,208 @@ trait CollectsValues { return User::where('email', 'james@firefly')->first(); } -// -// /** -// * @return User -// */ -// public function nonAdminUser(): User -// { -// return User::where('email', 'no_admin@firefly')->first(); -// } -// -// /** -// * @return Budget -// */ -// public function getRandomBudget(): Budget -// { -// return $this->user()->budgets()->inRandomOrder()->first(); -// } -// -// /** -// * @return Category -// */ -// public function getRandomCategory(): Category -// { -// return $this->user()->categories()->inRandomOrder()->first(); -// } -// -// /** -// * @return Bill -// */ -// public function getRandomBill(): Bill -// { -// return $this->user()->bills()->inRandomOrder()->first(); -// } -// -// /** -// * @return PiggyBank -// */ -// public function getRandomPiggyBank(): PiggyBank -// { -// return $this->user()->piggyBanks()->inRandomOrder()->first(); -// } -// -// -// /** -// * @return Tag -// */ -// public function getRandomTag(): Tag -// { -// return $this->user()->tags()->inRandomOrder()->first(); -// } -// -// /** -// * @return TransactionJournal -// */ -// public function getRandomWithdrawal(): TransactionJournal -// { -// return $this->getRandomJournal(TransactionType::WITHDRAWAL); -// } -// -// /** -// * @return TransactionJournal -// */ -// public function getRandomTransfer(): TransactionJournal -// { -// return $this->getRandomJournal(TransactionType::TRANSFER); -// } -// -// /** -// * @return TransactionJournal -// */ -// public function getRandomDeposit(): TransactionJournal -// { -// return $this->getRandomJournal(TransactionType::DEPOSIT); -// } -// -// /** -// * @param string $type -// * -// * @return TransactionJournal -// * @throws FireflyException -// */ -// private function getRandomJournal(string $type): TransactionJournal -// { -// $query = DB::table('transactions') -// ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') -// ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') -// ->where('transaction_journals.user_id', $this->user()->id) -// ->whereNull('transaction_journals.deleted_at') -// ->whereNull('transactions.deleted_at') -// ->where('transaction_types.type', $type) -// ->groupBy('transactions.transaction_journal_id') -// ->having('ct', '=', 2) -// ->inRandomOrder()->take(1); -// $result = $query->get( -// [ -// 'transactions.transaction_journal_id', -// 'transaction_journals.transaction_type_id', -// DB::raw('COUNT(transaction_journal_id) as ct'), -// ] -// )->first(); -// if (null === $result) { -// throw new FireflyException(sprintf('Cannot find suitable journal "%s" to use.', $type)); -// } -// -// return TransactionJournal::find((int)$result->transaction_journal_id); -// -// } -// -// /** -// * @return TransactionCurrency -// */ -// public function getEuro(): TransactionCurrency -// { -// return TransactionCurrency::whereCode('EUR')->first(); -// } -// -// /** -// * @return TransactionCurrency -// */ -// public function getRandomCurrency(): TransactionCurrency -// { -// return TransactionCurrency::where('code', '!=', 'EUR')->inRandomOrder()->first(); -// } -// -// /** -// * @return TransactionCurrency -// */ -// public function getDollar(): TransactionCurrency -// { -// return TransactionCurrency::whereCode('USD')->first(); -// } -// -// /** -// * @param int|null $except -// * -// * @return Account -// */ -// public function getRandomAsset(?int $except = null): Account -// { -// return $this->getRandomAccount(AccountType::ASSET, $except); -// } -// -// /** -// * @param int|null $except -// * -// * @return Account -// */ -// public function getRandomDebt(?int $except = null): Account -// { -// return $this->getRandomAccount(AccountType::DEBT, $except); -// } -// -// /** -// * @param int|null $except -// * -// * @return Account -// */ -// public function getRandomLoan(?int $except = null): Account -// { -// return $this->getRandomAccount(AccountType::LOAN, $except); -// } -// -// /** -// * @param int|null $except -// * -// * @return Account -// */ -// public function getRandomRevenue(?int $except = null): Account -// { -// return $this->getRandomAccount(AccountType::REVENUE, $except); -// } -// -// /** -// * @param int|null $except -// * -// * @return Account -// */ -// public function getRandomExpense(?int $except = null): Account -// { -// return $this->getRandomAccount(AccountType::EXPENSE, $except); -// } -// -// /** -// * @param string $type -// * -// * @param int|null $except -// * -// * @return Account -// */ -// private function getRandomAccount(string $type, ?int $except): Account -// { -// $query = Account:: -// leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') -// ->whereNull('accounts.deleted_at') -// ->where('accounts.user_id', $this->user()->id) -// ->where('account_types.type', $type) -// ->inRandomOrder()->take(1); -// if (null !== $except) { -// $query->where('accounts.id', '!=', $except); -// } -// -// return $query->first(['accounts.*']); -// } + // + // /** + // * @return User + // */ + // public function nonAdminUser(): User + // { + // return User::where('email', 'no_admin@firefly')->first(); + // } + // + // /** + // * @return Budget + // */ + // public function getRandomBudget(): Budget + // { + // return $this->user()->budgets()->inRandomOrder()->first(); + // } + // + // /** + // * @return Category + // */ + // public function getRandomCategory(): Category + // { + // return $this->user()->categories()->inRandomOrder()->first(); + // } + // + // /** + // * @return Bill + // */ + // public function getRandomBill(): Bill + // { + // return $this->user()->bills()->inRandomOrder()->first(); + // } + // + // /** + // * @return PiggyBank + // */ + // public function getRandomPiggyBank(): PiggyBank + // { + // return $this->user()->piggyBanks()->inRandomOrder()->first(); + // } + // + // + // /** + // * @return Tag + // */ + // public function getRandomTag(): Tag + // { + // return $this->user()->tags()->inRandomOrder()->first(); + // } + // + // /** + // * @return TransactionJournal + // */ + // public function getRandomWithdrawal(): TransactionJournal + // { + // return $this->getRandomJournal(TransactionType::WITHDRAWAL); + // } + // + // /** + // * @return TransactionJournal + // */ + // public function getRandomTransfer(): TransactionJournal + // { + // return $this->getRandomJournal(TransactionType::TRANSFER); + // } + // + // /** + // * @return TransactionJournal + // */ + // public function getRandomDeposit(): TransactionJournal + // { + // return $this->getRandomJournal(TransactionType::DEPOSIT); + // } + // + // /** + // * @param string $type + // * + // * @return TransactionJournal + // * @throws FireflyException + // */ + // private function getRandomJournal(string $type): TransactionJournal + // { + // $query = DB::table('transactions') + // ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') + // ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') + // ->where('transaction_journals.user_id', $this->user()->id) + // ->whereNull('transaction_journals.deleted_at') + // ->whereNull('transactions.deleted_at') + // ->where('transaction_types.type', $type) + // ->groupBy('transactions.transaction_journal_id') + // ->having('ct', '=', 2) + // ->inRandomOrder()->take(1); + // $result = $query->get( + // [ + // 'transactions.transaction_journal_id', + // 'transaction_journals.transaction_type_id', + // DB::raw('COUNT(transaction_journal_id) as ct'), + // ] + // )->first(); + // if (null === $result) { + // throw new FireflyException(sprintf('Cannot find suitable journal "%s" to use.', $type)); + // } + // + // return TransactionJournal::find((int)$result->transaction_journal_id); + // + // } + // + // /** + // * @return TransactionCurrency + // */ + // public function getEuro(): TransactionCurrency + // { + // return TransactionCurrency::whereCode('EUR')->first(); + // } + // + // /** + // * @return TransactionCurrency + // */ + // public function getRandomCurrency(): TransactionCurrency + // { + // return TransactionCurrency::where('code', '!=', 'EUR')->inRandomOrder()->first(); + // } + // + // /** + // * @return TransactionCurrency + // */ + // public function getDollar(): TransactionCurrency + // { + // return TransactionCurrency::whereCode('USD')->first(); + // } + // + // /** + // * @param int|null $except + // * + // * @return Account + // */ + // public function getRandomAsset(?int $except = null): Account + // { + // return $this->getRandomAccount(AccountType::ASSET, $except); + // } + // + // /** + // * @param int|null $except + // * + // * @return Account + // */ + // public function getRandomDebt(?int $except = null): Account + // { + // return $this->getRandomAccount(AccountType::DEBT, $except); + // } + // + // /** + // * @param int|null $except + // * + // * @return Account + // */ + // public function getRandomLoan(?int $except = null): Account + // { + // return $this->getRandomAccount(AccountType::LOAN, $except); + // } + // + // /** + // * @param int|null $except + // * + // * @return Account + // */ + // public function getRandomRevenue(?int $except = null): Account + // { + // return $this->getRandomAccount(AccountType::REVENUE, $except); + // } + // + // /** + // * @param int|null $except + // * + // * @return Account + // */ + // public function getRandomExpense(?int $except = null): Account + // { + // return $this->getRandomAccount(AccountType::EXPENSE, $except); + // } + // + // /** + // * @param string $type + // * + // * @param int|null $except + // * + // * @return Account + // */ + // private function getRandomAccount(string $type, ?int $except): Account + // { + // $query = Account:: + // leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') + // ->whereNull('accounts.deleted_at') + // ->where('accounts.user_id', $this->user()->id) + // ->where('account_types.type', $type) + // ->inRandomOrder()->take(1); + // if (null !== $except) { + // $query->where('accounts.id', '!=', $except); + // } + // + // return $query->first(['accounts.*']); + // } } diff --git a/tests/Traits/FakeValues.php b/tests/Traits/FakeValues.php index da391a8930..54a5912141 100644 --- a/tests/Traits/FakeValues.php +++ b/tests/Traits/FakeValues.php @@ -24,11 +24,11 @@ namespace Tests\Traits; trait FakeValues { -// /** -// * @return string -// */ -// protected function fakeName(): string { -// return ''; -// } + // /** + // * @return string + // */ + // protected function fakeName(): string { + // return ''; + // } } \ No newline at end of file diff --git a/tests/Traits/MocksDefaultValues.php b/tests/Traits/MocksDefaultValues.php index 595722b1bd..ecac0c158a 100644 --- a/tests/Traits/MocksDefaultValues.php +++ b/tests/Traits/MocksDefaultValues.php @@ -23,25 +23,22 @@ declare(strict_types=1); namespace Tests\Traits; -use FireflyIII\Models\Configuration; -use FireflyConfig; - /** * Trait MocksDefaultValues */ trait MocksDefaultValues { -// public function mockDefaultConfiguration(): void -// { -// -// $falseConfig = new Configuration; -// $falseConfig->data = false; -// -// $idConfig = new Configuration; -// $idConfig->data = 'abc'; -// -// FireflyConfig::shouldReceive('get')->withArgs(['is_demo_site', false])->andReturn($falseConfig); -// FireflyConfig::shouldReceive('get')->withArgs(['installation_id', null])->andReturn($idConfig); -// } + // public function mockDefaultConfiguration(): void + // { + // + // $falseConfig = new Configuration; + // $falseConfig->data = false; + // + // $idConfig = new Configuration; + // $idConfig->data = 'abc'; + // + // FireflyConfig::shouldReceive('get')->withArgs(['is_demo_site', false])->andReturn($falseConfig); + // FireflyConfig::shouldReceive('get')->withArgs(['installation_id', null])->andReturn($idConfig); + // } } diff --git a/tests/Traits/RandomValues.php b/tests/Traits/RandomValues.php index be7a8c4a33..cabb72987b 100644 --- a/tests/Traits/RandomValues.php +++ b/tests/Traits/RandomValues.php @@ -54,21 +54,12 @@ trait RandomValues return array_merge($res1, $res2); } - /** * @return string */ - protected function randomAccountRole(): string + protected function getRandomAmount(): string { - return $this->randomFromArray(['defaultAsset', 'sharedAsset', 'savingAsset']); - } - - /** - * @return string - */ - protected function randomLiabilityType(): string - { - return $this->randomFromArray(['loan', 'debt', 'mortgage']); + return number_format(rand(1000, 100000) / 100, '2', '.'); } /** @@ -79,14 +70,6 @@ trait RandomValues return $this->randomFromArray(['EUR', 'USD', 'GBP']); } - /** - * @return string - */ - protected function getRandomAmount(): string - { - return number_format(rand(1000, 100000) / 100, '2', '.'); - } - /** * @return string */ @@ -98,6 +81,14 @@ trait RandomValues return $date->format('Y-m-d'); } + /** + * @return string + */ + protected function getRandomInterestPeriod(): string + { + return $this->randomFromArray(['daily', 'monthly', 'yearly']); + } + /** * @return string */ @@ -109,9 +100,9 @@ trait RandomValues /** * @return string */ - protected function getRandomInterestPeriod(): string + protected function randomAccountRole(): string { - return $this->randomFromArray(['daily', 'monthly', 'yearly']); + return $this->randomFromArray(['defaultAsset', 'sharedAsset', 'savingAsset']); } /** @@ -123,4 +114,12 @@ trait RandomValues { return $array[rand(0, count($array) - 1)]; } + + /** + * @return string + */ + protected function randomLiabilityType(): string + { + return $this->randomFromArray(['loan', 'debt', 'mortgage']); + } } \ No newline at end of file diff --git a/tests/Traits/TestHelpers.php b/tests/Traits/TestHelpers.php index 3e442db9bf..1bbdd3fa69 100644 --- a/tests/Traits/TestHelpers.php +++ b/tests/Traits/TestHelpers.php @@ -32,6 +32,21 @@ use Log; */ trait TestHelpers { + /** + * @return int + */ + public function randomInt(): int + { + $result = 4; + try { + $result = random_int(1, 100000); + } catch (Exception $e) { + Log::debug(sprintf('Could not generate random number: %s', $e->getMessage())); + } + + return $result; + } + /** * @param array $minimalSets * @param array $startOptionalSets @@ -105,22 +120,6 @@ trait TestHelpers return $submissions; } - - /** - * @return int - */ - public function randomInt(): int - { - $result = 4; - try { - $result = random_int(1, 100000); - } catch (Exception $e) { - Log::debug(sprintf('Could not generate random number: %s', $e->getMessage())); - } - - return $result; - } - /** * @param $set * @param $opts @@ -149,6 +148,136 @@ trait TestHelpers return $set; } + /** + * @param string $route + * @param array $content + */ + protected function updatedStoreAndCompare(string $route, array $content): void + { + $submission = $content['submission']; + $expected = $content['expected']; + $ignore = $content['ignore']; + + // submit body + $response = $this->post($route, $submission, ['Accept' => 'application/json']); + $responseBody = $response->content(); + $responseJson = json_decode($responseBody, true); + $status = $response->getStatusCode(); + $this->assertEquals($status, 200, sprintf("Submission:\n%s\nResponse: %s", json_encode($submission), $responseBody)); + $response->assertHeader('Content-Type', 'application/vnd.api+json'); + + // get return and compare each field + $responseAttributes = $responseJson['data']['attributes']; + $this->updatedCompareStorageArray($submission, $responseAttributes, $expected, $ignore); + + // ignore fields too! + } + + /** + * @param array $submission + * @param array $response + * @param array $expected + * @param array $ignore + */ + protected function updatedCompareStorageArray(array $submission, array $response, array $expected, array $ignore): void + { + foreach ($response as $key => $value) { + if (is_array($value) && array_key_exists($key, $expected) && is_array($expected[$key])) { + $this->updatedCompareStorageArray($submission, $value, $expected[$key], $ignore[$key] ?? []); + } + if (isset($expected[$key])) { + if (in_array($key, $ignore, true)) { + continue; + } + if (!in_array($key, $ignore, true)) { + $message = sprintf( + "Field '%s' with value %s is expected to be %s.\nSubmitted:\n%s\nIgnored: %s\nReturned\n%s", + $key, + var_export($value, true), + var_export($expected[$key], true), + json_encode($submission), + json_encode($ignore), + json_encode($response) + ); + + $this->assertEquals($value, $expected[$key], $message); + } + + // if($value !== $expected[$key]) { + // } + // var_dump($key); + // var_dump($value); + // var_dump($expected[$key]); + // exit; + } + + } + + } + + + /** + * @param string $route + * @param array $content + */ + protected function storeAndCompare(string $route, array $content): void + { + $submission = $content['fields']; + $parameters = $content['parameters']; + $ignore = $content['ignore']; + // submit! + $response = $this->post(route($route, $parameters), $submission, ['Accept' => 'application/json']); + $responseBody = $response->content(); + $responseJson = json_decode($responseBody, true); + $status = $response->getStatusCode(); + $this->assertEquals($status, 200, sprintf("Submission:\n%s\nResponse: %s", json_encode($submission), $responseBody)); + + $response->assertHeader('Content-Type', 'application/vnd.api+json'); + + // compare results: + foreach ($responseJson['data']['attributes'] as $returnName => $returnValue) { + if (array_key_exists($returnName, $submission) && !in_array($returnName, $ignore, true)) { + // TODO still based on account routine: + if ($this->ignoreCombination($route, $submission['type'] ?? 'blank', $returnName)) { + continue; + } + // check if is array, if so we need something smart: + if (is_array($returnValue) && is_array($submission[$returnName])) { + $this->compareArray($submission, $returnName, $submission[$returnName], $returnValue); + } + if (!is_array($returnValue) && !is_array($submission[$returnName])) { + $message = sprintf( + "Main: Return value '%s' of key '%s' does not match submitted value '%s'.\n%s\n%s", $returnValue, $returnName, $submission[$returnName], + json_encode($submission), $responseBody + ); + $this->assertEquals($returnValue, $submission[$returnName], $message); + } + + } + } + } + + /** + * Some specials: + * + * @param string $area + * @param string $left + * @param string $right + * + * @return bool + */ + protected function ignoreCombination(string $area, string $left, string $right): bool + { + if ('api.v1.accounts.store' === $area) { + if ('expense' === $left + && in_array($right, ['order', 'virtual_balance', 'opening_balance', 'opening_balance_date'])) { + return true; + } + } + + return false; + } + /** * @param string $route * @param array $submission @@ -247,47 +376,6 @@ trait TestHelpers } } - /** - * @param string $route - * @param array $content - */ - protected function storeAndCompare(string $route, array $content): void - { - $submission = $content['fields']; - $parameters = $content['parameters']; - $ignore = $content['ignore']; - // submit! - $response = $this->post(route($route, $parameters), $submission, ['Accept' => 'application/json']); - $responseBody = $response->content(); - $responseJson = json_decode($responseBody, true); - $status = $response->getStatusCode(); - $this->assertEquals($status, 200, sprintf("Submission:\n%s\nResponse: %s", json_encode($submission), $responseBody)); - - $response->assertHeader('Content-Type', 'application/vnd.api+json'); - - // compare results: - foreach ($responseJson['data']['attributes'] as $returnName => $returnValue) { - if (array_key_exists($returnName, $submission) && !in_array($returnName, $ignore, true)) { - // TODO still based on account routine: - if ($this->ignoreCombination($route, $submission['type'] ?? 'blank', $returnName)) { - continue; - } - // check if is array, if so we need something smart: - if (is_array($returnValue) && is_array($submission[$returnName])) { - $this->compareArray($submission, $returnName, $submission[$returnName], $returnValue); - } - if (!is_array($returnValue) && !is_array($submission[$returnName])) { - $message = sprintf( - "Main: Return value '%s' of key '%s' does not match submitted value '%s'.\n%s\n%s", $returnValue, $returnName, $submission[$returnName], - json_encode($submission), $responseBody - ); - $this->assertEquals($returnValue, $submission[$returnName], $message); - } - - } - } - } - /** * @param array $fullOriginal * @param string $key @@ -297,7 +385,7 @@ trait TestHelpers protected function compareArray(array $fullOriginal, string $key, array $original, array $returned) { // TODO this should be configurable but OK - if(in_array($key, ['transactions','repetitions'], true) && 0 === count($original) && 0 !== count($returned)) { + if (in_array($key, ['transactions', 'repetitions'], true) && 0 === count($original) && 0 !== count($returned)) { // accept this. return; } @@ -326,25 +414,4 @@ trait TestHelpers } } } - - /** - * Some specials: - * - * @param string $area - * @param string $left - * @param string $right - * - * @return bool - */ - protected function ignoreCombination(string $area, string $left, string $right): bool - { - if ('api.v1.accounts.store' === $area) { - if ('expense' === $left - && in_array($right, ['order', 'virtual_balance', 'opening_balance', 'opening_balance_date'])) { - return true; - } - } - - return false; - } }