Skip to content

Commit 2270807

Browse files
authored
Merge pull request #20 from monkeyiq/2025/sep/soap-update
update test suite to using SOAP messages
2 parents b20892d + 1881c5f commit 2270807

3 files changed

Lines changed: 40 additions & 26 deletions

File tree

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
},
4747
"require-dev": {
4848
"beste/clock": "~3.0.0",
49+
"mockery/mockery": "~1.6.12",
4950
"simplesamlphp/simplesamlphp-test-framework": "~1.9.3"
5051
},
5152
"support": {

src/Controller/AttributeServer.php

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
namespace SimpleSAML\Module\exampleattributeserver\Controller;
66

77
use DateInterval;
8-
use Nyholm\Psr7\Factory\Psr17Factory;
8+
use Nyholm\Psr7\ServerRequest;
99
use SimpleSAML\{Configuration, Error, Logger};
1010
use SimpleSAML\HTTP\RunnableResponse;
1111
use SimpleSAML\Metadata\MetaDataStorageHandler;
12-
use SimpleSAML\SAML2\Binding;
1312
use SimpleSAML\SAML2\Binding\{SynchronousBindingInterface, SOAP};
1413
use SimpleSAML\SAML2\Constants as C;
1514
use SimpleSAML\SAML2\Utils as SAML2_Utils;
@@ -34,7 +33,6 @@
3433
use SimpleSAML\XMLSecurity\XML\ds\{KeyInfo, X509Certificate, X509Data};
3534
use SimpleSAML\XMLSecurity\XML\SignableElementInterface;
3635
use Symfony\Bridge\PsrHttpMessage\Factory\{HttpFoundationFactory, PsrHttpFactory};
37-
use Symfony\Component\HttpFoundation\Request;
3836

3937
use function array_filter;
4038

@@ -77,27 +75,14 @@ public function setMetadataStorageHandler(MetaDataStorageHandler $handler): void
7775

7876

7977
/**
80-
* @param \Symfony\Component\HttpFoundation\Request $request The current request.
78+
* @param \Nyholm\Psr7\ServerRequest $request The current request.
8179
*
8280
* @return \SimpleSAML\HTTP\RunnableResponse
8381
* @throws \SimpleSAML\Error\BadRequest
8482
*/
85-
public function main(/** @scrutinizer ignore-unused */ Request $request): RunnableResponse
83+
public function main(/** @scrutinizer ignore-unused */ SOAP $soap, ServerRequest $request): RunnableResponse
8684
{
87-
$psr17Factory = new Psr17Factory();
88-
$psrHttpFactory = new PsrHttpFactory($psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory);
89-
$psrRequest = $psrHttpFactory->createRequest($request);
90-
91-
$binding = Binding::getCurrentBinding($psrRequest);
92-
if (!($binding instanceof SynchronousBindingInterface)) {
93-
throw new Error\BadRequest('Invalid binding; MUST use a synchronous binding.');
94-
}
95-
96-
$message = $binding->receive($psrRequest);
97-
if (!($message instanceof AttributeQuery)) {
98-
throw new Error\BadRequest('Invalid message received to AttributeQuery endpoint.');
99-
}
100-
85+
$message = $soap->receive($request);
10186
$idpEntityId = $this->metadataHandler->getMetaDataCurrentEntityID('saml20-idp-hosted');
10287

10388
$issuer = $message->getIssuer();

tests/src/Controller/AttributeServerTest.php

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,23 @@
44

55
namespace SimpleSAML\Test\Module\exampleattributeserver\Controller;
66

7+
use Mockery\Adapter\Phpunit\MockeryTestCase;
8+
use Nyholm\Psr7\ServerRequest;
79
use PHPUnit\Framework\Attributes\CoversClass;
8-
use PHPUnit\Framework\TestCase;
910
use SimpleSAML\Configuration;
1011
use SimpleSAML\HTTP\RunnableResponse;
1112
use SimpleSAML\Metadata\MetaDataStorageHandler;
1213
use SimpleSAML\Module\exampleattributeserver\Controller\AttributeServer;
14+
use SimpleSAML\SAML2\Binding\SOAP;
1315
use SimpleSAML\XMLSecurity\TestUtils\PEMCertificatesMock;
14-
use Symfony\Component\HttpFoundation\Request;
1516

1617
/**
1718
* Set of tests for the controllers in the "exampleattributeserver" module.
1819
*
1920
* @package simplesamlphp/simplesamlphp-module-exampleattributeserver
2021
*/
2122
#[CoversClass(AttributeServer::class)]
22-
class ExampleAttributeServerTest extends TestCase
23+
class ExampleAttributeServerTest extends MockeryTestCase
2324
{
2425
/** @var \SimpleSAML\Configuration */
2526
protected static Configuration $config;
@@ -52,9 +53,22 @@ public static function setUpBeforeClass(): void
5253
*/
5354
public function testMain(): void
5455
{
55-
$_SERVER['REQUEST_URI'] = '/module.php/exampleattributeserver/attributeserver';
56-
$_SERVER['HTTP_HOST'] = 'example.org';
57-
$request = Request::createFromGlobals();
56+
$soap = $this->getStubWithInput(<<<SOAP
57+
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
58+
<SOAP-ENV:Body>
59+
<samlp:AttributeQuery xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="aaf23196-1773-2113-474a-fe114412ab72" Version="2.0" IssueInstant="2017-09-06T11:49:27Z">
60+
<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://example.org/</saml:Issuer>
61+
<saml:Subject>
62+
<saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified">urn:example:subject</saml:NameID>
63+
</saml:Subject>
64+
<saml:Attribute Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" FriendlyName="entitlements"/>
65+
<saml:Attribute Name="urn:oid:2.5.4.4" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" FriendlyName="sn"/>
66+
<saml:Attribute Name="urn:oid:2.16.840.1.113730.3.1.39" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" FriendlyName="preferredLanguage"/>
67+
</samlp:AttributeQuery>
68+
</SOAP-ENV:Body>
69+
</SOAP-ENV:Envelope>
70+
SOAP);
71+
5872

5973
$mdh = $this->createMock(MetaDataStorageHandler::class);
6074
$mdh->method('getMetaDataCurrentEntityID')->willReturn('https://example.org/');
@@ -67,9 +81,23 @@ public function testMain(): void
6781

6882
$c = new AttributeServer(self::$config);
6983
$c->setMetadataStorageHandler($mdh);
70-
$response = $c->main($request);
84+
85+
$request = new ServerRequest('', '');
86+
$response = $c->main($soap, $request);
7187

7288
$this->assertInstanceOf(RunnableResponse::class, $response);
7389
$this->assertTrue($response->isSuccessful());
7490
}
91+
92+
/**
93+
* @return \SimpleSAML\SAML2\Binding\SOAP
94+
*/
95+
private function getStubWithInput($input): SOAP
96+
{
97+
$stub = $this->getMockBuilder(SOAP::class)->onlyMethods(['getInputStream'])->getMock();
98+
$stub->expects($this->once())
99+
->method('getInputStream')
100+
->willReturn($input);
101+
return $stub;
102+
}
75103
}

0 commit comments

Comments
 (0)