235 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
/*
 | 
						|
 * This file is part of the Symfony package.
 | 
						|
 *
 | 
						|
 * (c) Fabien Potencier <fabien@symfony.com>
 | 
						|
 *
 | 
						|
 * For the full copyright and license information, please view the LICENSE
 | 
						|
 * file that was distributed with this source code.
 | 
						|
 */
 | 
						|
 | 
						|
namespace Symfony\Bridge\PsrHttpMessage\Tests\Functional;
 | 
						|
 | 
						|
use Nyholm\Psr7\Factory\Psr17Factory;
 | 
						|
use Nyholm\Psr7\Response as Psr7Response;
 | 
						|
use Nyholm\Psr7\ServerRequest as Psr7Request;
 | 
						|
use Nyholm\Psr7\Stream as Psr7Stream;
 | 
						|
use PHPUnit\Framework\TestCase;
 | 
						|
use Psr\Http\Message\ResponseInterface;
 | 
						|
use Psr\Http\Message\ServerRequestInterface;
 | 
						|
use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
 | 
						|
use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory;
 | 
						|
use Symfony\Bridge\PsrHttpMessage\HttpFoundationFactoryInterface;
 | 
						|
use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface;
 | 
						|
use Symfony\Component\HttpFoundation\Cookie;
 | 
						|
use Symfony\Component\HttpFoundation\File\UploadedFile;
 | 
						|
use Symfony\Component\HttpFoundation\Request;
 | 
						|
use Symfony\Component\HttpFoundation\Response;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test to convert a request/response back and forth to make sure we do not loose data.
 | 
						|
 *
 | 
						|
 * @author Tobias Nyholm <tobias.nyholm@gmail.com>
 | 
						|
 */
 | 
						|
