<?php
declare(strict_types=1);

namespace ShlinkioTest\Shlink\Common\Middleware;

use Doctrine\DBAL\Connection;
use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase;
use Prophecy\Prophecy\ObjectProphecy;
use Psr\Http\Server\RequestHandlerInterface;
use Shlinkio\Shlink\Common\Middleware\CloseDbConnectionMiddleware;
use Zend\Diactoros\Response;
use Zend\Diactoros\ServerRequest;

class CloseDbConnectionMiddlewareTest extends TestCase
{
    /** @var CloseDbConnectionMiddleware */
    private $middleware;
    /** @var ObjectProphecy */
    private $handler;
    /** @var ObjectProphecy */
    private $em;

    public function setUp()
    {
        $this->handler = $this->prophesize(RequestHandlerInterface::class);
        $this->em = $this->prophesize(EntityManagerInterface::class);

        $this->middleware = new CloseDbConnectionMiddleware($this->em->reveal());
    }

    /**
     * @test
     */
    public function connectionIsClosedWhenMiddlewareIsProcessed()
    {
        $req = new ServerRequest();
        $resp = new Response();

        $conn = $this->prophesize(Connection::class);
        $closeConn = $conn->close()->will(function () {
        });
        $getConn = $this->em->getConnection()->willReturn($conn->reveal());
        $clear = $this->em->clear()->will(function () {
        });
        $handle = $this->handler->handle($req)->willReturn($resp);

        $result = $this->middleware->process($req, $this->handler->reveal());

        $this->assertSame($result, $resp);
        $getConn->shouldHaveBeenCalledOnce();
        $closeConn->shouldHaveBeenCalledOnce();
        $clear->shouldHaveBeenCalledOnce();
        $handle->shouldHaveBeenCalledOnce();
    }
}