<?php

namespace Slovocast\Tests;

use PHPUnit\Framework\TestCase as PHPUnit_TestCase;
use Prophecy\PhpUnit\ProphecyTrait;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\App;
use Slim\Psr7\Factory\StreamFactory;
use Slim\Psr7\Headers;
use Slim\Psr7\Request as SlimRequest;
use Slim\Psr7\Uri;
use Slovocast\Bootstrap;
use Slovocast\Domain\Entity\User;

/**
 * This is the common test harness pattern lifted right out of the official
 * SlimPHP Skeleton application.
 */
class TestCase extends PHPUnit_TestCase
{
    use ProphecyTrait;

    /**
     * Generate an instance of the Application
     */
    protected function getAppInstance(): App
    {
        return Bootstrap::init();
    }

    /**
     * @param string $method
     * @param string path
     * @param array $headers
     * @param array $cookies
     * @param array $serverParams
     */
    protected function createRequest(
        string $method,
        string $path,
        array $headers = [],
        array $cookies = [],
        array $serverParams = []
    ): Request {
        $uri = new Uri('', '', 80, $path);
        $handle = fopen('php://temp', 'w+');
        $stream = (new StreamFactory())->createStreamFromResource($handle);

        $h = new Headers();
        foreach ($headers as $name => $value) {
            $h->addHeader($name, $value);
        }

        return new SlimRequest(
            $method,
            $uri,
            $h,
            $cookies,
            $serverParams,
            $stream
        );
    }

    /**
     * Quickly generate a User new User entity for testing.
     *
     * @param array $user The User properties to call User:fromArray on
     * @return User a new User entity
     */
    protected function getUserFromArray(array $user = []): User
    {
        if (empty($user)) {
            $user = [
                'email' => 'dave@slovocast.com',
                'name' => 'Dave SH',
                'password' => 'hashed_password'
            ];
        }

        return User::fromArray($user);
    }
}