221 lines
7.5 KiB
PHP
221 lines
7.5 KiB
PHP
<?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());
|
|
}
|
|
}
|