feat: anonymization command for request/response XML dumps
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user