Skip to content

Commit

Permalink
Handle Edge Cases from old times
Browse files Browse the repository at this point in the history
  • Loading branch information
pascalvb committed Sep 9, 2024
1 parent 5309264 commit e8cc59d
Show file tree
Hide file tree
Showing 8 changed files with 26 additions and 14 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ phpunit.xml
.phpunit.result.cache
###< phpunit/general ###
/.php-cs-fixer.cache
/docker/config/composer-auth.json
8 changes: 4 additions & 4 deletions src/Model/Polis/PolisResult.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ public static function createFromArray(array $data): self
return new self(
location: PolisVoteLocation::createFromArray($data['Location']),
absolute: new PolisResultAbsolute(
yes: $data['Absolute']['Yes'],
no: $data['Absolute']['No'],
yes: $data['Absolute']['Yes'] ?? 0,
no: $data['Absolute']['No'] ?? 0,
),
relative: new PolisResultRelative(
yes: $data['Relative']['Yes'],
no: $data['Relative']['No'],
yes: $data['Relative']['Yes'] ?? 0,
no: $data['Relative']['No'] ?? 0,
participation: $data['Relative']['Participation'] ?? null,
),
dataCondition: PolisDataCondition::from($data['DataCondition']['id']),
Expand Down
4 changes: 2 additions & 2 deletions src/Model/Polis/PolisVoteLocation.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ public static function createFromArray(array $data): self
{
return new self(
id: $data['id'],
locationName: $data['LocationName'],
shortName: $data['ShortName'],
locationName: $data['LocationName'] ?? 'unbekannter Ort',
shortName: $data['ShortName'] ?? '??',
type: PolisVoteLocationType::createFromArray($data['LocationType']),
parentLocationId: $data['ParentLocationID'] ?? null,
electionPower: $data['ElectionPower'] ?? null,
Expand Down
2 changes: 1 addition & 1 deletion src/Model/Polis/PolisVoteLocationType.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public static function createFromArray(array $data): self
{
return new self(
id: $data['id'],
value: $data['Value'],
value: $data['Value'] ?? 'Unbekannt',
);
}
}
2 changes: 1 addition & 1 deletion src/Service/PolisClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public static function parsePolisDateTime(string $dateString): ?\DateTimeImmutab

if ($matches) {
$timestampMs = (int) $matches[1];
$timestampSec = $timestampMs / 1000;
$timestampSec = intval(round($timestampMs / 1000));

return (new \DateTimeImmutable())->setTimestamp($timestampSec);
}
Expand Down
1 change: 1 addition & 0 deletions tests/Unit/Mocks/votation_1591.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Items":[{"__type":"tpc.eMedia.PolisV2.Business.API.v1.Models.Export.Case, tpc.eMedia.PolisV2.Business","Title":"Abstimmung vom 09.02.2003 (ainp)","EventDate":"\/Date(1044745200000-0000)\/","EventDateSpecified":true,"id":"1225","active":false},{"__type":"tpc.eMedia.PolisV2.Business.API.v1.Models.Export.Votation, tpc.eMedia.PolisV2.Business","Results":[{"Result":[{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item3","Value":"abgelehnt"},"LastUpdate":"\/Date(1164450377000-0000)\/","Location":{"LocationType":{"id":"1","Value":"Land"},"LocationName":"Deutschland","ShortName":"DE","id":"30","locationNumber":"0"},"Absolute":{"Yes":"0","No":"0","EntitledToVote":"0","Votes":"0","Validvotes":"0"},"Relative":{"No":"100.0"},"id":"25504"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1164450377000-0000)\/","Location":{"LocationType":{"id":"1","Value":"Land"},"LocationName":"Schweiz","ShortName":"CH","id":"1","locationNumber":"0"},"Absolute":{"Yes":"1028673","No":"301128","EntitledToVote":"4755703","Votes":"1365354","Validvotes":"1329801"},"Relative":{"Yes":"77.4","No":"22.6","Participation":"28.7"},"id":"25503"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Aargau","ShortName":"AG","id":"3","locationNumber":"19"},"Absolute":{"Yes":"67270","No":"21125","EntitledToVote":"361381","Votes":"89684","Validvotes":"88395"},"Relative":{"Yes":"76.1","No":"23.9","Participation":"24.8"},"id":"23863"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":0.5,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Appenzell Ausserrhoden","ShortName":"AR","id":"4","locationNumber":"15"},"Absolute":{"Yes":"11487","No":"3623","EntitledToVote":"35862","Votes":"15367","Validvotes":"15110"},"Relative":{"Yes":"76.0","No":"24.0","Participation":"42.9"},"id":"23859"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":0.5,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Appenzell Innerrhoden","ShortName":"AI","id":"6","locationNumber":"16"},"Absolute":{"Yes":"1758","No":"517","EntitledToVote":"10173","Votes":"2302","Validvotes":"2275"},"Relative":{"Yes":"77.3","No":"22.7","Participation":"22.6"},"id":"23860"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":0.5,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Basel-Landschaft","ShortName":"BL","id":"7","locationNumber":"13"},"Absolute":{"Yes":"39247","No":"10642","EntitledToVote":"177936","Votes":"50864","Validvotes":"49889"},"Relative":{"Yes":"78.7","No":"21.3","Participation":"28.6"},"id":"23857"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":0.5,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Basel-Stadt","ShortName":"BS","id":"8","locationNumber":"12"},"Absolute":{"Yes":"39644","No":"9667","EntitledToVote":"117007","Votes":"50573","Validvotes":"49311"},"Relative":{"Yes":"80.4","No":"19.6","Participation":"43.2"},"id":"23856"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Bern","ShortName":"BE","id":"9","locationNumber":"2"},"Absolute":{"Yes":"126858","No":"34153","EntitledToVote":"681855","Votes":"163410","Validvotes":"161011"},"Relative":{"Yes":"78.8","No":"21.2","Participation":"24.0"},"id":"23846"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Freiburg","ShortName":"FR","id":"10","locationNumber":"10"},"Absolute":{"Yes":"25685","No":"8334","EntitledToVote":"162997","Votes":"34908","Validvotes":"34019"},"Relative":{"Yes":"75.5","No":"24.5","Participation":"21.4"},"id":"23854"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Genf","ShortName":"GE","id":"11","locationNumber":"25"},"Absolute":{"Yes":"64671","No":"12671","EntitledToVote":"217821","Votes":"78584","Validvotes":"77342"},"Relative":{"Yes":"83.6","No":"16.4","Participation":"36.1"},"id":"23869"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Glarus","ShortName":"GL","id":"12","locationNumber":"8"},"Absolute":{"Yes":"3530","No":"1124","EntitledToVote":"24847","Votes":"4730","Validvotes":"4654"},"Relative":{"Yes":"75.8","No":"24.2","Participation":"19.0"},"id":"23852"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Graubünden","ShortName":"GR","id":"13","locationNumber":"18"},"Absolute":{"Yes":"19657","No":"4787","EntitledToVote":"129155","Votes":"25168","Validvotes":"24444"},"Relative":{"Yes":"80.4","No":"19.6","Participation":"19.5"},"id":"23862"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Jura","ShortName":"JU","id":"14","locationNumber":"26"},"Absolute":{"Yes":"7069","No":"2746","EntitledToVote":"48239","Votes":"10191","Validvotes":"9815"},"Relative":{"Yes":"72.0","No":"28.0","Participation":"21.1"},"id":"23870"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Luzern","ShortName":"LU","id":"15","locationNumber":"3"},"Absolute":{"Yes":"53956","No":"13250","EntitledToVote":"236186","Votes":"68258","Validvotes":"67206"},"Relative":{"Yes":"80.3","No":"19.7","Participation":"28.9"},"id":"23847"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Neuenburg","ShortName":"NE","id":"16","locationNumber":"24"},"Absolute":{"Yes":"31945","No":"7789","EntitledToVote":"104635","Votes":"40524","Validvotes":"39734"},"Relative":{"Yes":"80.4","No":"19.6","Participation":"38.7"},"id":"23868"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":0.5,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Nidwalden","ShortName":"NW","id":"17","locationNumber":"7"},"Absolute":{"Yes":"5911","No":"1746","EntitledToVote":"27956","Votes":"7928","Validvotes":"7657"},"Relative":{"Yes":"77.2","No":"22.8","Participation":"28.4"},"id":"23851"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":0.5,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Obwalden","ShortName":"OW","id":"18","locationNumber":"6"},"Absolute":{"Yes":"4491","No":"1213","EntitledToVote":"22863","Votes":"5847","Validvotes":"5704"},"Relative":{"Yes":"78.7","No":"21.3","Participation":"25.6"},"id":"23850"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Schaffhausen","ShortName":"SH","id":"19","locationNumber":"14"},"Absolute":{"Yes":"17092","No":"4975","EntitledToVote":"47980","Votes":"25049","Validvotes":"22067"},"Relative":{"Yes":"77.5","No":"22.5","Participation":"52.2"},"id":"23858"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Schwyz","ShortName":"SZ","id":"20","locationNumber":"5"},"Absolute":{"Yes":"22966","No":"8235","EntitledToVote":"89187","Votes":"32416","Validvotes":"31201"},"Relative":{"Yes":"73.6","No":"26.4","Participation":"36.3"},"id":"23849"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Solothurn","ShortName":"SO","id":"22","locationNumber":"11"},"Absolute":{"Yes":"34025","No":"10598","EntitledToVote":"165701","Votes":"45110","Validvotes":"44623"},"Relative":{"Yes":"76.2","No":"23.8","Participation":"27.2"},"id":"23855"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"St. Gallen","ShortName":"SG","id":"21","locationNumber":"17"},"Absolute":{"Yes":"60489","No":"21124","EntitledToVote":"289986","Votes":"82538","Validvotes":"81613"},"Relative":{"Yes":"74.1","No":"25.9","Participation":"28.5"},"id":"23861"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Tessin","ShortName":"TI","id":"23","locationNumber":"21"},"Absolute":{"Yes":"27989","No":"8947","EntitledToVote":"198284","Votes":"38926","Validvotes":"36936"},"Relative":{"Yes":"75.8","No":"24.2","Participation":"19.6"},"id":"23865"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Thurgau","ShortName":"TG","id":"24","locationNumber":"20"},"Absolute":{"Yes":"40770","No":"12849","EntitledToVote":"145238","Votes":"56938","Validvotes":"53619"},"Relative":{"Yes":"76.0","No":"24.0","Participation":"39.2"},"id":"23864"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Uri","ShortName":"UR","id":"25","locationNumber":"4"},"Absolute":{"Yes":"5332","No":"2219","EntitledToVote":"25495","Votes":"7982","Validvotes":"7551"},"Relative":{"Yes":"70.6","No":"29.4","Participation":"31.3"},"id":"23848"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Waadt","ShortName":"VD","id":"26","locationNumber":"22"},"Absolute":{"Yes":"76628","No":"33408","EntitledToVote":"372764","Votes":"113902","Validvotes":"110036"},"Relative":{"Yes":"69.6","No":"30.4","Participation":"30.6"},"id":"23866"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Wallis","ShortName":"VS","id":"27","locationNumber":"23"},"Absolute":{"Yes":"19753","No":"6994","EntitledToVote":"188111","Votes":"27751","Validvotes":"26747"},"Relative":{"Yes":"73.9","No":"26.1","Participation":"14.8"},"id":"23867"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Zug","ShortName":"ZG","id":"28","locationNumber":"9"},"Absolute":{"Yes":"15937","No":"4074","EntitledToVote":"66568","Votes":"20299","Validvotes":"20011"},"Relative":{"Yes":"79.6","No":"20.4","Participation":"30.5"},"id":"23853"},{"DataCondition":{"id":"Item3","Value":"Resultat"},"ResultCondition":{"id":"Item2","Value":"angenommen"},"LastUpdate":"\/Date(1163590798000-0000)\/","Location":{"ParentLocationID":"1","ElectionPower":1,"LocationType":{"id":"2","Value":"Kanton"},"LocationName":"Zürich","ShortName":"ZH","id":"29","locationNumber":"1"},"Absolute":{"Yes":"204513","No":"54318","EntitledToVote":"807476","Votes":"266105","Validvotes":"258831"},"Relative":{"Yes":"79.0","No":"21.0","Participation":"33.0"},"id":"23845"}],"dataConditionID":"Item3","dataConditionIDSpecified":true}],"Title":"Bundesgesetz über die Anpassung der kantonalen Beiträge an Spitalbehandlungen","IndividualTitle":"Bundesgesetz über die Anpassung der kantonalen Beiträge an Spitalbehandlungen","VotationLocation":{"LocationType":{"id":"1","Value":"Land"},"LocationName":"Schweiz","ShortName":"CH","id":"1","locationNumber":"0"},"VoteType":{"Name":"Fakultatives Referendum","ScoreMore":false,"ShortName":"F","id":"2"},"adminid":"494","id":"1591"}],"language":"DE"}
1 change: 1 addition & 0 deletions tests/Unit/Mocks/votation_5006.json

Large diffs are not rendered by default.

21 changes: 15 additions & 6 deletions tests/Unit/PolisClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,24 @@

class PolisClientTest extends TestCase
{
public function testPolisClientTransformsApiDataCorrectly(): void
/**
* @dataProvider polisCaseDataProvider
*/
public function testPolisClientTransformsApiDataCorrectly($caseId, $data): void
{
$id = '5007';
$testData = file_get_contents(__DIR__.'/Mocks/votation_'.$id.'.json');
$response = new MockResponse($testData);
$response = new MockResponse($data);
$httpClient = new MockHttpClient($response);
$polisClient = new PolisClient($httpClient);
$votation = $polisClient->fetchPolisVotationById($id, 'de');
$votation = $polisClient->fetchPolisVotationById($caseId, 'de');
$this->assertInstanceOf(PolisVotation::class, $votation);
$this->assertEquals($id, $votation->id);
$this->assertEquals($caseId, $votation->id);
}

public function polisCaseDataProvider(): \Generator
{
$cases = ['1591', '5006', '5007'];
foreach ($cases as $caseId) {
yield [$caseId, file_get_contents(__DIR__.'/Mocks/votation_'.$caseId.'.json')];
}
}
}

0 comments on commit e8cc59d

Please sign in to comment.