mirror of
https://github.com/crazywhalecc/choir-psr-http.git
synced 2026-07-02 14:25:43 +08:00
initial commit
This commit is contained in:
47
tests/Choir/Http/HttpFactoryTest.php
Normal file
47
tests/Choir/Http/HttpFactoryTest.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Choir\Http;
|
||||
|
||||
use Choir\Http\HttpFactory;
|
||||
use Choir\Http\Uri;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Psr\Http\Message\RequestInterface;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use Psr\Http\Message\StreamInterface;
|
||||
use Psr\Http\Message\UriInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class HttpFactoryTest extends TestCase
|
||||
{
|
||||
public function testCreateStream()
|
||||
{
|
||||
$this->assertInstanceOf(StreamInterface::class, HttpFactory::createStream());
|
||||
}
|
||||
|
||||
public function testCreateUri()
|
||||
{
|
||||
$this->assertInstanceOf(UriInterface::class, HttpFactory::createUri('/'));
|
||||
$uri = new Uri();
|
||||
$this->assertSame(HttpFactory::createUri($uri), $uri);
|
||||
}
|
||||
|
||||
public function testCreateServerRequest()
|
||||
{
|
||||
$this->assertInstanceOf(ServerRequestInterface::class, HttpFactory::createServerRequest('GET', '/'));
|
||||
}
|
||||
|
||||
public function testCreateRequest()
|
||||
{
|
||||
$this->assertInstanceOf(RequestInterface::class, HttpFactory::createRequest('GET', '/'));
|
||||
}
|
||||
|
||||
public function testCreateResponse()
|
||||
{
|
||||
$this->assertInstanceOf(ResponseInterface::class, HttpFactory::createResponse());
|
||||
}
|
||||
}
|
||||
139
tests/Choir/Http/MessageTraitTest.php
Normal file
139
tests/Choir/Http/MessageTraitTest.php
Normal file
@@ -0,0 +1,139 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Choir\Http;
|
||||
|
||||
use Choir\Http\HttpFactory;
|
||||
use Choir\Http\Request;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Psr\Http\Message\RequestInterface;
|
||||
use Psr\Http\Message\StreamInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class MessageTraitTest extends TestCase
|
||||
{
|
||||
private static RequestInterface $trait_class;
|
||||
|
||||
public static function setUpBeforeClass(): void
|
||||
{
|
||||
self::$trait_class = HttpFactory::createRequest(
|
||||
'POST',
|
||||
'/test',
|
||||
[
|
||||
'A' => 'B',
|
||||
'C' => [
|
||||
'123',
|
||||
'456',
|
||||
],
|
||||
],
|
||||
'hello'
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetHeaders()
|
||||
{
|
||||
$this->assertIsArray(self::$trait_class->getHeaders());
|
||||
}
|
||||
|
||||
public function testGetHeader()
|
||||
{
|
||||
$this->assertIsArray(self::$trait_class->getHeader('A'));
|
||||
$this->assertIsArray(self::$trait_class->getHeader('a'));
|
||||
$this->assertEquals('B', self::$trait_class->getHeader('a')[0]);
|
||||
}
|
||||
|
||||
public function testGetBody()
|
||||
{
|
||||
$this->assertInstanceOf(StreamInterface::class, self::$trait_class->getBody());
|
||||
$this->assertEquals('', HttpFactory::createRequest('GET', '/')->getBody()->getContents());
|
||||
$this->assertEquals('hello', self::$trait_class->getBody()->getContents());
|
||||
}
|
||||
|
||||
public function testWithProtocolVersion()
|
||||
{
|
||||
$this->assertNotSame(self::$trait_class->withProtocolVersion('1.1'), self::$trait_class);
|
||||
$this->assertEquals('2.0', self::$trait_class->withProtocolVersion('2.0')->getProtocolVersion());
|
||||
}
|
||||
|
||||
public function testHasHeader()
|
||||
{
|
||||
$this->assertTrue(self::$trait_class->hasHeader('a'));
|
||||
$this->assertTrue(self::$trait_class->hasHeader('A'));
|
||||
$this->assertFalse(self::$trait_class->hasHeader('User-Agent'));
|
||||
}
|
||||
|
||||
public function testGetProtocolVersion()
|
||||
{
|
||||
$this->assertEquals('1.1', self::$trait_class->getProtocolVersion());
|
||||
}
|
||||
|
||||
public function testWithHeader()
|
||||
{
|
||||
$this->assertNotSame(self::$trait_class->withHeader('User-Agent', 'HEICORE'), self::$trait_class);
|
||||
$this->assertEquals('HEICORE', self::$trait_class->withHeader('C', 'HEICORE')->getHeaderLine('C'));
|
||||
}
|
||||
|
||||
public function testGetHeaderLine()
|
||||
{
|
||||
$this->assertEquals('B', self::$trait_class->getHeaderLine('A'));
|
||||
$this->assertEquals('B', self::$trait_class->getHeaderLine('a'));
|
||||
$this->assertEquals('', self::$trait_class->getHeaderLine('not-exist-header'));
|
||||
$this->assertEquals('123, 456', self::$trait_class->getHeaderLine('C'));
|
||||
}
|
||||
|
||||
public function testWithAddedHeader()
|
||||
{
|
||||
$this->assertNotSame(self::$trait_class->withAddedHeader('c', ['789']), self::$trait_class);
|
||||
$this->assertEquals('123, 456, 789', self::$trait_class->withAddedHeader('c', ['789'])->getHeaderLine('c'));
|
||||
$this->assertEquals('new', self::$trait_class->withAddedHeader('D', 'new')->getHeaderLine('D'));
|
||||
// Test int header
|
||||
$req = new Request('GET', '/', [132 => '123']);
|
||||
$this->assertEquals('123', $req->getHeaderLine('132'));
|
||||
|
||||
// Test exception
|
||||
$this->expectException(\InvalidArgumentException::class);
|
||||
self::$trait_class->withAddedHeader(['test-array' => 'ok'], 'are you');
|
||||
}
|
||||
|
||||
public function testWithoutHeader()
|
||||
{
|
||||
$this->assertNotSame(self::$trait_class->withoutHeader('Cmm'), self::$trait_class);
|
||||
$this->assertEquals('', self::$trait_class->withoutHeader('c')->getHeaderLine('c'));
|
||||
}
|
||||
|
||||
public function testWithBody()
|
||||
{
|
||||
$this->assertNotSame(self::$trait_class->withBody(HttpFactory::createStream('test')), self::$trait_class);
|
||||
$this->assertEquals('test', self::$trait_class->withBody(HttpFactory::createStream('test'))->getBody()->getContents());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider providerValidateAndTrimHeaderExceptions
|
||||
* @param mixed $header
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function testValidateAndTrimHeaderExceptions($header, $value)
|
||||
{
|
||||
$no_throwable = false;
|
||||
try {
|
||||
self::$trait_class->withHeader($header, $value);
|
||||
$no_throwable = true;
|
||||
} catch (\Throwable $e) {
|
||||
$this->assertInstanceOf(\InvalidArgumentException::class, $e);
|
||||
}
|
||||
$this->assertFalse($no_throwable);
|
||||
}
|
||||
|
||||
public function providerValidateAndTrimHeaderExceptions(): array
|
||||
{
|
||||
return [
|
||||
'header not string' => [[], []],
|
||||
'value not valid' => ['www', true],
|
||||
'value array empty' => ['www', []],
|
||||
'value array not valid' => ['www', [true]],
|
||||
];
|
||||
}
|
||||
}
|
||||
20
tests/Choir/Http/RequestTest.php
Normal file
20
tests/Choir/Http/RequestTest.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Choir\Http;
|
||||
|
||||
use Choir\Http\Request;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class RequestTest extends TestCase
|
||||
{
|
||||
public function testConstruct()
|
||||
{
|
||||
$req = new Request('GET', '/', [], 'nihao');
|
||||
$this->assertEquals('nihao', $req->getBody()->getContents());
|
||||
}
|
||||
}
|
||||
82
tests/Choir/Http/RequestTraitTest.php
Normal file
82
tests/Choir/Http/RequestTraitTest.php
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Choir\Http;
|
||||
|
||||
use Choir\Http\HttpFactory;
|
||||
use Choir\Http\Request;
|
||||
use Choir\Http\ServerRequest;
|
||||
use Choir\Http\Uri;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Psr\Http\Message\RequestInterface;
|
||||
use Psr\Http\Message\UriInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class RequestTraitTest extends TestCase
|
||||
{
|
||||
private static RequestInterface $request;
|
||||
|
||||
public static function setUpBeforeClass(): void
|
||||
{
|
||||
self::$request = HttpFactory::createRequest(
|
||||
'GET',
|
||||
'/test?pwq=123',
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetUri()
|
||||
{
|
||||
$this->assertInstanceOf(UriInterface::class, self::$request->getUri());
|
||||
$this->assertEquals('/test', self::$request->getUri()->getPath());
|
||||
}
|
||||
|
||||
public function testWithUri()
|
||||
{
|
||||
$this->assertNotSame(self::$request->withUri(self::$request->getUri()), self::$request);
|
||||
}
|
||||
|
||||
public function testWithRequestTarget()
|
||||
{
|
||||
$this->assertNotSame(self::$request->withRequestTarget(self::$request->getRequestTarget()), self::$request);
|
||||
}
|
||||
|
||||
public function testWithMethod()
|
||||
{
|
||||
$this->assertNotSame(self::$request->withMethod(self::$request->getMethod()), self::$request);
|
||||
$this->expectException(\InvalidArgumentException::class);
|
||||
self::$request->withMethod(123);
|
||||
}
|
||||
|
||||
public function testGetMethod()
|
||||
{
|
||||
$this->assertEquals('GET', self::$request->getMethod());
|
||||
}
|
||||
|
||||
public function testGetRequestTarget()
|
||||
{
|
||||
// fulfill requestTarget is not null
|
||||
$req = new Request('GET', '');
|
||||
$this->assertEquals('/', $req->getRequestTarget());
|
||||
$req = $req->withRequestTarget('/ppp?help=123');
|
||||
$this->assertEquals('/ppp?help=123', $req->getRequestTarget());
|
||||
// Original uri is request target
|
||||
$this->assertEquals('/test?pwq=123', self::$request->getRequestTarget());
|
||||
$this->expectException(\InvalidArgumentException::class);
|
||||
$req->withRequestTarget(' ');
|
||||
}
|
||||
|
||||
public function testUpdateHostFromUri()
|
||||
{
|
||||
$req1 = (new ServerRequest('GET', '/p'))->withHeader('Host', 'baidu.com');
|
||||
$req2 = self::$request->withUri(new Uri('https://www.evil.com'));
|
||||
$uri = new Uri('http://10.0.0.1:8090/test233?param=value');
|
||||
$uri2 = new Uri('/test2?p2=v2');
|
||||
$req3 = $req1->withUri($uri);
|
||||
$req4 = $req2->withUri($uri2);
|
||||
$this->assertEquals('/test233', $req3->getUri()->getPath());
|
||||
$this->assertEquals('/test2', $req4->getUri()->getPath());
|
||||
}
|
||||
}
|
||||
78
tests/Choir/Http/ResponseTest.php
Normal file
78
tests/Choir/Http/ResponseTest.php
Normal file
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Choir\Http;
|
||||
|
||||
use Choir\Http\HttpFactory;
|
||||
use Choir\Http\Response;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
class ResponseTest extends TestCase
|
||||
{
|
||||
private static Response $response;
|
||||
|
||||
public static function setUpBeforeClass(): void
|
||||
{
|
||||
/* @phpstan-ignore-next-line */
|
||||
self::$response = HttpFactory::createResponse(
|
||||
200,
|
||||
'OK',
|
||||
[
|
||||
'X-Key' => '123fff',
|
||||
],
|
||||
'hahaha'
|
||||
);
|
||||
}
|
||||
|
||||
public function testCoverage()
|
||||
{
|
||||
$this->assertIsString((new Response('200', [], 'test', '1.1', 'OKK'))->__toString());
|
||||
}
|
||||
|
||||
public function testGetReasonPhrase()
|
||||
{
|
||||
$this->assertSame('OK', self::$response->getReasonPhrase());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider providerWithStatus
|
||||
* @param mixed $code 状态码
|
||||
* @param mixed $expected_exception 期望抛出的异常
|
||||
*/
|
||||
public function testWithStatus($code, $expected_exception)
|
||||
{
|
||||
$this->assertNotSame(self::$response->withStatus(200), self::$response);
|
||||
try {
|
||||
self::$response->withStatus($code);
|
||||
} catch (\Throwable $e) {
|
||||
$this->assertInstanceOf($expected_exception, $e);
|
||||
}
|
||||
}
|
||||
|
||||
public function providerWithStatus(): array
|
||||
{
|
||||
return [
|
||||
'not valid code exception' => [[], \InvalidArgumentException::class],
|
||||
'invalid code number exception' => [600, \InvalidArgumentException::class],
|
||||
];
|
||||
}
|
||||
|
||||
public function testToString()
|
||||
{
|
||||
$this->assertTrue(method_exists(self::$response, '__toString'));
|
||||
$this->assertIsString((string) self::$response);
|
||||
$lines = explode("\r\n", (string) self::$response);
|
||||
$this->assertEquals('HTTP/1.1 200 OK', $lines[0]);
|
||||
$this->assertContains('X-Key: 123fff', $lines);
|
||||
$this->assertStringEndsWith("\r\n\r\nhahaha", (string) self::$response);
|
||||
}
|
||||
|
||||
public function testGetStatusCode()
|
||||
{
|
||||
$this->assertSame(200, self::$response->getStatusCode());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user