Skip to content

Commit 4406b7e

Browse files
authored
Add tests for non-public etherpad instances (#163)
* Add tests for non-public etherpad instances * check for package version only if pads are public * Add new scan for plugin-definition * Do not test for adminpads2 because it is only available in CLIENT_VARS
1 parent 079e905 commit 4406b7e

7 files changed

Lines changed: 103 additions & 7 deletions

File tree

.github/workflows/e2e-test.yml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ jobs:
353353
diff -u /tmp/latest.txt /tmp/actual.txt
354354
355355
EtherpadDockerWithPlugins:
356-
name: Docker [${{ matrix.versions.tag }}] with plugins
356+
name: "Docker [${{ matrix.versions.tag }}] with plugins, editOnly: ${{ matrix.editOnly }}"
357357
runs-on: ubuntu-latest
358358

359359
strategy:
@@ -363,6 +363,7 @@ jobs:
363363
{ tag: "2.6.1" },
364364
{ tag: "2.5.0" },
365365
]
366+
editOnly: ["true", "false"]
366367
fail-fast: false
367368
steps:
368369
- name: Checkout repository
@@ -373,6 +374,7 @@ jobs:
373374
docker pull etherpad/etherpad:${{ matrix.versions.tag }}
374375
export ORIGINAL_CMD=$(docker inspect --format='{{join .Config.Cmd " "}}' etherpad/etherpad:${{ matrix.versions.tag }})
375376
echo "Original CMD: $ORIGINAL_CMD"
377+
export EDIT_ONLY=${{ matrix.editOnly }}
376378
EP_VERSION=${{ matrix.versions.tag }} docker compose -f ./tests/e2e/docker/docker-compose.plugins.yml up -d --wait
377379
378380
- name: Dump docker compose logs on failure
@@ -398,17 +400,18 @@ jobs:
398400
output="$(bin/console.php ether:scan http://localhost:9001)"
399401
echo "$output"
400402
401-
expected="Package version: ${{ matrix.versions.tag }}"
402-
if ! grep -Fq "$expected" <<< "$output"; then
403-
echo "Assertion failed: expected output to contain: $expected"
404-
exit 1
403+
if [[ "${{ matrix.editOnly }}" == "false" ]]; then
404+
expected="Package version: ${{ matrix.versions.tag }}"
405+
if ! grep -Fq "$expected" <<< "$output"; then
406+
echo "Assertion failed: expected output to contain: $expected"
407+
exit 1
408+
fi
405409
fi
406410
407411
expectedPackages=(
408412
"ep_align"
409413
"ep_headings2"
410414
"ep_font_color"
411-
"ep_adminpads2"
412415
"ep_comments_page"
413416
"ep_font_size"
414417
"ep_markdown"

src/Console/ScanCommandOutputHelper.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ public function onScanPluginsList(array $plugins): void
7272

7373
$pluginData = [];
7474
foreach ($plugins as $pluginName => $plugin) {
75-
$pluginData[] = $pluginName . '@' . $plugin['package']['version'];
75+
$version = $plugin['package']['version'] ?? null;
76+
$pluginData[] = $pluginName . ($version === null ? '' : '@' . $version);
7677
}
7778
sort($pluginData);
7879

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Gared\EtherScan\Service\Scanner;
5+
6+
use Gared\EtherScan\Exception\EtherpadServiceNotFoundException;
7+
use Gared\EtherScan\Service\ScannerServiceCallbackInterface;
8+
use GuzzleHttp\Client;
9+
use GuzzleHttp\Exception\GuzzleException;
10+
use JsonException;
11+
12+
readonly class PluginDefinitionScanner
13+
{
14+
public function scan(Client $client, string $baseUrl, ScannerServiceCallbackInterface $callback): void
15+
{
16+
try {
17+
$response = $client->get($baseUrl . 'pluginfw/plugin-definitions.json');
18+
19+
try {
20+
$body = (string)$response->getBody();
21+
$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
22+
23+
if (is_array($data) === false || array_key_exists('plugins', $data) === false) {
24+
throw new EtherpadServiceNotFoundException('No Etherpad service found');
25+
}
26+
27+
$onlyPlugins = $data['plugins'];
28+
$callback->onScanPluginsList($onlyPlugins);
29+
} catch (JsonException $e) {
30+
$callback->onScanApiException($e);
31+
}
32+
} catch (GuzzleException $e) {
33+
$callback->onScanApiException($e);
34+
}
35+
}
36+
}

src/Service/ScannerService.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Gared\EtherScan\Exception\EtherpadServiceNotPublicException;
1212
use Gared\EtherScan\Service\Scanner\ApiEndpointScanner;
1313
use Gared\EtherScan\Service\Scanner\Health\HealthScanner;
14+
use Gared\EtherScan\Service\Scanner\PluginDefinitionScanner;
1415
use GuzzleHttp\Client;
1516
use GuzzleHttp\Cookie\CookieJar;
1617
use GuzzleHttp\Exception\GuzzleException;
@@ -33,6 +34,7 @@ class ScannerService
3334
private string $padId;
3435
private readonly ApiEndpointScanner $apiEndpointScanner;
3536
private HealthScanner $healthScanner;
37+
private PluginDefinitionScanner $pluginDefinitionScanner;
3638

3739
public function __construct(
3840
string $url,
@@ -66,6 +68,7 @@ public function __construct(
6668
$githubApi,
6769
);
6870
$this->healthScanner = new HealthScanner($this->versionRangeService);
71+
$this->pluginDefinitionScanner = new PluginDefinitionScanner();
6972
}
7073

7174
/**
@@ -79,6 +82,9 @@ public function scan(ScannerServiceCallbackInterface $callback): void
7982
$this->apiEndpointScanner->scan($this->client, $this->baseUrl, $callback);
8083
$this->scanStaticFiles($callback);
8184
$this->scanPad($callback);
85+
if ($this->versionRangeService->getPackageVersion() === null) {
86+
$this->pluginDefinitionScanner->scan($this->client, $this->baseUrl, $callback);
87+
}
8288
$this->healthScanner->scan($this->client, $this->baseUrl, $callback);
8389
$this->progressVersionRanges($callback);
8490
$this->scanStats($callback);

src/Service/VersionRangeService.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ public function setPackageVersion(?string $packageVersion): void
5757
$this->packageVersion = $packageVersion;
5858
}
5959

60+
public function getPackageVersion(): ?string
61+
{
62+
return $this->packageVersion;
63+
}
64+
6065
public function setRevisionVersion(?string $revisionVersion): void
6166
{
6267
$this->revisionVersion = $revisionVersion;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Gared\EtherScan\Tests\Unit\Service;
5+
6+
use Gared\EtherScan\Service\Scanner\PluginDefinitionScanner;
7+
use Gared\EtherScan\Service\ScannerServiceCallbackInterface;
8+
use GuzzleHttp\Client;
9+
use PHPUnit\Framework\TestCase;
10+
use Psr\Http\Message\ResponseInterface;
11+
use Psr\Http\Message\StreamInterface;
12+
13+
class PluginDefinitionScannerTest extends TestCase
14+
{
15+
public function testCalculateVersionReturnsNullWithoutAnyInput(): void
16+
{
17+
$service = new PluginDefinitionScanner();
18+
19+
$body = '{"plugins":{"ep_image_upload":{"parts":[{"name":"ep_image_upload","client_hooks":{"postToolbarInit":"ep_image_upload/static/js/toolbar","aceAttribsToClasses":"ep_image_upload/static/js/clientHooks","aceDomLineProcessLineAttributes":"ep_image_upload/static/js/clientHooks","aceInitialized":"ep_image_upload/static/js/clientHooks","aceRegisterBlockElements":"ep_image_upload/static/js/clientHooks","aceEditorCSS":"ep_image_upload/static/js/clientHooks","collectContentImage":"ep_image_upload/static/js/contentCollection","collectContentPre":"ep_image_upload/static/js/contentCollection","ccRegisterBlockElements":"ep_image_upload/static/js/contentCollection","collectContentPost":"ep_image_upload/static/js/contentCollection"},"hooks":{"clientVars":"ep_image_upload/index","eejsBlock_body":"ep_image_upload/index","collectContentImage":"ep_image_upload/static/js/contentCollection","getLineHTMLForExport":"ep_image_upload/exportHTML","stylesForExport":"ep_image_upload/exportHTML","expressConfigure":"ep_image_upload/index","eejsBlock_editbarMenuLeft":"ep_image_upload/editbar","collectContentPre":"ep_image_upload/static/js/contentCollection","collectContentPost":"ep_image_upload/static/js/contentCollection","ccRegisterBlockElements":"ep_image_upload/static/js/contentCollection","loadSettings":"ep_image_upload/settings","padRemove":"ep_image_upload/index"},"plugin":"ep_image_upload","full_name":"ep_image_upload/ep_image_upload"}]},"ep_font_size":{"parts":[{"name":"main","client_hooks":{"postAceInit":"ep_font_size/static/js/index","postToolbarInit":"ep_font_size/static/js/index","aceInitialized":"ep_font_size/static/js/index","aceEditorCSS":"ep_font_size/static/js/index","aceCreateDomLine":"ep_font_size/static/js/index","aceAttribsToClasses":"ep_font_size/static/js/index","collectContentPre":"ep_font_size/static/js/shared"},"hooks":{"padInitToolbar":"ep_font_size/index","eejsBlock_editbarMenuLeft":"ep_font_size/index","collectContentPre":"ep_font_size/static/js/shared","exportHtmlAdditionalTagsWithData":"ep_font_size/exportHTML","stylesForExport":"ep_font_size/exportHTML","getLineHTMLForExport":"ep_font_size/exportHTML","eejsBlock_dd_format":"ep_font_size/index"},"plugin":"ep_font_size","full_name":"ep_font_size/main"}]},"ep_headings2":{"parts":[{"name":"main","client_hooks":{"aceEditorCSS":"ep_headings2/static/js/index","aceEditEvent":"ep_headings2/static/js/index","aceDomLineProcessLineAttributes":"ep_headings2/static/js/index","postAceInit":"ep_headings2/static/js/index","aceInitialized":"ep_headings2/static/js/index","aceAttribsToClasses":"ep_headings2/static/js/index","collectContentPre":"ep_headings2/static/js/shared","aceRegisterBlockElements":"ep_headings2/static/js/index"},"hooks":{"eejsBlock_editbarMenuLeft":"ep_headings2/index","collectContentPre":"ep_headings2/static/js/shared","collectContentPost":"ep_headings2/static/js/shared","getLineHTMLForExport":"ep_headings2/index","stylesForExport":"ep_headings2/index"},"plugin":"ep_headings2","full_name":"ep_headings2/main"}]},"ep_font_color":{"parts":[{"name":"main","client_hooks":{"postAceInit":"ep_font_color/static/js/index","aceInitialized":"ep_font_color/static/js/index","aceEditEvent":"ep_font_color/static/js/index","aceEditorCSS":"ep_font_color/static/js/index","aceCreateDomLine":"ep_font_color/static/js/index","postToolbarInit":"ep_font_color/static/js/index","aceAttribsToClasses":"ep_font_color/static/js/index","collectContentPre":"ep_font_color/static/js/shared"},"hooks":{"eejsBlock_editbarMenuLeft":"ep_font_color/index","collectContentPre":"ep_font_color/static/js/shared","collectContentPost":"ep_font_color/static/js/shared","exportHtmlAdditionalTagsWithData":"ep_font_color/exportHTML","stylesForExport":"ep_font_color/exportHTML","getLineHTMLForExport":"ep_font_color/exportHTML","eejsBlock_dd_format":"ep_font_color/index","padInitToolbar":"ep_font_color/index"},"plugin":"ep_font_color","full_name":"ep_font_color/main"}]},"ep_align":{"parts":[{"name":"main","client_hooks":{"aceEditEvent":"ep_align/static/js/index","postToolbarInit":"ep_align/static/js/index","aceDomLineProcessLineAttributes":"ep_align/static/js/index","postAceInit":"ep_align/static/js/index","aceInitialized":"ep_align/static/js/index","aceAttribsToClasses":"ep_align/static/js/index","collectContentPre":"ep_align/static/js/shared","aceRegisterBlockElements":"ep_align/static/js/index"},"hooks":{"eejsBlock_editbarMenuLeft":"ep_align/index","collectContentPre":"ep_align/static/js/shared","collectContentPost":"ep_align/static/js/shared","padInitToolbar":"ep_align/index","getLineHTMLForExport":"ep_align/index"},"plugin":"ep_align","full_name":"ep_align/main"}]},"ep_embedded_hyperlinks2":{"parts":[{"name":"main","client_hooks":{"postAceInit":"ep_embedded_hyperlinks2/static/js/index","aceInitialized":"ep_embedded_hyperlinks2/static/js/index","aceCreateDomLine":"ep_embedded_hyperlinks2/static/js/index","aceAttribsToClasses":"ep_embedded_hyperlinks2/static/js/index","collectContentPre":"ep_embedded_hyperlinks2/static/js/index"},"hooks":{"eejsBlock_editbarMenuLeft":"ep_embedded_hyperlinks2/index","eejsBlock_editorContainerBox":"ep_embedded_hyperlinks2/index"},"plugin":"ep_embedded_hyperlinks2","full_name":"ep_embedded_hyperlinks2/main"}]}},"parts":[{"name":"ep_image_upload","client_hooks":{"postToolbarInit":"ep_image_upload/static/js/toolbar","aceAttribsToClasses":"ep_image_upload/static/js/clientHooks","aceDomLineProcessLineAttributes":"ep_image_upload/static/js/clientHooks","aceInitialized":"ep_image_upload/static/js/clientHooks","aceRegisterBlockElements":"ep_image_upload/static/js/clientHooks","aceEditorCSS":"ep_image_upload/static/js/clientHooks","collectContentImage":"ep_image_upload/static/js/contentCollection","collectContentPre":"ep_image_upload/static/js/contentCollection","ccRegisterBlockElements":"ep_image_upload/static/js/contentCollection","collectContentPost":"ep_image_upload/static/js/contentCollection"},"hooks":{"clientVars":"ep_image_upload/index","eejsBlock_body":"ep_image_upload/index","collectContentImage":"ep_image_upload/static/js/contentCollection","getLineHTMLForExport":"ep_image_upload/exportHTML","stylesForExport":"ep_image_upload/exportHTML","expressConfigure":"ep_image_upload/index","eejsBlock_editbarMenuLeft":"ep_image_upload/editbar","collectContentPre":"ep_image_upload/static/js/contentCollection","collectContentPost":"ep_image_upload/static/js/contentCollection","ccRegisterBlockElements":"ep_image_upload/static/js/contentCollection","loadSettings":"ep_image_upload/settings","padRemove":"ep_image_upload/index"},"plugin":"ep_image_upload","full_name":"ep_image_upload/ep_image_upload"},{"name":"main","client_hooks":{"postAceInit":"ep_font_size/static/js/index","postToolbarInit":"ep_font_size/static/js/index","aceInitialized":"ep_font_size/static/js/index","aceEditorCSS":"ep_font_size/static/js/index","aceCreateDomLine":"ep_font_size/static/js/index","aceAttribsToClasses":"ep_font_size/static/js/index","collectContentPre":"ep_font_size/static/js/shared"},"hooks":{"padInitToolbar":"ep_font_size/index","eejsBlock_editbarMenuLeft":"ep_font_size/index","collectContentPre":"ep_font_size/static/js/shared","exportHtmlAdditionalTagsWithData":"ep_font_size/exportHTML","stylesForExport":"ep_font_size/exportHTML","getLineHTMLForExport":"ep_font_size/exportHTML","eejsBlock_dd_format":"ep_font_size/index"},"plugin":"ep_font_size","full_name":"ep_font_size/main"},{"name":"main","client_hooks":{"aceEditorCSS":"ep_headings2/static/js/index","aceEditEvent":"ep_headings2/static/js/index","aceDomLineProcessLineAttributes":"ep_headings2/static/js/index","postAceInit":"ep_headings2/static/js/index","aceInitialized":"ep_headings2/static/js/index","aceAttribsToClasses":"ep_headings2/static/js/index","collectContentPre":"ep_headings2/static/js/shared","aceRegisterBlockElements":"ep_headings2/static/js/index"},"hooks":{"eejsBlock_editbarMenuLeft":"ep_headings2/index","collectContentPre":"ep_headings2/static/js/shared","collectContentPost":"ep_headings2/static/js/shared","getLineHTMLForExport":"ep_headings2/index","stylesForExport":"ep_headings2/index"},"plugin":"ep_headings2","full_name":"ep_headings2/main"},{"name":"main","client_hooks":{"postAceInit":"ep_font_color/static/js/index","aceInitialized":"ep_font_color/static/js/index","aceEditEvent":"ep_font_color/static/js/index","aceEditorCSS":"ep_font_color/static/js/index","aceCreateDomLine":"ep_font_color/static/js/index","postToolbarInit":"ep_font_color/static/js/index","aceAttribsToClasses":"ep_font_color/static/js/index","collectContentPre":"ep_font_color/static/js/shared"},"hooks":{"eejsBlock_editbarMenuLeft":"ep_font_color/index","collectContentPre":"ep_font_color/static/js/shared","collectContentPost":"ep_font_color/static/js/shared","exportHtmlAdditionalTagsWithData":"ep_font_color/exportHTML","stylesForExport":"ep_font_color/exportHTML","getLineHTMLForExport":"ep_font_color/exportHTML","eejsBlock_dd_format":"ep_font_color/index","padInitToolbar":"ep_font_color/index"},"plugin":"ep_font_color","full_name":"ep_font_color/main"},{"name":"main","client_hooks":{"aceEditEvent":"ep_align/static/js/index","postToolbarInit":"ep_align/static/js/index","aceDomLineProcessLineAttributes":"ep_align/static/js/index","postAceInit":"ep_align/static/js/index","aceInitialized":"ep_align/static/js/index","aceAttribsToClasses":"ep_align/static/js/index","collectContentPre":"ep_align/static/js/shared","aceRegisterBlockElements":"ep_align/static/js/index"},"hooks":{"eejsBlock_editbarMenuLeft":"ep_align/index","collectContentPre":"ep_align/static/js/shared","collectContentPost":"ep_align/static/js/shared","padInitToolbar":"ep_align/index","getLineHTMLForExport":"ep_align/index"},"plugin":"ep_align","full_name":"ep_align/main"},{"name":"main","client_hooks":{"postAceInit":"ep_embedded_hyperlinks2/static/js/index","aceInitialized":"ep_embedded_hyperlinks2/static/js/index","aceCreateDomLine":"ep_embedded_hyperlinks2/static/js/index","aceAttribsToClasses":"ep_embedded_hyperlinks2/static/js/index","collectContentPre":"ep_embedded_hyperlinks2/static/js/index"},"hooks":{"eejsBlock_editbarMenuLeft":"ep_embedded_hyperlinks2/index","eejsBlock_editorContainerBox":"ep_embedded_hyperlinks2/index"},"plugin":"ep_embedded_hyperlinks2","full_name":"ep_embedded_hyperlinks2/main"}]}';
20+
21+
$stream = $this->createMock(StreamInterface::class);
22+
$stream->expects(self::once())->method('__toString')->willReturn($body);
23+
24+
$response = $this->createMock(ResponseInterface::class);
25+
$response->expects(self::once())->method('getBody')->willReturn($stream);
26+
27+
$client = $this->createMock(Client::class);
28+
$client->expects(self::once())->method('get')->willReturn($response);
29+
30+
$callback = $this->createMock(ScannerServiceCallbackInterface::class);
31+
$callback->expects(self::once())->method('onScanPluginsList')->with($this->callback(function (array $plugins) {
32+
return array_key_exists('ep_image_upload', $plugins) &&
33+
array_key_exists('ep_font_size', $plugins) &&
34+
array_key_exists('ep_headings2', $plugins) &&
35+
array_key_exists('ep_font_color', $plugins) &&
36+
array_key_exists('ep_align', $plugins) &&
37+
array_key_exists('ep_embedded_hyperlinks2', $plugins);
38+
}));
39+
40+
$service->scan($client, '', $callback);
41+
}
42+
}
43+

tests/e2e/docker/docker-compose.plugins.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,7 @@ services:
22
etherpad:
33
image: etherpad/etherpad:$EP_VERSION
44
entrypoint: /bin/sh -c "pnpm run plugins i ep_align ep_headings2 ep_font_color ep_adminpads2 ep_comments_page ep_font_size ep_markdown && ${ORIGINAL_CMD}"
5+
environment:
6+
- EDIT_ONLY=${EDIT_ONLY}
57
ports:
68
- 9001:9001

0 commit comments

Comments
 (0)