Skip to content

Commit 8b2d4c3

Browse files
committed
Adjust filter plugin requirements to comply with 4.5.
Per https://moodledev.io/docs/4.5/devupdate#filter-plugins Fixes #321
1 parent cd11318 commit 8b2d4c3

File tree

3 files changed

+82
-13
lines changed

3 files changed

+82
-13
lines changed

src/PluginValidate/Requirements/AbstractRequirements.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,18 @@ protected function behatTagsFactory(array $tags): array
6464
return $fileTokens;
6565
}
6666

67+
/**
68+
* Helper method to check file existence.
69+
*
70+
* @param string $file
71+
*
72+
* @return bool
73+
*/
74+
protected function fileExists(string $file): bool
75+
{
76+
return file_exists($this->plugin->directory . '/' . $file);
77+
}
78+
6779
/**
6880
* An array of required files, paths are relative to the plugin directory.
6981
*

src/PluginValidate/Requirements/FilterRequirements.php

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,28 @@ class FilterRequirements extends GenericRequirements
2121
{
2222
public function getRequiredFiles(): array
2323
{
24-
return array_merge(parent::getRequiredFiles(), [
25-
'filter.php',
26-
]);
24+
$files = [];
25+
if ($this->moodleVersion >= 405) {
26+
$files[] = 'classes/text_filter.php';
27+
} else {
28+
// This must exist in 4.5 if plugin supports older version, but we don't identify support range to validate it.
29+
$files[] = 'filter.php';
30+
}
31+
32+
return array_merge(parent::getRequiredFiles(), $files);
2733
}
2834

2935
public function getRequiredClasses(): array
3036
{
37+
if ($this->moodleVersion <= 404 && !$this->fileExists('classes/text_filter.php')) {
38+
// Plugin does not support 4.5, check class presence in filter.php
39+
return [
40+
FileTokens::create('filter.php')->mustHave('filter_' . $this->plugin->name),
41+
];
42+
}
43+
3144
return [
32-
FileTokens::create('filter.php')->mustHave('filter_' . $this->plugin->name),
45+
FileTokens::create('classes/text_filter.php')->mustHave("filter_{$this->plugin->name}\\text_filter"),
3346
];
3447
}
3548

tests/PluginValidate/Requirements/FilterRequirementsTest.php

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,21 @@ class FilterRequirementsTest extends \PHPUnit\Framework\TestCase
2323
*/
2424
private $requirements;
2525

26+
/**
27+
* @var FilterRequirements
28+
*/
29+
private $requirements404;
30+
2631
protected function setUp(): void
2732
{
28-
$this->requirements = new FilterRequirements(new Plugin('filter_activitynames', 'filter', 'activitynames', ''), 29);
33+
$this->requirements404 = new FilterRequirements(new Plugin('filter_activitynames', 'filter', 'activitynames', ''), 404);
34+
$this->requirements = new FilterRequirements(new Plugin('filter_activitynames', 'filter', 'activitynames', ''), 405);
2935
}
3036

3137
protected function tearDown(): void
3238
{
33-
$this->requirements = null;
39+
$this->requirements404 = null;
40+
$this->requirements = null;
3441
}
3542

3643
public function testResolveRequirements()
@@ -39,29 +46,66 @@ public function testResolveRequirements()
3946

4047
$this->assertInstanceOf(
4148
'MoodlePluginCI\PluginValidate\Requirements\FilterRequirements',
42-
$resolver->resolveRequirements(new Plugin('', 'filter', '', ''), 29)
49+
$resolver->resolveRequirements(new Plugin('', 'filter', '', ''), 404)
4350
);
4451
}
4552

53+
public function testGetRequiredFiles404()
54+
{
55+
$files = $this->requirements404->getRequiredFiles();
56+
57+
$this->assertTrue(in_array('filter.php', $files, true));
58+
$this->assertFalse(in_array('classes/text_filter.php', $files, true));
59+
foreach ($files as $file) {
60+
$this->assertIsString($file);
61+
}
62+
}
63+
4664
public function testGetRequiredFiles()
4765
{
4866
$files = $this->requirements->getRequiredFiles();
4967

50-
$this->assertNotEmpty($files);
51-
$this->assertTrue(in_array('filter.php', $files, true));
68+
$this->assertFalse(in_array('filter.php', $files, true));
69+
$this->assertTrue(in_array('classes/text_filter.php', $files, true));
5270
foreach ($files as $file) {
5371
$this->assertIsString($file);
5472
}
5573
}
5674

75+
public function testGetRequiredClasses404()
76+
{
77+
$requirements = $this->getMockBuilder('MoodlePluginCI\PluginValidate\Requirements\FilterRequirements')
78+
->setConstructorArgs([new Plugin('filter_activitynames', 'filter', 'activitynames', ''), 404])
79+
->onlyMethods(['fileExists'])
80+
->getMock();
81+
// On first call fileExists return false, on second call return true.
82+
$requirements->method('fileExists')
83+
->with($this->identicalTo('classes/text_filter.php'))
84+
->willReturn(false, true);
85+
86+
// If classes/text_filter.php does not exist, expect class presence in filter.php.
87+
$classes = $requirements->getRequiredClasses();
88+
$this->assertCount(1, $classes);
89+
$class = reset($classes);
90+
$this->assertInstanceOf('MoodlePluginCI\PluginValidate\Finder\FileTokens', $class);
91+
$this->assertSame('filter.php', $class->file);
92+
93+
// If classes/text_filter.php exists, expect class presence in it (4.5 plugin backward compatibility).
94+
$classes = $requirements->getRequiredClasses();
95+
$this->assertCount(1, $classes);
96+
$class = reset($classes);
97+
$this->assertInstanceOf('MoodlePluginCI\PluginValidate\Finder\FileTokens', $class);
98+
$this->assertSame('classes/text_filter.php', $class->file);
99+
}
100+
57101
public function testGetRequiredClasses()
58102
{
59103
$classes = $this->requirements->getRequiredClasses();
60104

61-
$this->assertNotEmpty($classes);
62-
foreach ($classes as $class) {
63-
$this->assertInstanceOf('MoodlePluginCI\PluginValidate\Finder\FileTokens', $class);
64-
}
105+
$this->assertCount(1, $classes);
106+
$class = reset($classes);
107+
$this->assertInstanceOf('MoodlePluginCI\PluginValidate\Finder\FileTokens', $class);
108+
$this->assertSame('classes/text_filter.php', $class->file);
65109
}
66110

67111
public function testGetRequiredStrings()

0 commit comments

Comments
 (0)