From d910d99379973790c9f3e589390f6dc7fb7ba48a Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Wed, 11 Sep 2024 22:21:42 +0200 Subject: [PATCH 01/17] feat: add database query count test helpers --- src/Abstracts/Tests/PhpUnit/TestCase.php | 2 + .../PhpUnit/TestDatabaseProfilerTrait.php | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php diff --git a/src/Abstracts/Tests/PhpUnit/TestCase.php b/src/Abstracts/Tests/PhpUnit/TestCase.php index 85384a807..5663f8d5e 100644 --- a/src/Abstracts/Tests/PhpUnit/TestCase.php +++ b/src/Abstracts/Tests/PhpUnit/TestCase.php @@ -6,6 +6,7 @@ use Apiato\Core\Traits\TestCaseTrait; use Apiato\Core\Traits\TestTraits\PhpUnit\TestAssertionHelperTrait; use Apiato\Core\Traits\TestTraits\PhpUnit\TestAuthHelperTrait; +use Apiato\Core\Traits\TestTraits\PhpUnit\TestDatabaseProfilerTrait; use Apiato\Core\Traits\TestTraits\PhpUnit\TestRequestHelperTrait; use Illuminate\Contracts\Console\Kernel; use Illuminate\Foundation\Testing\LazilyRefreshDatabase; @@ -20,6 +21,7 @@ abstract class TestCase extends LaravelTestCase use TestAssertionHelperTrait; use HashIdTrait; use LazilyRefreshDatabase; + use TestDatabaseProfilerTrait; /** * The base URL to use while testing the application. diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php new file mode 100644 index 000000000..8c926c339 --- /dev/null +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -0,0 +1,39 @@ +app->make('db')->enableQueryLog(); + } + + public function stopDatabaseProfiler(): void + { + $this->app->make('db')->disableQueryLog(); + } + + public function getDatabaseQueries(): array + { + return $this->app->make('db')->getQueryLog(); + } + + public function dumpDatabaseQueries(): void + { + foreach ($this->getDatabaseQueries() as $query) { + dump($query['query']); + } + } + + public function ddDatabaseQueries(): void + { + dd($this->getDatabaseQueries()); + } + + public function assertDatabaseQueriesCount(int $expectedCount): void + { + $actualCount = count($this->getDatabaseQueries()); + $this->assertEquals($expectedCount, $actualCount, "Expected $expectedCount database queries, but got $actualCount."); + } +} From 201ecb867537bbf5c725630e9e0d3b8144fa96d1 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Wed, 11 Sep 2024 22:22:41 +0200 Subject: [PATCH 02/17] fix: change function scope of test helper trait --- .../TestTraits/PhpUnit/TestDatabaseProfilerTrait.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index 8c926c339..ee2442ebf 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -4,34 +4,34 @@ trait TestDatabaseProfilerTrait { - public function startDatabaseProfiler(): void + protected function startDatabaseProfiler(): void { $this->app->make('db')->enableQueryLog(); } - public function stopDatabaseProfiler(): void + protected function stopDatabaseProfiler(): void { $this->app->make('db')->disableQueryLog(); } - public function getDatabaseQueries(): array + protected function getDatabaseQueries(): array { return $this->app->make('db')->getQueryLog(); } - public function dumpDatabaseQueries(): void + protected function dumpDatabaseQueries(): void { foreach ($this->getDatabaseQueries() as $query) { dump($query['query']); } } - public function ddDatabaseQueries(): void + protected function ddDatabaseQueries(): void { dd($this->getDatabaseQueries()); } - public function assertDatabaseQueriesCount(int $expectedCount): void + protected function assertDatabaseQueriesCount(int $expectedCount): void { $actualCount = count($this->getDatabaseQueries()); $this->assertEquals($expectedCount, $actualCount, "Expected $expectedCount database queries, but got $actualCount."); From acd14b7c157b2b70d711d789989662be4c6e3f16 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Thu, 12 Sep 2024 09:59:43 +0200 Subject: [PATCH 03/17] feat: add profiler wrapper --- .../TestTraits/PhpUnit/TestDatabaseProfilerTrait.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index ee2442ebf..6adb9b2cb 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -36,4 +36,13 @@ protected function assertDatabaseQueriesCount(int $expectedCount): void $actualCount = count($this->getDatabaseQueries()); $this->assertEquals($expectedCount, $actualCount, "Expected $expectedCount database queries, but got $actualCount."); } + + protected function profileDatabaseQueries(callable $callback): mixed + { + $this->startDatabaseProfiler(); + $result = $callback(); + $this->stopDatabaseProfiler(); + + return $result; + } } From 662fc4bce03011bf4dddb1e97ea3c23f56e99794 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Thu, 12 Sep 2024 10:00:13 +0200 Subject: [PATCH 04/17] feat: add profiler count wrapper --- .../TestTraits/PhpUnit/TestDatabaseProfilerTrait.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index 6adb9b2cb..6667cb4c2 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -45,4 +45,14 @@ protected function profileDatabaseQueries(callable $callback): mixed return $result; } + + protected function profileDatabaseQueriesCount(int $expectedCount, callable $callback): mixed + { + return $this->profileDatabaseQueries(function () use ($expectedCount, $callback) { + $result = $callback(); + $this->assertDatabaseQueriesCount($expectedCount); + + return $result; + }); + } } From 9ece34dce4638d86347faf65378d7cd70ebef52d Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Thu, 12 Sep 2024 10:07:54 +0200 Subject: [PATCH 05/17] chore: add function comments --- .../PhpUnit/TestDatabaseProfilerTrait.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index 6667cb4c2..44ab38b36 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -4,21 +4,33 @@ trait TestDatabaseProfilerTrait { + /** + * Start profiling database queries. + */ protected function startDatabaseProfiler(): void { $this->app->make('db')->enableQueryLog(); } + /** + * Stop profiling database queries. + */ protected function stopDatabaseProfiler(): void { $this->app->make('db')->disableQueryLog(); } + /** + * Get the database queries. + */ protected function getDatabaseQueries(): array { return $this->app->make('db')->getQueryLog(); } + /** + * Dump the database queries. + */ protected function dumpDatabaseQueries(): void { foreach ($this->getDatabaseQueries() as $query) { @@ -26,17 +38,26 @@ protected function dumpDatabaseQueries(): void } } + /** + * Dump and die the database queries. + */ protected function ddDatabaseQueries(): void { dd($this->getDatabaseQueries()); } + /** + * Assert the number of database queries. + */ protected function assertDatabaseQueriesCount(int $expectedCount): void { $actualCount = count($this->getDatabaseQueries()); $this->assertEquals($expectedCount, $actualCount, "Expected $expectedCount database queries, but got $actualCount."); } + /** + * Wrapper to profile database queries. + */ protected function profileDatabaseQueries(callable $callback): mixed { $this->startDatabaseProfiler(); @@ -46,6 +67,9 @@ protected function profileDatabaseQueries(callable $callback): mixed return $result; } + /** + * Wrapper to profile database queries and assert the number of queries. + */ protected function profileDatabaseQueriesCount(int $expectedCount, callable $callback): mixed { return $this->profileDatabaseQueries(function () use ($expectedCount, $callback) { From 91637bfd1abb383991bbcb36b3da21eb0ff2d53a Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Thu, 12 Sep 2024 10:09:11 +0200 Subject: [PATCH 06/17] chore: add doc block --- src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index 44ab38b36..2eed053ac 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -48,6 +48,7 @@ protected function ddDatabaseQueries(): void /** * Assert the number of database queries. + * @param int $expectedCount */ protected function assertDatabaseQueriesCount(int $expectedCount): void { @@ -57,6 +58,8 @@ protected function assertDatabaseQueriesCount(int $expectedCount): void /** * Wrapper to profile database queries. + * @param callable $callback + * @return mixed */ protected function profileDatabaseQueries(callable $callback): mixed { @@ -69,6 +72,9 @@ protected function profileDatabaseQueries(callable $callback): mixed /** * Wrapper to profile database queries and assert the number of queries. + * @param int $expectedCount + * @param callable $callback + * @return mixed */ protected function profileDatabaseQueriesCount(int $expectedCount, callable $callback): mixed { From 67e650f1c29dc6b8eb602ef5f49c86ee1d2b7d00 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Thu, 12 Sep 2024 10:26:25 +0200 Subject: [PATCH 07/17] refactor: fix function names --- src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index 2eed053ac..ffd8a7a69 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -50,7 +50,7 @@ protected function ddDatabaseQueries(): void * Assert the number of database queries. * @param int $expectedCount */ - protected function assertDatabaseQueriesCount(int $expectedCount): void + protected function assertDatabaseQueryCount(int $expectedCount): void { $actualCount = count($this->getDatabaseQueries()); $this->assertEquals($expectedCount, $actualCount, "Expected $expectedCount database queries, but got $actualCount."); @@ -76,7 +76,7 @@ protected function profileDatabaseQueries(callable $callback): mixed * @param callable $callback * @return mixed */ - protected function profileDatabaseQueriesCount(int $expectedCount, callable $callback): mixed + protected function profileDatabaseQueryCount(int $expectedCount, callable $callback): mixed { return $this->profileDatabaseQueries(function () use ($expectedCount, $callback) { $result = $callback(); From d5833e0de9f4f2d65816a1aba1a313373e849070 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Thu, 12 Sep 2024 10:36:04 +0200 Subject: [PATCH 08/17] fix: return type for dd funcion --- src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index ffd8a7a69..a69597c32 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -41,7 +41,7 @@ protected function dumpDatabaseQueries(): void /** * Dump and die the database queries. */ - protected function ddDatabaseQueries(): void + protected function ddDatabaseQueries(): never { dd($this->getDatabaseQueries()); } From ab8d8ef73d16ab98c453506b0ea29a8c1ada9089 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Thu, 12 Sep 2024 10:51:27 +0200 Subject: [PATCH 09/17] fix: php cs fixer problems --- src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index a69597c32..eadf3f047 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -48,7 +48,6 @@ protected function ddDatabaseQueries(): never /** * Assert the number of database queries. - * @param int $expectedCount */ protected function assertDatabaseQueryCount(int $expectedCount): void { @@ -58,8 +57,6 @@ protected function assertDatabaseQueryCount(int $expectedCount): void /** * Wrapper to profile database queries. - * @param callable $callback - * @return mixed */ protected function profileDatabaseQueries(callable $callback): mixed { @@ -72,9 +69,6 @@ protected function profileDatabaseQueries(callable $callback): mixed /** * Wrapper to profile database queries and assert the number of queries. - * @param int $expectedCount - * @param callable $callback - * @return mixed */ protected function profileDatabaseQueryCount(int $expectedCount, callable $callback): mixed { From 8dd7f13f4895245e1d4208fc152fadd70aea72b0 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Thu, 12 Sep 2024 15:00:56 +0200 Subject: [PATCH 10/17] fix: exclude test traits from coverage --- phpunit.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/phpunit.xml b/phpunit.xml index b3d5f4774..84d86393a 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -15,6 +15,7 @@ ./tests ./vendor + ./src/Traits/TestTraits From f4410059e8e9bb2d24aba0ec1f6b5aed13cb2b55 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Sun, 15 Sep 2024 19:24:25 +0200 Subject: [PATCH 11/17] feat: add query string assertion --- .../PhpUnit/TestDatabaseProfilerTrait.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index eadf3f047..2b3377eac 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -55,6 +55,24 @@ protected function assertDatabaseQueryCount(int $expectedCount): void $this->assertEquals($expectedCount, $actualCount, "Expected $expectedCount database queries, but got $actualCount."); } + /** + * Assert that the database queries contain the expected query. + */ + protected function assertDatabaseQueriesContains(string $expectedQuery): void + { + $queries = $this->getDatabaseQueries(); + + $found = false; + foreach ($queries as $query) { + if (str_contains($query['query'], $expectedQuery)) { + $found = true; + break; + } + } + + $this->assertTrue($found, "Expected query '$expectedQuery' not found in database queries."); + } + /** * Wrapper to profile database queries. */ From 7c185b0e23bce2627e66fbcccb9708d850624b5c Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Fri, 27 Sep 2024 18:21:31 +0200 Subject: [PATCH 12/17] refactor: improve the helper method names --- .../PhpUnit/TestDatabaseProfilerTrait.php | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index 2b3377eac..34ed047ff 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -7,7 +7,7 @@ trait TestDatabaseProfilerTrait /** * Start profiling database queries. */ - protected function startDatabaseProfiler(): void + protected function startDatabaseQueryLog(): void { $this->app->make('db')->enableQueryLog(); } @@ -15,7 +15,7 @@ protected function startDatabaseProfiler(): void /** * Stop profiling database queries. */ - protected function stopDatabaseProfiler(): void + protected function stopDatabaseQueryLog(): void { $this->app->make('db')->disableQueryLog(); } @@ -58,7 +58,7 @@ protected function assertDatabaseQueryCount(int $expectedCount): void /** * Assert that the database queries contain the expected query. */ - protected function assertDatabaseQueriesContains(string $expectedQuery): void + protected function assertDatabaseExecutedQuery(string $expectedQuery): void { $queries = $this->getDatabaseQueries(); @@ -73,6 +73,16 @@ protected function assertDatabaseQueriesContains(string $expectedQuery): void $this->assertTrue($found, "Expected query '$expectedQuery' not found in database queries."); } + /** + * Assert that the database queries contain the expected queries. + */ + protected function assertDatabaseExecutedQueries(array $expectedQueries): void + { + foreach ($expectedQueries as $expectedQuery) { + $this->assertDatabaseExecutedQuery($expectedQuery); + } + } + /** * Wrapper to profile database queries. */ @@ -97,4 +107,17 @@ protected function profileDatabaseQueryCount(int $expectedCount, callable $callb return $result; }); } + + /** + * Wrapper to profile database queries and assert the executed query. + */ + protected function profileDatabaseExecutedQuery(string $expectedQuery, callable $callback): mixed + { + return $this->profileDatabaseQueries(function () use ($expectedQuery, $callback) { + $result = $callback(); + $this->assertDatabaseExecutedQuery($expectedQuery); + + return $result; + }); + } } From 6b555e749c9394af05fc2db05d1a2f4fb616c3cc Mon Sep 17 00:00:00 2001 From: Mohammad Alavi Date: Sun, 29 Sep 2024 14:58:50 +0330 Subject: [PATCH 13/17] feat: include traits in test coverage --- phpunit.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/phpunit.xml b/phpunit.xml index 84d86393a..b3d5f4774 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -15,7 +15,6 @@ ./tests ./vendor - ./src/Traits/TestTraits From 1121091cc91ffdbabe559912da529628fb0c4772 Mon Sep 17 00:00:00 2001 From: Mohammad Alavi Date: Sun, 29 Sep 2024 14:59:16 +0330 Subject: [PATCH 14/17] test(unit): add TestCaseTest --- .../Abstracts/Tests/PhpUnit/TestCaseTest.php | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/Unit/Abstracts/Tests/PhpUnit/TestCaseTest.php diff --git a/tests/Unit/Abstracts/Tests/PhpUnit/TestCaseTest.php b/tests/Unit/Abstracts/Tests/PhpUnit/TestCaseTest.php new file mode 100644 index 000000000..ccd5f153f --- /dev/null +++ b/tests/Unit/Abstracts/Tests/PhpUnit/TestCaseTest.php @@ -0,0 +1,35 @@ +assertContains($trait, class_uses_recursive(TestCase::class)); + } + } +} From 1dd723a32577135e035ba98698726eb3d0999205 Mon Sep 17 00:00:00 2001 From: Mohammad Alavi Date: Sun, 29 Sep 2024 14:59:38 +0330 Subject: [PATCH 15/17] test(wip): add TestDatabaseProfilerTraitTest --- .../PhpUnit/TestDatabaseProfilerTraitTest.php | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tests/Unit/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTraitTest.php diff --git a/tests/Unit/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTraitTest.php b/tests/Unit/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTraitTest.php new file mode 100644 index 000000000..c0508bdc1 --- /dev/null +++ b/tests/Unit/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTraitTest.php @@ -0,0 +1,41 @@ +enableQueryLog(); + + $this->startDatabaseQueryLog(); + } + + public function testStopDatabaseQueryLog(): void + { + DB::expects()->disableQueryLog(); + + $this->stopDatabaseQueryLog(); + } + + protected function setUp(): void + { + parent::setUp(); + $this->trait = new class { + use TestDatabaseProfilerTrait; + }; + } + + public function testGetDatabaseQueries(): void + { + $this->markTestIncomplete('To be implemented'); + } +} From c52815ad87868c1ee49fbbbfed0accea7a3901e5 Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Sun, 29 Sep 2024 17:08:09 +0200 Subject: [PATCH 16/17] fix: issues --- .../PhpUnit/TestDatabaseProfilerTrait.php | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php index 34ed047ff..95b007af7 100644 --- a/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php +++ b/src/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTrait.php @@ -78,8 +78,18 @@ protected function assertDatabaseExecutedQuery(string $expectedQuery): void */ protected function assertDatabaseExecutedQueries(array $expectedQueries): void { + $queries = $this->getDatabaseQueries(); + foreach ($expectedQueries as $expectedQuery) { - $this->assertDatabaseExecutedQuery($expectedQuery); + $found = false; + foreach ($queries as $query) { + if (str_contains($query['query'], $expectedQuery)) { + $found = true; + break; + } + } + + $this->assertTrue($found, "Expected query '$expectedQuery' not found in database queries."); } } @@ -88,9 +98,12 @@ protected function assertDatabaseExecutedQueries(array $expectedQueries): void */ protected function profileDatabaseQueries(callable $callback): mixed { - $this->startDatabaseProfiler(); - $result = $callback(); - $this->stopDatabaseProfiler(); + try { + $this->startDatabaseQueryLog(); + $result = $callback(); + } finally { + $this->stopDatabaseQueryLog(); + } return $result; } @@ -102,7 +115,7 @@ protected function profileDatabaseQueryCount(int $expectedCount, callable $callb { return $this->profileDatabaseQueries(function () use ($expectedCount, $callback) { $result = $callback(); - $this->assertDatabaseQueriesCount($expectedCount); + $this->assertDatabaseQueryCount($expectedCount); return $result; }); @@ -120,4 +133,17 @@ protected function profileDatabaseExecutedQuery(string $expectedQuery, callable return $result; }); } + + /** + * Wrapper to profile database queries and assert the executed queries. + */ + protected function profileDatabaseExecutedQueries(array $expectedQueries, callable $callback): mixed + { + return $this->profileDatabaseQueries(function () use ($expectedQueries, $callback) { + $result = $callback(); + $this->assertDatabaseExecutedQueries($expectedQueries); + + return $result; + }); + } } From e84abefb8dd79a08975681ed82210d94c0442d9a Mon Sep 17 00:00:00 2001 From: Sebastian Weckend Date: Sun, 29 Sep 2024 17:08:19 +0200 Subject: [PATCH 17/17] test: add test trait tests --- .../PhpUnit/TestDatabaseProfilerTraitTest.php | 448 +++++++++++++++++- 1 file changed, 441 insertions(+), 7 deletions(-) diff --git a/tests/Unit/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTraitTest.php b/tests/Unit/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTraitTest.php index c0508bdc1..6a4bcca19 100644 --- a/tests/Unit/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTraitTest.php +++ b/tests/Unit/Traits/TestTraits/PhpUnit/TestDatabaseProfilerTraitTest.php @@ -26,16 +26,450 @@ public function testStopDatabaseQueryLog(): void $this->stopDatabaseQueryLog(); } - protected function setUp(): void + public function testGetDatabaseQueries(): void { - parent::setUp(); - $this->trait = new class { - use TestDatabaseProfilerTrait; - }; + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->assertEquals($queries, $this->getDatabaseQueries()); } - public function testGetDatabaseQueries(): void + public function testAssertDatabaseQueryCount(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->assertDatabaseQueryCount(2); + } + + public function testAssertDatabaseQueryCountWithDifferentCount(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage('Expected 3 database queries, but got 2.'); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->assertDatabaseQueryCount(3); + } + + public function testAssertDatabaseQueryCountWithEmptyDatabaseQueries(): void + { + $queries = []; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->assertDatabaseQueryCount(0); + } + + public function testAssertDatabaseExecutedQuery(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->assertDatabaseExecutedQuery('query1'); + } + + public function testAssertDatabaseExecutedQueryWithDifferentQuery(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query3' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->assertDatabaseExecutedQuery('query3'); + } + + public function testAssertDatabaseExecutedQueryWithEmptyDatabaseQueries(): void + { + $queries = []; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query1' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->assertDatabaseExecutedQuery('query1'); + } + + public function testAssertDatabaseExecutedQueryWithEmptyQueries(): void + { + $queries = []; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query '' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->assertDatabaseExecutedQuery(''); + } + + public function testAssertDatabaseExecutedQueryWithDifferentQueriesAndEmptyDatabaseQueries(): void + { + $queries = []; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query1' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->assertDatabaseExecutedQuery('query1'); + } + + public function testAssertDatabaseExecutedQueryWithEmptyQueriesAndDatabaseQueries(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->assertDatabaseExecutedQuery(''); + } + + public function testAssertDatabaseExecutedQueries(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2'], ['query' => 'query3']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->assertDatabaseExecutedQueries(['query1', 'query2']); + } + + public function testAssertDatabaseExecutedQueriesWithDifferentQueries(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query3' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->assertDatabaseExecutedQueries(['query1', 'query3']); + } + + public function testAssertDatabaseExecutedQueriesWithDifferentQueries2(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query4' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->assertDatabaseExecutedQueries(['query4', 'query3']); + } + + public function testAssertDatabaseExecutedQueriesWithEmptyQueries(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->assertDatabaseExecutedQueries([]); + } + + public function testAssertDatabaseExecutedQueriesWithEmptyDatabaseQueries(): void + { + $queries = []; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query1' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->assertDatabaseExecutedQueries(['query1']); + } + + public function testAssertDatabaseExecutedQueriesWithEmptyQueriesAndDatabaseQueries(): void + { + $queries = []; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->assertDatabaseExecutedQueries([]); + } + + public function testAssertDatabaseExecutedQueriesWithDifferentQueriesAndEmptyDatabaseQueries(): void + { + $queries = []; + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query1' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->assertDatabaseExecutedQueries(['query1']); + } + + public function testProfileDatabaseQueries(): void + { + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + + $this->profileDatabaseQueries(function () { + // Do nothing + }); + } + + public function testProfileDatabaseQueriesRunsClosure(): void + { + $closureRan = false; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + + $this->profileDatabaseQueries(function () use (&$closureRan) { + $closureRan = true; + }); + + $this->assertTrue($closureRan); + } + + public function testProfileDatabaseQueriesWithException(): void + { + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + + $this->expectException(\Exception::class); + $this->profileDatabaseQueries(function () { + throw new \Exception(); + }); + } + + public function testProfileDatabaseQueryCount(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->profileDatabaseQueryCount(2, function () { + // Do nothing + }); + } + + public function testProfileDatabaseQueryCountWithDifferentCount(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage('Expected 3 database queries, but got 2.'); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->profileDatabaseQueryCount(3, function () { + // Do nothing + }); + } + + public function testProfileDatabaseQueryCountRunsClosure(): void + { + $closureRan = false; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn([]); + + $this->profileDatabaseQueryCount(0, function () use (&$closureRan) { + $closureRan = true; + }); + + $this->assertTrue($closureRan); + } + + public function testProfileDatabaseQueryCountWithException(): void + { + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + + $this->expectException(\Exception::class); + $this->profileDatabaseQueryCount(0, function () { + throw new \Exception(); + }); + } + + public function testProfileDatabaseExecutedQuery(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->profileDatabaseExecutedQuery('query1', function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueryWithDifferentQuery(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query3' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->profileDatabaseExecutedQuery('query3', function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueryWithEmptyDatabaseQueries(): void + { + $queries = []; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query1' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->profileDatabaseExecutedQuery('query1', function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueryWithEmptyQueries(): void { - $this->markTestIncomplete('To be implemented'); + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->profileDatabaseExecutedQuery('', function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueryWithDifferentQueriesAndEmptyDatabaseQueries(): void + { + $queries = []; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query1' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->profileDatabaseExecutedQuery('query1', function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueryWithEmptyQueriesAndDatabaseQueries(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->profileDatabaseExecutedQuery('', function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueryRunsClosure(): void + { + $closureRan = false; + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->profileDatabaseExecutedQuery('query1', function () use (&$closureRan) { + $closureRan = true; + }); + + $this->assertTrue($closureRan); + } + + public function testProfileDatabaseExecutedQueryWithException(): void + { + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + + $this->expectException(\Exception::class); + $this->profileDatabaseExecutedQuery('query1', function () { + throw new \Exception(); + }); + } + + public function testProfileDatabaseExecutedQueries(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->profileDatabaseExecutedQueries(['query1', 'query2'], function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueriesWithDifferentQueries(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query3' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->profileDatabaseExecutedQueries(['query1', 'query3'], function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueriesWithDifferentQueries2(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query4' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->profileDatabaseExecutedQueries(['query4', 'query3'], function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueriesWithEmptyQueries(): void + { + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->profileDatabaseExecutedQueries([], function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueriesWithEmptyDatabaseQueries(): void + { + $queries = []; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->expectExceptionMessage("Expected query 'query1' not found in database queries."); + $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->profileDatabaseExecutedQueries(['query1'], function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueriesWithEmptyQueriesAndDatabaseQueries(): void + { + $queries = []; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->profileDatabaseExecutedQueries([], function () { + // Do nothing + }); + } + + public function testProfileDatabaseExecutedQueriesRunsClosure(): void + { + $closureRan = false; + $queries = [['query' => 'query1'], ['query' => 'query2']]; + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + DB::expects()->getQueryLog()->andReturn($queries); + + $this->profileDatabaseExecutedQueries(['query1'], function () use (&$closureRan) { + $closureRan = true; + }); + + $this->assertTrue($closureRan); + } + + public function testProfileDatabaseExecutedQueriesWithException(): void + { + DB::expects()->enableQueryLog(); + DB::expects()->disableQueryLog(); + + $this->expectException(\Exception::class); + $this->profileDatabaseExecutedQueries(['query1'], function () { + throw new \Exception(); + }); } }