<?php

/**
 * TEST: Connector test.
 */

use AmK\FastCGI;
use Tester\Assert;

require(__DIR__ . '/../bootstrap.php');

$loop = React\EventLoop\Factory::create();

$server = new FastCGI\Server(function(Psr\Http\Message\ServerRequestInterface $serverRequest) use($loop): React\Promise\PromiseInterface {

	$deferred = new React\Promise\Deferred;

	$loop->addTimer(.1, function() use($deferred, $loop): void {
		$stream = new React\Stream\ThroughStream;
		$response = new React\Http\Response(200, ['Content-Type' => 'text/plain'], $stream);
		$deferred->resolve($response);
		$stream->end(file_get_contents(__FILE__));
	});

	return $deferred->promise();

});

$socket = new React\Socket\Server('127.0.0.1:9009', $loop);
$server->listen($socket);

$connector = new FastCGI\Connector($loop);
$connector->connect('127.0.0.1:9009')->then(function(FastCGI\Client $client) use($loop, &$response, &$body): void {
	$loop->addTimer(.5, function() use($client, $loop, &$response, &$body): void {

		$serverRequest = new React\Http\Io\ServerRequest('GET', '/');

		$client->send($serverRequest)->then(function(React\Http\Response $v) use($loop, &$response, &$body): void {

			$response = $v;
			$body = '';

			$stream = $response->getBody();
			assert($stream instanceof React\Http\Io\HttpBodyStream);

			$stream->on('data', function(string $data) use(&$body) {
				$body .= $data;
			});

			$stream->on('end', function() use($loop) {
				$loop->stop();
			});

		});

	});
});

$loop->run();

/** @var $response Psr\Http\Message\ResponseInterface */
Assert::same('text/plain', $response->getHeaderLine('Content-Type'));
Assert::same(file_get_contents(__FILE__), $body);