Skip to content

Commit 8dc9dd5

Browse files
authored
Merge pull request #70 from zigzagdev/feature/balkans-presentation
fix: fix API Test
2 parents 420dae1 + 54c8c00 commit 8dc9dd5

12 files changed

Lines changed: 325 additions & 85 deletions

src/app/Packages/Domains/WorldHeritageEntity.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,48 @@ public function getStatePartyCodesOrFallback(): array
159159

160160
return array_values(array_unique($codes));
161161
}
162+
private function normalizeCodes(array $codes): array
163+
{
164+
$codes = array_map('trim', $codes);
165+
$codes = array_filter($codes, fn($v) => $v !== '');
166+
$codes = array_map('strtoupper', $codes);
167+
$codes = array_filter($codes, fn($v) => preg_match('/^[A-Z]{2}$/', $v));
168+
169+
return array_values(array_unique($codes));
170+
}
171+
172+
public function setStateParty(?string $value): void
173+
{
174+
$this->stateParty = $value;
175+
176+
$parts = [];
177+
if ($value !== null && $value !== '') {
178+
$parts = preg_split('/[;,\s]+/', $value);
179+
}
180+
$this->statePartyCodes = $this->normalizeCodes($parts);
181+
}
182+
183+
public function setStatePartyCodes(array $codes): void
184+
{
185+
$this->statePartyCodes = $this->normalizeCodes($codes);
186+
$this->stateParty = $this->statePartyCodes ? implode(', ', $this->statePartyCodes) : null;
187+
}
188+
189+
public function setStatePartyMeta(array $meta): void
190+
{
191+
$normalized = [];
192+
foreach ($meta as $code => $m) {
193+
$code = strtoupper(trim((string)$code));
194+
if (!preg_match('/^[A-Z]{2}$/', $code)) {
195+
continue;
196+
}
197+
$normalized[$code] = [
198+
'is_primary' => (bool)($m['is_primary'] ?? false),
199+
'inscription_year' => isset($m['inscription_year'])
200+
? (is_numeric($m['inscription_year']) ? (int)$m['inscription_year'] : null)
201+
: null,
202+
];
203+
}
204+
$this->statePartyMeta = $normalized;
205+
}
162206
}

src/app/Packages/Domains/WorldHeritageRepository.php

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@
33
namespace App\Packages\Domains;
44

55
use App\Models\WorldHeritage;
6+
use App\Models\Country;
67
use Exception;
78

