<?php

declare(strict_types=1);

namespace Benzine\Tests;

use Benzine\Tests\Traits\AppTestTrait;
use Psr\Http\Message\ResponseInterface;
use Slim\Psr7\Request;

abstract class AbstractRoutesTestCase extends AbstractBaseTestCase
{
    use AppTestTrait;

    public function setUp(): void
    {
        parent::setUp();
    }

    public function getApp()
    {
        return $this->slimApp;
    }

    /**
     * @deprecated this has been deprecated in favour of the calls inside AppTestTrait
     *
     * @param array $dataOrPost
     */
    public function request(
        string $method,
        string $path,
        $dataOrPost = null,
        bool $isJsonRequest = true,
        array $extraHeaders = []
    ): ResponseInterface {
        /** @var Request $request */
        $request = $this->createRequest($method, $path);

        if ($isJsonRequest) {
            if ($dataOrPost !== null) {
                $dataOrPost = json_decode(json_encode($dataOrPost), true);
                $request    = $request->withParsedBody($dataOrPost);
            }
            $request = $request->withHeader('Content-Type', 'application/json');
        } else {
            $request->getBody()->write($dataOrPost);
            $request->getBody()->rewind();
        }

        foreach ($extraHeaders as $key => $value) {
            $request = $request->withHeader($key, $value);
        }

        return $this->slimApp->handle($request);
    }
}