From 3d30bd6719504f6aa32b9850a5f4783d7f0609a4 Mon Sep 17 00:00:00 2001 From: Toon Verwerft Date: Fri, 27 Mar 2026 14:05:38 +0100 Subject: [PATCH] Migrate to veewee/xml v4 and PHP 8.4+ - Bump minimum PHP to 8.4, drop 8.3 from CI - Upgrade veewee/xml ^3.6 to ^4.10 (spec-compliant DOM API) - Replace DOMDocument/DOMElement/DOMNode/DOMAttr with Dom\ equivalents - Replace deprecated Document::configure(loader(...)) with Document::fromLoader() - Use assert_document() for ownerDocument access (now ?Dom\Document) - Fix getAttribute/getAttributeNS null returns (was empty string) - Remove redundant null coalescing on localName (now non-nullable) - Fix textContent nullability in fault encoders - Update Soap12FaultEncoderTest for changed namespace serialization order - Bump php-soap/* packages to latest versions - Switch to standalone PSL dependencies (^6.1) - Add DOM stubs and phpVersion to psalm.xml --- .github/workflows/analyzers.yaml | 2 +- .github/workflows/code-style.yaml | 2 +- .github/workflows/tests.yaml | 2 +- composer.json | 29 ++++++--- examples/encoders/simpleType/anyXml.php | 2 +- psalm.xml | 4 ++ src/Encoder/SoapEnc/ApacheMapEncoder.php | 4 +- src/Encoder/SoapEnc/SoapArrayEncoder.php | 4 +- src/Encoder/SoapEnc/SoapObjectEncoder.php | 6 +- src/Fault/Encoder/Soap11FaultEncoder.php | 6 +- src/Fault/Encoder/Soap12FaultEncoder.php | 10 +-- src/TypeInference/XsiTypeDetector.php | 10 +-- src/Xml/Node/Element.php | 11 ++-- src/Xml/Node/ElementList.php | 4 +- .../Reader/DocumentToLookupArrayReader.php | 14 ++--- src/Xml/Reader/ElementValueReader.php | 8 +-- src/Xml/Reader/SoapEnvelopeReader.php | 3 +- .../Fault/Encoder/Soap11FaultEncoderTest.php | 20 +++--- .../Fault/Encoder/Soap12FaultEncoderTest.php | 61 +++---------------- .../TypeInference/XsiTypeDetectorTest.php | 16 ++--- tests/Unit/Xml/Node/ElementTest.php | 5 +- 21 files changed, 92 insertions(+), 131 deletions(-) diff --git a/.github/workflows/analyzers.yaml b/.github/workflows/analyzers.yaml index fbdbd31..f8f7ef5 100644 --- a/.github/workflows/analyzers.yaml +++ b/.github/workflows/analyzers.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-versions: [ '8.3', '8.4', '8.5' ] + php-versions: [ '8.4', '8.5' ] composer-options: [ '--ignore-platform-req=php+' ] fail-fast: false name: PHP ${{ matrix.php-versions }} @ ${{ matrix.operating-system }} diff --git a/.github/workflows/code-style.yaml b/.github/workflows/code-style.yaml index 59d5362..d05c7ee 100644 --- a/.github/workflows/code-style.yaml +++ b/.github/workflows/code-style.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-versions: [ '8.3', '8.4', '8.5' ] + php-versions: [ '8.4', '8.5' ] composer-options: [ '--ignore-platform-req=php+' ] fail-fast: false name: PHP ${{ matrix.php-versions }} @ ${{ matrix.operating-system }} diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index f8cde3d..ec74651 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-versions: [ '8.3', '8.4', '8.5' ] + php-versions: [ '8.4', '8.5' ] composer-options: [ '--ignore-platform-req=php+' ] dependency-preference: ['current', 'lowest', 'stable'] fail-fast: false diff --git a/composer.json b/composer.json index 37023f1..c3a4c07 100644 --- a/composer.json +++ b/composer.json @@ -21,14 +21,25 @@ } ], "require": { - "php": "~8.3.0 || ~8.4.0 || ~8.5.0", - "php-standard-library/php-standard-library": "^3.0 || ^4.0 || ^5.0 || ^6.0", + "php": "~8.4.0 || ~8.5.0", + "php-standard-library/collection": "^6.1", + "php-standard-library/dict": "^6.1", + "php-standard-library/encoding": "^6.1", + "php-standard-library/foundation": "^6.1", + "php-standard-library/fun": "^6.1", + "php-standard-library/iter": "^6.1", + "php-standard-library/option": "^6.1", + "php-standard-library/regex": "^6.1", + "php-standard-library/result": "^6.1", + "php-standard-library/str": "^6.1", + "php-standard-library/type": "^6.1", + "php-standard-library/vec": "^6.1", "veewee/reflecta": "~0.16", - "veewee/xml": "^3.6", - "php-soap/engine": "^2.19", - "php-soap/wsdl": "^1.18", - "php-soap/xml": "^1.9", - "php-soap/wsdl-reader": "^0.31" + "veewee/xml": "^4.10", + "php-soap/engine": "^2.20", + "php-soap/wsdl": "^1.19", + "php-soap/xml": "^1.10", + "php-soap/wsdl-reader": "^0.32" }, "require-dev": { "vimeo/psalm": "~6.13", @@ -36,8 +47,8 @@ "php-cs-fixer/shim": "~3.88", "symfony/var-dumper": "^7.0 || ^6.4", "php-standard-library/psalm-plugin": "^2.3", - "php-soap/engine-integration-tests": "^1.10", - "php-soap/psr18-transport": "^1.8", + "php-soap/engine-integration-tests": "^1.12", + "php-soap/psr18-transport": "^2.0", "guzzlehttp/guzzle": "^7.8", "phpbench/phpbench": "^1.6" }, diff --git a/examples/encoders/simpleType/anyXml.php b/examples/encoders/simpleType/anyXml.php index 938d880..3b0f7bf 100644 --- a/examples/encoders/simpleType/anyXml.php +++ b/examples/encoders/simpleType/anyXml.php @@ -36,7 +36,7 @@ public function iso(Context $context): Iso $targetElementName = $context->type->getXmlTargetNodeName(); return new Iso( to: static fn (array $data): string => document_encode([$targetElementName => $data]) - ->manipulate(static fn (\DOMDocument $document) => $document->documentElement->setAttributeNS( + ->manipulate(static fn (\Dom\XMLDocument $document) => $document->documentElement->setAttributeNS( VeeWee\Xml\Xmlns\Xmlns::xsi()->value(), 'xsi:type', 'custom:type' diff --git a/psalm.xml b/psalm.xml index 7a494c8..b0f130c 100644 --- a/psalm.xml +++ b/psalm.xml @@ -8,6 +8,7 @@ findUnusedBaselineEntry="true" findUnusedCode="false" ensureOverrideAttribute="false" + phpVersion="8.4" > @@ -15,6 +16,9 @@ + + + diff --git a/src/Encoder/SoapEnc/ApacheMapEncoder.php b/src/Encoder/SoapEnc/ApacheMapEncoder.php index 26b2676..1b9ad6a 100644 --- a/src/Encoder/SoapEnc/ApacheMapEncoder.php +++ b/src/Encoder/SoapEnc/ApacheMapEncoder.php @@ -4,7 +4,7 @@ namespace Soap\Encoding\Encoder\SoapEnc; use Closure; -use DOMElement; +use Dom\Element as DomElement; use Soap\Encoding\Encoder\Context; use Soap\Encoding\Encoder\SimpleType\ScalarTypeEncoder; use Soap\Encoding\Encoder\XmlEncoder; @@ -84,7 +84,7 @@ private function decodeArray(Context $context, Element $value): array $xpath = $value->document()->xpath(); return readChildren($element)->reduce( - static function (array $map, DOMElement $item) use ($context, $xpath): array { + static function (array $map, DomElement $item) use ($context, $xpath): array { $key = $xpath->evaluate('string(./key)', string(), $item); /** @psalm-var mixed $value */ $value = ElementValueReader::forEncoder( diff --git a/src/Encoder/SoapEnc/SoapArrayEncoder.php b/src/Encoder/SoapEnc/SoapArrayEncoder.php index c002992..c6c8414 100644 --- a/src/Encoder/SoapEnc/SoapArrayEncoder.php +++ b/src/Encoder/SoapEnc/SoapArrayEncoder.php @@ -4,7 +4,7 @@ namespace Soap\Encoding\Encoder\SoapEnc; use Closure; -use DOMElement; +use Dom\Element as DomElement; use Soap\Encoding\Encoder\Context; use Soap\Encoding\Encoder\Feature\ListAware; use Soap\Encoding\Encoder\XmlEncoder; @@ -100,7 +100,7 @@ private function decodeArray(Context $context, SoapArrayAccess $arrayAccess, Ele * @param list $list * @return list */ - static function (array $list, DOMElement $item) use ($iso): array { + static function (array $list, DomElement $item) use ($iso): array { /** @var mixed $value */ $value = $iso->from(Element::fromDOMElement($item)); diff --git a/src/Encoder/SoapEnc/SoapObjectEncoder.php b/src/Encoder/SoapEnc/SoapObjectEncoder.php index 775f803..d433118 100644 --- a/src/Encoder/SoapEnc/SoapObjectEncoder.php +++ b/src/Encoder/SoapEnc/SoapObjectEncoder.php @@ -4,7 +4,7 @@ namespace Soap\Encoding\Encoder\SoapEnc; use Closure; -use DOMElement; +use Dom\Element as DomElement; use Soap\Encoding\Encoder\Context; use Soap\Encoding\Encoder\SimpleType\ScalarTypeEncoder; use Soap\Encoding\Encoder\XmlEncoder; @@ -75,8 +75,8 @@ private function decodeArray(Context $context, Element $value): object $element = $value->element(); return (object) readChildren($element)->reduce( - static function (array $map, DOMElement $item) use ($context): array { - $key = $item->localName ?? 'unkown'; + static function (array $map, DomElement $item) use ($context): array { + $key = $item->localName; /** @psalm-var mixed $value */ $value = ElementValueReader::forEncoder( $context->withType(XsdType::any()), diff --git a/src/Fault/Encoder/Soap11FaultEncoder.php b/src/Fault/Encoder/Soap11FaultEncoder.php index 1d9735f..91cfce5 100644 --- a/src/Fault/Encoder/Soap11FaultEncoder.php +++ b/src/Fault/Encoder/Soap11FaultEncoder.php @@ -90,9 +90,9 @@ private function from(string $fault): Soap11Fault $detail = $xpath->query('./detail'); return new Soap11Fault( - faultCode: WhitespaceRestriction::collapse($xpath->querySingle('./faultcode')->textContent), - faultString: WhitespaceRestriction::collapse($xpath->querySingle('./faultstring')->textContent), - faultActor: $actor->count() ? trim($actor->expectFirst()->textContent) : null, + faultCode: WhitespaceRestriction::collapse($xpath->querySingle('./faultcode')->textContent ?? ''), + faultString: WhitespaceRestriction::collapse($xpath->querySingle('./faultstring')->textContent ?? ''), + faultActor: $actor->count() ? trim($actor->expectFirst()->textContent ?? '') : null, detail: $detail->count() ? Document::fromXmlNode($detail->expectFirst())->stringifyDocumentElement() : null, ); } diff --git a/src/Fault/Encoder/Soap12FaultEncoder.php b/src/Fault/Encoder/Soap12FaultEncoder.php index 39cdede..5c6bbd3 100644 --- a/src/Fault/Encoder/Soap12FaultEncoder.php +++ b/src/Fault/Encoder/Soap12FaultEncoder.php @@ -135,11 +135,11 @@ private function from(string $fault): Soap12Fault $detail = $xpath->query('./env:Detail'); return new Soap12Fault( - code: WhitespaceRestriction::collapse($xpath->querySingle('./env:Code/env:Value')->textContent), - reason: WhitespaceRestriction::collapse($xpath->querySingle('./env:Reason/env:Text')->textContent), - subCode: $subCode->count() ? WhitespaceRestriction::collapse($subCode->expectFirst()->textContent) : null, - node: $node->count() ? trim($node->expectFirst()->textContent) : null, - role: $role->count() ? trim($role->expectFirst()->textContent) : null, + code: WhitespaceRestriction::collapse($xpath->querySingle('./env:Code/env:Value')->textContent ?? ''), + reason: WhitespaceRestriction::collapse($xpath->querySingle('./env:Reason/env:Text')->textContent ?? ''), + subCode: $subCode->count() ? WhitespaceRestriction::collapse($subCode->expectFirst()->textContent ?? '') : null, + node: $node->count() ? trim($node->expectFirst()->textContent ?? '') : null, + role: $role->count() ? trim($role->expectFirst()->textContent ?? '') : null, detail: $detail->count() ? Document::fromXmlNode($detail->expectFirst())->stringifyDocumentElement() : null, ); } diff --git a/src/TypeInference/XsiTypeDetector.php b/src/TypeInference/XsiTypeDetector.php index 59a80c7..6c2b296 100644 --- a/src/TypeInference/XsiTypeDetector.php +++ b/src/TypeInference/XsiTypeDetector.php @@ -3,7 +3,7 @@ namespace Soap\Encoding\TypeInference; -use DOMElement; +use Dom\Element; use Psl\Option\Option; use Soap\Encoding\Cache\ScopedCache; use Soap\Encoding\Encoder\Context; @@ -58,10 +58,10 @@ static function () use ($context, $value) { /** * @return Option */ - public static function detectXsdTypeFromXmlElement(Context $context, DOMElement $element): Option + public static function detectXsdTypeFromXmlElement(Context $context, Element $element): Option { - $xsiType = $element->getAttributeNS(Xmlns::xsi()->value(), 'type') ?: $element->getAttribute('xsi:type'); - if (!$xsiType) { + $xsiType = $element->getAttributeNS(Xmlns::xsi()->value(), 'type') ?? $element->getAttribute('xsi:type'); + if ($xsiType === null || $xsiType === '') { return none(); } @@ -91,7 +91,7 @@ public static function detectXsdTypeFromXmlElement(Context $context, DOMElement /** * @return Option> */ - public static function detectEncoderFromXmlElement(Context $context, DOMElement $element): Option + public static function detectEncoderFromXmlElement(Context $context, Element $element): Option { $requestedXsiType = self::detectXsdTypeFromXmlElement($context, $element); if (!$requestedXsiType->isSome()) { diff --git a/src/Xml/Node/Element.php b/src/Xml/Node/Element.php index 6ae397a..4e9d7aa 100644 --- a/src/Xml/Node/Element.php +++ b/src/Xml/Node/Element.php @@ -3,14 +3,15 @@ namespace Soap\Encoding\Xml\Node; -use DOMElement; +use Dom\Element as DomElement; use Stringable; use VeeWee\Xml\Dom\Document; use function Psl\invariant; +use function VeeWee\Xml\Dom\Assert\assert_document; final class Element implements Stringable { - private ?DOMElement $element = null; + private ?DomElement $element = null; /** * @var non-empty-string|null */ @@ -32,7 +33,7 @@ public static function fromString(string $xml): Element return $new; } - public static function fromDOMElement(DOMElement $element): self + public static function fromDOMElement(DomElement $element): self { $new = new self(); $new->element = $element; @@ -41,7 +42,7 @@ public static function fromDOMElement(DOMElement $element): self return $new; } - public function element(): DOMElement + public function element(): DomElement { if (!$this->element) { invariant($this->value !== null, 'Expected an XML value to be present'); @@ -66,7 +67,7 @@ public function value(): string public function document(): Document { - return Document::fromUnsafeDocument($this->element()->ownerDocument); + return Document::fromUnsafeDocument(assert_document($this->element()->ownerDocument)); } /** diff --git a/src/Xml/Node/ElementList.php b/src/Xml/Node/ElementList.php index 0740e28..eb71b13 100644 --- a/src/Xml/Node/ElementList.php +++ b/src/Xml/Node/ElementList.php @@ -5,7 +5,7 @@ use Closure; use Countable; -use DOMElement; +use Dom\Element as DomElement; use Soap\Encoding\Xml\Reader\DocumentToLookupArrayReader; use Stringable; use VeeWee\Xml\Dom\Document; @@ -69,7 +69,7 @@ public static function fromString(string $xml): self return new self( ...readChildren($doc->locateDocumentElement())->map( - static fn (DOMElement $element): Element => Element::fromDOMElement($element) + static fn (DomElement $element): Element => Element::fromDOMElement($element) ) ); } diff --git a/src/Xml/Reader/DocumentToLookupArrayReader.php b/src/Xml/Reader/DocumentToLookupArrayReader.php index 1efb076..dd6b7b1 100644 --- a/src/Xml/Reader/DocumentToLookupArrayReader.php +++ b/src/Xml/Reader/DocumentToLookupArrayReader.php @@ -3,8 +3,8 @@ namespace Soap\Encoding\Xml\Reader; -use DOMAttr; -use DOMNode; +use Dom\Attr; +use Dom\Node; use Soap\Encoding\Xml\Node\Element; use Soap\Encoding\Xml\Node\ElementList; use VeeWee\Xml\Xmlns\Xmlns; @@ -28,14 +28,14 @@ public function __invoke(Element $xml): array // Read all child elements. // The key is the name of the elements // The value is the raw XML for those element(s) - /** @var iterable $children */ + /** @var iterable $children */ $children = $root->childNodes; foreach ($children as $element) { if (!is_element($element)) { continue; } - $key = $element->localName ?? 'unknown'; + $key = $element->localName; $previousValue = $nodes[$key] ?? null; $currentElement = Element::fromDOMElement($element); @@ -53,14 +53,14 @@ public function __invoke(Element $xml): array // It might be possible that the child is a regular textNode. // In that case, we use '_' as the key and the value of the textNode as value. if (!$nodes && $root->getAttributeNS(Xmlns::xsi()->value(), 'nil') !== 'true') { - $nodes['_'] = $root->textContent; + $nodes['_'] = $root->textContent ?? ''; } // All attributes also need to be added as key => value pairs. - /** @var \iterable $attributes */ + /** @var \iterable $attributes */ $attributes = $root->attributes; foreach ($attributes as $attribute) { - $key = $attribute->localName ?? 'unknown'; + $key = $attribute->localName; $nodes[$key] = $attribute->value; } diff --git a/src/Xml/Reader/ElementValueReader.php b/src/Xml/Reader/ElementValueReader.php index 40298bc..33afc7d 100644 --- a/src/Xml/Reader/ElementValueReader.php +++ b/src/Xml/Reader/ElementValueReader.php @@ -3,7 +3,7 @@ namespace Soap\Encoding\Xml\Reader; -use DOMElement; +use Dom\Element; use Soap\Encoding\Encoder\Context; use Soap\Encoding\Encoder\XmlEncoder; use VeeWee\Reflecta\Iso\Iso; @@ -19,7 +19,7 @@ final class ElementValueReader public function __invoke( Context $context, XmlEncoder $encoder, - DOMElement $element + Element $element ): mixed { return self::forEncoder($context, $encoder, $element); } @@ -28,7 +28,7 @@ public function __invoke( * @param XmlEncoder $encoder * @psalm-return mixed */ - public static function forEncoder(Context $context, XmlEncoder $encoder, DOMElement $element): mixed + public static function forEncoder(Context $context, XmlEncoder $encoder, Element $element): mixed { return $encoder->iso($context)->from( readValue($element, string()) @@ -39,7 +39,7 @@ public static function forEncoder(Context $context, XmlEncoder $encoder, DOMElem * @param Iso $iso * @psalm-return mixed */ - public static function forIso(Iso $iso, DOMElement $element): mixed + public static function forIso(Iso $iso, Element $element): mixed { return $iso->from( readValue($element, string()) diff --git a/src/Xml/Reader/SoapEnvelopeReader.php b/src/Xml/Reader/SoapEnvelopeReader.php index 1246980..65c7e1a 100644 --- a/src/Xml/Reader/SoapEnvelopeReader.php +++ b/src/Xml/Reader/SoapEnvelopeReader.php @@ -8,7 +8,6 @@ use Soap\Xml\Locator\SoapBodyLocator; use VeeWee\Xml\Dom\Document; use function VeeWee\Xml\Dom\Assert\assert_element; -use function VeeWee\Xml\Dom\Configurator\loader; use function VeeWee\Xml\Dom\Loader\xml_string_loader; final class SoapEnvelopeReader @@ -19,7 +18,7 @@ final class SoapEnvelopeReader */ public function __invoke(string $xml, int $libXmlOptions = 0): Element { - $envelope = Document::configure(loader(xml_string_loader($xml, $libXmlOptions))); + $envelope = Document::fromLoader(xml_string_loader($xml, $libXmlOptions)); // Make sure it does not contain a fault response before parsing the body parts. (new SoapFaultGuard())($envelope); diff --git a/tests/Unit/Fault/Encoder/Soap11FaultEncoderTest.php b/tests/Unit/Fault/Encoder/Soap11FaultEncoderTest.php index 2ec8857..74d5a5a 100644 --- a/tests/Unit/Fault/Encoder/Soap11FaultEncoderTest.php +++ b/tests/Unit/Fault/Encoder/Soap11FaultEncoderTest.php @@ -7,9 +7,7 @@ use Soap\Encoding\Fault\Encoder\Soap11FaultEncoder; use Soap\Encoding\Fault\Soap11Fault; use VeeWee\Xml\Dom\Document; -use function VeeWee\Xml\Dom\Configurator\loader; use function VeeWee\Xml\Dom\Configurator\trim_spaces; -use function VeeWee\Xml\Dom\Loader\xml_string_loader; #[CoversClass(Soap11FaultEncoder::class)] #[CoversClass(Soap11Fault::class)] @@ -23,16 +21,15 @@ public static function provideIsomorphicCases(): iterable yield 'required-fields-only' => [ ...$baseConfig, - 'xml' => Document::configure( - trim_spaces(), - loader(xml_string_loader( - << Document::fromXmlString( + << a:Microsoft.Dynamics.ServiceBrokerException Invalid input parameter x EOXML - )) + , + trim_spaces() )->stringifyDocumentElement(), 'data' => new Soap11Fault( faultCode: 'a:Microsoft.Dynamics.ServiceBrokerException', @@ -41,10 +38,8 @@ public static function provideIsomorphicCases(): iterable ]; yield 'all-fields' => [ ...$baseConfig, - 'xml' => Document::configure( - trim_spaces(), - loader(xml_string_loader( - << Document::fromXmlString( + << a:Microsoft.Dynamics.ServiceBrokerException Invalid input parameter x @@ -52,7 +47,8 @@ public static function provideIsomorphicCases(): iterable value EOXML - )) + , + trim_spaces() )->stringifyDocumentElement(), 'data' => new Soap11Fault( faultCode: 'a:Microsoft.Dynamics.ServiceBrokerException', diff --git a/tests/Unit/Fault/Encoder/Soap12FaultEncoderTest.php b/tests/Unit/Fault/Encoder/Soap12FaultEncoderTest.php index ed0ea37..5265134 100644 --- a/tests/Unit/Fault/Encoder/Soap12FaultEncoderTest.php +++ b/tests/Unit/Fault/Encoder/Soap12FaultEncoderTest.php @@ -7,9 +7,7 @@ use Soap\Encoding\Fault\Encoder\Soap12FaultEncoder; use Soap\Encoding\Fault\Soap12Fault; use VeeWee\Xml\Dom\Document; -use function VeeWee\Xml\Dom\Configurator\loader; use function VeeWee\Xml\Dom\Configurator\trim_spaces; -use function VeeWee\Xml\Dom\Loader\xml_string_loader; #[CoversClass(Soap12FaultEncoder::class)] #[CoversClass(Soap12Fault::class)] @@ -23,10 +21,8 @@ public static function provideIsomorphicCases(): iterable yield 'required-fields-only' => [ ...$baseConfig, - 'xml' => Document::configure( - trim_spaces(), - loader(xml_string_loader( - << Document::fromXmlString( + << env:Sender @@ -36,7 +32,8 @@ public static function provideIsomorphicCases(): iterable EOXML - )) + , + trim_spaces() )->stringifyDocumentElement(), 'data' => new Soap12Fault( code: 'env:Sender', @@ -45,66 +42,24 @@ public static function provideIsomorphicCases(): iterable ]; yield 'subcode-and-details-example' => [ ...$baseConfig, - 'xml' => Document::configure( - trim_spaces(), - loader(xml_string_loader( - << - - env:Sender - - m:MessageTimeout - - - - Sender Timeout - - P5M - - EOXML - )) - )->stringifyDocumentElement(), + 'xml' => 'env:Senderm:MessageTimeoutSender TimeoutP5M', 'data' => new Soap12Fault( code: 'env:Sender', subCode: 'm:MessageTimeout', reason: 'Sender Timeout', - detail: trim(<<P5M - EOXML) + detail: 'P5M', ), ]; yield 'full-example' => [ ...$baseConfig, - 'xml' => Document::configure( - trim_spaces(), - loader(xml_string_loader( - << - - env:Sender - - m:MessageTimeout - - - - Sender Timeout - - urn:node - urn:role - P5M - - EOXML - )) - )->stringifyDocumentElement(), + 'xml' => 'env:Senderm:MessageTimeoutSender Timeouturn:nodeurn:roleP5M', 'data' => new Soap12Fault( code: 'env:Sender', subCode: 'm:MessageTimeout', reason: 'Sender Timeout', node: 'urn:node', role: 'urn:role', - detail: trim(<<P5M - EOXML) + detail: 'P5M', ), ]; } diff --git a/tests/Unit/TypeInference/XsiTypeDetectorTest.php b/tests/Unit/TypeInference/XsiTypeDetectorTest.php index 3b4da1c..a8ba494 100644 --- a/tests/Unit/TypeInference/XsiTypeDetectorTest.php +++ b/tests/Unit/TypeInference/XsiTypeDetectorTest.php @@ -3,8 +3,8 @@ namespace Soap\Encoding\Test\Unit\TypeInference; -use DOMDocument; -use DOMElement; +use Dom\Element; +use Dom\XMLDocument; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use Soap\Encoding\Test\Unit\ContextCreatorTrait; @@ -62,10 +62,8 @@ public function test_it_detects_xsi_type_with_mismatched_prefix(): void */ public function test_it_detects_xsi_type_without_xsi_namespace_declaration(): void { - $doc = new DOMDocument(); - $doc->loadXML(''); + $doc = XMLDocument::createFromString(''); $element = $doc->documentElement; - $element->setAttribute('xsi:type', 'tns:MyType'); $context = self::createContext(XsdType::guess('anyType')); $result = XsiTypeDetector::detectXsdTypeFromXmlElement($context, $element); @@ -114,8 +112,7 @@ public function test_it_returns_none_for_unprefixed_xsi_type_without_default_nam */ public function test_it_falls_back_to_wsdl_namespaces_when_dom_has_no_declaration(): void { - $doc = new DOMDocument(); - $doc->loadXML(''); + $doc = XMLDocument::createFromString(''); $element = $doc->documentElement; $element->setAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'xsi:type', 'tns:MyType'); @@ -140,10 +137,9 @@ public function test_it_returns_none_for_unknown_prefix(): void static::assertFalse($result->isSome()); } - private function createElement(string $xml): DOMElement + private function createElement(string $xml): Element { - $doc = new DOMDocument(); - $doc->loadXML($xml); + $doc = XMLDocument::createFromString($xml); return $doc->documentElement; } diff --git a/tests/Unit/Xml/Node/ElementTest.php b/tests/Unit/Xml/Node/ElementTest.php index e26a35c..0a91d1e 100644 --- a/tests/Unit/Xml/Node/ElementTest.php +++ b/tests/Unit/Xml/Node/ElementTest.php @@ -3,7 +3,7 @@ namespace Soap\Encoding\Test\Unit\Xml\Node; -use DOMDocument; +use Dom\XMLDocument; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use Soap\Encoding\Xml\Node\Element; @@ -25,8 +25,7 @@ public function test_it_can_be_constructed_from_xml(): void public function test_it_can_be_constructed_from_dom_element(): void { - $document = new DOMDocument(); - $document->loadXML($xml = 'world'); + $document = XMLDocument::createFromString($xml = 'world'); $element = Element::fromDOMElement($DOMElement = $document->documentElement); static::assertSame($DOMElement, $element->element());