Skip to content

Commit 94b82cf

Browse files
authored
Merge pull request #53 from zigzagdev/feature/south-asia
South Asia Content
2 parents 0427410 + 1f1fd70 commit 94b82cf

22 files changed

Lines changed: 1484 additions & 232 deletions

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ services:
3737
ports:
3838
- "2307:3306"
3939
environment:
40-
MYSQL_DATABASE: world-heritage-test
40+
MYSQL_DATABASE: world_heritage_test
4141
MYSQL_ROOT_PASSWORD: world-heritage
4242
MYSQL_USER: world-heritage
4343
MYSQL_PASSWORD: world-heritage

src/app/Models/WorldHeritage.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,11 @@ class WorldHeritage extends Model
3333

3434
protected $casts = [
3535
'criteria' => 'array',
36+
'is_endangered' => 'boolean',
37+
'year_inscribed' => 'integer',
38+
'area_hectares' => 'float',
39+
'buffer_zone_hectares' => 'float',
40+
'latitude' => 'float',
41+
'longitude' => 'float',
3642
];
3743
}

src/app/Packages/Domains/Test/QueryService/WorldHeritageQueryService_getByIdTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,39 @@
22

33
namespace App\Packages\Domains\Test\QueryService;
44

5+
use App\Models\WorldHeritage;
56
use App\Packages\Domains\WorldHeritageEntity;
67
use App\Packages\Domains\WorldHeritageQueryService;
8+
use Illuminate\Support\Facades\DB;
79
use Tests\TestCase;
10+
use Database\Seeders\JapaneseWorldHeritageSeeder;
811

