Add a controller test.

This commit is contained in:
Dave Smith-Hayes 2024-05-22 20:39:33 -04:00
parent 39018f78d9
commit 050eb87e83
7 changed files with 85 additions and 63 deletions

View File

@ -22,7 +22,8 @@
],
"autoload": {
"psr-4": {
"Slovocast\\": "src/"
"Slovocast\\": "src/",
"Slovocast\\Tests\\": "tests/"
}
}
}

59
app/composer.lock generated
View File

@ -281,16 +281,16 @@
},
{
"name": "league/flysystem",
"version": "3.27.0",
"version": "3.28.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "4729745b1ab737908c7d055148c9a6b3e959832f"
"reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f",
"reference": "4729745b1ab737908c7d055148c9a6b3e959832f",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c",
"reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c",
"shasum": ""
},
"require": {
@ -314,10 +314,13 @@
"composer/semver": "^3.0",
"ext-fileinfo": "*",
"ext-ftp": "*",
"ext-mongodb": "^1.3",
"ext-zip": "*",
"friendsofphp/php-cs-fixer": "^3.5",
"google/cloud-storage": "^1.23",
"guzzlehttp/psr7": "^2.6",
"microsoft/azure-storage-blob": "^1.1",
"mongodb/mongodb": "^1.2",
"phpseclib/phpseclib": "^3.0.36",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^9.5.11|^10.0",
@ -355,32 +358,22 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.27.0"
"source": "https://github.com/thephpleague/flysystem/tree/3.28.0"
},
"funding": [
{
"url": "https://ecologi.com/frankdejonge",
"type": "custom"
},
{
"url": "https://github.com/frankdejonge",
"type": "github"
}
],
"time": "2024-04-07T19:17:50+00:00"
"time": "2024-05-22T10:09:12+00:00"
},
{
"name": "league/flysystem-local",
"version": "3.25.1",
"version": "3.28.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-local.git",
"reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92"
"reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92",
"reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92",
"url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40",
"reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40",
"shasum": ""
},
"require": {
@ -414,19 +407,9 @@
"local"
],
"support": {
"source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1"
"source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0"
},
"funding": [
{
"url": "https://ecologi.com/frankdejonge",
"type": "custom"
},
{
"url": "https://github.com/frankdejonge",
"type": "github"
}
],
"time": "2024-03-15T19:58:44+00:00"
"time": "2024-05-06T20:05:52+00:00"
},
{
"name": "league/mime-type-detection",
@ -1925,16 +1908,16 @@
},
{
"name": "twig/twig",
"version": "v3.10.1",
"version": "v3.10.3",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "3af5ab2e52279e5e23dc192b1a26db3b8cffa4e7"
"reference": "67f29781ffafa520b0bbfbd8384674b42db04572"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/3af5ab2e52279e5e23dc192b1a26db3b8cffa4e7",
"reference": "3af5ab2e52279e5e23dc192b1a26db3b8cffa4e7",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/67f29781ffafa520b0bbfbd8384674b42db04572",
"reference": "67f29781ffafa520b0bbfbd8384674b42db04572",
"shasum": ""
},
"require": {
@ -1988,7 +1971,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.10.1"
"source": "https://github.com/twigphp/Twig/tree/v3.10.3"
},
"funding": [
{
@ -2000,7 +1983,7 @@
"type": "tidelift"
}
],
"time": "2024-05-12T06:16:18+00:00"
"time": "2024-05-16T10:04:27+00:00"
}
],
"packages-dev": [

View File

@ -70,8 +70,9 @@ class Bootstrap
// Twig
$templatePath = __DIR__ . "/../templates";
$twig = Twig::create($templatePath, [ 'cache' => false ]);
$app->add(TwigMiddleware::create($app, $twig));
$templateCache = false;
$twig = Twig::create($templatePath, [ 'cache' => $templateCache ]);
$app->add(TwigMiddleware::create($app));
}
/**

View File

@ -13,6 +13,7 @@ abstract class Controller
protected Response $response;
protected array $args;
protected RouteContext $routeContext;
protected Twig $view;
/**
* Make the Class invokable and pass it into a route as its handler.
@ -31,6 +32,7 @@ abstract class Controller
$this->response = $response;
$this->args = $args;
$this->routeContext = RouteContext::fromRequest($this->request);
$this->view = Twig::fromRequest($request);
return $this->respond($request, $response);
}
@ -51,7 +53,29 @@ abstract class Controller
*/
public function render(string $templateName, array $data = []): Response
{
$view = Twig::fromRequest($this->request);
return $view->render($this->response, $templateName, $data);
return $this->view->render($this->response, $templateName, $data);
}
/**
* @param string $html The raw Twig HTML to render
* @param array $data The data to injext into the HTML
* @return Response
*/
public function renderInline(string $html, array $data = []): Response
{
$renderedTemplate = $this->view->fetchFromString($html, $data);
$this->response->getBody()->write($renderedTemplate);
return $this->response;
}
/**
* @param array|object $data The data to encode as JSON
* @return Response
*/
public function json(array|object $data): Response
{
$encodedData = json_encode($data);
$this->response->getBody()->write($encodedData);
return $this->response->withHeader('Content-Type', 'application/json');
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace Slovocast\Tests\Controller;
use Slovocast\Tests\TestCase;
use Slovocast\Controller\Controller;
use Psr\Http\Message\ResponseInterface as Response;
class ControllerTest extends TestCase
{
public function testHtmlInlineResponse(): void
{
$testController = new class extends Controller {
public function respond(): Response
{
return $this->renderInline(
'<p>{{ name }}</p>',
[ 'name' => 'Dave' ]
);
}
};
$app = $this->getAppInstance();
$app->get('/test', $testController);
$request = $this->createRequest('GET', '/test');
$response = $app->handle($request);
$this->assertEquals('<p>Dave</p>', $response->getBody());
}
}

View File

@ -3,14 +3,13 @@
namespace Slovocast\Tests;
use PHPUnit\Framework\TestCase as PHPUnit_TestCase;
use DI\ContainerBuilder;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\App;
use Slim\Factory\AppFactory;
use Slim\Psr7\Factory\StreamFactory;
use Slim\Psr7\Headers;
use Slim\Psr7\Request as SlimRequest;
use Slim\Psr7\Uri;
use Slovocast\Bootstrap;
/**
* This is the common test harness pattern lifted right out of the official
@ -23,22 +22,7 @@ class TestCase extends PHPUnit_TestCase
*/
protected function getAppInstance(): App
{
$containerBuilder = new ContainerBuilder();
// add settings too container
// add dependencies to container
// add repositories
$container = $containerBuilder->build();
$app = AppFactory::setContainer($container);
// add middleware
// add routes
return $app;
return Bootstrap::init();
}
/**

View File

@ -1,2 +0,0 @@
<?php