From a8bbae8716c71a48a71f3af67041f207ec855967 Mon Sep 17 00:00:00 2001 From: AUTIN Tristan Date: Tue, 13 Jan 2026 16:40:31 +0100 Subject: [PATCH] test : ajout de TU sur les services et providers --- .idea/workspace.xml | 57 +++++++------ .../Service/PontBasculePayloadDecoderTest.php | 61 +++++++++++++ tests/Service/PontBasculeServiceTest.php | 85 +++++++++++++++++++ tests/State/ReceptionWeighingProviderTest.php | 62 ++++++++++++++ 4 files changed, 241 insertions(+), 24 deletions(-) create mode 100644 tests/Service/PontBasculePayloadDecoderTest.php create mode 100644 tests/Service/PontBasculeServiceTest.php create mode 100644 tests/State/ReceptionWeighingProviderTest.php diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b484dfc..2cff8a4 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,8 +6,8 @@ - - + + - { + "keyToString": { + "RunOnceActivity.MCP Project settings loaded": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", + "RunOnceActivity.git.unshallow": "true", + "RunOnceActivity.typescript.service.memoryLimit.init": "true", + "git-widget-placeholder": "feat/203-reception-parcours-pesee-multi-etapas", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "settings.editor.selected.configurable": "reference.webide.settings.project.settings.php.debug", + "vue.rearranger.settings.migration": "true" }, - "keyToStringList": { - "vue.recent.templates": [ - "Vue Composition API Component" + "keyToStringList": { + "vue.recent.templates": [ + "Vue Composition API Component" ] } -}]]> +} @@ -242,7 +242,7 @@ 1767956826164 - + - @@ -300,7 +308,8 @@ - diff --git a/tests/Service/PontBasculePayloadDecoderTest.php b/tests/Service/PontBasculePayloadDecoderTest.php new file mode 100644 index 0000000..d56198c --- /dev/null +++ b/tests/Service/PontBasculePayloadDecoderTest.php @@ -0,0 +1,61 @@ + "\u{0001}\u{0002}040200\u{0002}01001420.kg \u{0002}02000000.kg \u{0002}03001420.kg \u{0002}9900121", + ], JSON_THROW_ON_ERROR); + + $result = $decoder->decode($payload); + + self::assertSame(121, $result->getDsd()); + self::assertSame(1420.0, $result->getWeight()); + } + + public function testDecodeInvalidPayloadThrows(): void + { + $decoder = new PontBasculePayloadDecoder(); + + $this->expectException(PontBasculeException::class); + $this->expectExceptionMessage('Réponse invalide du pont bascule.'); + + $decoder->decode('not-json'); + } + + public function testDecodeMissingFieldThrows(): void + { + $decoder = new PontBasculePayloadDecoder(); + $payload = json_encode(['ok' => true], JSON_THROW_ON_ERROR); + + $this->expectException(PontBasculeException::class); + $this->expectExceptionMessage('Réponse incomplète du pont bascule: champ "response_ascii" manquant.'); + + $decoder->decode($payload); + } + + public function testDecodeUnreadableValuesThrows(): void + { + $decoder = new PontBasculePayloadDecoder(); + $payload = json_encode(['response_ascii' => 'no-data'], JSON_THROW_ON_ERROR); + + $this->expectException(PontBasculeException::class); + $this->expectExceptionMessage('Impossible de lire les valeurs de pesée du pont bascule.'); + + $decoder->decode($payload); + } +} diff --git a/tests/Service/PontBasculeServiceTest.php b/tests/Service/PontBasculeServiceTest.php new file mode 100644 index 0000000..751c4ce --- /dev/null +++ b/tests/Service/PontBasculeServiceTest.php @@ -0,0 +1,85 @@ +createMock(HttpClientInterface::class); + $httpClient->expects(self::never())->method('request'); + + $service = new PontBasculeService($httpClient, $decoder, 'http://example.test', true); + + $result = $service->fetch(); + + self::assertSame(121, $result->getDsd()); + self::assertSame(1420.0, $result->getWeight()); + self::assertInstanceOf(DateTimeImmutable::class, $result->getWeighedAt()); + } + + public function testFetchUsesHttpClientWhenNotBypass(): void + { + $payload = json_encode([ + 'response_ascii' => "\u{0001}\u{0002}040200\u{0002}03000123.kg \u{0002}9900042", + ], JSON_THROW_ON_ERROR); + + $response = $this->createMock(ResponseInterface::class); + $response->expects(self::once())->method('getContent')->with(false)->willReturn($payload); + + $httpClient = $this->createMock(HttpClientInterface::class); + $httpClient + ->expects(self::once()) + ->method('request') + ->with('POST', 'http://example.test') + ->willReturn($response) + ; + + $decoder = new PontBasculePayloadDecoder(); + + $service = new PontBasculeService($httpClient, $decoder, 'http://example.test', false); + + $result = $service->fetch(); + + self::assertSame(42, $result->getDsd()); + self::assertSame(123.0, $result->getWeight()); + self::assertInstanceOf(DateTimeImmutable::class, $result->getWeighedAt()); + } + + public function testFetchThrowsOnTransportFailure(): void + { + $exception = $this->createStub(TransportExceptionInterface::class); + + $httpClient = $this->createMock(HttpClientInterface::class); + $httpClient + ->expects(self::once()) + ->method('request') + ->willThrowException($exception) + ; + + $decoder = new PontBasculePayloadDecoder(); + + $service = new PontBasculeService($httpClient, $decoder, 'http://example.test', false); + + $this->expectException(PontBasculeException::class); + $this->expectExceptionMessage('Erreur lors de la communication avec le pont bascule:'); + + $service->fetch(); + } +} diff --git a/tests/State/ReceptionWeighingProviderTest.php b/tests/State/ReceptionWeighingProviderTest.php new file mode 100644 index 0000000..d68f2a8 --- /dev/null +++ b/tests/State/ReceptionWeighingProviderTest.php @@ -0,0 +1,62 @@ +createMock(HttpClientInterface::class); + $httpClient->expects(self::never())->method('request'); + + $service = new PontBasculeService($httpClient, $decoder, 'http://example.test', true); + + $provider = new ReceptionWeighingProvider($service); + + $result = $provider->provide(new Get()); + + self::assertInstanceOf(PontBasculeReading::class, $result); + self::assertSame(121, $result->getDsd()); + self::assertSame(1420.0, $result->getWeight()); + } + + public function testProvideThrowsHttpException(): void + { + $exception = $this->createStub(TransportExceptionInterface::class); + + $httpClient = $this->createMock(HttpClientInterface::class); + $httpClient + ->expects(self::once()) + ->method('request') + ->willThrowException($exception) + ; + + $decoder = new PontBasculePayloadDecoder(); + + $service = new PontBasculeService($httpClient, $decoder, 'http://example.test', false); + + $provider = new ReceptionWeighingProvider($service); + + $this->expectException(HttpException::class); + $this->expectExceptionMessage('Erreur lors de la communication avec le pont bascule:'); + + $provider->provide(new Get()); + } +}