89
readonly class WorldHeritageRepository implements WorldHeritageRepositoryInterface
910
{
1011
public function __construct(
11-
private readonly WorldHeritage $model
12+
private readonly WorldHeritage $worldHeritage,
13+
private readonly Country $country
1214
) {}
1315

1416
public function insertHeritage(
1517
WorldHeritageEntity $entity
1618
): WorldHeritageEntity {
19+
1720
$insertValue = [
1821
'unesco_id' => $entity->getUnescoId(),
1922
'official_name' => $entity->getOfficialName(),
@@ -34,31 +37,51 @@ public function insertHeritage(
3437
'unesco_site_url' => $entity->getUnescoSiteUrl()
3538
];
3639

37-
$heritage = $this->model->create($insertValue);
40+
$heritage = $this->worldHeritage->create($insertValue);
41+
42+
$meta = $entity->getStatePartyMeta() ?? [];
43+
$codes = $entity->getStatePartyCodes();
44+
if (empty($codes) && !empty($meta)) {
45+
$codes = array_keys($meta);
46+
}
47+
if (empty($codes)) {
48+
$codes = $entity->getStatePartyCodesOrFallback();
49+
}
3850

39-
$codes = $entity->getStatePartyCodes() ?: $entity->getStatePartyCodesOrFallback();
4051
$codes = array_values(array_unique(array_map('strtoupper', $codes)));
52+
$codeIds = $this->country
53+
->whereIn('state_party_code', $codes)
54+
->pluck('state_party_code', 'state_party_code')
55+
->all();
4156

42-
$meta = $entity->getStatePartyMeta();
43-
if (!empty($meta)) {
44-
$payload = [];
45-
foreach ($codes as $code) {
46-
$m = $meta[$code] ?? [];
47-
$payload[$code] = [
48-
'is_primary' => (bool)($m['is_primary'] ?? false),
49-
'inscription_year' => $m['inscription_year'] ?? null,
50-
];
57+
if (!empty($codeIds)) {
58+
if (!empty($meta)) {
59+
$payload = [];
60+
foreach ($codes as $code) {
61+
if (!isset($codeIds[$code])) {
62+
continue;
63+
}
64+
$m = $meta[$code] ?? [];
65+
$payload[$codeIds[$code]] = [
66+
'is_primary' => (bool)($m['is_primary'] ?? false),
67+
'inscription_year' => $m['inscription_year'] ?? null,
68+
];
69+
}
70+
$heritage->countries()->sync($payload);
71+
} else {
72+
$heritage->countries()->sync(array_values($codeIds));
5173
}
52-
$heritage->countries()->sync($payload);
5374
} else {
54-
$heritage->countries()->sync($codes);
75+
$heritage->countries()->sync([]);
5576
}
5677

57-
$heritage->state_party = $code ? implode(', ', $codes) : null;
78+
$heritage->state_party = !empty($codes) ? implode(',', $codes) : null;
5879
$heritage->save();
80+
$heritage->load(['countries' => function ($q) {
81+
$q->withPivot(['is_primary', 'inscription_year']);
82+
}]);
5983

6084
$partyMeta = [];
61-
6285
foreach ($heritage->countries as $country) {
6386
$partyMeta[$country->state_party_code] = [
6487
'is_primary' => (bool) data_get($country, 'pivot.is_primary', false),
@@ -86,7 +109,7 @@ public function insertHeritage(
86109
shortDescription: $heritage->short_description,
87110
imageUrl: $heritage->image_url,
88111
unescoSiteUrl: $heritage->unesco_site_url,
89-
statePartyCodes: $heritage->countries->pluck('state_party_code')->all(),
112+
statePartyCodes: $this->parseStateParty($heritage->state_party),
90113
statePartyMeta: $partyMeta
91114
);
92115
}
@@ -170,4 +193,14 @@ public function insertHeritages(
170193
// unescoSiteUrl: $updateValue['unesco_site_url']
171194
// );
172195
// }
196+
197+
private function parseStateParty(?string $stored): array
198+
{
199+
if ($stored === null || $stored === '') return [];
200+
201+
$parts = array_map('trim', explode(',', $stored));
202+
$parts = array_filter($parts, static fn($v) => $v !== '');
203+
$parts = array_map('strtoupper', $parts);
204+
return array_values(array_unique($parts));
205+
}
173206
}

src/app/Packages/Features/Controller/Tests/WorldHeritageController_registerTest.php

Lines changed: 73 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
namespace App\Packages\Features\Controller\Tests;
44

5+
use App\Models\Country;
56
use App\Models\WorldHeritage;
67
use App\Packages\Features\QueryUseCases\Dto\WorldHeritageDto;
78
use App\Packages\Features\QueryUseCases\UseCase\CreateWorldHeritageUseCase;
9+
use Database\Seeders\CountrySeeder;
810
use Illuminate\Http\JsonResponse;
911
use Illuminate\Http\Request;
1012
use Illuminate\Support\Facades\DB;
@@ -18,6 +20,8 @@ protected function setUp(): void
1820
{
1921
parent::setUp();
2022
$this->refresh();
23+
$seeder = new CountrySeeder();
24+
$seeder->run();
2125
$this->controller = new WorldHeritageController();
2226
}
2327

@@ -32,6 +36,8 @@ private function refresh(): void
3236
if (env('APP_ENV') === 'testing') {
3337
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=0;');
3438
WorldHeritage::truncate();
39+
Country::truncate();
40+
DB::table('site_state_parties')->truncate();
3541
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=1;');
3642
}
3743
}
@@ -40,24 +46,47 @@ private function requestData(): array
4046
{
4147
return [
4248
'id' => 1,
43-
'unesco_id' => '668',
44-
'official_name' => 'Historic Monuments of Ancient Nara',
45-
'name' => 'Historic Monuments of Ancient Nara',
46-
'name_jp' => '古都奈良の文化財',
47-
'country' => 'Japan',
48-
'region' => 'Asia',
49-
'state_party' => 'JP',
50-
'category' => 'cultural',
51-
'criteria' => ['ii', 'iii', 'v'],
52-
'year_inscribed' => 1998,
53-
'area_hectares' => 442.0,
54-
'buffer_zone_hectares' => 320.0,
49+
'unesco_id' => '1133',
50+
'official_name' => "Ancient and Primeval Beech Forests of the Carpathians and Other Regions of Europe",
51+
'name' => "Ancient and Primeval Beech Forests",
52+
'name_jp' => null,
53+
'country' => 'Slovakia',
54+
'region' => 'Europe',
55+
'category' => 'natural',
56+
'criteria' => ['ix'],
57+
'state_party' => null,
58+
'year_inscribed' => 2007,
59+
'area_hectares' => 99947.81,
60+
'buffer_zone_hectares' => 296275.8,
5561
'is_endangered' => false,
56-
'latitude' => 34.6851,
57-
'longitude' => 135.8048,
58-
'short_description' => 'Temples and shrines of the first permanent capital of Japan.',
62+
'latitude' => 0.0,
63+
'longitude' => 0.0,
64+
'short_description' => 'Transnational serial property of European beech forests illustrating post-glacial expansion and ecological processes across Europe.',
5965
'image_url' => '',
60-
'unesco_site_url' => 'https://whc.unesco.org/en/list/668/',
66+
'unesco_site_url' => 'https://whc.unesco.org/en/list/1133/',
67+
'state_party_codes' => [
68+
'AL','AT','BE','BA','BG','HR','CZ','FR','DE','IT','MK','PL','RO','SK','SI','ES','CH','UA'
69+
],
70+
'state_parties_meta' => [
71+
'AL' => ['is_primary' => false, 'inscription_year' => 2007],
72+
'AT' => ['is_primary' => false, 'inscription_year' => 2007],
73+
'BE' => ['is_primary' => false, 'inscription_year' => 2007],
74+
'BA' => ['is_primary' => false, 'inscription_year' => 2007],
75+
'BG' => ['is_primary' => false, 'inscription_year' => 2007],
76+
'HR' => ['is_primary' => false, 'inscription_year' => 2007],
77+
'CZ' => ['is_primary' => false, 'inscription_year' => 2007],
78+
'FR' => ['is_primary' => false, 'inscription_year' => 2007],
79+
'DE' => ['is_primary' => false, 'inscription_year' => 2007],
80+
'IT' => ['is_primary' => false, 'inscription_year' => 2007],
81+
'MK' => ['is_primary' => false, 'inscription_year' => 2007],
82+
'PL' => ['is_primary' => false, 'inscription_year' => 2007],
83+
'RO' => ['is_primary' => false, 'inscription_year' => 2007],
84+
'SK' => ['is_primary' => true, 'inscription_year' => 2007],
85+
'SI' => ['is_primary' => false, 'inscription_year' => 2007],
86+
'ES' => ['is_primary' => false, 'inscription_year' => 2007],
87+
'CH' => ['is_primary' => false, 'inscription_year' => 2007],
88+
'UA' => ['is_primary' => false, 'inscription_year' => 2007],
89+
],
6190
];
6291
}
6392

@@ -153,6 +182,14 @@ private function mockDto(): WorldHeritageDto
153182
->shouldReceive('getUnescoSiteUrl')
154183
->andReturn($this->requestData()['unesco_site_url']);
155184

185+
$mock
186+
->shouldReceive('getStatePartyCodes')
187+
->andReturn($this->requestData()['state_party_codes']);
188+
189+
$mock
190+
->shouldReceive('getStatePartiesMeta')
191+
->andReturn($this->requestData()['state_parties_meta'] ?? []);
192+
156193
return $mock;
157194
}
158195

@@ -185,5 +222,25 @@ public function test_controller_check_value(): void
185222
);
186223

187224
$this->assertEquals(201, $result->getStatusCode());
225+
$this->assertEquals($this->requestData()['id'], $result->getOriginalContent()['data']['id']);
226+
$this->assertEquals($this->requestData()['unesco_id'], $result->getOriginalContent()['data']['unesco_id']);
227+
$this->assertEquals($this->requestData()['official_name'], $result->getOriginalContent()['data']['official_name']);
228+
$this->assertEquals($this->requestData()['name'], $result->getOriginalContent()['data']['name']);
229+
$this->assertEquals($this->requestData()['name_jp'], $result->getOriginalContent()['data']['name_jp']);
230+
$this->assertEquals($this->requestData()['country'], $result->getOriginalContent()['data']['country']);
231+
$this->assertEquals($this->requestData()['region'], $result->getOriginalContent()['data']['region']);
232+
$this->assertEquals($this->requestData()['category'], $result->getOriginalContent()['data']['category']);
233+
$this->assertEquals($this->requestData()['criteria'], $result->getOriginalContent()['data']['criteria']);
234+
$this->assertEquals($this->requestData()['year_inscribed'], $result->getOriginalContent()['data']['year_inscribed']);
235+
$this->assertEquals($this->requestData()['area_hectares'], $result->getOriginalContent()['data']['area_hectares']);
236+
$this->assertEquals($this->requestData()['buffer_zone_hectares'], $result->getOriginalContent()['data']['buffer_zone_hectares']);
237+
$this->assertEquals($this->requestData()['is_endangered'], $result->getOriginalContent()['data']['is_endangered']);
238+
$this->assertEquals($this->requestData()['latitude'], $result->getOriginalContent()['data']['latitude']);
239+
$this->assertEquals($this->requestData()['longitude'], $result->getOriginalContent()['data']['longitude']);
240+
$this->assertEquals($this->requestData()['short_description'], $result->getOriginalContent()['data']['short_description']);
241+
$this->assertEquals($this->requestData()['image_url'], $result->getOriginalContent()['data']['image_url']);
242+
$this->assertEquals($this->requestData()['unesco_site_url'], $result->getOriginalContent()['data']['unesco_site_url']);
243+
$this->assertEquals($this->requestData()['state_party_codes'], $result->getOriginalContent()['data']['state_party_codes']);
244+
$this->assertEquals($this->requestData()['state_parties_meta'], $result->getOriginalContent()['data']['state_parties_meta']);
188245
}
189246
}

src/app/Packages/Features/QueryUseCases/Dto/WorldHeritageDto.php

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -133,16 +133,6 @@ public function getStatePartiesMeta(): array
133133
return $this->statePartiesMeta;
134134
}
135135

