feat: local password hashes

This commit is contained in:
Björn Fromme committed 2026-06-23 16:27:08 +02:00
1 parent 08f6633507
commit fe562e5e73
15 files changed
+541 -253

No files matched your search

@@ -0,0 +1,96 @@
<?php
declare(strict_types=1);
namespace App\Tests\BusProNet;
use App\BusProNet\ApiClient;
use App\BusProNet\DataProcessor\BookingDataProcessor;
use App\BusProNet\XmlParser\ApiResponseParser;
use App\Service\RequestIdGenerator;
use League\Flysystem\FilesystemOperator;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
class ApiClientPersonalDataRequestTest extends TestCase
{
public function testPersonalDataRequestUsesLoginFlagAndAddressIdentifiers(): void
{
$apiClient = $this->createApiClient();
$payload = $this->invokeBuildPersonalDataRequestData($apiClient, '[email protected]', 'Adressdaten', 123, 456);
$xml = $this->serializePayload($payload);
self::assertStringContainsString('<login>J</login>', $xml);
self::assertStringNotContainsString('<passwort>', $xml);
self::assertStringContainsString('<email>[email protected]</email>', $xml);
self::assertStringContainsString('<idadresse>123</idadresse>', $xml);
self::assertStringContainsString('<idadresseperson>456</idadresseperson>', $xml);
}
public function testPersonalDataRequestOmitsOptionalIdentifiersWhenNotProvided(): void
{
$apiClient = $this->createApiClient();
$payload = $this->invokeBuildPersonalDataRequestData($apiClient, '[email protected]', 'Adressdaten');
$xml = $this->serializePayload($payload);
self::assertStringContainsString('<login>J</login>', $xml);
self::assertStringNotContainsString('<passwort>', $xml);
self::assertStringContainsString('<email>[email protected]</email>', $xml);
self::assertStringNotContainsString('<idadresse>', $xml);
self::assertStringNotContainsString('<idadresseperson>', $xml);
}
/**
* @return array<string, mixed>
*/
private function invokeBuildPersonalDataRequestData(
ApiClient $apiClient,
string $email,
string $art,
?int $addressId = null,
?int $personId = null
): array
{
$method = new \ReflectionMethod(ApiClient::class, 'buildCustomerDataRequestData');
$method->setAccessible(true);
/** @var array<string, mixed> $payload */
$payload = $method->invoke($apiClient, $email, $art, $addressId, $personId);
return $payload;
}
/**
* @param array<string, mixed> $payload
*/
private function serializePayload(array $payload): string
{
return (new Serializer([], [new XmlEncoder()]))->serialize($payload, 'xml', [
XmlEncoder::ROOT_NODE_NAME => 'anfrage',
XmlEncoder::ENCODING => 'UTF-8',
]);
}
private function createApiClient(): ApiClient
{
return new ApiClient(
$this->createMock(SerializerInterface::class),
$this->createMock(ApiResponseParser::class),
$this->createMock(FilesystemOperator::class),
$this->createMock(LoggerInterface::class),
$this->createMock(BookingDataProcessor::class),
new RequestStack(),
new RequestIdGenerator(),
[
'bpn_username' => 'test-user',
'bpn_password' => 'test-password',
'bpn_api_ip' => '127.0.0.1',
'bpn_api_ports' => [9000],
],
);
}
}