912
class WorldHeritageQueryService_getByIdTest extends TestCase
1013
{
1114
private $repository;
1215
protected function setUp(): void
1316
{
1417
parent::setUp();
18+
$this->refresh();
1519
$this->repository = app(WorldHeritageQueryService::class);
20+
$this->seed('JapaneseWorldHeritageSeeder');
1621
}
1722

1823
protected function tearDown(): void
1924
{
25+
$this->refresh();
2026
parent::tearDown();
2127
}
2228

29+
private function refresh(): void
30+
{
31+
if (env('APP_ENV') === 'testing') {
32+
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=0;');
33+
WorldHeritage::truncate();
34+
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=1;');
35+
}
36+
}
37+
2338
private function arrayData(): array
2439
{
2540
return [

src/app/Packages/Domains/Test/QueryService/WorldHeritageQueryService_getByIdsTest.php

Lines changed: 63 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,45 @@
22

33
namespace App\Packages\Domains\Test\QueryService;
44

5+
use App\Common\Pagination\PaginationDto;
6+
use App\Models\WorldHeritage;
7+
use Database\Seeders\JapaneseWorldHeritageSeeder;
8+
use Illuminate\Support\Facades\DB;
59
use Tests\TestCase;
610
use App\Packages\Domains\WorldHeritageQueryService;
7-
use App\Models\WorldHeritage;
811

912
class WorldHeritageQueryService_getByIdsTest extends TestCase
1013
{
11-
1214
private $queryService;
13-
private int $currentPage;
1415
private int $perPage;
16+
private int $currentPage;
1517

1618
protected function setUp(): void
1719
{
1820
parent::setUp();
21+
$this->refresh();
22+
$this->perPage = 15;
23+
$this->currentPage = 1;
1924
$this->queryService = app(WorldHeritageQueryService::class);
25+
$seeder = new JapaneseWorldHeritageSeeder();
26+
$seeder->run();
2027
}
2128

2229
protected function tearDown(): void
2330
{
31+
$this->refresh();
2432
parent::tearDown();
2533
}
2634

35+
private function refresh(): void
36+
{
37+
if (env('APP_ENV') === 'testing') {
38+
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=0;');
39+
WorldHeritage::truncate();
40+
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=1;');
41+
}
42+
}
43+
2744
private static function arrayData(): array
2845
{
2946
return [
@@ -47,6 +64,7 @@ private static function arrayData(): array
4764
'short_description' => "Early Buddhist wooden structures including the world's oldest wooden building.",
4865
'image_url' => '',
4966
'unesco_site_url' => 'https://whc.unesco.org/en/list/660/',
67+
'created_at' => now(), 'updated_at' => now(),
5068
],
5169
[
5270
'id' => 2,
@@ -68,6 +86,7 @@ private static function arrayData(): array
6886
'short_description' => "A masterpiece of Japanese castle architecture in original form.",
6987
'image_url' => '',
7088
'unesco_site_url' => 'https://whc.unesco.org/en/list/661/',
89+
'created_at' => now(), 'updated_at' => now(),
7190
],
7291
[
7392
'id' => 3,
@@ -89,6 +108,7 @@ private static function arrayData(): array
89108
'short_description' => "A subtropical island with ancient cedar forests and diverse ecosystems.",
90109
'image_url' => '',
91110
'unesco_site_url' => 'https://whc.unesco.org/en/list/662/',
111+
'created_at' => now(), 'updated_at' => now(),
92112
],
93113
[
94114
'id' => 4,
@@ -110,64 +130,53 @@ private static function arrayData(): array
110130
'short_description' => "Pristine beech forest with minimal human impact.",
111131
'image_url' => '',
112132
'unesco_site_url' => 'https://whc.unesco.org/en/list/663/',
113-
]
133+
'created_at' => now(), 'updated_at' => now(),
134+
],
114135
];
115136
}
116137

117-
public function test_getByIds_count_objects(): void
138+
public function test_fetch_data_check_type(): void
118139
{
119-
$ids = [1, 2];
120-
$result = $this->queryService->getHeritagesByIds($ids, 1, 10);
121-
122-
$this->assertCount(2, $result->getCollection());
140+
$ids = array_column(self::arrayData(), 'id');
141+
$result = $this->queryService->getHeritagesByIds(
142+
$ids,
143+
$this->perPage,
144+
$this->currentPage
145+
);
146+
147+
$this->assertInstanceOf(PaginationDto::class, $result);
123148
}
124149

125-
public function test_getByIds_check_each_value(): void
150+
public function test_fetch_data_check_value(): void
126151
{
127-
$ids = [1, 2];
128-
$result = $this->queryService->getHeritagesByIds($ids, 1, 10);
129-
130-
$expectedMap = collect(self::arrayData())
131-
->filter(fn($row) => in_array($row['id'], $ids))
132-
->keyBy('id');
133-
134-
foreach ($result->getCollection() as $entity) {
135-
$id = $entity['id'];
136-
$expected = $expectedMap[$id] ?? null;
137-
$this->assertSame($expected['id'], $entity['id']);
138-
$this->assertEquals($expected['unesco_id'], $entity['unesco_id']);
139-
$this->assertSame($expected['official_name'], $entity['official_name']);
140-
$this->assertSame($expected['name'], $entity['name']);
141-
$this->assertSame($expected['name_jp'], $entity['name_jp']);
142-
$this->assertSame($expected['country'], $entity['country']);
143-
$this->assertSame($expected['region'], $entity['region']);
144-
$this->assertSame($expected['state_party'], $entity['state_party']);
145-
$this->assertSame($expected['category'], $entity['category']);
146-
$this->assertSame($expected['criteria'], $entity['criteria']);
147-
$this->assertEquals($expected['year_inscribed'], $entity['year_inscribed']);
148-
$this->assertSame($expected['area_hectares'], $entity['area_hectares']);
149-
$this->assertSame($expected['buffer_zone_hectares'], $entity['buffer_zone_hectares']);
150-
$this->assertIsBool($expected['is_endangered'], $entity['is_endangered']);
151-
$this->assertIsFloat($expected['latitude'], $entity['latitude']);
152-
$this->assertIsFloat($expected['longitude'], $entity['longitude']);
153-
$this->assertSame($expected['short_description'], $entity['short_description']);
154-
$this->assertSame($expected['image_url'], $entity['image_url']);
155-
$this->assertSame($expected['unesco_site_url'], $entity['unesco_site_url']);
152+
$ids = array_column(self::arrayData(), 'id');
153+
$result = $this->queryService->getHeritagesByIds(
154+
$ids,
155+
$this->currentPage,
156+
$this->perPage
157+
);
158+
159+
$this->assertSame(array_column(self::arrayData(), 'id'), array_column($result->toArray()['data'], 'id'));
160+
foreach ($result->toArray()['data'] as $key => $value) {
161+
$this->assertSame(self::arrayData()[$key]['id'], $value['id']);
162+
$this->assertSame(self::arrayData()[$key]['unesco_id'], $value['unescoId']);
163+
$this->assertSame(self::arrayData()[$key]['official_name'], $value['officialName']);
164+
$this->assertSame(self::arrayData()[$key]['name'], $value['name']);
165+
$this->assertSame(self::arrayData()[$key]['name_jp'], $value['nameJp']);
166+
$this->assertSame(self::arrayData()[$key]['country'], $value['country']);
167+
$this->assertSame(self::arrayData()[$key]['region'], $value['region']);
168+
$this->assertSame(self::arrayData()[$key]['state_party'], $value['stateParty']);
169+
$this->assertSame(self::arrayData()[$key]['category'], $value['category']);
170+
$this->assertSame(self::arrayData()[$key]['criteria'], $value['criteria']);
171+
$this->assertSame(self::arrayData()[$key]['year_inscribed'], $value['yearInscribed']);
172+
$this->assertSame(self::arrayData()[$key]['area_hectares'], $value['areaHectares']);
173+
$this->assertSame(self::arrayData()[$key]['buffer_zone_hectares'], $value['bufferZoneHectares']);
174+
$this->assertSame(self::arrayData()[$key]['is_endangered'], $value['isEndangered']);
175+
$this->assertSame(self::arrayData()[$key]['latitude'], $value['latitude']);
176+
$this->assertSame(self::arrayData()[$key]['longitude'], $value['longitude']);
177+
$this->assertSame(self::arrayData()[$key]['short_description'], $value['shortDescription']);
178+
$this->assertSame(self::arrayData()[$key]['image_url'], $value['imageUrl']);
179+
$this->assertSame(self::arrayData()[$key]['unesco_site_url'], $value['unescoSiteUrl']);
156180
}
157181
}
158-
159-
public function test_getByIds_pagination_meta(): void
160-
{
161-
$ids = [1, 2];
162-
$currentPage = 1;
163-
$perPage = 1;
164-
165-
$result = $this->queryService->getHeritagesByIds($ids, $currentPage, $perPage);
166-
167-
$this->assertSame($currentPage, $result->getCurrentPage());
168-
$this->assertSame($perPage, $result->getPerPage());
169-
170-
$this->assertSame(2, $result->getTotal());
171-
$this->assertSame(2, $result->getLastPage());
172-
}
173182
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
<?php
2+
3+
namespace App\Packages\Domains\Test\Repository;
4+
5+
use App\Packages\Domains\WorldHeritageEntity;
6+
use App\Packages\Domains\WorldHeritageRepository;
7+
use Illuminate\Support\Facades\DB;
8+
use Tests\TestCase;
9+
use App\Models\WorldHeritage;
10+
11+
class WorldHeritageRepository_insertTest extends TestCase
12+
{
13+
private $repository;
14+
protected function setUp(): void
15+
{
16+
parent::setUp();
17+
$this->refresh();
18+
19+
$this->repository = app(WorldHeritageRepository::class);
20+
}
21+
22+
protected function tearDown(): void
23+
{
24+
$this->refresh();
25+
parent::tearDown();
26+
}
27+
28+
private function refresh(): void
29+
{
30+
if (env('APP_ENV') === 'testing') {
31+
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=0;');
32+
WorldHeritage::truncate();
33+
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=1;');
34+
}
35+
}
36+
37+
private static function arrayData(): array
38+
{
39+
return [
40+
'unesco_id' => '668',
41+
'official_name' => 'Historic Monuments of Ancient Nara',
42+
'name' => 'Historic Monuments of Ancient Nara',
43+
'name_jp' => '古都奈良の文化財',
44+
'country' => 'Japan',
45+
'region' => 'Asia',
46+
'state_party' => 'JP',
47+
'category' => 'cultural',
48+
'criteria' => ['ii', 'iii', 'v'],
49+
'year_inscribed' => 1998,
50+
'area_hectares' => 442.0,
51+
'buffer_zone_hectares' => 320.0,
52+
'is_endangered' => false,
53+
'latitude' => 34.6851,
54+
'longitude' => 135.8048,
55+
'short_description' => 'Temples and shrines of the first permanent capital of Japan.',
56+
'image_url' => '',
57+
'unesco_site_url' => 'https://whc.unesco.org/en/list/668/',
58+
];
59+
}
60+
61+
public function test_insert_check_type(): void
62+
{
63+
$entity = new WorldHeritageEntity(
64+
null,
65+
self::arrayData()['unesco_id'],
66+
self::arrayData()['official_name'],
67+
self::arrayData()['name'],
68+
self::arrayData()['country'],
69+
self::arrayData()['region'],
70+
self::arrayData()['category'],
71+
self::arrayData()['year_inscribed'],
72+
self::arrayData()['is_endangered'],
73+
self::arrayData()['latitude'],
74+
self::arrayData()['longitude'],
75+
self::arrayData()['name_jp'],
76+
self::arrayData()['state_party'],
77+
self::arrayData()['criteria'],
78+
self::arrayData()['area_hectares'],
79+
self::arrayData()['buffer_zone_hectares'],
80+
self::arrayData()['short_description'],
81+
self::arrayData()['image_url'],
82+
self::arrayData()['unesco_site_url']
83+
);
84+
85+
$result = $this->repository->insertHeritage($entity);
86+
87+
$this->assertInstanceOf(WorldHeritageEntity::class, $result);
88+
}
89+
90+
public function test_insert_check_value(): void
91+
{
92+
$entity = new WorldHeritageEntity(
93+
null,
94+
self::arrayData()['unesco_id'],
95+
self::arrayData()['official_name'],
96+
self::arrayData()['name'],
97+
self::arrayData()['country'],
98+
self::arrayData()['region'],
99+
self::arrayData()['category'],
100+
self::arrayData()['year_inscribed'],
101+
self::arrayData()['latitude'],
102+
self::arrayData()['longitude'],
103+
self::arrayData()['is_endangered'],
104+
self::arrayData()['name_jp'],
105+
self::arrayData()['state_party'],
106+
self::arrayData()['criteria'],
107+
self::arrayData()['area_hectares'],
108+
self::arrayData()['buffer_zone_hectares'],
109+
self::arrayData()['short_description'],
110+
self::arrayData()['image_url'],
111+
self::arrayData()['unesco_site_url']
112+
);
113+
114+
$result = $this->repository->insertHeritage($entity);
115+
116+
$this->assertEquals(self::arrayData()['unesco_id'], $result->getUnescoId());
117+
$this->assertEquals(self::arrayData()['official_name'], $result->getOfficialName());
118+
$this->assertEquals(self::arrayData()['name'], $result->getName());
119+
$this->assertEquals(self::arrayData()['name_jp'], $result->getNameJp());
120+
$this->assertEquals(self::arrayData()['country'], $result->getCountry());
121+
$this->assertEquals(self::arrayData()['region'], $result->getRegion());
122+
$this->assertEquals(self::arrayData()['state_party'], $result->getStateParty());
123+
$this->assertEquals(self::arrayData()['category'], $result->getCategory());
124+
$this->assertEquals(self::arrayData()['criteria'], $result->getCriteria());
125+
$this->assertEquals(self::arrayData()['year_inscribed'], $result->getYearInscribed());
126+
$this->assertEquals(self::arrayData()['area_hectares'], $result->getAreaHectares());
127+
$this->assertEquals(self::arrayData()['buffer_zone_hectares'], $result->getBufferZoneHectares());
128+
$this->assertEquals(self::arrayData()['is_endangered'], $result->isEndangered());
129+
$this->assertEquals(self::arrayData()['latitude'], $result->getLatitude());
130+
$this->assertEquals(self::arrayData()['longitude'], $result->getLongitude());
131+
$this->assertEquals(self::arrayData()['short_description'], $result->getShortDescription());
132+
$this->assertEquals(self::arrayData()['image_url'], $result->getImageUrl());
133+
$this->assertEquals(self::arrayData()['unesco_site_url'], $result->getUnescoSiteUrl());
134+
}
135+
}

src/app/Packages/Domains/WorldHeritageEntity.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public function __construct(
2626
public ?string $unescoSiteUrl = null
2727
) {}
2828

29-
public function getId(): int
29+
public function getId(): ?int
3030
{
3131
return $this->id;
3232
}

0 commit comments

Comments
 (0)