Skip to content

Commit

Permalink
Add EmbedResourceLoader
Browse files Browse the repository at this point in the history
  • Loading branch information
malberts committed Oct 4, 2023
1 parent b07eada commit 019416a
Show file tree
Hide file tree
Showing 16 changed files with 93 additions and 80 deletions.
9 changes: 1 addition & 8 deletions src/Adapters/EmbedPresenter/ParserFunctionEmbedPresenter.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,10 @@ class ParserFunctionEmbedPresenter implements EmbedPresenter {

private string $html = '';
private UsageTracker $usageTracker;
private ParserOutput $output;

public function __construct( MessageLocalizer $localizer, UsageTracker $usageTracker, ParserOutput $output ) {
public function __construct( MessageLocalizer $localizer, UsageTracker $usageTracker ) {
$this->localizer = $localizer;
$this->usageTracker = $usageTracker;
$this->output = $output;
}

public function showError( string $messageKey ): void {
Expand Down Expand Up @@ -54,9 +52,4 @@ public function getParserFunctionReturnValue(): array {
];
}

public function loadRendererRequirements( ContentRenderer $renderer ): void {
$this->output->addModules( $renderer->getOutputModules() );
$this->output->addModuleStyles( $renderer->getOutputModuleStyles() );
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare( strict_types = 1 );

namespace ProfessionalWiki\ExternalContent\Adapters\EmbedResourceLoader;

use ParserOutput;
use ProfessionalWiki\ExternalContent\Domain\ContentRenderer;
use ProfessionalWiki\ExternalContent\Domain\ContentRenderer\CodeRenderer;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedResourceLoader;

class ParserFunctionEmbedResourceLoader implements EmbedResourceLoader {

public function __construct(
private ParserOutput $output
) {
}

public function loadRendererResources( ContentRenderer $renderer ): void {
if ( $renderer instanceof CodeRenderer ) {
$this->output->addModules( [ 'ext.external-content.code-renderer' ] );
$this->output->addModuleStyles( [ 'ext.external-content.code-renderer.styles' ] );
}
}

}
10 changes: 0 additions & 10 deletions src/Domain/ContentRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,4 @@ interface ContentRenderer {

public function render( string $content, string $contentUrl ): string;

/**
* @return string[]
*/
public function getOutputModules(): array;

/**
* @return string[]
*/
public function getOutputModuleStyles(): array;

}
8 changes: 0 additions & 8 deletions src/Domain/ContentRenderer/CodeRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,4 @@ private function getLanguageClasses(): array {
return [ 'language-' . htmlspecialchars( $this->language ) ];
}

public function getOutputModules(): array {
return [ 'ext.external-content.code-renderer' ];
}

public function getOutputModuleStyles(): array {
return [ 'ext.external-content.code-renderer.styles' ];
}

}
8 changes: 0 additions & 8 deletions src/Domain/ContentRenderer/MarkdownRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,4 @@ private function newMarkdownParser( string $contentUrl ): Markdown {
return $parser;
}

public function getOutputModules(): array {
return [];
}

public function getOutputModuleStyles(): array {
return [];
}

}
13 changes: 9 additions & 4 deletions src/EmbedExtensionFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use ProfessionalWiki\ExternalContent\Domain\UrlValidator\FileExtensionUrlValidator;
use ProfessionalWiki\ExternalContent\Domain\UrlValidator\WhitelistedDomainUrlValidator;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedPresenter;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedResourceLoader;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedUseCase;

class EmbedExtensionFactory {
Expand Down Expand Up @@ -49,26 +50,30 @@ final protected function __construct() {
}

public function newEmbedUseCaseForEmbedFunction(
EmbedPresenter $presenter
EmbedPresenter $presenter,
EmbedResourceLoader $resourceLoader
): EmbedUseCase {
return new EmbedUseCase(
$presenter,
$this->getUrlValidator(),
new GitHubUrlNormalizer(),
$this->getFileFetcher(),
new WikiContentRendererFactory()
new WikiContentRendererFactory(),
$resourceLoader
);
}

public function newEmbedUseCaseForBitbucketFunction(
EmbedPresenter $presenter
EmbedPresenter $presenter,
EmbedResourceLoader $resourceLoader
): EmbedUseCase {
return new EmbedUseCase(
$presenter,
$this->getUrlValidator(),
new BitbucketUrlNormalizer(),
$this->getFileFetcher(),
new WikiContentRendererFactory()
new WikiContentRendererFactory(),
$resourceLoader
);
}

Expand Down
6 changes: 4 additions & 2 deletions src/EntryPoints/BitbucketFunction.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Parser;
use ProfessionalWiki\ExternalContent\Adapters\EmbedPresenter\CategoryUsageTracker;
use ProfessionalWiki\ExternalContent\Adapters\EmbedPresenter\ParserFunctionEmbedPresenter;
use ProfessionalWiki\ExternalContent\Adapters\EmbedResourceLoader\ParserFunctionEmbedResourceLoader;
use ProfessionalWiki\ExternalContent\EmbedExtensionFactory;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedRequestBuilder;

Expand All @@ -21,10 +22,11 @@ public function handleParserFunctionCall( Parser $parser, string ...$arguments )
$presenter = new ParserFunctionEmbedPresenter(
EmbedExtensionFactory::getInstance()->getMessageLocalizer(),
new CategoryUsageTracker( $parser ),
$parser->getOutput()
);

$useCase = EmbedExtensionFactory::getInstance()->newEmbedUseCaseForBitbucketFunction( $presenter );
$resourceLoader = new ParserFunctionEmbedResourceLoader( $parser->getOutput() );

$useCase = EmbedExtensionFactory::getInstance()->newEmbedUseCaseForBitbucketFunction( $presenter, $resourceLoader );

$useCase->embed( EmbedRequestBuilder::argumentsToRequest( $arguments ) );

Expand Down
8 changes: 5 additions & 3 deletions src/EntryPoints/EmbedFunction.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Parser;
use ProfessionalWiki\ExternalContent\Adapters\EmbedPresenter\CategoryUsageTracker;
use ProfessionalWiki\ExternalContent\Adapters\EmbedPresenter\ParserFunctionEmbedPresenter;
use ProfessionalWiki\ExternalContent\Adapters\EmbedResourceLoader\ParserFunctionEmbedResourceLoader;
use ProfessionalWiki\ExternalContent\EmbedExtensionFactory;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedRequestBuilder;

Expand All @@ -20,11 +21,12 @@ final class EmbedFunction {
public function handleParserFunctionCall( Parser $parser, string ...$arguments ) {
$presenter = new ParserFunctionEmbedPresenter(
EmbedExtensionFactory::getInstance()->getMessageLocalizer(),
new CategoryUsageTracker( $parser ),
$parser->getOutput()
new CategoryUsageTracker( $parser )
);

$useCase = EmbedExtensionFactory::getInstance()->newEmbedUseCaseForEmbedFunction( $presenter );
$resourceLoader = new ParserFunctionEmbedResourceLoader( $parser->getOutput() );

$useCase = EmbedExtensionFactory::getInstance()->newEmbedUseCaseForEmbedFunction( $presenter, $resourceLoader );

$useCase->embed( EmbedRequestBuilder::argumentsToRequest( $arguments ) );

Expand Down
2 changes: 0 additions & 2 deletions src/UseCases/Embed/EmbedPresenter.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,4 @@ public function showContent( string $content ): void;

public function showFetchingError(): void;

public function loadRendererRequirements( ContentRenderer $renderer ): void;

}
13 changes: 13 additions & 0 deletions src/UseCases/Embed/EmbedResourceLoader.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare( strict_types = 1 );

namespace ProfessionalWiki\ExternalContent\UseCases\Embed;

use ProfessionalWiki\ExternalContent\Domain\ContentRenderer;

interface EmbedResourceLoader {

public function loadRendererResources( ContentRenderer $renderer ): void;

}
7 changes: 5 additions & 2 deletions src/UseCases/Embed/EmbedUseCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,22 @@ class EmbedUseCase {
private UrlNormalizer $urlNormalizer;
private FileFetcher $fileFetcher;
private ContentRendererFactory $contentRendererFactory;
private EmbedResourceLoader $resourceLoader;

public function __construct(
EmbedPresenter $presenter,
UrlValidator $urlValidator,
UrlNormalizer $urlNormalizer,
FileFetcher $fileFetcher,
ContentRendererFactory $contentRendererFactory
ContentRendererFactory $contentRendererFactory,
EmbedResourceLoader $resourceLoader
) {
$this->presenter = $presenter;
$this->urlValidator = $urlValidator;
$this->urlNormalizer = $urlNormalizer;
$this->fileFetcher = $fileFetcher;
$this->contentRendererFactory = $contentRendererFactory;
$this->resourceLoader = $resourceLoader;
}

public function embed( EmbedRequest $request ): void {
Expand Down Expand Up @@ -65,7 +68,7 @@ public function embed( EmbedRequest $request ): void {
)
);

$this->presenter->loadRendererRequirements( $renderer );
$this->resourceLoader->loadRendererResources( $renderer );
}

private function createRendererConfig( EmbedRequest $request ): RendererConfig {
Expand Down
9 changes: 3 additions & 6 deletions tests/Unit/Adapters/ParserFunctionEmbedPresenterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ class ParserFunctionEmbedPresenterTest extends TestCase {
public function testShowErrorBuildsErrorMessageKey(): void {
$presenter = new ParserFunctionEmbedPresenter(
TestFactory::newTestInstance()->newTestMessageLocalizer(),
$this->createMock( UsageTracker::class ),
$this->createMock( ParserOutput::class )
$this->createMock( UsageTracker::class )
);

$presenter->showError( 'my-error' );
Expand All @@ -33,8 +32,7 @@ public function testShowErrorBuildsErrorMessageKey(): void {
public function testShowErrorBuildsErrorHtml(): void {
$presenter = new ParserFunctionEmbedPresenter(
TestFactory::newTestInstance()->newTestMessageLocalizer(),
$this->createMock( UsageTracker::class ),
$this->createMock( ParserOutput::class )
$this->createMock( UsageTracker::class )
);

$presenter->showError( 'my-error' );
Expand All @@ -60,8 +58,7 @@ public function assertStringContainsEither( string $expected1, string $expected2
public function testContentIsAccessibleAsHtml(): void {
$presenter = new ParserFunctionEmbedPresenter(
TestFactory::newTestInstance()->newTestMessageLocalizer(),
$this->createMock( UsageTracker::class ),
$this->createMock( ParserOutput::class )
$this->createMock( UsageTracker::class )
);

$presenter->showContent( '<strong>Well hello there!</strong>' );
Expand Down
23 changes: 9 additions & 14 deletions tests/Unit/UseCases/Embed/EmbedUseCaseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class EmbedUseCaseTest extends TestCase {
private SpyingFileFetcher $fileFetcher;
private ContentRenderer $contentRenderer;
private ContentRendererFactory $contentRendererFactory;
private SpyEmbedResourceLoader $resourceLoader;

private const KNOWN_FILE_URL = 'https://example.com/Fluff.md';
private const KNOWN_FILE_CONTENT = '~=[,,_,,]:3';
Expand All @@ -40,6 +41,7 @@ protected function setUp(): void {
] ) );
$this->contentRenderer = new NullContentRenderer();
$this->contentRendererFactory = new StubContentRendererFactory( $this->contentRenderer );
$this->resourceLoader = new SpyEmbedResourceLoader();
}

private function newUseCase(): EmbedUseCase {
Expand All @@ -48,7 +50,8 @@ private function newUseCase(): EmbedUseCase {
$this->urlValidator,
$this->urlNormalizer,
$this->fileFetcher,
$this->contentRendererFactory
$this->contentRendererFactory,
$this->resourceLoader
);
}

Expand All @@ -59,7 +62,7 @@ public function testInvalidUrlResultsInPresentedError(): void {

$this->assertSame( [ 'not-fluff-enough' ], $this->presenter->errors );
$this->assertNull( $this->presenter->content );
$this->assertFalse( $this->presenter->requirementsAreLoaded );
$this->assertFalse( $this->resourceLoader->resourcesAreLoaded );
}

private function createRequest( string $fileUrl ): EmbedRequest {
Expand All @@ -75,15 +78,15 @@ public function testValidUrlResultsInPresenterContent(): void {

$this->assertSame( self::KNOWN_FILE_CONTENT, $this->presenter->content );
$this->assertSame( [], $this->presenter->errors );
$this->assertTrue( $this->presenter->requirementsAreLoaded );
$this->assertTrue( $this->resourceLoader->resourcesAreLoaded );
}

public function testFileFetchingErrorResultsInPresentedError(): void {
$this->newUseCase()->embed( $this->createRequest( 'https://example.com/NotFluff.md' ) );

$this->assertSame( [ 'fetch-error' ], $this->presenter->errors );
$this->assertNull( $this->presenter->content );
$this->assertFalse( $this->presenter->requirementsAreLoaded );
$this->assertFalse( $this->resourceLoader->resourcesAreLoaded );
}

public function testFetchesNormalizedUrl(): void {
Expand All @@ -110,14 +113,6 @@ public function testPresentsRenderedContent(): void {
public function render( string $content, string $contentUrl ): string {
return $content . ' from ' . $contentUrl;
}

public function getOutputModules(): array {
return [];
}

public function getOutputModuleStyles(): array {
return [];
}
};
$this->contentRendererFactory = new StubContentRendererFactory( $this->contentRenderer );

Expand All @@ -128,7 +123,7 @@ public function getOutputModuleStyles(): array {
$this->presenter->content
);
$this->assertSame( [], $this->presenter->errors );
$this->assertTrue( $this->presenter->requirementsAreLoaded );
$this->assertTrue( $this->resourceLoader->resourcesAreLoaded );
}

public function testPresentsErrorOnUrlNormalizerException(): void {
Expand All @@ -146,7 +141,7 @@ public function viewLevelNormalize( string $url ): string {

$this->assertSame( [ 'url-not-fluff-enough' ], $this->presenter->errors );
$this->assertNull( $this->presenter->content );
$this->assertFalse( $this->presenter->requirementsAreLoaded );
$this->assertFalse( $this->resourceLoader->resourcesAreLoaded );
}

}
8 changes: 0 additions & 8 deletions tests/Unit/UseCases/Embed/NullContentRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,4 @@ public function render( string $content, string $contentUrl ): string {
return $content;
}

public function getOutputModules(): array {
return [];
}

public function getOutputModuleStyles(): array {
return [];
}

}
5 changes: 0 additions & 5 deletions tests/Unit/UseCases/Embed/SpyEmbedPresenter.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ class SpyEmbedPresenter implements EmbedPresenter {

public array $errors = [];
public ?string $content = null;
public bool $requirementsAreLoaded = false;

public function showError( string $messageKey ): void {
$this->errors[] = $messageKey;
Expand All @@ -25,8 +24,4 @@ public function showFetchingError(): void {
$this->errors[] = 'fetch-error';
}

public function loadRendererRequirements( ContentRenderer $renderer ): void {
$this->requirementsAreLoaded = true;
}

}
18 changes: 18 additions & 0 deletions tests/Unit/UseCases/Embed/SpyEmbedResourceLoader.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare( strict_types = 1 );

namespace ProfessionalWiki\ExternalContent\Tests\Unit\UseCases\Embed;

use ProfessionalWiki\ExternalContent\Domain\ContentRenderer;
use ProfessionalWiki\ExternalContent\UseCases\Embed\EmbedResourceLoader;

class SpyEmbedResourceLoader implements EmbedResourceLoader {

public bool $resourcesAreLoaded = false;

public function loadRendererResources( ContentRenderer $renderer ): void {
$this->resourcesAreLoaded = true;
}

}

0 comments on commit 019416a

Please sign in to comment.