<?php
declare(strict_types=1);

namespace ShlinkioTest\Shlink\Rest\ErrorHandler;

use PHPUnit\Framework\TestCase;
use Shlinkio\Shlink\Rest\ErrorHandler\JsonErrorResponseGenerator;
use Zend\Diactoros\Response;
use Zend\Diactoros\ServerRequest;

use function array_map;
use function range;

class JsonErrorResponseGeneratorTest extends TestCase
{
    /** @var JsonErrorResponseGenerator */
    private $errorHandler;

    public function setUp(): void
    {
        $this->errorHandler = new JsonErrorResponseGenerator();
    }

    /** @test */
    public function noErrorStatusReturnsInternalServerError(): void
    {
        /** @var Response\JsonResponse $response */
        $response = $this->errorHandler->__invoke(null, new ServerRequest(), new Response());
        $payload = $response->getPayload();

        $this->assertInstanceOf(Response\JsonResponse::class, $response);
        $this->assertEquals(500, $response->getStatusCode());
        $this->assertEquals('Internal Server Error', $payload['message']);
    }

    /**
     * @test
     * @dataProvider provideStatus
     */
    public function errorStatusReturnsThatStatus(int $status, string $message): void
    {
        /** @var Response\JsonResponse $response */
        $response = $this->errorHandler->__invoke(
            null,
            new ServerRequest(),
            (new Response())->withStatus($status, $message)
        );
        $payload = $response->getPayload();

        $this->assertInstanceOf(Response\JsonResponse::class, $response);
        $this->assertEquals($status, $response->getStatusCode());
        $this->assertEquals($message, $payload['message']);
    }

    public function provideStatus(): iterable
    {
        return array_map(function (int $status) {
            return [$status, 'Some message'];
        }, range(400, 500, 20));
    }
}