diff --git a/Tests/Integration/Features/FeatureContainerTest.php b/Tests/Integration/Features/FeatureContainerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b117fcfccc882d0be88ca127a0e0aa381e35a61a --- /dev/null +++ b/Tests/Integration/Features/FeatureContainerTest.php @@ -0,0 +1,55 @@ +<?php + + +namespace calderawp\CalderaFormsQuery\Tests\Integration\Features; + + +use calderawp\CalderaFormsQuery\Features\FeatureContainer; +use calderawp\CalderaFormsQuery\Tests\Integration\IntegrationTestCase; + +class FeatureContainerTest extends IntegrationTestCase +{ + + /** + * Test the table names + * + * @covers FeatureContainer::getQueries() + * @covers FeatureContainer::bindServices() + */ + public function testTableNames() + { + $container = $this->containerFactory(); + + //Select entry + $this->assertEquals( $this->entryTableName(), + $container + ->getQueries() + ->entrySelect() + ->getTableName() + ); + + //Select entry value + $this->assertEquals( $this->entryValueTableName(), + $container + ->getQueries() + ->entryValuesSelect() + ->getTableName() + ); + + //Delete entry + $this->assertEquals( $this->entryTableName(), + $container + ->getQueries() + ->entryDelete() + ->getTableName() + ); + + //Delete entry values + $this->assertEquals( $this->entryValueTableName(), + $container + ->getQueries() + ->entryValueDelete() + ->getTableName() + ); + } +} \ No newline at end of file diff --git a/Tests/Integration/Features/QueryByUserIdTest.php b/Tests/Integration/Features/QueryByUserIdTest.php index 0347b9c9f22b25be46dda6f87067675a609dd1e1..897712ce526dead44ed3bc2d1555dc1700d0360d 100644 --- a/Tests/Integration/Features/QueryByUserIdTest.php +++ b/Tests/Integration/Features/QueryByUserIdTest.php @@ -11,23 +11,20 @@ class QueryByUserIdTest extends IntegrationTestCase use CanCreateEntryWithEmailField; - /** - * Test selecting by entry ID - * - * @covers CreatesSelectQueries::selectByUserId() - */ + public function testByUserId() { - $email = 'nom@noms.noms'; + $container = $this->containerFactory(); + //Create an entry for a known user. + $email = 'nom@noms.noms'; $userId = $this->factory()->user->create( [ 'user_email' => $email ] ); wp_set_current_user( $userId ); $entryId = $this->createEntryWithEmail( $email ); - $queries = $this->selectQueriesFactory(); - $results = $queries->selectByUserId( $userId ); + $results = $container->selectByUserId( $userId ); $this->assertEquals( $entryId, $results[0]['entry']->id); $this->assertEquals( $entryId, $results[0]['entry']->id); @@ -42,5 +39,6 @@ class QueryByUserIdTest extends IntegrationTestCase $this->assertTrue( $found ); + } } \ No newline at end of file diff --git a/Tests/Traits/HasFactories.php b/Tests/Traits/HasFactories.php index 1c948f23dde7bd4d69cff796d5b181b971ebb4d4..6bd08f14b634ba330a137e6fc13a7180aa2de511 100644 --- a/Tests/Traits/HasFactories.php +++ b/Tests/Traits/HasFactories.php @@ -3,7 +3,9 @@ namespace calderawp\CalderaFormsQuery\Tests\Traits; +use calderawp\CalderaContainers\Service\Container; use calderawp\CalderaFormsQuery\DeleteQueries; +use calderawp\CalderaFormsQuery\Features\FeatureContainer; use calderawp\CalderaFormsQuery\SelectQueries; use calderawp\CalderaFormsQuery\Tests\Unit\Features\QueriesTest; @@ -102,6 +104,17 @@ trait HasFactories ); } + /** + * @return FeatureContainer + */ + protected function containerFactory() + { + return new FeatureContainer( + new Container(), + $this->getWPDB() + ); + } + /** * Gets a WPDB instance * diff --git a/Tests/Unit/Features/FeatureContainerTest.php b/Tests/Unit/Features/FeatureContainerTest.php index 300c1ce39750e20028551bab2aaf17f8c152748b..82c21510a3c398e6b5a026e8f1c28fdc01430dda 100644 --- a/Tests/Unit/Features/FeatureContainerTest.php +++ b/Tests/Unit/Features/FeatureContainerTest.php @@ -16,6 +16,7 @@ class FeatureContainerTest extends TestCase { /** + * Test getting the main MySQL Builder * * @covers FeatureContainer::getBuilder() * @covers FeatureContainer::bindServices() @@ -42,6 +43,7 @@ class FeatureContainerTest extends TestCase } /** + * Test getting the main query builder * * @covers FeatureContainer::bindServices() * @covers FeatureContainer::getQueries() @@ -51,7 +53,6 @@ class FeatureContainerTest extends TestCase $serviceContainer = new TheServiceContainer(); $container = new FeatureContainer($serviceContainer, $this->getWPDB()); - $this->assertTrue( is_a( $container->getQueries(), @@ -64,4 +65,48 @@ class FeatureContainerTest extends TestCase $container->getQueries() ); } + + /** + * Test the table names + * + * @covers FeatureContainer::getQueries() + * @covers FeatureContainer::bindServices() + */ + public function testTableNames() + { + $container = $this->containerFactory(); + + //Select entry + $this->assertEquals( $this->entryTableName(), + $container + ->getQueries() + ->entrySelect() + ->getTableName() + ); + + //Select entry value + $this->assertEquals( $this->entryValueTableName(), + $container + ->getQueries() + ->entryValuesSelect() + ->getTableName() + ); + + //Delete entry + $this->assertEquals( $this->entryTableName(), + $container + ->getQueries() + ->entryDelete() + ->getTableName() + ); + + //Delete entry values + $this->assertEquals( $this->entryValueTableName(), + $container + ->getQueries() + ->entryValueDelete() + ->getTableName() + ); + } + } \ No newline at end of file diff --git a/Tests/Unit/TestCase.php b/Tests/Unit/TestCase.php index 3040fb6ca1d74bd22a38b12d20d36e9d8d9505b0..df3ec4c9a29900e67d6fc4550e7d9789446c29c9 100755 --- a/Tests/Unit/TestCase.php +++ b/Tests/Unit/TestCase.php @@ -17,5 +17,8 @@ use PHPUnit\Framework\TestCase as FrameworkTestCase; */ abstract class TestCase extends FrameworkTestCase { + //Factories go in this trait so they are share with integration tests use HasFactories; + + } diff --git a/src/CanCollectResults.php b/src/CanCollectResults.php new file mode 100644 index 0000000000000000000000000000000000000000..33b5b78d8cecce47907560c0e7a01dd44a7f1a98 --- /dev/null +++ b/src/CanCollectResults.php @@ -0,0 +1,70 @@ +<?php + + +namespace calderawp\CalderaFormsQuery; + + +trait CanCollectResults +{ + /** + * Collect results using Caldera_Forms_Entry_Entry and Caldera_Forms_Entry_Field to represent values + * + * @param \stdClass[] $entriesValues + * @return array + */ + private function collectResults($entriesValues) + { + $results = []; + foreach ($entriesValues as $entry) { + $this->resetEntryValueGenerator(); + $entry = new \Caldera_Forms_Entry_Entry($entry); + $this + ->getEntryValueGenerator() + ->queryByEntryId($entry->id); + $entriesValues =$this->getResults( + $this->getEntryValueGenerator() + ->getPreparedSql() + ); + + $entryValuesPrepared = $this->collectEntryValues($entriesValues); + $results[] = [ + 'entry' => $entry, + 'values' => $entryValuesPrepared + ]; + } + return $results; + } + + /** + * Collect entry values as Caldera_Forms_Entry_Field objects + * + * @param \stdClass[] $entriesValues + * @return array + */ + private function collectEntryValues($entriesValues): array + { + $entryValuesPrepared = []; + if (!empty($entriesValues)) { + foreach ($entriesValues as $entryValue) { + $entryValuesPrepared[] = new \Caldera_Forms_Entry_Field($entryValue); + } + } + return $entryValuesPrepared; + } + + /** + * Reset entry generator + */ + private function resetEntryGenerator() + { + $this->entryGenerator->resetQuery(); + } + + /** + * Reset entry value generator + */ + private function resetEntryValueGenerator() + { + $this->entryValueGenerator->resetQuery(); + } +} \ No newline at end of file diff --git a/src/CreatesSelectQueries.php b/src/CreatesSelectQueries.php index 0c1f9ea3b7431a6fa1d93c1827fd81addf2d5fb8..eb588228d3c44a749beaf9e4da6757229baf9f16 100644 --- a/src/CreatesSelectQueries.php +++ b/src/CreatesSelectQueries.php @@ -9,7 +9,7 @@ use calderawp\CalderaFormsQuery\Select\EntryValues; /** * Interface QueriesEntries * - * Interface that all classes that query for entries MUST impliment + * Interface that all classes that query for entries MUST implement */ interface CreatesSelectQueries extends GetsResults { @@ -25,4 +25,10 @@ interface CreatesSelectQueries extends GetsResults * @return Entry */ public function getEntryGenerator(); + + /** + * @param $sql + * @return \stdClass[] + */ + public function getResults($sql); } diff --git a/src/Features/FeatureContainer.php b/src/Features/FeatureContainer.php index 7fb00dd827be15d99909c2c89c3f159e67ef4961..c3ae76eb215c8587ef7f05292b6acbefd26a43f8 100644 --- a/src/Features/FeatureContainer.php +++ b/src/Features/FeatureContainer.php @@ -7,12 +7,16 @@ namespace calderawp\CalderaFormsQuery\Features; use calderawp\CalderaContainers\Container; use calderawp\CalderaContainers\Interfaces\ServiceContainer; +use calderawp\CalderaFormsQuery\Delete\DeleteQueryBuilder; +use calderawp\CalderaFormsQuery\Delete\DoesDeleteQuery; use calderawp\CalderaFormsQuery\DeleteQueries; use calderawp\CalderaFormsQuery\MySqlBuilder; use calderawp\CalderaFormsQuery\Delete\Entry as EntryDelete; use \calderawp\CalderaFormsQuery\Delete\EntryValues as EntryValuesDelete; +use calderawp\CalderaFormsQuery\Select\DoesSelectQuery; use \calderawp\CalderaFormsQuery\Select\Entry as EntrySelect; use \calderawp\CalderaFormsQuery\Select\EntryValues as EntryValueSelect; +use calderawp\CalderaFormsQuery\Select\SelectQueryBuilder; use calderawp\CalderaFormsQuery\SelectQueries; class FeatureContainer extends Container @@ -44,11 +48,13 @@ class FeatureContainer extends Container */ protected function bindServices() { + //@TODO move these to service provider classes $this->serviceContainer->singleton( MySqlBuilder::class, function(){ return new MySqlBuilder(); }); $this->serviceContainer->bind( SelectQueries::class, function (){ + //@TODO Factory return new SelectQueries( new EntrySelect( $this->getBuilder(), @@ -56,13 +62,14 @@ class FeatureContainer extends Container ), new EntryValueSelect( $this->getBuilder(), - $this->entryTableName() + $this->entryValueTableName() ), $this->wpdb ); }); $this->serviceContainer->bind( DeleteQueries::class, function (){ + //@TODO Factory return new DeleteQueries( new EntryDelete( $this->getBuilder(), @@ -70,7 +77,7 @@ class FeatureContainer extends Container ), new EntryValuesDelete( $this->getBuilder(), - $this->entryTableName() + $this->entryValueTableName() ), $this->wpdb ); @@ -112,12 +119,25 @@ class FeatureContainer extends Container ->make( Queries::class ); } - + /** + * Select all entries and entry values by user ID + * + * @param int $userId + * @return array + */ + public function selectByUserId($userId) + { + $query = $this + ->getQueries() + ->entrySelect() + ->queryByUserId($userId); + return $this->collectResults( $this->select( $query ) ); + } /** * @return string */ - protected function entryValueTableName(): string + protected function entryValueTableName() { return "{$this->wpdb->prefix}cf_form_entry_values"; } @@ -125,9 +145,80 @@ class FeatureContainer extends Container /** * @return string */ - protected function entryTableName(): string + protected function entryTableName() { return "{$this->wpdb->prefix}cf_form_entries"; } + /** + * Collect results using Caldera_Forms_Entry_Entry and Caldera_Forms_Entry_Field to represent values + * + * @param \stdClass[] $entriesValues + * @return array + */ + private function collectResults($entriesValues) + { + $results = []; + foreach ($entriesValues as $entry) { + + $entry = new \Caldera_Forms_Entry_Entry($entry); + $query = $this + ->getQueries() + ->entryValuesSelect() + ->queryByEntryId($entry->id); + $entriesValues = $this->select($query); + + $entryValuesPrepared = $this->collectEntryValues($entriesValues); + $results[] = [ + 'entry' => $entry, + 'values' => $entryValuesPrepared + ]; + } + return $results; + } + + /** + * Collect entry values as Caldera_Forms_Entry_Field objects + * + * @param \stdClass[] $entriesValues + * @return array + */ + private function collectEntryValues($entriesValues): array + { + $entryValuesPrepared = []; + if (!empty($entriesValues)) { + foreach ($entriesValues as $entryValue) { + $entryValuesPrepared[] = new \Caldera_Forms_Entry_Field($entryValue); + } + } + return $entryValuesPrepared; + } + + /** + * Do a select query + * + * @param SelectQueryBuilder $query + * @return \stdClass[] + */ + private function select(SelectQueryBuilder $query) + { + return $this + ->getQueries() + ->select($query); + } + + /** + * Do a delete query + * + * @param DeleteQueryBuilder $query + * @return \stdClass[] + */ + private function delete(DeleteQueryBuilder $query) + { + return $this-> + getQueries() + ->delete($query); + } + + } \ No newline at end of file diff --git a/src/Features/Queries.php b/src/Features/Queries.php index 55c0885b54e9292b99e0d62703caa9a8d6ed3317..0cd720419959bfda14413b63f729bbf2b07fbebd 100644 --- a/src/Features/Queries.php +++ b/src/Features/Queries.php @@ -5,10 +5,15 @@ namespace calderawp\CalderaFormsQuery\Features; use calderawp\CalderaFormsQuery\CreatesDeleteQueries; use calderawp\CalderaFormsQuery\CreatesSelectQueries; +use calderawp\CalderaFormsQuery\Delete\DeleteQueryBuilder; +use calderawp\CalderaFormsQuery\Delete\DoesDeleteQuery; use calderawp\CalderaFormsQuery\Delete\Entry as EntryDelete; use \calderawp\CalderaFormsQuery\Delete\EntryValues as EntryValuesDelete; +use calderawp\CalderaFormsQuery\DeleteQueries; +use calderawp\CalderaFormsQuery\Select\DoesSelectQuery; use \calderawp\CalderaFormsQuery\Select\Entry as EntrySelect; use \calderawp\CalderaFormsQuery\Select\EntryValues as EntryValueSelect; +use calderawp\CalderaFormsQuery\Select\SelectQueryBuilder; class Queries implements DoesQueries { @@ -34,6 +39,32 @@ class Queries implements DoesQueries $this->deleteQueries = $deleteQueries; } + /** + * @param SelectQueryBuilder $query + * @return \stdClass[] + */ + public function select( SelectQueryBuilder $query ) + { + return $this + ->selectQueries + ->getResults( + $query->getPreparedSql() + ); + } + + /** + * @param DeleteQueryBuilder $query + * @return \stdClass[] + */ + public function delete( DeleteQueryBuilder $query ) + { + return $this + ->deleteQueries + ->getResults( + $query->getPreparedSql() + ); + } + /** * Create a new SELECT query for Entry table * diff --git a/src/SelectQueries.php b/src/SelectQueries.php index 8b355cda6ba3d45aa14cfef736f87074aa1dff94..1cc6aeb9f141fbd5a9f82af9edf4d823ef9f5781 100644 --- a/src/SelectQueries.php +++ b/src/SelectQueries.php @@ -62,26 +62,6 @@ class SelectQueries implements CreatesSelectQueries return $this->entryGenerator; } - - /** - * Get all data for a user by Id - * - * @param $userId - * @return array - */ - public function selectByUserId($userId) - { - $this->resetEntryGenerator(); - - $this - ->getEntryGenerator() - ->queryByUserId($userId); - - $entries = $this->getResults($this->getEntryGenerator()->getPreparedSql()); - - return $this->collectResults($entries); - } - /** * Reset entry generator */ @@ -98,49 +78,5 @@ class SelectQueries implements CreatesSelectQueries $this->entryValueGenerator->resetQuery(); } - /** - * Collect results using Caldera_Forms_Entry_Entry and Caldera_Forms_Entry_Field to represent values - * - * @param \stdClass[] $entriesValues - * @return array - */ - private function collectResults($entriesValues) - { - $results = []; - foreach ($entriesValues as $entry) { - $this->resetEntryValueGenerator(); - $entry = new \Caldera_Forms_Entry_Entry($entry); - $this - ->getEntryValueGenerator() - ->queryByEntryId($entry->id); - $entriesValues =$this->getResults( - $this->getEntryValueGenerator() - ->getPreparedSql() - ); - - $entryValuesPrepared = $this->collectEntryValues($entriesValues); - $results[] = [ - 'entry' => $entry, - 'values' => $entryValuesPrepared - ]; - } - return $results; - } - /** - * Collect entry values as Caldera_Forms_Entry_Field objects - * - * @param \stdClass[] $entriesValues - * @return array - */ - private function collectEntryValues($entriesValues): array - { - $entryValuesPrepared = []; - if (!empty($entriesValues)) { - foreach ($entriesValues as $entryValue) { - $entryValuesPrepared[] = new \Caldera_Forms_Entry_Field($entryValue); - } - } - return $entryValuesPrepared; - } }