136-
public function getPrimaryStatePartyCode(): ?string
137-
{
138-
return $this->primaryStatePartyCode;
139-
}
140-
141-
public function isTransnational(): bool
142-
{
143-
return $this->isTransnational;
144-
}
145-
146136
public function getStatePartyCodesOrFallback(): array
147137
{
148138
if ($this->statePartyCodes)
@@ -181,8 +171,6 @@ public function toArray(): array
181171
'unesco_site_url' => $this->getUnescoSiteUrl(),
182172
'state_parties' => $this->getStatePartyCodes(),
183173
'state_parties_meta' => $this->getStatePartiesMeta(),
184-
'primary_state_party_code' => $this->getPrimaryStatePartyCode(),
185-
'is_transnational' => $this->isTransnational()
186174
];
187175
}
188176
}

src/app/Packages/Features/QueryUseCases/Factory/WorldHeritageListQueryFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public static function build(array $request): WorldHeritageListQuery
4444
short_description: $request['short_description'] ?? null,
4545
image_url: $request['image_url'] ?? null,
4646
unesco_site_url: $request['unesco_site_url'] ?? null,
47+
state_parties_codes: $request['state_party_codes'] ?? [],
48+
state_parties_meta: $request['state_parties_meta'] ?? []
4749
);
4850
}
4951