class CovertTest extends TestCase
 | 
						|
{
 | 
						|
    private $tmpDir;
 | 
						|
 | 
						|
    public function setUp(): void
 | 
						|
    {
 | 
						|
        if (!class_exists('Nyholm\Psr7\ServerRequest')) {
 | 
						|
            $this->markTestSkipped('nyholm/psr7 is not installed.');
 | 
						|
        }
 | 
						|
 | 
						|
        $this->tmpDir = sys_get_temp_dir();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @dataProvider requestProvider
 | 
						|
     *
 | 
						|
     * @param Request|ServerRequestInterface                             $request
 | 
						|
     * @param HttpFoundationFactoryInterface|HttpMessageFactoryInterface $firstFactory
 | 
						|
     * @param HttpFoundationFactoryInterface|HttpMessageFactoryInterface $secondFactory
 | 
						|
     */
 | 
						|
    public function testConvertRequestMultipleTimes($request, $firstFactory, $secondFactory)
 | 
						|
    {
 | 
						|
        $temporaryRequest = $firstFactory->createRequest($request);
 | 
						|
        $finalRequest = $secondFactory->createRequest($temporaryRequest);
 | 
						|
 | 
						|
        if ($finalRequest instanceof Request) {
 | 
						|
            $this->assertEquals($request->getBasePath(), $finalRequest->getBasePath());
 | 
						|
            $this->assertEquals($request->getBaseUrl(), $finalRequest->getBaseUrl());
 | 
						|
            $this->assertEquals($request->getContent(), $finalRequest->getContent());
 | 
						|
            $this->assertEquals($request->getEncodings(), $finalRequest->getEncodings());
 | 
						|
            $this->assertEquals($request->getETags(), $finalRequest->getETags());
 | 
						|
            $this->assertEquals($request->getHost(), $finalRequest->getHost());
 | 
						|
            $this->assertEquals($request->getHttpHost(), $finalRequest->getHttpHost());
 | 
						|
            $this->assertEquals($request->getMethod(), $finalRequest->getMethod());
 | 
						|
            $this->assertEquals($request->getPassword(), $finalRequest->getPassword());
 | 
						|
            $this->assertEquals($request->getPathInfo(), $finalRequest->getPathInfo());
 | 
						|
            $this->assertEquals($request->getPort(), $finalRequest->getPort());
 | 
						|
            $this->assertEquals($request->getProtocolVersion(), $finalRequest->getProtocolVersion());
 | 
						|
            $this->assertEquals($request->getQueryString(), $finalRequest->getQueryString());
 | 
						|
            $this->assertEquals($request->getRequestUri(), $finalRequest->getRequestUri());
 | 
						|
            $this->assertEquals($request->getScheme(), $finalRequest->getScheme());
 | 
						|
            $this->assertEquals($request->getSchemeAndHttpHost(), $finalRequest->getSchemeAndHttpHost());
 | 
						|
            $this->assertEquals($request->getScriptName(), $finalRequest->getScriptName());
 | 
						|
            $this->assertEquals($request->getUri(), $finalRequest->getUri());
 | 
						|
            $this->assertEquals($request->getUser(), $finalRequest->getUser());
 | 
						|
            $this->assertEquals($request->getUserInfo(), $finalRequest->getUserInfo());
 | 
						|
        } elseif ($finalRequest instanceof ServerRequestInterface) {
 | 
						|
            $strToLower = function ($arr) {
 | 
						|
                foreach ($arr as $key => $value) {
 | 
						|
                    yield strtolower($key) => $value;
 | 
						|
                }
 | 
						|
            };
 | 
						|
            $this->assertEquals($request->getAttributes(), $finalRequest->getAttributes());
 | 
						|
            $this->assertEquals($request->getCookieParams(), $finalRequest->getCookieParams());
 | 
						|
            $this->assertEquals((array) $request->getParsedBody(), (array) $finalRequest->getParsedBody());
 | 
						|
            $this->assertEquals($request->getQueryParams(), $finalRequest->getQueryParams());
 | 
						|
            // PSR7 does not define a "withServerParams" so this is impossible to implement without knowing the PSR7 implementation.
 | 
						|
            //$this->assertEquals($request->getServerParams(), $finalRequest->getServerParams());
 | 
						|
            $this->assertEquals($request->getUploadedFiles(), $finalRequest->getUploadedFiles());
 | 
						|
            $this->assertEquals($request->getMethod(), $finalRequest->getMethod());
 | 
						|
            $this->assertEquals($request->getRequestTarget(), $finalRequest->getRequestTarget());
 | 
						|
            $this->assertEquals((string) $request->getUri(), (string) $finalRequest->getUri());
 | 
						|
            $this->assertEquals((string) $request->getBody(), (string) $finalRequest->getBody());
 | 
						|
            $this->assertEquals($strToLower($request->getHeaders()), $strToLower($finalRequest->getHeaders()));
 | 
						|
            $this->assertEquals($request->getProtocolVersion(), $finalRequest->getProtocolVersion());
 | 
						|
        } else {
 | 
						|
            $this->fail('$finalRequest must be an instance of PSR7 or a HTTPFoundation request');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function requestProvider()
 | 
						|
    {
 | 
						|
        $sfRequest = new Request(
 | 
						|
            [
 | 
						|
                'foo' => '1',
 | 
						|
                'bar' => ['baz' => '42'],
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'twitter' => [
 | 
						|
                    '@dunglas' => 'Kévin Dunglas',
 | 
						|
                    '@coopTilleuls' => 'Les-Tilleuls.coop',
 | 
						|
                ],
 | 
						|
                'baz' => '2',
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'a2' => ['foo' => 'bar'],
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'c1' => 'foo',
 | 
						|
                'c2' => ['c3' => 'bar'],
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'f1' => $this->createUploadedFile('F1', 'f1.txt', 'text/plain', UPLOAD_ERR_OK),
 | 
						|
                'foo' => ['f2' => $this->createUploadedFile('F2', 'f2.txt', 'text/plain', UPLOAD_ERR_OK)],
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'REQUEST_METHOD' => 'POST',
 | 
						|
                'HTTP_HOST' => 'dunglas.fr',
 | 
						|
                'SERVER_NAME' => 'dunglas.fr',
 | 
						|
                'SERVER_PORT' => null,
 | 
						|
                'HTTP_X_SYMFONY' => '2.8',
 | 
						|
                'REQUEST_URI' => '/testCreateRequest?bar[baz]=42&foo=1',
 | 
						|
                'QUERY_STRING' => 'foo=1&bar[baz]=42',
 | 
						|
            ],
 | 
						|
            'Content'
 | 
						|
        );
 | 
						|
 | 
						|
        $psr7Request = (new Psr7Request('POST', 'http://tnyholm.se/foo/?bar=biz'))
 | 
						|
            ->withQueryParams(['bar' => 'biz']);
 | 
						|
 | 
						|
        $nyholmFactory = new Psr17Factory();
 | 
						|
        $psr17Factory = new PsrHttpFactory($nyholmFactory, $nyholmFactory, $nyholmFactory, $nyholmFactory);
 | 
						|
        $symfonyFactory = new HttpFoundationFactory();
 | 
						|
 | 
						|
        return [
 | 
						|
            [$sfRequest, $psr17Factory, $symfonyFactory],
 | 
						|
            [$psr7Request, $symfonyFactory, $psr17Factory],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @dataProvider responseProvider
 | 
						|
     *
 | 
						|
     * @param Response|ResponseInterface                                 $response
 | 
						|
     * @param HttpFoundationFactoryInterface|HttpMessageFactoryInterface $firstFactory
 | 
						|
     * @param HttpFoundationFactoryInterface|HttpMessageFactoryInterface $secondFactory
 | 
						|
     */
 | 
						|
    public function testConvertResponseMultipleTimes($response, $firstFactory, $secondFactory)
 | 
						|
    {
 | 
						|
        $temporaryResponse = $firstFactory->createResponse($response);
 | 
						|
        $finalResponse = $secondFactory->createResponse($temporaryResponse);
 | 
						|
 | 
						|
        if ($finalResponse instanceof Response) {
 | 
						|
            $this->assertEquals($response->getAge(), $finalResponse->getAge());
 | 
						|
            $this->assertEquals($response->getCharset(), $finalResponse->getCharset());
 | 
						|
            $this->assertEquals($response->getContent(), $finalResponse->getContent());
 | 
						|
            $this->assertEquals($response->getDate(), $finalResponse->getDate());
 | 
						|
            $this->assertEquals($response->getEtag(), $finalResponse->getEtag());
 | 
						|
            $this->assertEquals($response->getExpires(), $finalResponse->getExpires());
 | 
						|
            $this->assertEquals($response->getLastModified(), $finalResponse->getLastModified());
 | 
						|
            $this->assertEquals($response->getMaxAge(), $finalResponse->getMaxAge());
 | 
						|
            $this->assertEquals($response->getProtocolVersion(), $finalResponse->getProtocolVersion());
 | 
						|
            $this->assertEquals($response->getStatusCode(), $finalResponse->getStatusCode());
 | 
						|
            $this->assertEquals($response->getTtl(), $finalResponse->getTtl());
 | 
						|
        } elseif ($finalResponse instanceof ResponseInterface) {
 | 
						|
            $strToLower = function ($arr) {
 | 
						|
                foreach ($arr as $key => $value) {
 | 
						|
                    yield strtolower($key) => $value;
 | 
						|
                }
 | 
						|
            };
 | 
						|
            $this->assertEquals($response->getStatusCode(), $finalResponse->getStatusCode());
 | 
						|
            $this->assertEquals($response->getReasonPhrase(), $finalResponse->getReasonPhrase());
 | 
						|
            $this->assertEquals((string) $response->getBody(), (string) $finalResponse->getBody());
 | 
						|
            $this->assertEquals($strToLower($response->getHeaders()), $strToLower($finalResponse->getHeaders()));
 | 
						|
            $this->assertEquals($response->getProtocolVersion(), $finalResponse->getProtocolVersion());
 | 
						|
        } else {
 | 
						|
            $this->fail('$finalResponse must be an instance of PSR7 or a HTTPFoundation response');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function responseProvider()
 | 
						|
    {
 | 
						|
        $sfResponse = new Response(
 | 
						|
            'Response content.',
 | 
						|
            202,
 | 
						|
            ['x-symfony' => ['3.4']]
 | 
						|
        );
 | 
						|
 | 
						|
        if (method_exists(Cookie::class, 'create')) {
 | 
						|
            $cookie = Cookie::create('city', 'Lille', new \DateTime('Wed, 13 Jan 2021 22:23:01 GMT'));
 | 
						|
        } else {
 | 
						|
            $cookie = new Cookie('city', 'Lille', new \DateTime('Wed, 13 Jan 2021 22:23:01 GMT'));
 | 
						|
        }
 | 
						|
 | 
						|
        $sfResponse->headers->setCookie($cookie);
 | 
						|
        $body = Psr7Stream::create();
 | 
						|
        $status = 302;
 | 
						|
        $headers = [
 | 
						|
            'location' => ['http://example.com/'],
 | 
						|
        ];
 | 
						|
        $zendResponse = new Psr7Response($status, $headers, $body);
 | 
						|
 | 
						|
        $nyholmFactory = new Psr17Factory();
 | 
						|
        $psr17Factory = new PsrHttpFactory($nyholmFactory, $nyholmFactory, $nyholmFactory, $nyholmFactory);
 | 
						|
        $symfonyFactory = new HttpFoundationFactory();
 | 
						|
 | 
						|
        return [
 | 
						|
            [$sfResponse, $psr17Factory, $symfonyFactory],
 | 
						|
            [$zendResponse, $symfonyFactory, $psr17Factory],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    private function createUploadedFile($content, $originalName, $mimeType, $error)
 | 
						|
    {
 | 
						|
        $path = tempnam($this->tmpDir, uniqid());
 | 
						|
        file_put_contents($path, $content);
 | 
						|
 | 
						|
        return new UploadedFile($path, $originalName, $mimeType, $error, true);
 | 
						|
    }
 | 
						|
}
 |