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 @@
-
-
+
+
@@ -198,28 +198,28 @@
- {
+ "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
-
+
@@ -276,7 +276,15 @@
1768316965511
-
+
+
+ 1768317786187
+
+
+
+ 1768317786187
+
+
@@ -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());
+ }
+}