diff --git a/src/app/Packages/Features/Controller/WorldHeritageController.php b/src/app/Packages/Features/Controller/WorldHeritageController.php index 2d79d76..ea1a996 100644 --- a/src/app/Packages/Features/Controller/WorldHeritageController.php +++ b/src/app/Packages/Features/Controller/WorldHeritageController.php @@ -3,6 +3,7 @@ namespace App\Packages\Features\Controller; use App\Http\Controllers\Controller; +use App\Packages\Features\QueryUseCases\UseCase\GetCountEachRegionUseCase; use App\Packages\Features\QueryUseCases\UseCase\GetWorldHeritageByIdUseCase; use App\Packages\Features\QueryUseCases\UseCase\SearchWorldHeritagesWithAlgoliaUseCase; use App\Packages\Features\QueryUseCases\ViewModel\WorldHeritageViewModel; @@ -79,4 +80,17 @@ public function searchWorldHeritages( 'data' => $dto->toArray(), ], 200); } + + public function getWorldHeritagesCountByRegion( + Request $request, + GetCountEachRegionUseCase $useCase + ): JsonResponse + { + $dto = $useCase->handle(); + + return response()->json([ + 'status' => 'success', + 'data' => array_map(fn ($item) => $item->toArray(), $dto), + ], 200); + } } \ No newline at end of file diff --git a/src/app/Packages/Features/Tests/GetCountEachRegionTest.php b/src/app/Packages/Features/Tests/GetCountEachRegionTest.php new file mode 100644 index 0000000..c8e17db --- /dev/null +++ b/src/app/Packages/Features/Tests/GetCountEachRegionTest.php @@ -0,0 +1,100 @@ +refresh(); + + $this->app->bind(WorldHeritageSearchPort::class, function () { + return new class implements WorldHeritageSearchPort { + public function search($query, int $currentPage, int $perPage): HeritageSearchResult { + return new HeritageSearchResult(ids: [], total: 0, currentPage: 1, perPage: $perPage, lastPage: 0); + } + }; + }); + + $seeder = new DatabaseSeeder(); + $seeder->run(); + } + + protected function tearDown(): void + { + $this->refresh(); + parent::tearDown(); + } + + private function refresh(): void + { + if (env('APP_ENV') === 'testing') { + DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=0;'); + WorldHeritage::truncate(); + Country::truncate(); + DB::table('site_state_parties')->truncate(); + Image::truncate(); + DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=1;'); + } + } + + public function test_check_count_each_region_value(): void + { + $response = $this->getJson('/api/v1/heritages/region-count'); + + $response->assertStatus(200) + ->assertJsonStructure([ + 'data' => [ + '*' => [ + 'region', + 'count', + ], + ], + ]); + } + + public function test_returns_all_six_regions(): void + { + $response = $this->getJson('/api/v1/heritages/region-count'); + + $data = $response->json('data'); + $regions = array_column($data, 'region'); + + + $this->assertCount(6, $data); + $this->assertContains('Africa', $regions); + $this->assertContains('Asia', $regions); + $this->assertContains('Europe', $regions); + $this->assertContains('North America', $regions); + $this->assertContains('South America', $regions); + $this->assertContains('Oceania', $regions); + } + + public function test_count_is_positive_integer(): void + { + $response = $this->getJson('/api/v1/heritages/region-count'); + + foreach ($response->json('data') as $item) { + $this->assertIsInt($item['count']); + $this->assertGreaterThanOrEqual(0, $item['count']); + } + } + + public function test_unknown_region_is_not_included(): void + { + $response = $this->getJson('/api/v1/heritages/region-count'); + + $regions = array_column($response->json('data'), 'region'); + $this->assertNotContains('Unknown', $regions); + } +} \ No newline at end of file diff --git a/src/routes/api.php b/src/routes/api.php index b45b9ad..9ebdb19 100644 --- a/src/routes/api.php +++ b/src/routes/api.php @@ -6,11 +6,6 @@ Route::prefix('v1')->group(function () { Route::get('/heritages', [WorldHeritageController::class, 'getWorldHeritages']); Route::get('/heritages/search', [WorldHeritageController::class, 'searchWorldHeritages']); + Route::get('heritages/region-count', [WorldHeritageController::class, 'getWorldHeritagesCountByRegion']); Route::get('/heritages/{id}', [WorldHeritageController::class, 'getWorldHeritageById']); - Route::post('heritage', [WorldHeritageController::class, 'registerOneWorldHeritage']); - Route::post('heritages', [WorldHeritageController::class, 'registerManyWorldHeritages']); - Route::put('heritages/{id}', [WorldHeritageController::class, 'updateOneWorldHeritage']); - Route::put('heritages', [WorldHeritageController::class, 'updateManyHeritages']); - Route::delete('heritages/{id}', [WorldHeritageController::class, 'deleteOneHeritage']); - Route::delete('heritages', [WorldHeritageController::class, 'deleteManyHeritages']); }); \ No newline at end of file