Skip to content

Commit ea80ce1

Browse files
authored
Merge pull request #34 from veewee/predicate-is-of-type
Introduce a predicate IsOfType that checks both current and extending…
2 parents 328dfcc + 513cb72 commit ea80ce1

File tree

4 files changed

+163
-4
lines changed

4 files changed

+163
-4
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"php": "~8.1.0 || ~8.2.0 || ~8.3.0",
1717
"ext-dom": "*",
1818
"goetas-webservices/xsd-reader": "^0.4.6",
19-
"php-soap/engine": "^2.9",
19+
"php-soap/engine": "^2.10.1",
2020
"php-soap/wsdl": "^1.4",
2121
"php-soap/xml": "^1.6.0",
2222
"veewee/xml": "^3.0",

src/Metadata/Converter/Wsdl1ToMethodsConverter.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,13 @@ private function parseMethod(Wsdl1SelectedService $service, BindingOperation $bi
5555
[]
5656
);
5757

58-
$void = XsdType::guess('void');
5958
$returnType = $outputMessage->map($convertMessageToTypesDict)->mapOr(
6059
static fn (array $types): XsdType => match (count($types)) {
61-
0 => $void,
60+
0 => XsdType::void(),
6261
1 => first($types),
6362
default => XsdType::guess('array')
6463
},
65-
$void
64+
XsdType::void()
6665
);
6766

6867
$configure = pipe(

src/Metadata/Predicate/IsOfType.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Soap\WsdlReader\Metadata\Predicate;
5+
6+
use Soap\Engine\Metadata\Model\XsdType;
7+
8+
final class IsOfType
9+
{
10+
/**
11+
* @param non-empty-string $namespace
12+
* @param non-empty-string $name
13+
*/
14+
public function __construct(
15+
private readonly string $namespace,
16+
private readonly string $name
17+
) {
18+
}
19+
20+
public function __invoke(XsdType $type): bool
21+
{
22+
$normalize = mb_strtolower(...);
23+
$expectedName = $normalize($this->name);
24+
$expectedNamespace = $normalize($this->namespace);
25+
26+
if ($normalize($type->getXmlTypeName()) === $expectedName && $normalize($type->getXmlNamespace()) === $expectedNamespace) {
27+
return true;
28+
}
29+
30+
$extends = $type->getMeta()
31+
->extends()
32+
->filter(static fn (array $extends): bool => $normalize($extends['type']) === $expectedName
33+
&& $normalize($extends['namespace']) === $expectedNamespace);
34+
if ($extends->isSome()) {
35+
return true;
36+
}
37+
38+
return false;
39+
}
40+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Soap\WsdlReader\Test\Unit\Metadata\Predicate;
5+
6+
use PHPUnit\Framework\TestCase;
7+
use Soap\Engine\Metadata\Model\TypeMeta;
8+
use Soap\Engine\Metadata\Model\XsdType;
9+
use Soap\WsdlReader\Metadata\Predicate\IsOfType;
10+
11+
final class IsOfTypeTest extends TestCase
12+
{
13+
14+
/**
15+
* @dataProvider provideTests
16+
*
17+
*/
18+
public function test_it_knows_if_a_type_is_considered_nullable(
19+
string $namespace,
20+
string $name,
21+
XsdType $type,
22+
bool $expected
23+
): void {
24+
static::assertSame($expected, (new IsOfType($namespace, $name))($type));
25+
}
26+
27+
public static function provideTests()
28+
{
29+
yield 'empty' => [
30+
'https://test',
31+
'test',
32+
(new XsdType('')),
33+
false,
34+
];
35+
yield 'invalid-type' => [
36+
'https://test',
37+
'test',
38+
(new XsdType('test'))
39+
->withXmlTypeName('invalid')
40+
->withXmlNamespace('https://test'),
41+
false,
42+
];
43+
yield 'invalid-ns' => [
44+
'https://test',
45+
'test',
46+
(new XsdType('test'))
47+
->withXmlTypeName('test')
48+
->withXmlNamespace('invalid'),
49+
false,
50+
];
51+
yield 'valid' => [
52+
'https://test',
53+
'test',
54+
(new XsdType('test'))
55+
->withXmlTypeName('test')
56+
->withXmlNamespace('https://test'),
57+
true,
58+
];
59+
yield 'valid-case-insensitive' => [
60+
'https://TEST',
61+
'TEST',
62+
(new XsdType('test'))
63+
->withXmlTypeName('test')
64+
->withXmlNamespace('https://test'),
65+
true,
66+
];
67+
yield 'invalid-extend-type' => [
68+
'https://test',
69+
'test',
70+
(new XsdType(''))
71+
->withMeta(
72+
static fn (TypeMeta $meta) => $meta->withExtends([
73+
'type' => 'invalid',
74+
'namespace' => 'https://test',
75+
'isSimple' => false,
76+
])
77+
),
78+
false,
79+
];
80+
yield 'invalid-extend-ns' => [
81+
'https://test',
82+
'test',
83+
(new XsdType(''))
84+
->withMeta(
85+
static fn (TypeMeta $meta) => $meta->withExtends([
86+
'type' => 'test',
87+
'namespace' => 'invalid',
88+
'isSimple' => false,
89+
])
90+
),
91+
false,
92+
];
93+
yield 'valid-extend' => [
94+
'https://test',
95+
'test',
96+
(new XsdType(''))
97+
->withMeta(
98+
static fn (TypeMeta $meta) => $meta->withExtends([
99+
'type' => 'test',
100+
'namespace' => 'https://test',
101+
'isSimple' => false,
102+
])
103+
),
104+
true,
105+
];
106+
yield 'valid-extend-case-insensitive' => [
107+
'https://TEST',
108+
'TEST',
109+
(new XsdType(''))
110+
->withMeta(
111+
static fn (TypeMeta $meta) => $meta->withExtends([
112+
'type' => 'test',
113+
'namespace' => 'https://test',
114+
'isSimple' => false,
115+
])
116+
),
117+
true,
118+
];
119+
}
120+
}

0 commit comments

Comments
 (0)