feat: anonymization command for request/response XML dumps

This commit is contained in:
Björn Fromme
2026-03-04 10:47:20 +01:00
parent cd5d353158
commit 90fc66277e
5 changed files with 744 additions and 1 deletions
+220
View File
@@ -0,0 +1,220 @@
<?php
declare(strict_types=1);
namespace App\Tests\Service;
use App\Service\BpnXmlAnonymizer;
use PHPUnit\Framework\TestCase;
class BpnXmlAnonymizerTest extends TestCase
{
public function testAnonymizeReusesIdentityForSamePersonId(): void
{
$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<anfrage>
<anmelder>
<name>Schlegelmilch</name>
<vorname>Mandy</vorname>
<anschrift>
<strasse>Am Jägersteig 19</strasse>
<plz>40724</plz>
<ort>Hilden</ort>
</anschrift>
<kommunikation>
<email>[email protected]</email>
<telefonmobil>02212722760</telefonmobil>
</kommunikation>
<idadresseperson>255752</idadresseperson>
</anmelder>
<teilnehmerliste>
<teilnehmer id="1">
<name>Schlegelmilch</name>
<vorname>Mandy</vorname>
<anschrift>
<strasse>Am Jägersteig 19</strasse>
<plz>40724</plz>
<ort>Hilden</ort>
</anschrift>
<kommunikation>
<email>[email protected]</email>
<telefonmobil>02212722760</telefonmobil>
</kommunikation>
<idadresseperson>255752</idadresseperson>
</teilnehmer>
<teilnehmer id="2">
<name>Danielzik</name>
<vorname>Leon</vorname>
<kommunikation>
<email>[email protected]</email>
</kommunikation>
<idadresseperson>306886</idadresseperson>
</teilnehmer>
</teilnehmerliste>
</anfrage>
XML;
$anonymizer = new BpnXmlAnonymizer();
$result = $anonymizer->anonymize($xml);
$document = new \DOMDocument();
$this->assertTrue($document->loadXML($result));
$xpath = new \DOMXPath($document);
$applicantName = trim((string) $xpath->evaluate('string(//anmelder/name)'));
$participantOneName = trim((string) $xpath->evaluate('string(//teilnehmer[@id="1"]/name)'));
$participantOneEmail = trim((string) $xpath->evaluate('string(//teilnehmer[@id="1"]/kommunikation/email)'));
$applicantMobilePhone = trim((string) $xpath->evaluate('string(//anmelder/kommunikation/telefonmobil)'));
$participantOneMobilePhone = trim((string) $xpath->evaluate('string(//teilnehmer[@id="1"]/kommunikation/telefonmobil)'));
$participantTwoName = trim((string) $xpath->evaluate('string(//teilnehmer[@id="2"]/name)'));
$this->assertNotSame('Schlegelmilch', $applicantName);
$this->assertSame($applicantName, $participantOneName);
$this->assertStringEndsWith('@example.com', $participantOneEmail);
$this->assertNotSame('02212722760', $participantOneMobilePhone);
$this->assertSame($applicantMobilePhone, $participantOneMobilePhone);
$this->assertNotSame($participantOneName, $participantTwoName);
$this->assertSame(2, $anonymizer->getLastIdentityCount());
}
public function testAnonymizeReplacesKundeAttributes(): void
{
$xml = <<<'XML'
<?xml version="1.0" encoding="utf-8"?>
<ergebnis>
<vorgaenge>
<vorgang>
<kundennamen>
<kunde id="1" art="Anmelder/Teilnehmer" name="Fromme" vorname="Björn"></kunde>
<kunde id="2" art="Teilnehmer" name="Rütten" vorname="Manuela"></kunde>
</kundennamen>
</vorgang>
</vorgaenge>
</ergebnis>
XML;
$anonymizer = new BpnXmlAnonymizer();
$result = $anonymizer->anonymize($xml);
$document = new \DOMDocument();
$this->assertTrue($document->loadXML($result));
$xpath = new \DOMXPath($document);
$firstCustomerLastName = trim((string) $xpath->evaluate('string(//kunde[@id="1"]/@name)'));
$firstCustomerFirstName = trim((string) $xpath->evaluate('string(//kunde[@id="1"]/@vorname)'));
$this->assertNotSame('Fromme', $firstCustomerLastName);
$this->assertNotSame('Björn', $firstCustomerFirstName);
}
public function testAnonymizeThrowsOnInvalidXml(): void
{
$anonymizer = new BpnXmlAnonymizer();
$this->expectException(\InvalidArgumentException::class);
$anonymizer->anonymize('<invalid');
}
public function testAnonymizeLinksApplicantAndParticipantWhenOnlyDataMatches(): void
{
$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<anfrage>
<anmelder>
<name>Schlegelmilch</name>
<vorname>Mandy</vorname>
<anschrift>
<strasse>Am Jägersteig 19</strasse>
<plz>40724</plz>
<ort>Hilden</ort>
</anschrift>
<kommunikation>
<email>[email protected]</email>
</kommunikation>
</anmelder>
<teilnehmerliste>
<teilnehmer id="1">
<name>Schlegelmilch</name>
<vorname>Mandy</vorname>
<anschrift>
<strasse>Am Jägersteig 19</strasse>
<plz>40724</plz>
<ort>Hilden</ort>
</anschrift>
<kommunikation>
<email>[email protected]</email>
</kommunikation>
</teilnehmer>
</teilnehmerliste>
</anfrage>
XML;
$anonymizer = new BpnXmlAnonymizer();
$result = $anonymizer->anonymize($xml);
$document = new \DOMDocument();
$this->assertTrue($document->loadXML($result));
$xpath = new \DOMXPath($document);
$applicantName = trim((string) $xpath->evaluate('string(//anmelder/name)'));
$participantName = trim((string) $xpath->evaluate('string(//teilnehmer[@id="1"]/name)'));
$this->assertSame($applicantName, $participantName);
$this->assertSame(1, $anonymizer->getLastIdentityCount());
}
public function testAnonymizeCanReuseIdentityAcrossMultipleXmlDocuments(): void
{
$requestXml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<anfrage>
<anmelder>
<name>Schlegelmilch</name>
<vorname>Mandy</vorname>
<kommunikation>
<email>[email protected]</email>
</kommunikation>
<idadresseperson>255752</idadresseperson>
</anmelder>
</anfrage>
XML;
$responseXml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<ergebnis>
<teilnehmerliste>
<teilnehmer id="1">
<name>Schlegelmilch</name>
<vorname>Mandy</vorname>
<kommunikation>
<email>[email protected]</email>
</kommunikation>
<idadresseperson>255752</idadresseperson>
</teilnehmer>
</teilnehmerliste>
</ergebnis>
XML;
$anonymizer = new BpnXmlAnonymizer();
$anonymizedRequest = $anonymizer->anonymize($requestXml, true);
$anonymizedResponse = $anonymizer->anonymize($responseXml, false);
$requestDocument = new \DOMDocument();
$this->assertTrue($requestDocument->loadXML($anonymizedRequest));
$requestXpath = new \DOMXPath($requestDocument);
$requestName = trim((string) $requestXpath->evaluate('string(//anmelder/name)'));
$responseDocument = new \DOMDocument();
$this->assertTrue($responseDocument->loadXML($anonymizedResponse));
$responseXpath = new \DOMXPath($responseDocument);
$responseName = trim((string) $responseXpath->evaluate('string(//teilnehmer[@id="1"]/name)'));
$this->assertSame($requestName, $responseName);
$this->assertSame(1, $anonymizer->getLastIdentityCount());
}
}