Adds events to TwigSceneRenderer, and tests to show that they correctly overwrite the data.

This commit is contained in:
Vassyli
2021-01-16 16:40:26 +01:00
committed by Basilius Sauter
parent 1fb2eb023e
commit eca1343b5f
2 changed files with 147 additions and 81 deletions
+111 -77
View File
@@ -3,6 +3,8 @@ declare(strict_types=1);
namespace LotGD\Core\Tests\Services;
use LotGD\Core\EventManager;
use LotGD\Core\Events\EventContextData;
use LotGD\Core\Exceptions\InsecureTwigTemplateError;
use LotGD\Core\Game;
use LotGD\Core\Models\Character;
@@ -12,43 +14,7 @@ use LotGD\Core\Services\TwigSceneRenderer;
class TwigSceneRendererTest extends LotGDTestCase
{
protected function getGameMock(): Game
{
$game = $this->getMockBuilder(Game::class)
->disableOriginalConstructor()
->getMock();
return $game;
}
public function testIfSceneRendererCanBeConstructed()
{
$renderer = new TwigSceneRenderer($this->getGameMock());
$this->assertInstanceOf(TwigSceneRenderer::class, $renderer);
}
public function testIfTwigSceneRendererReturnsANonTemplateStringUnmodified()
{
# Get renderer
$renderer = new TwigSceneRenderer($this->getGameMock());
# Get mock scene
$scene = $this->getMockBuilder(Scene::class)
->disableOriginalConstructor()
->getMock();
# Prepare the template string.
$template = "You enter a new location.\n\nA new location.";
# Create the result
$renderResult = $renderer->render($template, $scene);
# Assert result
$this->assertSame($template, $renderResult);
}
public function testIfTwigSceneRendererParsesStringsWithCharacters()
protected function getMockeries(): array
{
# Get mock character
$character = $this->getMockBuilder(Character::class)
@@ -66,11 +32,53 @@ class TwigSceneRendererTest extends LotGDTestCase
->getMock();
$game->method("getCharacter")->willReturn($character);
# Get event manager mock
$eventManager = $this->getMockBuilder(EventManager::class)
->disableOriginalConstructor()
->getMock();
$game->method("getEventManager")->willReturn($eventManager);
# Get mock scene
$scene = $this->getMockBuilder(Scene::class)
->disableOriginalConstructor()
->getMock();
return [$game, $scene, $character, $eventManager];
}
public function testIfSceneRendererCanBeConstructed()
{
[$game, $scene, $character, $eventManager] = $this->getMockeries();
$eventManager->method("publish")->willReturnArgument(1);
$renderer = new TwigSceneRenderer($game);
$this->assertInstanceOf(TwigSceneRenderer::class, $renderer);
}
public function testIfTwigSceneRendererReturnsANonTemplateStringUnmodified()
{
[$game, $scene, $character, $eventManager] = $this->getMockeries();
$eventManager->method("publish")->willReturnArgument(1);
# Get renderer
$renderer = new TwigSceneRenderer($game);
# Prepare the template string.
$template = "You enter a new location.\n\nA new location.";
# Create the result
$renderResult = $renderer->render($template, $scene);
# Assert result
$this->assertSame($template, $renderResult);
}
public function testIfTwigSceneRendererParsesStringsWithCharacters()
{
[$game, $scene, $character, $eventManager] = $this->getMockeries();
$eventManager->method("publish")->willReturnArgument(1);
# Get renderer
$renderer = new TwigSceneRenderer($game);
@@ -92,26 +100,8 @@ class TwigSceneRendererTest extends LotGDTestCase
public function testIfRawTemplateGetsReturnedIfTemplateContainsIllegalTokens()
{
# Get mock character
$character = $this->getMockBuilder(Character::class)
->disableOriginalConstructor()
->getMock();
$character->method("getDisplayName")->willReturn("Frodo");
$character->method("getLevel")->willReturn(5);
$character->method("getHealth")->willReturn(10);
$character->method("getMaxHealth")->willReturn(100);
$character->method("isAlive")->willReturn(true);
# Get mock game
$game = $this->getMockBuilder(Game::class)
->disableOriginalConstructor()
->getMock();
$game->method("getCharacter")->willReturn($character);
# Get mock scene
$scene = $this->getMockBuilder(Scene::class)
->disableOriginalConstructor()
->getMock();
[$game, $scene, $character, $eventManager] = $this->getMockeries();
$eventManager->method("publish")->willReturnArgument(1);
# Get renderer
$renderer = new TwigSceneRenderer($game);
@@ -128,26 +118,8 @@ class TwigSceneRendererTest extends LotGDTestCase
public function testIfExceptionGetsRaisedIfTemplateContainsIllegalTokens()
{
# Get mock character
$character = $this->getMockBuilder(Character::class)
->disableOriginalConstructor()
->getMock();
$character->method("getDisplayName")->willReturn("Frodo");
$character->method("getLevel")->willReturn(5);
$character->method("getHealth")->willReturn(10);
$character->method("getMaxHealth")->willReturn(100);
$character->method("isAlive")->willReturn(true);
# Get mock game
$game = $this->getMockBuilder(Game::class)
->disableOriginalConstructor()
->getMock();
$game->method("getCharacter")->willReturn($character);
# Get mock scene
$scene = $this->getMockBuilder(Scene::class)
->disableOriginalConstructor()
->getMock();
[$game, $scene, $character, $eventManager] = $this->getMockeries();
$eventManager->method("publish")->willReturnArgument(1);
# Get renderer
$renderer = new TwigSceneRenderer($game);
@@ -161,4 +133,66 @@ class TwigSceneRendererTest extends LotGDTestCase
# Try to parse the result
$renderResult = $renderer->render($template, $scene, false);
}
public function testIfPublishedEventCanModifySecurityPolicy()
{
[$game, $scene, $character, $eventManager] = $this->getMockeries();
# Set up a more complex "publish" method to emulate a real event.
$eventManager->method("publish")->willReturnCallback(function($event, EventContextData $context) {
if ($event !== "h/lotgd/core/scene-renderer/securityPolicy") {
return $context;
}
$tags = [];
$filters = ["escape"];
$functions = [];
$methods = [];
$properties = [];
return EventContextData::create([
"tags" => $tags,
"filters" => $filters,
"functions" => $functions,
"methods" => $methods,
"properties" => $properties,
]);
});
# Get renderer
$renderer = new TwigSceneRenderer($game);
# Assert that if does not work anymore
$this->expectException(InsecureTwigTemplateError::class);
$renderer->render("{% if 5*1 %}Hallo{%endif%}", $scene, false);
$this->expectException(InsecureTwigTemplateError::class);
$renderer->render("{{ Character.name }}", $scene, false);
}
public function testIfPublishedEventCanModifyValueScope()
{
[$game, $scene, $character, $eventManager] = $this->getMockeries();
# Set up a more complex "publish" method to emulate a real event.
$eventManager->method("publish")->willReturnCallback(function($event, EventContextData $context) {
if ($event !== "h/lotgd/core/scene-renderer/templateValues") {
return $context;
}
$templateValues = $context->get("templateValues");
$templateValues["test"] = "A test";
$context = $context->set("templateValues", $templateValues);
return $context;
});
# Get renderer
$renderer = new TwigSceneRenderer($game);
# Assert result
$result = $renderer->render("{{ test }}", $scene, false);
$this->assertSame("A test", $result);
}
}