Skip to content

Commit

Permalink
* DtdValidator can be instantiated with custom dtds
Browse files Browse the repository at this point in the history
* DtdValidator can be instantiated for a directory with DTDs `::forDtdDirectory()`
  • Loading branch information
mathielen committed Jan 28, 2025
1 parent b99c7d6 commit 93e0f5f
Show file tree
Hide file tree
Showing 11 changed files with 25 additions and 22 deletions.
27 changes: 15 additions & 12 deletions src/CXml/Validation/DtdValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,20 @@

readonly class DtdValidator
{
public function __construct(private string $pathToCxmlDtds)
public function __construct(
private array $pathToDtds
)
{
Assertion::directory($pathToCxmlDtds);
Assertion::file($pathToCxmlDtds . '/cXML.dtd');
Assertion::file($pathToCxmlDtds . '/Fulfill.dtd');
Assertion::file($pathToCxmlDtds . '/Quote.dtd');
Assertion::notEmpty($pathToDtds);
}

public static function forDtdDirectory(string $directory): self
{
Assertion::directory($directory);

$pathToDtds = glob($directory . '/*.dtd');

return new self($pathToDtds);
}

/**
Expand All @@ -38,12 +46,7 @@ public function validateAgainstDtd(string $xml): void
$old = new DOMDocument();
$old->loadXML($xml);

$validateFiles = ['cXML.dtd', 'Fulfill.dtd', 'Quote.dtd'];
if (file_exists($this->pathToCxmlDtds . '/Custom.dtd')) {
$validateFiles[] = 'Custom.dtd';
}

$this->validateAgainstMultipleDtd($validateFiles, $old);
$this->validateAgainstMultipleDtd($this->pathToDtds, $old);

// reset throwing of php errors for libxml
libxml_use_internal_errors($internalErrors);
Expand All @@ -57,7 +60,7 @@ private function injectDtd(DOMDocument $originalDomDocument, string $dtdFilename
$creator = new DOMImplementation();

try {
$doctype = $creator->createDocumentType('cXML', '', $this->pathToCxmlDtds . '/' . $dtdFilename);
$doctype = $creator->createDocumentType('cXML', '', $dtdFilename);
$new = $creator->createDocument('', '', $doctype);
} catch (DOMException $domException) {
throw new CXmlInvalidException($domException->getMessage(), (string)$originalDomDocument->saveXML(), $domException);
Expand Down
2 changes: 1 addition & 1 deletion tests/CXmlTest/Handling/HandlerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ private static function loadFixture(string $filename): ?string
public function testEndpoint(string $requestCxml, string $expectedHandlerCalled): void
{
$serializer = Serializer::create();
$messageValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.050');
$messageValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.050');

$credentialRepository = new Registry();
$credentialRepository->registerCredential(
Expand Down
2 changes: 1 addition & 1 deletion tests/CXmlTest/Model/OrderRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ final class OrderRequestTest extends TestCase implements PayloadIdentityFactoryI

protected function setUp(): void
{
$this->dtdValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
$this->dtdValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
}

public function testMinimumExample(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/CXmlTest/Model/ProductActivityMessageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ final class ProductActivityMessageTest extends TestCase implements PayloadIdenti

protected function setUp(): void
{
$this->dtdValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
$this->dtdValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
}

public function testMinimumExample(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/CXmlTest/Model/PunchOutSetupRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ final class PunchOutSetupRequestTest extends TestCase implements PayloadIdentity

protected function setUp(): void
{
$this->dtdValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
$this->dtdValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
}

public function testMinimumExample(): void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ final class PunchoutOrderMessageAdvancedPricingTest extends TestCase implements

protected function setUp(): void
{
$this->dtdValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
$this->dtdValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
}

public function testMinimumExampleAdvPricing(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/CXmlTest/Model/PunchoutOrderMessageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ final class PunchoutOrderMessageTest extends TestCase implements PayloadIdentity

protected function setUp(): void
{
$this->dtdValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
$this->dtdValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
}

public function testMinimumExample(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/CXmlTest/Model/QuoteMessageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ final class QuoteMessageTest extends TestCase implements PayloadIdentityFactoryI

protected function setUp(): void
{
$this->dtdValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
$this->dtdValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
}

public function testMinimumExample(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/CXmlTest/Model/ShipNoticeRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ final class ShipNoticeRequestTest extends TestCase implements PayloadIdentityFac

protected function setUp(): void
{
$this->dtdValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
$this->dtdValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
}

public function testMinimumExample(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/CXmlTest/Model/StatusUpdateRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ final class StatusUpdateRequestTest extends TestCase implements PayloadIdentityF

protected function setUp(): void
{
$this->dtdValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
$this->dtdValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.050/');
}

public function testMinimumExample(): void
Expand Down
2 changes: 1 addition & 1 deletion tests/CXmlTest/Validation/MessageValidatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ final class MessageValidatorTest extends TestCase

protected function setUp(): void
{
$this->dtdValidator = new DtdValidator(__DIR__ . '/../../metadata/cxml/dtd/1.2.063');
$this->dtdValidator = DtdValidator::forDtdDirectory(__DIR__ . '/../../metadata/cxml/dtd/1.2.063');
}

public function testValidateProfileRequestSuccess(): void
Expand Down

0 comments on commit 93e0f5f

Please sign in to comment.