From fea072ff83ec205b4d61001692346109adcc54a5 Mon Sep 17 00:00:00 2001 From: Steph Sako Date: Mon, 19 Dec 2022 20:50:03 +0100 Subject: [PATCH 1/8] Fix data encoding only for content-type in "text/html; charset=UTF-8" --- src/Service/FFTTClient.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Service/FFTTClient.php b/src/Service/FFTTClient.php index 8c7d286..91becd7 100644 --- a/src/Service/FFTTClient.php +++ b/src/Service/FFTTClient.php @@ -51,6 +51,11 @@ private function send(string $uri): array $content = preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $content); $content = html_entity_decode($content); + // Some requests have a different header than others, whose data must be correctly encoded + if ($response->hasHeader('content-type') && $response->getHeader('content-type')[0] == 'text/html; charset=UTF-8') { + $content = mb_convert_encoding($content, 'ISO-8859-1', 'UTF-8'); + } + $xml = simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA); /** @var string $encoded */ From 427919e561200d7e00595e8e8ca4bc809e9d51f2 Mon Sep 17 00:00:00 2001 From: Antoine Lamirault Date: Wed, 21 Dec 2022 00:15:01 +0100 Subject: [PATCH 2/8] Add tests --- src/Service/FFTTClient.php | 2 +- tests/Unit/Service/FFTTClientTest.php | 60 ++++++++++++++++++ .../Operation/ListActualiteOperationTest.php | 6 +- tests/Unit/Service/fixtures/actualite.xml | 61 +++++++------------ .../Service/fixtures/response_with_accent.xml | 4 ++ 5 files changed, 91 insertions(+), 42 deletions(-) create mode 100644 tests/Unit/Service/fixtures/response_with_accent.xml diff --git a/src/Service/FFTTClient.php b/src/Service/FFTTClient.php index 91becd7..dcdc964 100644 --- a/src/Service/FFTTClient.php +++ b/src/Service/FFTTClient.php @@ -52,7 +52,7 @@ private function send(string $uri): array $content = html_entity_decode($content); // Some requests have a different header than others, whose data must be correctly encoded - if ($response->hasHeader('content-type') && $response->getHeader('content-type')[0] == 'text/html; charset=UTF-8') { + if ($response->hasHeader('content-type') && 'text/html; charset=UTF-8' === $response->getHeader('content-type')[0]) { $content = mb_convert_encoding($content, 'ISO-8859-1', 'UTF-8'); } diff --git a/tests/Unit/Service/FFTTClientTest.php b/tests/Unit/Service/FFTTClientTest.php index a53f9d0..1f6e3c1 100644 --- a/tests/Unit/Service/FFTTClientTest.php +++ b/tests/Unit/Service/FFTTClientTest.php @@ -37,4 +37,64 @@ public function testGetWithAccent(): void $this->assertSame('Côme', $response['licence']['prenom']); } + + /** + * @covers ::get + * @covers ::send + * + * @param array $responseHeaders + * + * @dataProvider getDecodingFromContentTypeData + */ + public function testConvertEncoding(array $responseHeaders, string $expected): void + { + /** @var string $content */ + $content = file_get_contents(__DIR__.'/fixtures/response_with_accent.xml'); + + $mock = new MockHandlerStub([ + new Response(200, $responseHeaders, $content), + ]); + + $handlerStack = HandlerStack::create($mock); + $clientStub = new Client(['handler' => $handlerStack]); + $client = new FFTTClient($clientStub, new UriGenerator('foo', 'bar')); + + /** @var array{foo: string} $response */ + $response = $client->get('bar'); + + $this->assertSame($expected, $response['foo']); + } + + /** + * @return \Generator> + */ + public static function getDecodingFromContentTypeData(): \Generator + { + yield 'No header must not convert encoding' => [ + [ + ], + 'opération', + ]; + + yield 'One charset UTF-8 header must convert encoding' => [ + [ + 'content-type' => ['text/html; charset=UTF-8'], + ], + 'opération', + ]; + + yield 'One charset ISO-8859-1 header must not convert encoding' => [ + [ + 'content-type' => ['text/html; charset=ISO-8859-1'], + ], + 'opération', + ]; + + yield 'Multi charset header must use first' => [ + [ + 'content-type' => ['text/html; charset=UTF-8', 'text/html; charset=ISO-8859-1'], + ], + 'opération', + ]; + } } diff --git a/tests/Unit/Service/Operation/ListActualiteOperationTest.php b/tests/Unit/Service/Operation/ListActualiteOperationTest.php index 2660c49..f9c5570 100644 --- a/tests/Unit/Service/Operation/ListActualiteOperationTest.php +++ b/tests/Unit/Service/Operation/ListActualiteOperationTest.php @@ -24,7 +24,9 @@ public function testListActualites(): void /** @var string $responseContent */ $responseContent = file_get_contents(__DIR__.'/../fixtures/actualite.xml'); $mock = new MockHandlerStub([ - new Response(200, [], $responseContent), + new Response(200, [ + 'content-type' => ['text/html; charset=UTF-8'], + ], $responseContent), ]); $handlerStack = HandlerStack::create($mock); @@ -40,7 +42,7 @@ public function testListActualites(): void $actualite = $result[0]; $this->assertSame('Ping santé', $actualite->getCategorie()); $this->assertSame('2022-10-07T00:00:00+00:00', $actualite->getDate()->format(DATE_ATOM)); - $this->assertSame('Du 12 au 16 octobre, les Championnats du Monde Ping Parkinson se dérouleront à Pula en Croatie. Cinq Français seront présents lors de cette compétition.', $actualite->getDescription()); + $this->assertStringContainsString('Du 12 au 16 octobre, les Championnats du Monde Ping Parkinson se dérouleront à Pula en Croatie. Cinq Français seront présents lors de cette compétition.', $actualite->getDescription()); $this->assertSame('https://www.fftt.com/site/medias/news/news__20221007145001.jpg', $actualite->getPhoto()); $this->assertSame('Les Championnats du Monde Ping Parkinson débutent mercredi !', $actualite->getTitre()); $this->assertSame('https://www.fftt.com/site/actualites/2022-10-07/les-championnats-monde-ping-parkinson-debutent-mercredi', $actualite->getUrl()); diff --git a/tests/Unit/Service/fixtures/actualite.xml b/tests/Unit/Service/fixtures/actualite.xml index e291d2b..eefc1f7 100644 --- a/tests/Unit/Service/fixtures/actualite.xml +++ b/tests/Unit/Service/fixtures/actualite.xml @@ -1,24 +1,22 @@ - - + 2022-10-07 - Les Championnats du Monde Ping Parkinson dbutent mercredi ! - Du 12 au 16 octobre, les Championnats du Monde Ping Parkinson se drouleront Pula en Croatie. Cinq Franais seront prsents lors de cette comptition. + Les Championnats du Monde Ping Parkinson débutent mercredi ! + Du 12 au 16 octobre, les Championnats du Monde Ping Parkinson se dérouleront à Pula en Croatie. Cinq Français seront présents lors de cette compétition. + + Avoir la... https://www.fftt.com/site/actualites/2022-10-07/les-championnats-monde-ping-parkinson-debutent-mercredi https://www.fftt.com/site/medias/news/news__20221007145001.jpg - Ping sant + Ping santé - 2022-10-07 Si proches... - L'quipe de France masculine s'incline 2 matchs 3 face l'Allemagne et quitte la comptition aux - portes des demi-finales. + L'équipe de France masculine s'incline 2 matchs à 3 face à l'Allemagne et quitte la compétition aux portes des demi-finales. Si proches … - Le... - + Le... https://www.fftt.com/site/actualites/2022-10-07/si-proches https://www.fftt.com/site/medias/news/news__20221007093621.jpg Championnats du Monde @@ -26,9 +24,7 @@ 2022-10-06 La revanche ? Les Bleus joueront les Allemands en 1/4 de finale - Les Bleus affronteront donc l'Allemagne pour un quart de finale qui aura un air de revanche puisque - les Franais s'taient inclins 3 matchs 1 en phase de... - + Les Bleus affronteront donc l'Allemagne pour un quart de finale qui aura un air de revanche puisque les Français s'étaient inclinés 3 matchs à 1 en phase de... https://www.fftt.com/site/actualites/2022-10-06/la-revanche-bleus-joueront-allemands-en-1-4-de-finale https://www.fftt.com/site/medias/news/news__20221006175007.jpg Championnats du Monde @@ -36,9 +32,7 @@ 2022-10-05 Les Bleus sont en quarts de finale ! - Cette aprs-midi les Franais se sont qualifis pour les quarts de finale des championnats du Monde - par quipes de Chengdu. En revanche, c'est malheureusement... - + Cette après-midi les Français se sont qualifiés pour les quarts de finale des championnats du Monde par équipes de Chengdu. En revanche, c'est malheureusement... https://www.fftt.com/site/actualites/2022-10-05/les-bleus-sont-en-quarts-de-finale https://www.fftt.com/site/medias/news/news__20221005184354.jpg Championnats du Monde @@ -46,19 +40,15 @@ 2022-09-21 Paris 2024 : A vos agendas pour obtenir vos billets ! - Le comit d'organisation de Paris 2024 a dvoil ce mardi 20 septembre la procdure pour obtenir - des billets pour assister aux preuves des prochains Jeux... - + Le comité d'organisation de Paris 2024 a dévoilé ce mardi 20 septembre la procédure pour obtenir des billets pour assister aux épreuves des prochains Jeux... https://www.fftt.com/site/actualites/2022-09-21/paris-2024-vos-agendas-pour-obtenir-vos-billets https://www.fftt.com/site/medias/news/news__20221005165214.jpg Paris 2024 2022-10-02 - Participez au webinaire de clture de l't Ping ! - La deuxime dition de l'opration t Ping s'est acheve le 21 septembre dernier ! A cette - occasion, la Fdration... - + Participez au webinaire de clôture de l'Été Ping ! + La deuxième édition de l'opération été Ping s'est achevée le 21 septembre dernier ! A cette occasion, la Fédération... https://www.fftt.com/site/actualites/2022-10-02/participez-webinaire-de-cloture-de-ete-ping https://www.fftt.com/site/medias/news/news__20221005130752.jpg Ete Ping @@ -66,41 +56,34 @@ 2022-10-04 Mondiaux 2022 : Les Bleu(e)s en phases finales ! - C'tait trs tOt ce matin, les filles dcrochaient leur ticket pour les huitimes de finale des - championnats du Monde par quipes face au Brsil,... - + C'était très tOt ce matin, les filles décrochaient leur ticket pour les huitièmes de finale des championnats du Monde par équipes face au Brésil,... https://www.fftt.com/site/actualites/2022-10-04/mondiaux-2022-bleu-e-s-en-phases-finales https://www.fftt.com/site/medias/news/news__20221004192731.jpg Championnats du Monde 2022-10-04 - Retour sur le TOP 10 europen jeunes de Tours - Le TOP 10 europen jeunes se droulait Tours le 30 septembre, 1er et 2 octobre. Une dition - organise pour la seconde anne conscutive au... - + Retour sur le TOP 10 européen jeunes de Tours + Le TOP 10 européen jeunes se déroulait à Tours le 30 septembre, 1er et 2 octobre. Une édition organisée pour la seconde année consécutive au... https://www.fftt.com/site/actualites/2022-10-04/retour-top-10-europeen-jeunes-de-tours https://www.fftt.com/site/medias/news/news__20221004165606.jpg TOP 10 2022-10-04 - Retour sur l?opration Tous les jours tous en forme ! - Faire bouger et jouer les usagers des transports parisiens au moins quinze minutes par jour, voil - l'objectif vis par la RATP et la FFTT dans le cadre de l'opration... - + Retour sur l’opération « Tous les jours tous en forme » ! + Faire bouger et jouer les usagers des transports parisiens au moins quinze minutes par jour, voilà l'objectif visé par la RATP et la FFTT dans le cadre de l'opération... https://www.fftt.com/site/actualites/2022-10-04/retour-operation-tous-jours-tous-en-forme https://www.fftt.com/site/medias/news/news__20221004105215.jpg - Ping sant + Ping santé 2022-10-03 - La FFTT et la socit KOMPAN deviennent partenaires - La FFTT et la socit KOMPAN deviennent partenaires + La FFTT et la société KOMPAN deviennent partenaires + La FFTT et la société KOMPAN deviennent partenaires - La Fdration Franaise de Tennis de Table (FFTT) et KOMPAN s'associent pour le dploiement de... - + La Fédération Française de Tennis de Table (FFTT) et KOMPAN s'associent pour le déploiement de... https://www.fftt.com/site/actualites/2022-10-03/la-fftt-et-societe-kompan-deviennent-partenaires https://www.fftt.com/site/medias/news/news__20221003103600.jpg Partenariat diff --git a/tests/Unit/Service/fixtures/response_with_accent.xml b/tests/Unit/Service/fixtures/response_with_accent.xml new file mode 100644 index 0000000..06358ad --- /dev/null +++ b/tests/Unit/Service/fixtures/response_with_accent.xml @@ -0,0 +1,4 @@ + + + opération + \ No newline at end of file From eb4f6f7be546c645f4d5efe1bd511be34651015e Mon Sep 17 00:00:00 2001 From: Steph Sako Date: Fri, 10 Mar 2023 23:45:31 +0100 Subject: [PATCH 3/8] Add xml_liste_joueur_o's unit tests and format players' names, clean RencontreDetailsFactory's code, add /Model/Joueur properties "echelon" and "place" --- src/Model/Factory/RencontreDetailsFactory.php | 20 +++-- src/Model/Joueur.php | 20 ++++- src/Service/FFTTApi.php | 4 +- src/Service/Operation/ListJoueurOperation.php | 15 +++- .../Operation/ListJoueurOperationTest.php | 52 ++++++++++++ .../RetrieveRencontreDetailsOperationTest.php | 12 +-- .../liste_joueurs_xml_liste_joueur_o.xml | 80 +++++++++++++++++++ .../test_2/liste_joueurs_equ_a.xml | 2 +- .../test_2/liste_joueurs_equ_b.xml | 2 +- 9 files changed, 177 insertions(+), 30 deletions(-) create mode 100644 tests/Unit/Service/Operation/ListJoueurOperationTest.php create mode 100644 tests/Unit/Service/fixtures/ListJoueurOperationTest/liste_joueurs_xml_liste_joueur_o.xml diff --git a/src/Model/Factory/RencontreDetailsFactory.php b/src/Model/Factory/RencontreDetailsFactory.php index b774e52..288616e 100644 --- a/src/Model/Factory/RencontreDetailsFactory.php +++ b/src/Model/Factory/RencontreDetailsFactory.php @@ -157,9 +157,7 @@ private function formatJoueur(string $prenom, string $nom, string $points, array } foreach ($joueursClub as $joueurClub) { - $nomJoueurClub = $this->nomPrenomExtractor->removeSeparatorsDuplication($joueurClub->getNom()); - $prenomJoueurClub = $this->nomPrenomExtractor->removeSeparatorsDuplication($joueurClub->getPrenom()); - if ($nomJoueurClub === Accentuation::remove($nom) && $prenomJoueurClub === $prenom) { + if ($joueurClub->getNom() === Accentuation::remove($nom) && $joueurClub->getPrenom() === $prenom) { $return = preg_match('/^(N°[0-9]*- ){0,1}(?[A-Z]{1}) (?[0-9]+)pts$/', $points, $result); if (false === $return) { @@ -169,8 +167,8 @@ private function formatJoueur(string $prenom, string $nom, string $points, array $playerPoints = $result['points']; return new Joueur( - $nomJoueurClub, - $prenomJoueurClub, + $joueurClub->getNom(), + $joueurClub->getPrenom(), $joueurClub->getLicence(), (int) $playerPoints, $sexe @@ -192,15 +190,15 @@ private function getParties(array $data): array foreach ($data as $partieData) { $setDetails = explode(' ', $partieData['detail']); - /** @var string $adverssaireA */ - $adverssaireA = is_array($partieData['ja']) ? 'Absent Absent' : $this->nomPrenomExtractor->removeSeparatorsDuplication($partieData['ja']); + /** @var string $adversaireA */ + $adversaireA = is_array($partieData['ja']) ? 'Absent Absent' : $this->nomPrenomExtractor->removeSeparatorsDuplication($partieData['ja']); - /** @var string $adverssaireB */ - $adverssaireB = is_array($partieData['jb']) ? 'Absent Absent' : $this->nomPrenomExtractor->removeSeparatorsDuplication($partieData['jb']); + /** @var string $adversaireB */ + $adversaireB = is_array($partieData['jb']) ? 'Absent Absent' : $this->nomPrenomExtractor->removeSeparatorsDuplication($partieData['jb']); $parties[] = new Partie( - $adverssaireA, - $adverssaireB, + $adversaireA, + $adversaireB, '-' === $partieData['scorea'] ? 0 : (int) $partieData['scorea'], '-' === $partieData['scoreb'] ? 0 : (int) $partieData['scoreb'], $setDetails diff --git a/src/Model/Joueur.php b/src/Model/Joueur.php index f635c37..aba7fed 100644 --- a/src/Model/Joueur.php +++ b/src/Model/Joueur.php @@ -5,7 +5,9 @@ final class Joueur { /** - * @param string|null $points Points du joueur ou classement si classé dans les 1000 premiers français + * @param int|null $points Points du joueur ou classement si classé dans les 1000 premiers français + * @param string|null $echelon Egal à 'N' si classé dans les 1000 premiers français, sinon null + * @param int|null $place Classement national si classé dans les 1000 premiers français */ public function __construct( private readonly string $licence, @@ -13,7 +15,9 @@ public function __construct( private readonly string $club, private readonly string $nom, private readonly string $prenom, - private readonly ?string $points, + private readonly ?int $points, + private readonly ?string $echelon = null, + private readonly ?int $place = null, ) {} public function getLicence(): string @@ -41,8 +45,18 @@ public function getPrenom(): string return $this->prenom; } - public function getPoints(): ?string + public function getPoints(): ?int { return $this->points; } + + public function getEchelon(): ?string + { + return $this->echelon; + } + + public function getPlace(): ?int + { + return $this->place; + } } diff --git a/src/Service/FFTTApi.php b/src/Service/FFTTApi.php index e249e04..2e5075b 100644 --- a/src/Service/FFTTApi.php +++ b/src/Service/FFTTApi.php @@ -73,13 +73,13 @@ public function __construct(string $id, string $password) $clubFactory = new ClubFactory(); $this->listClubOperation = new ListClubOperation($FFTTClient, $clubFactory, $arrayWrapper); + $nomPrenomExtractor = new NomPrenomExtractor(); $this->retrieveClubDetailsOperation = new RetrieveClubDetailsOperation($FFTTClient, $this->listClubOperation); - $this->listJoueurOperation = new ListJoueurOperation($FFTTClient, $arrayWrapper); + $this->listJoueurOperation = new ListJoueurOperation($FFTTClient, $arrayWrapper, $nomPrenomExtractor); $this->retrieveJoueurDetailsOperation = new RetrieveJoueurDetailsOperation($FFTTClient); $this->retrieveClassementOperation = new RetrieveClassementOperation($FFTTClient); $this->listHistoriqueOperation = new ListHistoriqueOperation($FFTTClient, $arrayWrapper); - $nomPrenomExtractor = new NomPrenomExtractor(); $this->listPartieOperation = new ListPartieOperation($FFTTClient, $arrayWrapper, $nomPrenomExtractor); $pointCalculator = new PointCalculator(); diff --git a/src/Service/Operation/ListJoueurOperation.php b/src/Service/Operation/ListJoueurOperation.php index 63bb80e..cbd7437 100644 --- a/src/Service/Operation/ListJoueurOperation.php +++ b/src/Service/Operation/ListJoueurOperation.php @@ -7,12 +7,14 @@ use Alamirault\FFTTApi\Exception\InvalidResponseException; use Alamirault\FFTTApi\Model\Joueur; use Alamirault\FFTTApi\Service\FFTTClientInterface; +use Alamirault\FFTTApi\Service\NomPrenomExtractorInterface; final class ListJoueurOperation { public function __construct( private readonly FFTTClientInterface $client, private readonly ArrayWrapper $arrayWrapper, + private readonly NomPrenomExtractorInterface $nomPrenomExtractor, ) {} /** @@ -36,9 +38,12 @@ public function listJoueursByClub(string $clubId): array $joueur['licence'], $joueur['nclub'], $joueur['club'], - $joueur['nom'], - $joueur['prenom'], - $joueur['points']); + $this->nomPrenomExtractor->removeSeparatorsDuplication(trim($joueur['nom'])), + $this->nomPrenomExtractor->removeSeparatorsDuplication(trim($joueur['prenom'])), + !is_array($joueur['points']) ? (int) $joueur['points'] : null, + !is_array($joueur['echelon']) ? $joueur['echelon'] : null, + !is_array($joueur['place']) ? (int) $joueur['place'] : null, + ); $result[] = $realJoueur; } @@ -69,7 +74,9 @@ public function listJoueursByNom(string $nom, string $prenom = ''): array $joueur['club'], $joueur['nom'], $joueur['prenom'], - $joueur['clast']); + $joueur['clast'] ? (int) $joueur['clast'] : null, + null, + null, ); $result[] = $realJoueur; } diff --git a/tests/Unit/Service/Operation/ListJoueurOperationTest.php b/tests/Unit/Service/Operation/ListJoueurOperationTest.php new file mode 100644 index 0000000..96c082a --- /dev/null +++ b/tests/Unit/Service/Operation/ListJoueurOperationTest.php @@ -0,0 +1,52 @@ + ['text/html; charset=UTF-8'], + ], $responseContent), + ]); + + $handlerStack = HandlerStack::create($mock); + $client = new Client(['handler' => $handlerStack]); + $FFTTClient = new FFTTClient($client, new UriGenerator('foo', 'bar')); + + $operation = new ListJoueurOperation($FFTTClient, new ArrayWrapper(), new NomPrenomExtractor()); + + $result = $operation->listJoueursByClub('05650412'); + + $this->assertCount(7, $result); + $this->assertEquals(new Joueur('9521866', 'CERGY PONTOISE', '05650412', 'HERNANDEZ', 'Francois', 816, null, null), $result[0]); + $this->assertEquals(new Joueur('9521899', 'CERGY PONTOISE', '05650412', "DE L'EPREVIER PAVRON - SEC", 'Domìtïlle', 812, null, null), $result[1]); + $this->assertEquals(new Joueur('9521877', 'CERGY PONTOISE', '05650412', 'NDJOM BASSANAGA', 'Moïse Çéliñó', 1216, null, null), $result[2]); + $this->assertEquals(new Joueur('95218367', 'CERGY PONTOISE', '05650412', 'ÂBBÄS', 'Ãbdel-Jælil', 1456, 'N', 924), $result[3]); + $this->assertEquals(new Joueur('9521870', 'CERGY PONTOISE', '05650412', 'GARBANI - LECOURT NEVEU', 'Dimitri - Sébastien', 1456, null, null), $result[4]); + $this->assertEquals(new Joueur('9521876', 'CERGY PONTOISE', '05650412', 'AMOR QUOINTEAU', 'Erwan', 756, null, null), $result[5]); + $this->assertEquals(new Joueur('9521888', 'CERGY PONTOISE', '05650412', 'MOREAU', 'Véronique', 1956, 'N', 54), $result[6]); + } +} diff --git a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php index 17434b1..b6482d4 100644 --- a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php +++ b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php @@ -48,10 +48,8 @@ public function testRetrieveRencontreDetailsByLien(): void $handlerStack = HandlerStack::create($mock); $client = new Client(['handler' => $handlerStack]); $FFTTClient = new FFTTClient($client, new UriGenerator('foo', 'bar')); - $arrayWrapper = new ArrayWrapper(); - $listJoueurOperation = new ListJoueurOperation($FFTTClient, $arrayWrapper); - $nomPrenomExtractor = new NomPrenomExtractor(); - $rencontreDetailsFactory = new RencontreDetailsFactory($nomPrenomExtractor, $listJoueurOperation); + $listJoueurOperation = new ListJoueurOperation($FFTTClient, new ArrayWrapper(), new NomPrenomExtractor()); + $rencontreDetailsFactory = new RencontreDetailsFactory(new NomPrenomExtractor(), $listJoueurOperation); $operation = new RetrieveRencontreDetailsOperation($FFTTClient, $rencontreDetailsFactory); /** @var RencontreDetails $result */ @@ -92,10 +90,8 @@ public function testRetrieveRencontreDetailsByLienWeirdFormattedPlayersNames(): $handlerStack = HandlerStack::create($mock); $client = new Client(['handler' => $handlerStack]); $FFTTClient = new FFTTClient($client, new UriGenerator('foo', 'bar')); - $arrayWrapper = new ArrayWrapper(); - $listJoueurOperation = new ListJoueurOperation($FFTTClient, $arrayWrapper); - $nomPrenomExtractor = new NomPrenomExtractor(); - $rencontreDetailsFactory = new RencontreDetailsFactory($nomPrenomExtractor, $listJoueurOperation); + $listJoueurOperation = new ListJoueurOperation($FFTTClient, new ArrayWrapper(), new NomPrenomExtractor()); + $rencontreDetailsFactory = new RencontreDetailsFactory(new NomPrenomExtractor(), $listJoueurOperation); $operation = new RetrieveRencontreDetailsOperation($FFTTClient, $rencontreDetailsFactory); /** @var RencontreDetails $result */ diff --git a/tests/Unit/Service/fixtures/ListJoueurOperationTest/liste_joueurs_xml_liste_joueur_o.xml b/tests/Unit/Service/fixtures/ListJoueurOperationTest/liste_joueurs_xml_liste_joueur_o.xml new file mode 100644 index 0000000..6337e08 --- /dev/null +++ b/tests/Unit/Service/fixtures/ListJoueurOperationTest/liste_joueurs_xml_liste_joueur_o.xml @@ -0,0 +1,80 @@ + + + + 9521866 + HERNANDEZ + Francois + 05650412 + CERGY PONTOISE + M + + + 816 + + + 9521899 + DE L'EPREVIER PAVRON - SEC + Domìtïlle + 05650412 + CERGY PONTOISE + F + + + 812 + + + 9521877 + NDJOM BASSANAGA + Moïse Çéliñó + 05650412 + CERGY PONTOISE + M + + + 1216 + + + 95218367 + ÂBBÄS + Ãbdel--Jælil + 05650412 + CERGY PONTOISE + M + N + 924 + 1456 + + + 9521870 + GARBANI - LECOURT NEVEU + Dimitri -- Sébastien + 05650412 + CERGY PONTOISE + M + + + 1456 + + + 9521876 + AMOR QUOINTEAU + Erwan + 05650412 + CERGY PONTOISE + M + + + 756 + + + 9521888 + MOREAU + Véronique + 05650412 + CERGY PONTOISE + F + N + 54 + 1956 + + \ No newline at end of file diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_a.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_a.xml index 78b724d..447a159 100644 --- a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_a.xml +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_a.xml @@ -1 +1 @@ -9536698BERNETLoris08950531MONTSOULT USMBMM5359541048DESROCHESDamien08950531MONTSOULT USMBMM5009537596HARDYMael08950531MONTSOULT USMBMM582953581MACCHIETTIJean08950531MONTSOULT USMBMM543 \ No newline at end of file +9536698BERNETLoris08950531MONTSOULT USMBMM5359541048DESROCHESDamien08950531MONTSOULT USMBMM5009537596HARDYMael08950531MONTSOULT USMBMM582953581 MACCHIETTIJean08950531MONTSOULT USMBMM543 \ No newline at end of file diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_b.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_b.xml index b551653..acb8d50 100644 --- a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_b.xml +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_b.xml @@ -1 +1 @@ -9533978AMOR QUOINTEAUErwan08951366BESSANCOURT TTBM7739233469MARIANNI--SAMSONEmmanuel08951366BESSANCOURT TTBM7239536798GARBANI - LECOURTDimitri08951366BESSANCOURT TTBM6339521619GARBANIFabrice08951366BESSANCOURT TTBM819 \ No newline at end of file +9533978 AMOR QUOINTEAUErwan08951366BESSANCOURT TTBM7739233469MARIANNI--SAMSON Emmanuel08951366BESSANCOURT TTBM7239536798GARBANI - LECOURTDimitri08951366BESSANCOURT TTBM6339521619GARBANIFabrice08951366BESSANCOURT TTBM819 \ No newline at end of file From 59f5899ba34e4a41fa9a41f7ec807f4d317dfe17 Mon Sep 17 00:00:00 2001 From: Steph Sako Date: Sat, 11 Mar 2023 01:33:59 +0100 Subject: [PATCH 4/8] Fix players comparison from club's players list if they have accents in nom --- src/Model/Factory/RencontreDetailsFactory.php | 3 +-- tests/Unit/Service/NomPrenomExtractorTest.php | 6 ++++++ .../RetrieveRencontreDetailsOperationTest.php | 10 +++++----- .../test_2/liste_joueurs_equ_a.xml | 2 +- .../test_2/rencontres_details_by_lien.xml | 10 +++++----- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/Model/Factory/RencontreDetailsFactory.php b/src/Model/Factory/RencontreDetailsFactory.php index 288616e..1e4f116 100644 --- a/src/Model/Factory/RencontreDetailsFactory.php +++ b/src/Model/Factory/RencontreDetailsFactory.php @@ -2,7 +2,6 @@ namespace Alamirault\FFTTApi\Model\Factory; -use Accentuation\Accentuation; use Alamirault\FFTTApi\Model\Rencontre\Joueur; use Alamirault\FFTTApi\Model\Rencontre\Partie; use Alamirault\FFTTApi\Model\Rencontre\RencontreDetails; @@ -157,7 +156,7 @@ private function formatJoueur(string $prenom, string $nom, string $points, array } foreach ($joueursClub as $joueurClub) { - if ($joueurClub->getNom() === Accentuation::remove($nom) && $joueurClub->getPrenom() === $prenom) { + if ($joueurClub->getNom() === $nom && $joueurClub->getPrenom() === $prenom) { $return = preg_match('/^(N°[0-9]*- ){0,1}(?[A-Z]{1}) (?[0-9]+)pts$/', $points, $result); if (false === $return) { diff --git a/tests/Unit/Service/NomPrenomExtractorTest.php b/tests/Unit/Service/NomPrenomExtractorTest.php index 057742c..9873cd6 100644 --- a/tests/Unit/Service/NomPrenomExtractorTest.php +++ b/tests/Unit/Service/NomPrenomExtractorTest.php @@ -125,5 +125,11 @@ public function getData(): \Generator "DE L'EPREVIER PAVRON - SEC", 'Domitille', ]; + + yield [ + 'SÉJOURNÉ Jérémy', + 'SÉJOURNÉ', + 'Jérémy', + ]; } } diff --git a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php index b6482d4..dbb50ec 100644 --- a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php +++ b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php @@ -115,24 +115,24 @@ public function testRetrieveRencontreDetailsByLienWeirdFormattedPlayersNames(): $this->assertEquals(new Joueur('GARBANI', 'Fabrice', '9521619', 819, 'M'), $joueursA[2]); $this->assertEquals(new Joueur('GARBANI - LECOURT', 'Dimitri', '9536798', 633, 'M'), $joueursA[3]); $this->assertEquals(new Joueur('MACCHIETTI', 'Jean', '953581', 543, 'M'), $joueursB[0]); - $this->assertEquals(new Joueur('DESROCHES', 'Damien', '9541048', 500, 'M'), $joueursB[1]); + $this->assertEquals(new Joueur('SÉJOURNÉ', 'Jérémy', '9541048', 500, 'M'), $joueursB[1]); $this->assertEquals(new Joueur('BERNET', 'Loris', '9536698', 535, 'M'), $joueursB[2]); $this->assertEquals(new Joueur('HARDY', 'Mael', '9537596', 582, 'M'), $joueursB[3]); // Tests sur les parties $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'MACCHIETTI Jean', 2, 1, ['04', '04', '08']), $result->getParties()[0]); - $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'DESROCHES Damien', 2, 1, ['04', '05', '06']), $result->getParties()[1]); + $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'SÉJOURNÉ Jérémy', 2, 1, ['04', '05', '06']), $result->getParties()[1]); $this->assertEquals(new Partie('GARBANI Fabrice', 'BERNET Loris', 2, 1, ['01', '01', '04']), $result->getParties()[2]); $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'HARDY Mael', 1, 2, ['-08', '-05', '11', '11', '-10']), $result->getParties()[3]); - $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'DESROCHES Damien', 2, 1, ['06', '07', '02']), $result->getParties()[4]); + $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'SÉJOURNÉ Jérémy', 2, 1, ['06', '07', '02']), $result->getParties()[4]); $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'MACCHIETTI Jean', 2, 1, ['10', '04', '06']), $result->getParties()[5]); $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'BERNET Loris', 1, 2, ['-05', '-07', '-11']), $result->getParties()[6]); $this->assertEquals(new Partie('GARBANI Fabrice', 'HARDY Mael', 2, 1, ['04', '07', '06']), $result->getParties()[7]); - $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan et MARIANNI-SAMSON Emmanuel', 'MACCHIETTI Jean et DESROCHES Damien', 2, 1, ['06', '05', '06']), $result->getParties()[8]); + $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan et MARIANNI-SAMSON Emmanuel', 'MACCHIETTI Jean et SÉJOURNÉ Jérémy', 2, 1, ['06', '05', '06']), $result->getParties()[8]); $this->assertEquals(new Partie('GARBANI Fabrice et GARBANI - LECOURT Dimitri', 'BERNET Loris et HARDY Mael', 2, 1, ['-09', '04', '07', '10']), $result->getParties()[9]); $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'BERNET Loris', 2, 1, ['08', '10', '08']), $result->getParties()[10]); $this->assertEquals(new Partie('GARBANI Fabrice', 'MACCHIETTI Jean', 2, 1, ['01', '07', '02']), $result->getParties()[11]); - $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'DESROCHES Damien', 1, 2, ['-08', '-08', '-10']), $result->getParties()[12]); + $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'SÉJOURNÉ Jérémy', 1, 2, ['-08', '-08', '-10']), $result->getParties()[12]); $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'HARDY Mael', 2, 1, ['06', '05', '11']), $result->getParties()[13]); } } diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_a.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_a.xml index 447a159..c5d9b0e 100644 --- a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_a.xml +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/liste_joueurs_equ_a.xml @@ -1 +1 @@ -9536698BERNETLoris08950531MONTSOULT USMBMM5359541048DESROCHESDamien08950531MONTSOULT USMBMM5009537596HARDYMael08950531MONTSOULT USMBMM582953581 MACCHIETTIJean08950531MONTSOULT USMBMM543 \ No newline at end of file +9536698BERNETLoris08950531MONTSOULT USMBMM5359541048SÉJOURNÉJérémy08950531MONTSOULT USMBMM5009537596HARDYMael08950531MONTSOULT USMBMM582953581 MACCHIETTIJean08950531MONTSOULT USMBMM543 \ No newline at end of file diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/rencontres_details_by_lien.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/rencontres_details_by_lien.xml index 4223baf..fc46e04 100644 --- a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/rencontres_details_by_lien.xml +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/rencontres_details_by_lien.xml @@ -15,7 +15,7 @@ MARIANNI--SAMSON Emmanuel M 723pts - DESROCHES Damien + SÉJOURNÉ Jérémy M 500pts @@ -40,7 +40,7 @@ MARIANNI--SAMSON Emmanuel 2 - DESROCHES Damien + SÉJOURNÉ Jérémy 1 04 05 06 @@ -61,7 +61,7 @@ AMOR QUOINTEAU Erwan 2 - DESROCHES Damien + SÉJOURNÉ Jérémy 1 06 07 02 @@ -89,7 +89,7 @@ AMOR QUOINTEAU Erwan et MARIANNI--SAMSON Emmanuel 2 - MACCHIETTI Jean et DESROCHES Damien + MACCHIETTI Jean et SÉJOURNÉ Jérémy 1 06 05 06 @@ -117,7 +117,7 @@ GARBANI - LECOURT Dimitri 1 - DESROCHES Damien + SÉJOURNÉ Jérémy 2 -08 -08 -10 From dee4347649289fe08f98fd1313d0f622649c88be Mon Sep 17 00:00:00 2001 From: Steph Sako Date: Sat, 11 Mar 2023 16:05:50 +0100 Subject: [PATCH 5/8] Don't add a WO player or a whole WO team in players list for RencontreDetails, trim() sets details, add unit tests --- src/Model/Factory/RencontreDetailsFactory.php | 23 +-- .../RetrieveRencontreDetailsOperationTest.php | 127 +++++++++++++++++ .../test_2/rencontres_details_by_lien.xml | 132 +----------------- .../test_player_wo/liste_joueurs_equ_a.xml | 1 + .../test_player_wo/liste_joueurs_equ_b.xml | 1 + .../rencontres_details_by_lien.xml | 1 + .../liste_joueurs_equ_a.xml | 1 + .../rencontres_details_by_lien.xml | 1 + 8 files changed, 147 insertions(+), 140 deletions(-) create mode 100644 tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_a.xml create mode 100644 tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_b.xml create mode 100644 tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/rencontres_details_by_lien.xml create mode 100644 tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/liste_joueurs_equ_a.xml create mode 100644 tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/rencontres_details_by_lien.xml diff --git a/src/Model/Factory/RencontreDetailsFactory.php b/src/Model/Factory/RencontreDetailsFactory.php index 1e4f116..ddf51d3 100644 --- a/src/Model/Factory/RencontreDetailsFactory.php +++ b/src/Model/Factory/RencontreDetailsFactory.php @@ -28,11 +28,14 @@ public function createFromArray(array $array, string $clubEquipeA, string $clubE $joueursA = []; $joueursB = []; foreach ($array['joueur'] as $joueur) { - $joueursA[] = [$joueur['xja'] ?: '', $joueur['xca'] ?: '']; - $joueursB[] = [$joueur['xjb'] ?: '', $joueur['xcb'] ?: '']; + $joueursA[] = ['nom' => $joueur['xja'] ?: '', 'points' => $joueur['xca'] ?: '']; + $joueursB[] = ['nom' => $joueur['xjb'] ?: '', 'points' => $joueur['xcb'] ?: '']; } - $joueursAFormatted = $this->formatJoueurs($joueursA, $clubEquipeA); - $joueursBFormatted = $this->formatJoueurs($joueursB, $clubEquipeB); + + $wholeTeamAForfeit = 0 === count(array_filter($joueursA, function ($joueurA) { return $joueurA['nom'] && $joueurA['points']; })); + $wholeTeamBForfeit = 0 === count(array_filter($joueursB, function ($joueurB) { return $joueurB['nom'] && $joueurB['points']; })); + $joueursAFormatted = !$wholeTeamAForfeit ? $this->formatJoueurs($joueursA, $clubEquipeA) : []; + $joueursBFormatted = !$wholeTeamBForfeit ? $this->formatJoueurs($joueursB, $clubEquipeB) : []; $parties = $this->getParties($array['partie']); @@ -128,7 +131,7 @@ private function getScores(array $parties): array } /** - * @param array $data + * @param array $data * * @return array */ @@ -138,9 +141,11 @@ private function formatJoueurs(array $data, string $playerClubId): array $joueurs = []; foreach ($data as $joueurData) { - $nomPrenom = $joueurData[0]; - [$nom, $prenom] = $this->nomPrenomExtractor->extractNomPrenom($nomPrenom); - $joueurs[$this->nomPrenomExtractor->removeSeparatorsDuplication($nomPrenom)] = $this->formatJoueur($prenom, $nom, $joueurData[1], $joueursClub); + if ($joueurData['nom'] && $joueurData['points']) { + $nomPrenom = $joueurData['nom']; + [$nom, $prenom] = $this->nomPrenomExtractor->extractNomPrenom($nomPrenom); + $joueurs[$this->nomPrenomExtractor->removeSeparatorsDuplication($nomPrenom)] = $this->formatJoueur($prenom, $nom, $joueurData['points'], $joueursClub); + } } return $joueurs; @@ -187,7 +192,7 @@ private function getParties(array $data): array { $parties = []; foreach ($data as $partieData) { - $setDetails = explode(' ', $partieData['detail']); + $setDetails = explode(' ', trim($partieData['detail'])); /** @var string $adversaireA */ $adversaireA = is_array($partieData['ja']) ? 'Absent Absent' : $this->nomPrenomExtractor->removeSeparatorsDuplication($partieData['ja']); diff --git a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php index dbb50ec..023475b 100644 --- a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php +++ b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php @@ -135,4 +135,131 @@ public function testRetrieveRencontreDetailsByLienWeirdFormattedPlayersNames(): $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'SÉJOURNÉ Jérémy', 1, 2, ['-08', '-08', '-10']), $result->getParties()[12]); $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'HARDY Mael', 2, 1, ['06', '05', '11']), $result->getParties()[13]); } + + /** + * This test covers when a whole team is forfeit. + * + * @covers ::retrieveRencontreDetailsByLien + */ + public function testRetrieveRencontreDetailsByLienWholeTeamForfeit(): void + { + /** @var string $responseContentResult */ + $responseContentResult = file_get_contents(__DIR__.'/../fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/rencontres_details_by_lien.xml'); + /** @var string $responseContentJoueursEquA */ + $responseContentJoueursEquA = file_get_contents(__DIR__.'/../fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/liste_joueurs_equ_a.xml'); + /** @var string $responseContentJoueursEquB */ + $responseContentJoueursEquB = ''; + $mock = new MockHandlerStub([ + new Response(200, [ + 'content-type' => ['text/html; charset=UTF-8'], + ], $responseContentResult), + new Response(200, [ + 'content-type' => ['text/html; charset=UTF-8'], + ], $responseContentJoueursEquA), + new Response(200, [ + 'content-type' => ['text/html; charset=UTF-8'], + ], $responseContentJoueursEquB), + ]); + + $handlerStack = HandlerStack::create($mock); + $client = new Client(['handler' => $handlerStack]); + $FFTTClient = new FFTTClient($client, new UriGenerator('foo', 'bar')); + $listJoueurOperation = new ListJoueurOperation($FFTTClient, new ArrayWrapper(), new NomPrenomExtractor()); + $rencontreDetailsFactory = new RencontreDetailsFactory(new NomPrenomExtractor(), $listJoueurOperation); + $operation = new RetrieveRencontreDetailsOperation($FFTTClient, $rencontreDetailsFactory); + + /** @var RencontreDetails $result */ + $result = $operation->retrieveRencontreDetailsByLien('renc_id=1704115&is_retour=0&phase=2&res_1=28&res_2=0&equip_1=BESSANCOURT+1&equip_2=GROSLAY+2&equip_id1=8740&equip_id2=8741&clubnum_1=08951366&clubnum_2=08950348', '08951366', '08950348'); + + // Tests sur la rencontre + $this->assertCount(4, $result->getJoueursA()); + $this->assertCount(0, $result->getJoueursB()); + $this->assertEquals(1.0, $result->getExpectedScoreEquipeA()); + $this->assertEquals(13.0, $result->getExpectedScoreEquipeB()); + $this->assertEquals('BESSANCOURT 1', $result->getNomEquipeA()); + $this->assertEquals('GROSLAY 2', $result->getNomEquipeB()); + $this->assertEquals(28, $result->getScoreEquipeA()); + $this->assertEquals(0, $result->getScoreEquipeB()); + + // Tests sur les joueurs + $joueursA = array_values($result->getJoueursA()); + $this->assertEquals(new Joueur('LEFEVRE', 'Philippe', '9527872', 1328, 'M'), $joueursA[0]); + $this->assertEquals(new Joueur('BOUVET', 'Anthony', '4512672', 994, 'M'), $joueursA[1]); + $this->assertEquals(new Joueur('CLEMENT', 'Stephane', '9222438', 970, 'M'), $joueursA[2]); + $this->assertEquals(new Joueur('NEE', 'Christophe', '9526243', 866, 'M'), $joueursA[3]); + $this->assertEquals([], $result->getJoueursB()); + } + + /** + * This test covers when a player is forfeit. + * + * @covers ::retrieveRencontreDetailsByLien + */ + public function testRetrieveRencontreDetailsByLienPlayerForfeit(): void + { + /** @var string $responseContentResult */ + $responseContentResult = file_get_contents(__DIR__.'/../fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/rencontres_details_by_lien.xml'); + /** @var string $responseContentJoueursEquA */ + $responseContentJoueursEquA = file_get_contents(__DIR__.'/../fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_a.xml'); + /** @var string $responseContentJoueursEquB */ + $responseContentJoueursEquB = file_get_contents(__DIR__.'/../fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_b.xml'); + $mock = new MockHandlerStub([ + new Response(200, [ + 'content-type' => ['text/html; charset=UTF-8'], + ], $responseContentResult), + new Response(200, [ + 'content-type' => ['text/html; charset=UTF-8'], + ], $responseContentJoueursEquA), + new Response(200, [ + 'content-type' => ['text/html; charset=UTF-8'], + ], $responseContentJoueursEquB), + ]); + + $handlerStack = HandlerStack::create($mock); + $client = new Client(['handler' => $handlerStack]); + $FFTTClient = new FFTTClient($client, new UriGenerator('foo', 'bar')); + $listJoueurOperation = new ListJoueurOperation($FFTTClient, new ArrayWrapper(), new NomPrenomExtractor()); + $rencontreDetailsFactory = new RencontreDetailsFactory(new NomPrenomExtractor(), $listJoueurOperation); + $operation = new RetrieveRencontreDetailsOperation($FFTTClient, $rencontreDetailsFactory); + + /** @var RencontreDetails $result */ + $result = $operation->retrieveRencontreDetailsByLien('renc_id=1705548&is_retour=0&phase=2&res_1=11&res_2=27&equip_1=LA+FRETTE+4&equip_2=EZANVILLE+ECOUEN+14&equip_id1=11869&equip_id2=21323&clubnum_1=08951331&clubnum_2=08950481', '08951331', '08950481'); + + // Tests sur la rencontre + $this->assertCount(3, $result->getJoueursA()); + $this->assertCount(4, $result->getJoueursB()); + $this->assertEquals(5.0, $result->getExpectedScoreEquipeA()); + $this->assertEquals(9.0, $result->getExpectedScoreEquipeB()); + $this->assertEquals('LA FRETTE 4', $result->getNomEquipeA()); + $this->assertEquals('EZANVILLE ECOUEN 14', $result->getNomEquipeB()); + $this->assertEquals(11, $result->getScoreEquipeA()); + $this->assertEquals(27, $result->getScoreEquipeB()); + + // Tests sur les joueurs + $joueursA = array_values($result->getJoueursA()); + $joueursB = array_values($result->getJoueursB()); + $this->assertEquals(new Joueur('NICOLAS', 'Xavier', '9540536', 500, 'M'), $joueursA[0]); + $this->assertEquals(new Joueur('TOUFANIAN', 'Armen', '9518355', 500, 'M'), $joueursA[1]); + $this->assertEquals(new Joueur('TABIB', 'Talel', '9541836', 500, 'M'), $joueursA[2]); + $this->assertEquals(new Joueur('COSSEC', 'Kenji', '9535888', 504, 'M'), $joueursB[0]); + $this->assertEquals(new Joueur('MENGIN', 'Luca', '9534049', 500, 'M'), $joueursB[1]); + $this->assertEquals(new Joueur('WATTEBLED', 'Morgane', '9318432', 531, 'F'), $joueursB[2]); + $this->assertEquals(new Joueur('GODIN', 'Emeline', '9539281', 518, 'F'), $joueursB[3]); + + // Tests sur les parties + $this->assertEquals(new Partie('NICOLAS Xavier', 'COSSEC Kenji', 2, 1, ['6', '6', '8']), $result->getParties()[0]); + $this->assertEquals(new Partie('TOUFANIAN Armen', 'MENGIN Luca', 1, 2, ['-6', '-3', '10', '-7']), $result->getParties()[1]); + $this->assertEquals(new Partie('TABIB Talel', 'WATTEBLED Morgane', 1, 2, ['-5', '-10', '10', '-3']), $result->getParties()[2]); + $this->assertEquals(new Partie('Absent Absent', 'GODIN Emeline', 0, 2, ['-0', '-0', '-0']), $result->getParties()[3]); + $this->assertEquals(new Partie('NICOLAS Xavier', 'MENGIN Luca', 1, 2, ['10', '-7', '-8', '-12']), $result->getParties()[4]); + $this->assertEquals(new Partie('TOUFANIAN Armen', 'COSSEC Kenji', 1, 2, ['-10', '6', '-9', '-5']), $result->getParties()[5]); + $this->assertEquals(new Partie('Absent Absent', 'WATTEBLED Morgane', 0, 2, ['-0', '-0', '-0']), $result->getParties()[6]); + $this->assertEquals(new Partie('TABIB Talel', 'GODIN Emeline', 1, 2, ['-7', '-1', '-8']), $result->getParties()[7]); + $this->assertEquals(new Partie('NICOLAS Xavier et TOUFANIAN Armen', 'WATTEBLED Morgane et GODIN Emeline', 1, 2, ['-8', '-9', '9', '5', '-3']), $result->getParties()[8]); + $this->assertEquals(new Partie('Absent Absent', 'COSSEC Kenji et MENGIN Luca', 0, 2, ['-0', '-0', '-0']), $result->getParties()[9]); + $this->assertEquals(new Partie('NICOLAS Xavier', 'WATTEBLED Morgane', 1, 2, ['-7', '-6', '-6']), $result->getParties()[10]); + $this->assertEquals(new Partie('TABIB Talel', 'COSSEC Kenji', 1, 2, ['-4', '-8', '8', '10', '-7']), $result->getParties()[11]); + $this->assertEquals(new Partie('Absent Absent', 'MENGIN Luca', 0, 2, ['-0', '-0', '-0']), $result->getParties()[12]); + $this->assertEquals(new Partie('TOUFANIAN Armen', 'GODIN Emeline', 1, 2, ['-7', '-7', '-7']), $result->getParties()[13]); + } } diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/rencontres_details_by_lien.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/rencontres_details_by_lien.xml index fc46e04..e585fa6 100644 --- a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/rencontres_details_by_lien.xml +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_2/rencontres_details_by_lien.xml @@ -1,131 +1 @@ - - - - BESSANCOURT 3 - MONTSOULT 3 - 25 - 17 - - - AMOR QUOINTEAU Erwan - M 773pts - MACCHIETTI Jean - M 543pts - - - MARIANNI--SAMSON Emmanuel - M 723pts - SÉJOURNÉ Jérémy - M 500pts - - - GARBANI Fabrice - M 819pts - BERNET Loris - M 535pts - - - GARBANI - LECOURT Dimitri - M 633pts - HARDY Mael - M 582pts - - - AMOR QUOINTEAU Erwan - 2 - MACCHIETTI Jean - 1 - 04 04 08 - - - MARIANNI--SAMSON Emmanuel - 2 - SÉJOURNÉ Jérémy - 1 - 04 05 06 - - - GARBANI Fabrice - 2 - BERNET Loris - 1 - 01 01 04 - - - GARBANI - LECOURT Dimitri - 1 - HARDY Mael - 2 - -08 -05 11 11 -10 - - - AMOR QUOINTEAU Erwan - 2 - SÉJOURNÉ Jérémy - 1 - 06 07 02 - - - MARIANNI--SAMSON Emmanuel - 2 - MACCHIETTI Jean - 1 - 10 04 06 - - - GARBANI - LECOURT Dimitri - 1 - BERNET Loris - 2 - -05 -07 -11 - - - GARBANI Fabrice - 2 - HARDY Mael - 1 - 04 07 06 - - - AMOR QUOINTEAU Erwan et MARIANNI--SAMSON Emmanuel - 2 - MACCHIETTI Jean et SÉJOURNÉ Jérémy - 1 - 06 05 06 - - - GARBANI Fabrice et GARBANI - LECOURT Dimitri - 2 - BERNET Loris et HARDY Mael - 1 - -09 04 07 10 - - - AMOR QUOINTEAU Erwan - 2 - BERNET Loris - 1 - 08 10 08 - - - GARBANI Fabrice - 2 - MACCHIETTI Jean - 1 - 01 07 02 - - - GARBANI - LECOURT Dimitri - 1 - SÉJOURNÉ Jérémy - 2 - -08 -08 -10 - - - MARIANNI--SAMSON Emmanuel - 2 - HARDY Mael - 1 - 06 05 11 - - \ No newline at end of file +BESSANCOURT 3MONTSOULT 32517AMOR QUOINTEAU ErwanM 773ptsMACCHIETTI JeanM 543ptsMARIANNI--SAMSON EmmanuelM 723ptsSÉJOURNÉ JérémyM 500ptsGARBANI FabriceM 819ptsBERNET LorisM 535ptsGARBANI - LECOURT DimitriM 633ptsHARDY MaelM 582ptsAMOR QUOINTEAU Erwan2MACCHIETTI Jean104 04 08MARIANNI--SAMSON Emmanuel2SÉJOURNÉ Jérémy104 05 06GARBANI Fabrice2BERNET Loris101 01 04GARBANI - LECOURT Dimitri1HARDY Mael2-08 -05 11 11 -10AMOR QUOINTEAU Erwan2SÉJOURNÉ Jérémy106 07 02MARIANNI--SAMSON Emmanuel2MACCHIETTI Jean110 04 06GARBANI - LECOURT Dimitri1BERNET Loris2-05 -07 -11GARBANI Fabrice2HARDY Mael104 07 06AMOR QUOINTEAU Erwan et MARIANNI--SAMSON Emmanuel2MACCHIETTI Jean et SÉJOURNÉ Jérémy106 05 06GARBANI Fabrice et GARBANI - LECOURT Dimitri2BERNET Loris et HARDY Mael1-09 04 07 10AMOR QUOINTEAU Erwan2BERNET Loris108 10 08GARBANI Fabrice2MACCHIETTI Jean101 07 02GARBANI - LECOURT Dimitri1SÉJOURNÉ Jérémy2-08 -08 -10MARIANNI--SAMSON Emmanuel2HARDY Mael106 05 11 \ No newline at end of file diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_a.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_a.xml new file mode 100644 index 0000000..1e5f3d2 --- /dev/null +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_a.xml @@ -0,0 +1 @@ +9540536NICOLASXavier08951331LA FRETTE ESFTTM5009541836TABIBTalel08951331LA FRETTE ESFTTM5009518355TOUFANIANArmen08951331LA FRETTE ESFTTM500 \ No newline at end of file diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_b.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_b.xml new file mode 100644 index 0000000..f5ec11a --- /dev/null +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/liste_joueurs_equ_b.xml @@ -0,0 +1 @@ +9535888COSSECKenji08950481EZANVILLE ECOUEN USM5049534049MENGINLuca08950481EZANVILLE ECOUEN USM5009318432WATTEBLEDMorgane08950481EZANVILLE ECOUEN USF5319539281GODINEmeline08950481EZANVILLE ECOUEN USF518 \ No newline at end of file diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/rencontres_details_by_lien.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/rencontres_details_by_lien.xml new file mode 100644 index 0000000..2da13d7 --- /dev/null +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_player_wo/rencontres_details_by_lien.xml @@ -0,0 +1 @@ +LA FRETTE 4EZANVILLE ECOUEN 141127NICOLAS XavierM 500ptsCOSSEC KenjiM 504ptsTOUFANIAN ArmenM 500ptsMENGIN LucaM 500ptsTABIB TalelM 500ptsWATTEBLED MorganeF 531ptsGODIN EmelineF 518ptsNICOLAS Xavier2COSSEC Kenji16 6 8TOUFANIAN Armen1MENGIN Luca2-6 -3 10 -7TABIB Talel1WATTEBLED Morgane2-5 -10 10 -3-GODIN Emeline2-0 -0 -0NICOLAS Xavier1MENGIN Luca210 -7 -8 -12TOUFANIAN Armen1COSSEC Kenji2-10 6 -9 -5-WATTEBLED Morgane2-0 -0 -0TABIB Talel1GODIN Emeline2-7 -1 -8NICOLAS Xavier et TOUFANIAN Armen1WATTEBLED Morgane et GODIN Emeline2-8 -9 9 5 -3-COSSEC Kenji et MENGIN Luca2-0 -0 -0NICOLAS Xavier1WATTEBLED Morgane2-7 -6 -6TABIB Talel1COSSEC Kenji2-4 -8 8 10 -7-MENGIN Luca2-0 -0 -0TOUFANIAN Armen1GODIN Emeline2-7 -7 -7 \ No newline at end of file diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/liste_joueurs_equ_a.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/liste_joueurs_equ_a.xml new file mode 100644 index 0000000..d3c2257 --- /dev/null +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/liste_joueurs_equ_a.xml @@ -0,0 +1 @@ +4512672BOUVETAnthony08951366BESSANCOURT TTBM9949222438CLEMENTStephane08951366BESSANCOURT TTBM9709527872LEFEVREPhilippe08951366BESSANCOURT TTBM13289526243NEEChristophe08951366BESSANCOURT TTBM866 \ No newline at end of file diff --git a/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/rencontres_details_by_lien.xml b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/rencontres_details_by_lien.xml new file mode 100644 index 0000000..cec943b --- /dev/null +++ b/tests/Unit/Service/fixtures/RetrieveRencontreDetailsOperationTest/test_whole_team_wo/rencontres_details_by_lien.xml @@ -0,0 +1 @@ +BESSANCOURT 1GROSLAY 2280LEFEVRE PhilippeM 1328ptsBOUVET AnthonyM 994ptsCLEMENT StephaneM 970ptsNEE ChristopheM 866ptsLEFEVRE Philippe2-0 0 0BOUVET Anthony2-0 0 0CLEMENT Stephane2-0 0 0NEE Christophe2-0 0 0LEFEVRE Philippe2-0 0 0BOUVET Anthony2-0 0 0NEE Christophe2-0 0 0CLEMENT Stephane2-0 0 0LEFEVRE Philippe et BOUVET Anthony2-0 0 0CLEMENT Stephane et NEE Christophe2-0 0 0LEFEVRE Philippe2-0 0 0CLEMENT Stephane2-0 0 0NEE Christophe2-0 0 0BOUVET Anthony2-0 0 0 \ No newline at end of file From 46c3eed9295ce9b8abf272de8507419e076d251c Mon Sep 17 00:00:00 2001 From: Steph Sako Date: Sat, 18 Mar 2023 16:56:31 +0100 Subject: [PATCH 6/8] =?UTF-8?q?Fix=20pr=C3=A9noms=20with=20second=20part?= =?UTF-8?q?=20in=20lowercase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Service/NomPrenomExtractor.php | 2 +- tests/Unit/Service/NomPrenomExtractorTest.php | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Service/NomPrenomExtractor.php b/src/Service/NomPrenomExtractor.php index fa5346a..8aecbe8 100644 --- a/src/Service/NomPrenomExtractor.php +++ b/src/Service/NomPrenomExtractor.php @@ -8,7 +8,7 @@ public function extractNomPrenom(string $raw): array { $raw = $this->removeSeparatorsDuplication($raw); // On extrait le nom et le prénom - $return = preg_match("/^(?[A-ZÀ-Ý]+(?:(?:[\s'\-])*[A-ZÀ-Ý]+)*)\s(?[A-ZÀ-Ý][a-zà-ÿ]*(?:(?:[\s'\-])*[A-ZÀ-Ý][a-zà-ÿ]*)*)$/", $raw, $result); + $return = preg_match("/^(?[A-ZÀ-Ý]+(?:(?:[\s'\-])*[A-ZÀ-Ý]+)*)\s(?[A-ZÀ-Ý][a-zà-ÿ]*(?:(?:[\s'\-])*[A-ZÀ-Ý]?[a-zà-ÿ]*)*)$/", $raw, $result); return 1 !== $return ? ['', ''] : [ diff --git a/tests/Unit/Service/NomPrenomExtractorTest.php b/tests/Unit/Service/NomPrenomExtractorTest.php index 9873cd6..a3410a8 100644 --- a/tests/Unit/Service/NomPrenomExtractorTest.php +++ b/tests/Unit/Service/NomPrenomExtractorTest.php @@ -131,5 +131,11 @@ public function getData(): \Generator 'SÉJOURNÉ', 'Jérémy', ]; + + yield [ + 'EVEN Gwec hen', + 'EVEN', + 'Gwec hen', + ]; } } From 0f777d5d4632109d34256295f84c3838a15506ca Mon Sep 17 00:00:00 2001 From: Steph Sako Date: Sat, 18 Mar 2023 22:03:32 +0100 Subject: [PATCH 7/8] Format the scores of the sets into int type --- src/Model/Factory/RencontreDetailsFactory.php | 6 +- src/Model/Rencontre/Partie.php | 10 ++-- .../RetrieveRencontreDetailsOperationTest.php | 56 +++++++++---------- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/Model/Factory/RencontreDetailsFactory.php b/src/Model/Factory/RencontreDetailsFactory.php index ddf51d3..b36370f 100644 --- a/src/Model/Factory/RencontreDetailsFactory.php +++ b/src/Model/Factory/RencontreDetailsFactory.php @@ -192,7 +192,9 @@ private function getParties(array $data): array { $parties = []; foreach ($data as $partieData) { - $setDetails = explode(' ', trim($partieData['detail'])); + $setsDetails = array_map(function ($setDetail) { + return intval($setDetail); + }, explode(' ', trim($partieData['detail']))); /** @var string $adversaireA */ $adversaireA = is_array($partieData['ja']) ? 'Absent Absent' : $this->nomPrenomExtractor->removeSeparatorsDuplication($partieData['ja']); @@ -205,7 +207,7 @@ private function getParties(array $data): array $adversaireB, '-' === $partieData['scorea'] ? 0 : (int) $partieData['scorea'], '-' === $partieData['scoreb'] ? 0 : (int) $partieData['scoreb'], - $setDetails + $setsDetails ); } diff --git a/src/Model/Rencontre/Partie.php b/src/Model/Rencontre/Partie.php index 24d7727..a44abbb 100644 --- a/src/Model/Rencontre/Partie.php +++ b/src/Model/Rencontre/Partie.php @@ -5,14 +5,14 @@ final class Partie { /** - * @param array $setDetails + * @param array $setsDetails */ public function __construct( private readonly string $adversaireA, private readonly string $adversaireB, private readonly int $scoreA, private readonly int $scoreB, - private readonly array $setDetails, + private readonly array $setsDetails, ) {} public function getAdversaireA(): string @@ -36,10 +36,10 @@ public function getScoreB(): int } /** - * @return array + * @return array */ - public function getSetDetails(): array + public function getSetsDetails(): array { - return $this->setDetails; + return $this->setsDetails; } } diff --git a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php index 023475b..b586616 100644 --- a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php +++ b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php @@ -120,20 +120,20 @@ public function testRetrieveRencontreDetailsByLienWeirdFormattedPlayersNames(): $this->assertEquals(new Joueur('HARDY', 'Mael', '9537596', 582, 'M'), $joueursB[3]); // Tests sur les parties - $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'MACCHIETTI Jean', 2, 1, ['04', '04', '08']), $result->getParties()[0]); - $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'SÉJOURNÉ Jérémy', 2, 1, ['04', '05', '06']), $result->getParties()[1]); - $this->assertEquals(new Partie('GARBANI Fabrice', 'BERNET Loris', 2, 1, ['01', '01', '04']), $result->getParties()[2]); - $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'HARDY Mael', 1, 2, ['-08', '-05', '11', '11', '-10']), $result->getParties()[3]); - $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'SÉJOURNÉ Jérémy', 2, 1, ['06', '07', '02']), $result->getParties()[4]); - $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'MACCHIETTI Jean', 2, 1, ['10', '04', '06']), $result->getParties()[5]); - $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'BERNET Loris', 1, 2, ['-05', '-07', '-11']), $result->getParties()[6]); - $this->assertEquals(new Partie('GARBANI Fabrice', 'HARDY Mael', 2, 1, ['04', '07', '06']), $result->getParties()[7]); - $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan et MARIANNI-SAMSON Emmanuel', 'MACCHIETTI Jean et SÉJOURNÉ Jérémy', 2, 1, ['06', '05', '06']), $result->getParties()[8]); - $this->assertEquals(new Partie('GARBANI Fabrice et GARBANI - LECOURT Dimitri', 'BERNET Loris et HARDY Mael', 2, 1, ['-09', '04', '07', '10']), $result->getParties()[9]); - $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'BERNET Loris', 2, 1, ['08', '10', '08']), $result->getParties()[10]); - $this->assertEquals(new Partie('GARBANI Fabrice', 'MACCHIETTI Jean', 2, 1, ['01', '07', '02']), $result->getParties()[11]); - $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'SÉJOURNÉ Jérémy', 1, 2, ['-08', '-08', '-10']), $result->getParties()[12]); - $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'HARDY Mael', 2, 1, ['06', '05', '11']), $result->getParties()[13]); + $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'MACCHIETTI Jean', 2, 1, [4, 4, 8]), $result->getParties()[0]); + $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'SÉJOURNÉ Jérémy', 2, 1, [4, 5, 6]), $result->getParties()[1]); + $this->assertEquals(new Partie('GARBANI Fabrice', 'BERNET Loris', 2, 1, [1, 1, 4]), $result->getParties()[2]); + $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'HARDY Mael', 1, 2, [-8, -5, 11, 11, -10]), $result->getParties()[3]); + $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'SÉJOURNÉ Jérémy', 2, 1, [6, 7, 2]), $result->getParties()[4]); + $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'MACCHIETTI Jean', 2, 1, [10, 4, 6]), $result->getParties()[5]); + $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'BERNET Loris', 1, 2, [-5, -7, -11]), $result->getParties()[6]); + $this->assertEquals(new Partie('GARBANI Fabrice', 'HARDY Mael', 2, 1, [4, 7, 6]), $result->getParties()[7]); + $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan et MARIANNI-SAMSON Emmanuel', 'MACCHIETTI Jean et SÉJOURNÉ Jérémy', 2, 1, [6, 5, 6]), $result->getParties()[8]); + $this->assertEquals(new Partie('GARBANI Fabrice et GARBANI - LECOURT Dimitri', 'BERNET Loris et HARDY Mael', 2, 1, [-9, 4, 7, 10]), $result->getParties()[9]); + $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'BERNET Loris', 2, 1, [8, 10, 8]), $result->getParties()[10]); + $this->assertEquals(new Partie('GARBANI Fabrice', 'MACCHIETTI Jean', 2, 1, [1, 7, 2]), $result->getParties()[11]); + $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'SÉJOURNÉ Jérémy', 1, 2, [-8, -8, -10]), $result->getParties()[12]); + $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'HARDY Mael', 2, 1, [6, 5, 11]), $result->getParties()[13]); } /** @@ -247,19 +247,19 @@ public function testRetrieveRencontreDetailsByLienPlayerForfeit(): void $this->assertEquals(new Joueur('GODIN', 'Emeline', '9539281', 518, 'F'), $joueursB[3]); // Tests sur les parties - $this->assertEquals(new Partie('NICOLAS Xavier', 'COSSEC Kenji', 2, 1, ['6', '6', '8']), $result->getParties()[0]); - $this->assertEquals(new Partie('TOUFANIAN Armen', 'MENGIN Luca', 1, 2, ['-6', '-3', '10', '-7']), $result->getParties()[1]); - $this->assertEquals(new Partie('TABIB Talel', 'WATTEBLED Morgane', 1, 2, ['-5', '-10', '10', '-3']), $result->getParties()[2]); - $this->assertEquals(new Partie('Absent Absent', 'GODIN Emeline', 0, 2, ['-0', '-0', '-0']), $result->getParties()[3]); - $this->assertEquals(new Partie('NICOLAS Xavier', 'MENGIN Luca', 1, 2, ['10', '-7', '-8', '-12']), $result->getParties()[4]); - $this->assertEquals(new Partie('TOUFANIAN Armen', 'COSSEC Kenji', 1, 2, ['-10', '6', '-9', '-5']), $result->getParties()[5]); - $this->assertEquals(new Partie('Absent Absent', 'WATTEBLED Morgane', 0, 2, ['-0', '-0', '-0']), $result->getParties()[6]); - $this->assertEquals(new Partie('TABIB Talel', 'GODIN Emeline', 1, 2, ['-7', '-1', '-8']), $result->getParties()[7]); - $this->assertEquals(new Partie('NICOLAS Xavier et TOUFANIAN Armen', 'WATTEBLED Morgane et GODIN Emeline', 1, 2, ['-8', '-9', '9', '5', '-3']), $result->getParties()[8]); - $this->assertEquals(new Partie('Absent Absent', 'COSSEC Kenji et MENGIN Luca', 0, 2, ['-0', '-0', '-0']), $result->getParties()[9]); - $this->assertEquals(new Partie('NICOLAS Xavier', 'WATTEBLED Morgane', 1, 2, ['-7', '-6', '-6']), $result->getParties()[10]); - $this->assertEquals(new Partie('TABIB Talel', 'COSSEC Kenji', 1, 2, ['-4', '-8', '8', '10', '-7']), $result->getParties()[11]); - $this->assertEquals(new Partie('Absent Absent', 'MENGIN Luca', 0, 2, ['-0', '-0', '-0']), $result->getParties()[12]); - $this->assertEquals(new Partie('TOUFANIAN Armen', 'GODIN Emeline', 1, 2, ['-7', '-7', '-7']), $result->getParties()[13]); + $this->assertEquals(new Partie('NICOLAS Xavier', 'COSSEC Kenji', 2, 1, [6, 6, 8]), $result->getParties()[0]); + $this->assertEquals(new Partie('TOUFANIAN Armen', 'MENGIN Luca', 1, 2, [-6, -3, 10, -7]), $result->getParties()[1]); + $this->assertEquals(new Partie('TABIB Talel', 'WATTEBLED Morgane', 1, 2, [-5, -10, 10, -3]), $result->getParties()[2]); + $this->assertEquals(new Partie('Absent Absent', 'GODIN Emeline', 0, 2, [0, 0, 0]), $result->getParties()[3]); + $this->assertEquals(new Partie('NICOLAS Xavier', 'MENGIN Luca', 1, 2, [10, -7, -8, -12]), $result->getParties()[4]); + $this->assertEquals(new Partie('TOUFANIAN Armen', 'COSSEC Kenji', 1, 2, [-10, 6, -9, -5]), $result->getParties()[5]); + $this->assertEquals(new Partie('Absent Absent', 'WATTEBLED Morgane', 0, 2, [0, 0, 0]), $result->getParties()[6]); + $this->assertEquals(new Partie('TABIB Talel', 'GODIN Emeline', 1, 2, [-7, -1, -8]), $result->getParties()[7]); + $this->assertEquals(new Partie('NICOLAS Xavier et TOUFANIAN Armen', 'WATTEBLED Morgane et GODIN Emeline', 1, 2, [-8, -9, 9, 5, -3]), $result->getParties()[8]); + $this->assertEquals(new Partie('Absent Absent', 'COSSEC Kenji et MENGIN Luca', 0, 2, [0, 0, 0]), $result->getParties()[9]); + $this->assertEquals(new Partie('NICOLAS Xavier', 'WATTEBLED Morgane', 1, 2, [-7, -6, -6]), $result->getParties()[10]); + $this->assertEquals(new Partie('TABIB Talel', 'COSSEC Kenji', 1, 2, [-4, -8, 8, 10, -7]), $result->getParties()[11]); + $this->assertEquals(new Partie('Absent Absent', 'MENGIN Luca', 0, 2, [0, 0, 0]), $result->getParties()[12]); + $this->assertEquals(new Partie('TOUFANIAN Armen', 'GODIN Emeline', 1, 2, [-7, -7, -7]), $result->getParties()[13]); } } From 246555f091aad17b0b7db649ed8459e844f46925 Mon Sep 17 00:00:00 2001 From: Steph Sako Date: Mon, 20 Mar 2023 18:36:32 +0100 Subject: [PATCH 8/8] Enhance name formatting with spaces and hyphens --- src/Service/NomPrenomExtractor.php | 2 +- tests/Unit/Service/NomPrenomExtractorTest.php | 12 ++++++------ .../Service/Operation/ListJoueurOperationTest.php | 4 ++-- .../RetrieveRencontreDetailsOperationTest.php | 10 +++++----- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Service/NomPrenomExtractor.php b/src/Service/NomPrenomExtractor.php index 8aecbe8..95a8cb3 100644 --- a/src/Service/NomPrenomExtractor.php +++ b/src/Service/NomPrenomExtractor.php @@ -22,6 +22,6 @@ public function extractNomPrenom(string $raw): array */ public function removeSeparatorsDuplication(string $raw): string { - return preg_replace(['/\s+/', '/-+/'], [' ', '-'], $raw) ?? ''; + return preg_replace(['/\s+/', '/(?:\s*\-\s*)+|-+/'], [' ', '-'], $raw) ?? ''; } } diff --git a/tests/Unit/Service/NomPrenomExtractorTest.php b/tests/Unit/Service/NomPrenomExtractorTest.php index a3410a8..e77d9d6 100644 --- a/tests/Unit/Service/NomPrenomExtractorTest.php +++ b/tests/Unit/Service/NomPrenomExtractorTest.php @@ -50,20 +50,20 @@ public function getData(): \Generator yield [ 'GARBANI - LECOURT Dimitri', - 'GARBANI - LECOURT', + 'GARBANI-LECOURT', 'Dimitri', ]; yield [ 'GARBANI - LECOURT NEVEU Dimitri-Sébastien', - 'GARBANI - LECOURT NEVEU', + 'GARBANI-LECOURT NEVEU', 'Dimitri-Sébastien', ]; yield [ 'GARBANI - LECOURT NEVEU Dimitri - Sébastien', - 'GARBANI - LECOURT NEVEU', - 'Dimitri - Sébastien', + 'GARBANI-LECOURT NEVEU', + 'Dimitri-Sébastien', ]; yield [ @@ -86,7 +86,7 @@ public function getData(): \Generator yield [ 'ÆYAO -- ÆYAOÈ Attien Henri', - 'ÆYAO - ÆYAOÈ', + 'ÆYAO-ÆYAOÈ', 'Attien Henri', ]; @@ -122,7 +122,7 @@ public function getData(): \Generator yield [ "DE L'EPREVIER PAVRON - SEC Domitille", - "DE L'EPREVIER PAVRON - SEC", + "DE L'EPREVIER PAVRON-SEC", 'Domitille', ]; diff --git a/tests/Unit/Service/Operation/ListJoueurOperationTest.php b/tests/Unit/Service/Operation/ListJoueurOperationTest.php index 96c082a..c0c364e 100644 --- a/tests/Unit/Service/Operation/ListJoueurOperationTest.php +++ b/tests/Unit/Service/Operation/ListJoueurOperationTest.php @@ -42,10 +42,10 @@ public function testListJoueursByClub(): void $this->assertCount(7, $result); $this->assertEquals(new Joueur('9521866', 'CERGY PONTOISE', '05650412', 'HERNANDEZ', 'Francois', 816, null, null), $result[0]); - $this->assertEquals(new Joueur('9521899', 'CERGY PONTOISE', '05650412', "DE L'EPREVIER PAVRON - SEC", 'Domìtïlle', 812, null, null), $result[1]); + $this->assertEquals(new Joueur('9521899', 'CERGY PONTOISE', '05650412', "DE L'EPREVIER PAVRON-SEC", 'Domìtïlle', 812, null, null), $result[1]); $this->assertEquals(new Joueur('9521877', 'CERGY PONTOISE', '05650412', 'NDJOM BASSANAGA', 'Moïse Çéliñó', 1216, null, null), $result[2]); $this->assertEquals(new Joueur('95218367', 'CERGY PONTOISE', '05650412', 'ÂBBÄS', 'Ãbdel-Jælil', 1456, 'N', 924), $result[3]); - $this->assertEquals(new Joueur('9521870', 'CERGY PONTOISE', '05650412', 'GARBANI - LECOURT NEVEU', 'Dimitri - Sébastien', 1456, null, null), $result[4]); + $this->assertEquals(new Joueur('9521870', 'CERGY PONTOISE', '05650412', 'GARBANI-LECOURT NEVEU', 'Dimitri-Sébastien', 1456, null, null), $result[4]); $this->assertEquals(new Joueur('9521876', 'CERGY PONTOISE', '05650412', 'AMOR QUOINTEAU', 'Erwan', 756, null, null), $result[5]); $this->assertEquals(new Joueur('9521888', 'CERGY PONTOISE', '05650412', 'MOREAU', 'Véronique', 1956, 'N', 54), $result[6]); } diff --git a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php index b586616..d9b5a0f 100644 --- a/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php +++ b/tests/Unit/Service/Operation/RetrieveRencontreDetailsOperationTest.php @@ -113,7 +113,7 @@ public function testRetrieveRencontreDetailsByLienWeirdFormattedPlayersNames(): $this->assertEquals(new Joueur('AMOR QUOINTEAU', 'Erwan', '9533978', 773, 'M'), $joueursA[0]); $this->assertEquals(new Joueur('MARIANNI-SAMSON', 'Emmanuel', '9233469', 723, 'M'), $joueursA[1]); $this->assertEquals(new Joueur('GARBANI', 'Fabrice', '9521619', 819, 'M'), $joueursA[2]); - $this->assertEquals(new Joueur('GARBANI - LECOURT', 'Dimitri', '9536798', 633, 'M'), $joueursA[3]); + $this->assertEquals(new Joueur('GARBANI-LECOURT', 'Dimitri', '9536798', 633, 'M'), $joueursA[3]); $this->assertEquals(new Joueur('MACCHIETTI', 'Jean', '953581', 543, 'M'), $joueursB[0]); $this->assertEquals(new Joueur('SÉJOURNÉ', 'Jérémy', '9541048', 500, 'M'), $joueursB[1]); $this->assertEquals(new Joueur('BERNET', 'Loris', '9536698', 535, 'M'), $joueursB[2]); @@ -123,16 +123,16 @@ public function testRetrieveRencontreDetailsByLienWeirdFormattedPlayersNames(): $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'MACCHIETTI Jean', 2, 1, [4, 4, 8]), $result->getParties()[0]); $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'SÉJOURNÉ Jérémy', 2, 1, [4, 5, 6]), $result->getParties()[1]); $this->assertEquals(new Partie('GARBANI Fabrice', 'BERNET Loris', 2, 1, [1, 1, 4]), $result->getParties()[2]); - $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'HARDY Mael', 1, 2, [-8, -5, 11, 11, -10]), $result->getParties()[3]); + $this->assertEquals(new Partie('GARBANI-LECOURT Dimitri', 'HARDY Mael', 1, 2, [-8, -5, 11, 11, -10]), $result->getParties()[3]); $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'SÉJOURNÉ Jérémy', 2, 1, [6, 7, 2]), $result->getParties()[4]); $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'MACCHIETTI Jean', 2, 1, [10, 4, 6]), $result->getParties()[5]); - $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'BERNET Loris', 1, 2, [-5, -7, -11]), $result->getParties()[6]); + $this->assertEquals(new Partie('GARBANI-LECOURT Dimitri', 'BERNET Loris', 1, 2, [-5, -7, -11]), $result->getParties()[6]); $this->assertEquals(new Partie('GARBANI Fabrice', 'HARDY Mael', 2, 1, [4, 7, 6]), $result->getParties()[7]); $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan et MARIANNI-SAMSON Emmanuel', 'MACCHIETTI Jean et SÉJOURNÉ Jérémy', 2, 1, [6, 5, 6]), $result->getParties()[8]); - $this->assertEquals(new Partie('GARBANI Fabrice et GARBANI - LECOURT Dimitri', 'BERNET Loris et HARDY Mael', 2, 1, [-9, 4, 7, 10]), $result->getParties()[9]); + $this->assertEquals(new Partie('GARBANI Fabrice et GARBANI-LECOURT Dimitri', 'BERNET Loris et HARDY Mael', 2, 1, [-9, 4, 7, 10]), $result->getParties()[9]); $this->assertEquals(new Partie('AMOR QUOINTEAU Erwan', 'BERNET Loris', 2, 1, [8, 10, 8]), $result->getParties()[10]); $this->assertEquals(new Partie('GARBANI Fabrice', 'MACCHIETTI Jean', 2, 1, [1, 7, 2]), $result->getParties()[11]); - $this->assertEquals(new Partie('GARBANI - LECOURT Dimitri', 'SÉJOURNÉ Jérémy', 1, 2, [-8, -8, -10]), $result->getParties()[12]); + $this->assertEquals(new Partie('GARBANI-LECOURT Dimitri', 'SÉJOURNÉ Jérémy', 1, 2, [-8, -8, -10]), $result->getParties()[12]); $this->assertEquals(new Partie('MARIANNI-SAMSON Emmanuel', 'HARDY Mael', 2, 1, [6, 5, 11]), $result->getParties()[13]); }