diff --git a/Tests/Integration/Features/QueryByUserIdTest.php b/Tests/Integration/Features/QueryByUserIdTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2b5ec488f6f3ff3b67d5483a4ca167d02fb0a426 --- /dev/null +++ b/Tests/Integration/Features/QueryByUserIdTest.php @@ -0,0 +1,46 @@ +<?php +namespace calderawp\CalderaFormsQuery\Tests\Integration\Features; + + +use calderawp\CalderaFormsQuery\QueriesEntries; +use calderawp\CalderaFormsQuery\Tests\Integration\IntegrationTestCase; +use calderawp\CalderaFormsQuery\Tests\Traits\CanCreateEntryWithEmailField; + +class QueryByUserIdTest extends IntegrationTestCase +{ + + use CanCreateEntryWithEmailField; + + /** + * Test selecting by entry ID + * + * @covers QueriesEntries::selectByUserId() + */ + public function testByUserId() + { + $email = 'nom@noms.noms'; + //Create an entry for a known user. + $userId = $this->factory()->user->create( + [ 'user_email' => $email ] + ); + wp_set_current_user( $userId ); + $entryId = $this->createEntryWithEmail( $email ); + $queries = $this->entryQueriesFactory(); + + $results = $queries->selectByUserId( $userId ); + $this->assertEquals( $entryId, $results[0]['entry']->id); + $this->assertEquals( $entryId, $results[0]['entry']->id); + + $found = false; + foreach ( $results[0]['values'] as $entryValue ) + { + if( $entryValue->slug === $this->getEmailFieldSlug() ){ + $this->assertSame( $email, $entryValue->value ); + $found = true; + } + } + + $this->assertTrue( $found ); + + } +} \ No newline at end of file diff --git a/src/EntryQueries.php b/src/EntryQueries.php index c54876e8a7f7b0273c00618c4fe803f27d471929..8fee8745c51677ee9bf81d3a29569911707dadea 100644 --- a/src/EntryQueries.php +++ b/src/EntryQueries.php @@ -61,4 +61,89 @@ class EntryQueries implements QueriesEntries { 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 + */ + private function resetEntryGenerator() + { + $this->entryGenerator->resetQuery(); + } + + /** + * Reset entry value generator + */ + private function resetEntryValueGenerator() + { + $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; + } }