Skip to content

Commit b47d586

Browse files
authored
Test entire request (#310)
1 parent a5aac3a commit b47d586

File tree

6 files changed

+131
-25
lines changed

6 files changed

+131
-25
lines changed

src/Request.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public function __construct(string $method, string $uri, array $query, array $he
3333
{
3434
$this->method = $method;
3535
$this->uri = $uri;
36+
$this->headers = [];
3637
foreach ($headers as $key => $value) {
3738
$this->headers[\strtolower($key)] = $value;
3839
}

src/Test/InternalTestCase.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,20 @@ class InternalTestCase
1313
public static function assertEqualsCanonicalizing($expected, $actual, string $message = ''): void
1414
{
1515
}
16+
17+
public static function assertEqualsIgnoringCase($expected, $actual, string $message = ''): void
18+
{
19+
}
20+
21+
public static function assertSame($expected, $actual, string $message = ''): void
22+
{
23+
}
24+
25+
public static function assertJsonStringEqualsJsonString($expected, $actual, string $message = ''): void
26+
{
27+
}
28+
29+
public static function assertXmlStringEqualsXmlString($expected, $actual, string $message = ''): void
30+
{
31+
}
1632
}

src/Test/TestCase.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace AsyncAws\Core\Test;
44

5+
use AsyncAws\Core\Request;
56
use PHPUnit\Framework\TestCase as PHPUnitTestCase;
67

78
class TestCase extends PHPUnitTestCase
@@ -16,6 +17,85 @@ public static function assertHttpFormEqualsHttpForm(string $expected, string $ac
1617

1718
self::assertEqualsCanonicalizing($expectedArray, $actualArray, $message);
1819
}
20+
21+
/**
22+
* Asserts that two Body documents are equal.
23+
*/
24+
public static function assertUrlEqualsUrl(string $expected, string $actual, string $message = '')
25+
{
26+
$actualUrl = \parse_url($actual);
27+
$expectedUrl = \parse_url($expected);
28+
self::assertSame($expectedUrl['path'] ?? '/', $actualUrl['path'] ?? '/');
29+
30+
$expectedQuery = [];
31+
foreach (array_filter(\explode('&', $expectedUrl['query'] ?? '')) as $item) {
32+
$item = explode('=', $item);
33+
$expectedQuery[$item[0]] = \urldecode($item[1] ?? '');
34+
}
35+
36+
$actualQuery = [];
37+
foreach (array_filter(\explode('&', $actualUrl['query'] ?? '')) as $item) {
38+
$item = explode('=', $item);
39+
$actualQuery[$item[0]] = \urldecode($item[1] ?? '');
40+
}
41+
self::assertEqualsIgnoringCase($expectedQuery, $actualQuery);
42+
}
43+
44+
/**
45+
* Asserts that two Body documents are equal.
46+
*/
47+
public static function assertRequestEqualsHttpRequest(string $expected, Request $actual, string $message = '')
48+
{
49+
$expected = \explode("\n\n", trim($expected));
50+
$headers = $expected[0];
51+
$body = $expected[1] ?? '';
52+
$headers = explode("\n", $headers);
53+
\array_map('trim', $headers);
54+
[$method, $url] = explode(' ', \array_shift($headers));
55+
56+
self::assertSame($method, $actual->getMethod());
57+
58+
$actualUrl = $actual->getUri();
59+
if ($actual->getQuery()) {
60+
$actualUrl .= false !== \strpos($actual->getUri(), '?') ? '&' : '?';
61+
$actualUrl .= \http_build_query($actual->getQuery());
62+
}
63+
self::assertUrlEqualsUrl($url, $actualUrl);
64+
65+
$expectedHeaders = [];
66+
foreach ($headers as $header) {
67+
[$key, $value] = \explode(':', trim($header), 2);
68+
$expectedHeaders[\strtolower($key)] = trim($value);
69+
}
70+
self::assertEqualsIgnoringCase($expectedHeaders, $actual->getHeaders(), $message);
71+
72+
switch ($expectedHeaders['content-type'] ?? null) {
73+
case 'application/x-www-form-urlencoded':
74+
self::assertHttpFormEqualsHttpForm(\trim($body), $actual->getBody()->stringify(), $message);
75+
76+
break;
77+
case 'application/json':
78+
if ('' === \trim($body)) {
79+
self::assertSame($body, $actual->getBody()->stringify());
80+
} else {
81+
self::assertJsonStringEqualsJsonString(\trim($body), $actual->getBody()->stringify(), $message);
82+
}
83+
84+
break;
85+
case 'application/xml':
86+
if ('' === \trim($body)) {
87+
self::assertSame($body, $actual->getBody()->stringify());
88+
} else {
89+
self::assertXmlStringEqualsXmlString(\trim($body), $actual->getBody()->stringify(), $message);
90+
}
91+
92+
break;
93+
default:
94+
self::assertSame(trim($body), $actual->getBody()->stringify());
95+
96+
break;
97+
}
98+
}
1999
}
20100
if (!\class_exists(PHPUnitTestCase::class)) {
21101
\class_alias(InternalTestCase::class, PHPUnitTestCase::class);

tests/Unit/Input/AssumeRoleRequestTest.php

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
class AssumeRoleRequestTest extends TestCase
1111
{
12-
public function testRequestBody(): void
12+
public function testRequest(): void
1313
{
1414
$input = new AssumeRoleRequest([
1515
'RoleArn' => 'arn:aws::iam::123456789012:role/demo',
@@ -36,25 +36,28 @@ public function testRequestBody(): void
3636

3737
/** @see https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html */
3838
$expected = '
39-
Action=AssumeRole
40-
&Version=2011-06-15
41-
&RoleArn=arn%3Aaws%3A%3Aiam%3A%3A123456789012%3Arole%2Fdemo
42-
&RoleSessionName=John-session
43-
&PolicyArns.member.1.arn=arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2Fdemopolicy1
44-
&PolicyArns.member.2.arn=arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2Fdemopolicy2
45-
&Policy=%7B%22Version%22%3A%222012-10-17%22%2C%22Statement%22%3A%5B%7B%22Sid%22%3A+%22Stmt1%22%2C%22Effect%22%3A+%22Allow%22%2C%22Action%22%3A+%22s3%3A%2A%22%2C%22Resource%22%3A+%22%2A%22%7D%5D%7D
46-
&DurationSeconds=1800
47-
&Tags.member.1.Key=Project
48-
&Tags.member.1.Value=Pegasus
49-
&Tags.member.2.Key=Team
50-
&Tags.member.2.Value=Engineering
51-
&Tags.member.3.Key=Cost-Center
52-
&Tags.member.3.Value=12345
53-
&TransitiveTagKeys.member.1=Project
54-
&TransitiveTagKeys.member.2=Cost-Center
55-
&ExternalId=123ABC
39+
POST / HTTP/1.0
40+
Content-Type: application/x-www-form-urlencoded
41+
42+
Action=AssumeRole
43+
&Version=2011-06-15
44+
&RoleArn=arn%3Aaws%3A%3Aiam%3A%3A123456789012%3Arole%2Fdemo
45+
&RoleSessionName=John-session
46+
&PolicyArns.member.1.arn=arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2Fdemopolicy1
47+
&PolicyArns.member.2.arn=arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2Fdemopolicy2
48+
&Policy=%7B%22Version%22%3A%222012-10-17%22%2C%22Statement%22%3A%5B%7B%22Sid%22%3A+%22Stmt1%22%2C%22Effect%22%3A+%22Allow%22%2C%22Action%22%3A+%22s3%3A%2A%22%2C%22Resource%22%3A+%22%2A%22%7D%5D%7D
49+
&DurationSeconds=1800
50+
&Tags.member.1.Key=Project
51+
&Tags.member.1.Value=Pegasus
52+
&Tags.member.2.Key=Team
53+
&Tags.member.2.Value=Engineering
54+
&Tags.member.3.Key=Cost-Center
55+
&Tags.member.3.Value=12345
56+
&TransitiveTagKeys.member.1=Project
57+
&TransitiveTagKeys.member.2=Cost-Center
58+
&ExternalId=123ABC
5659
';
5760

58-
self::assertHttpFormEqualsHttpForm($expected, $input->request()->getBody()->stringify());
61+
self::assertRequestEqualsHttpRequest($expected, $input->request());
5962
}
6063
}

tests/Unit/Input/AssumeRoleWithWebIdentityRequestTest.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
class AssumeRoleWithWebIdentityRequestTest extends TestCase
1010
{
11-
public function testRequestBody(): void
11+
public function testRequest(): void
1212
{
1313
$input = new AssumeRoleWithWebIdentityRequest([
1414
'RoleArn' => 'arn:aws:iam::123456789012:role/FederatedWebIdentityRole',
@@ -25,6 +25,9 @@ public function testRequestBody(): void
2525

2626
// see https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html
2727
$expected = '
28+
POST / HTTP/1.0
29+
Content-Type: application/x-www-form-urlencoded
30+
2831
Action=AssumeRoleWithWebIdentity
2932
&Version=2011-06-15
3033
&DurationSeconds=3600
@@ -36,6 +39,6 @@ public function testRequestBody(): void
3639
&WebIdentityToken=FooBarBz
3740
';
3841

39-
self::assertHttpFormEqualsHttpForm($expected, $input->request()->getBody()->stringify());
42+
self::assertRequestEqualsHttpRequest($expected, $input->request());
4043
}
4144
}

tests/Unit/Input/GetCallerIdentityRequestTest.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77

88
class GetCallerIdentityRequestTest extends TestCase
99
{
10-
public function testRequestBody(): void
10+
public function testRequest(): void
1111
{
1212
$input = new GetCallerIdentityRequest();
1313

1414
/** @see https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html */
1515
$expected = '
16-
Action=GetCallerIdentity
17-
&Version=2011-06-15
16+
POST / HTTP/1.0
17+
Content-Type: application/x-www-form-urlencoded
18+
19+
Action=GetCallerIdentity
20+
&Version=2011-06-15
1821
';
1922

20-
self::assertHttpFormEqualsHttpForm($expected, $input->request()->getBody()->stringify());
23+
self::assertRequestEqualsHttpRequest($expected, $input->request());
2124
}
2225
}

0 commit comments

Comments
 (0)