diff --git a/src/Model/Factory/RencontreDetailsFactory.php b/src/Model/Factory/RencontreDetailsFactory.php index b774e52..b36370f 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; @@ -29,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']); @@ -129,7 +131,7 @@ private function getScores(array $parties): array } /** - * @param array $data + * @param array $data * * @return array */ @@ -139,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; @@ -157,9 +161,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() === $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 +171,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 @@ -190,20 +192,22 @@ private function getParties(array $data): array { $parties = []; foreach ($data as $partieData) { - $setDetails = explode(' ', $partieData['detail']); + $setsDetails = array_map(function ($setDetail) { + return intval($setDetail); + }, explode(' ', trim($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 + $setsDetails ); } 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/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/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/NomPrenomExtractor.php b/src/Service/NomPrenomExtractor.php index fa5346a..95a8cb3 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 ? ['', ''] : [ @@ -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/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/NomPrenomExtractorTest.php b/tests/Unit/Service/NomPrenomExtractorTest.php index 057742c..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,8 +122,20 @@ public function getData(): \Generator yield [ "DE L'EPREVIER PAVRON - SEC Domitille", - "DE L'EPREVIER PAVRON - SEC", + "DE L'EPREVIER PAVRON-SEC", 'Domitille', ]; + + yield [ + 'SÉJOURNÉ Jérémy', + 'SÉJOURNÉ', + 'Jérémy', + ]; + + yield [ + 'EVEN Gwec hen', + 'EVEN', + 'Gwec hen', + ]; } } diff --git a/tests/Unit/Service/Operation/ListJoueurOperationTest.php b/tests/Unit/Service/Operation/ListJoueurOperationTest.php new file mode 100644 index 0000000..c0c364e --- /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..d9b5a0f 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 */ @@ -117,26 +113,153 @@ 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('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('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('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('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('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]); + } + + /** + * 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/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..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 USMBMM582953581MACCHIETTIJean08950531MONTSOULT 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/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 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..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 - DESROCHES Damien - 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 - DESROCHES Damien - 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 - DESROCHES Damien - 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 DESROCHES Damien - 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 - DESROCHES Damien - 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