src/app/Packages/Features/QueryUseCases/ListQuery/WorldHeritageListQuery.php

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ public function __construct(
2323
private readonly ?float $buffer_zone_hectares,
2424
private readonly ?string $short_description,
2525
private readonly ?string $image_url,
26-
private readonly ?string $unesco_site_url
26+
private readonly ?string $unesco_site_url,
27+
private readonly ?array $state_parties_codes = null,
28+
private readonly ?array $state_parties_meta = null
2729
){}
2830

2931
public function getId(): ?int
@@ -121,6 +123,30 @@ public function getUnescoSiteUrl(): ?string
121123
return $this->unesco_site_url;
122124
}
123125

126+
public function getStatePartyCodes(): array
127+
{
128+
return $this->state_parties_codes ?: $this->getStatePartyCodesOrFallback();
129+
}
130+
131+
public function getStatePartiesMeta(): array
132+
{
133+
return $this->state_parties_meta ?: [];
134+
}
135+
136+
public function getStatePartyCodesOrFallback(): array
137+
{
138+
if ($this->state_parties_codes)
139+
return $this->state_parties_codes;
140+
141+
if (!$this->state_party)
142+
return [];
143+
144+
$parts = preg_split('/[;,\s]+/', strtoupper($this->state_party));
145+
$codes = array_filter($parts, fn($country) => preg_match('/^[A-Z]{2}$/', $country));
146+
147+
return array_values(array_unique($codes));
148+
}
149+
124150
public function toArray(): array
125151
{
126152
return [
@@ -141,7 +167,9 @@ public function toArray(): array
141167
'buffer_zone_hectares' => $this->getBufferZoneHectares(),
142168
'short_description' => $this->getShortDescription(),
143169
'image_url' => $this->getImageUrl(),
144-
'unesco_site_url' => $this->getUnescoSiteUrl()
170+
'unesco_site_url' => $this->getUnescoSiteUrl(),
171+
'state_parties_codes' => $this->getStatePartyCodes(),
172+
'state_parties_meta' => $this->getStatePartiesMeta()
145173
];
146174
}
147175
}

0 commit comments

Comments
 (0)