Adds events to TwigSceneRenderer, and tests to show that they correctly overwrite the data.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user