MDL-86087 core: Fix PHPUnit 11.5.43+ compatibility

Adjust tests to comply with updated PHPUnit lifecycle behaviour
 - Initialise typed test properties (e.g. core_session memcached test) or make them nullable
 - Add `isset()` checks to avoid accessing properties before initialisation
 - Ensure resetAfterTest() is called before modifying DB or `$USER`
This commit is contained in:
Huong Nguyen
2025-11-28 09:10:34 +07:00
parent d25846cb41
commit c4d054cfbf
3 changed files with 8 additions and 45 deletions
+1 -34
View File
@@ -54,7 +54,7 @@ final class model_test extends \advanced_testcase {
public function setUp(): void {
parent::setUp();
$this->resetAfterTest();
$this->setAdminUser();
$target = \core_analytics\manager::get_target('test_target_shortname');
@@ -68,8 +68,6 @@ final class model_test extends \advanced_testcase {
}
public function test_enable(): void {
$this->resetAfterTest(true);
$this->assertEquals(0, $this->model->get_model_obj()->enabled);
$this->assertEquals(0, $this->model->get_model_obj()->trained);
$this->assertEquals('', $this->model->get_model_obj()->timesplitting);
@@ -81,8 +79,6 @@ final class model_test extends \advanced_testcase {
}
public function test_create(): void {
$this->resetAfterTest(true);
$target = \core_analytics\manager::get_target('\core_course\analytics\target\course_dropout');
$indicators = array(
\core_analytics\manager::get_indicator('\core\analytics\indicator\any_write_action'),
@@ -194,7 +190,6 @@ final class model_test extends \advanced_testcase {
*/
public function test_clear_static(): void {
global $DB;
$this->resetAfterTest();
$statictarget = new \test_static_target_shortname();
$indicators['test_indicator_max'] = \core_analytics\manager::get_indicator('test_indicator_max');
@@ -211,8 +206,6 @@ final class model_test extends \advanced_testcase {
}
public function test_model_manager(): void {
$this->resetAfterTest(true);
$this->assertCount(3, $this->model->get_indicators());
$this->assertInstanceOf('\core_analytics\local\target\binary', $this->model->get_target());
@@ -225,8 +218,6 @@ final class model_test extends \advanced_testcase {
}
public function test_output_dir(): void {
$this->resetAfterTest(true);
$dir = make_request_directory();
set_config('modeloutputdir', $dir, 'analytics');
@@ -237,9 +228,6 @@ final class model_test extends \advanced_testcase {
public function test_unique_id(): void {
global $DB;
$this->resetAfterTest(true);
$originaluniqueid = $this->model->get_unique_id();
// Same id across instances.
@@ -283,8 +271,6 @@ final class model_test extends \advanced_testcase {
* @return void
*/
public function test_exists(): void {
$this->resetAfterTest(true);
$target = \core_analytics\manager::get_target('\core_course\analytics\target\no_teaching');
$this->assertTrue(\core_analytics\model::exists($target));
@@ -302,9 +288,6 @@ final class model_test extends \advanced_testcase {
*/
public function test_model_timelimit(): void {
global $DB;
$this->resetAfterTest(true);
set_config('modeltimelimit', 2, 'analytics');
$courses = array();
@@ -365,8 +348,6 @@ final class model_test extends \advanced_testcase {
* Test model_config::get_class_component.
*/
public function test_model_config_get_class_component(): void {
$this->resetAfterTest(true);
$this->assertEquals('core',
\core_analytics\model_config::get_class_component('\\core\\analytics\\indicator\\read_actions'));
$this->assertEquals('core',
@@ -387,8 +368,6 @@ final class model_test extends \advanced_testcase {
$this->markTestSkipped('mlbackend_python is not configured.');
}
$this->resetAfterTest(true);
$this->model->enable('\\core\\analytics\\time_splitting\\quarters');
$zipfilepath = $this->model->export_model('yeah-config.zip');
@@ -408,8 +387,6 @@ final class model_test extends \advanced_testcase {
* Test can export configuration
*/
public function test_can_export_configuration(): void {
$this->resetAfterTest(true);
// No time splitting method.
$this->assertFalse($this->model->can_export_configuration());
@@ -433,8 +410,6 @@ final class model_test extends \advanced_testcase {
$this->markTestSkipped('mlbackend_python is not configured.');
}
$this->resetAfterTest(true);
$this->model->enable('\\core\\analytics\\time_splitting\\quarters');
$modelconfig = new \core_analytics\model_config($this->model);
@@ -463,8 +438,6 @@ final class model_test extends \advanced_testcase {
public function test_inplace_editable_name(): void {
global $PAGE;
$this->resetAfterTest();
$output = new \core_renderer($PAGE, RENDERER_TARGET_GENERAL);
// Check as a user with permission to edit the name.
@@ -489,8 +462,6 @@ final class model_test extends \advanced_testcase {
public function test_get_name_and_rename(): void {
global $PAGE;
$this->resetAfterTest();
$output = new \core_renderer($PAGE, RENDERER_TARGET_GENERAL);
// By default, the model exported for template uses its target's name in the name inplace editable element.
@@ -518,8 +489,6 @@ final class model_test extends \advanced_testcase {
* Tests model::get_potential_timesplittings()
*/
public function test_potential_timesplittings(): void {
$this->resetAfterTest();
$this->assertArrayNotHasKey('\core\analytics\time_splitting\no_splitting', $this->model->get_potential_timesplittings());
$this->assertArrayHasKey('\core\analytics\time_splitting\single_range', $this->model->get_potential_timesplittings());
$this->assertArrayHasKey('\core\analytics\time_splitting\quarters', $this->model->get_potential_timesplittings());
@@ -531,8 +500,6 @@ final class model_test extends \advanced_testcase {
* @return null
*/
public function test_get_samples(): void {
$this->resetAfterTest();
if (!PHPUNIT_LONGTEST) {
$this->markTestSkipped('PHPUNIT_LONGTEST is not defined');
}
+1 -8
View File
@@ -39,7 +39,7 @@ final class stats_test extends \advanced_testcase {
*/
public function setUp(): void {
parent::setUp();
$this->resetAfterTest();
$this->setAdminUser();
}
@@ -47,9 +47,6 @@ final class stats_test extends \advanced_testcase {
* Test the {@link \core_analytics\stats::enabled_models()} implementation.
*/
public function test_enabled_models(): void {
$this->resetAfterTest(true);
// By default, sites have {@link \core_course\analytics\target\no_teaching} and
// {@link \core_user\analytics\target\upcoming_activities_due} enabled.
$this->assertEquals(4, \core_analytics\stats::enabled_models());
@@ -77,8 +74,6 @@ final class stats_test extends \advanced_testcase {
$this->markTestSkipped('mlbackend_python is not configured.');
}
$this->resetAfterTest(true);
$model = \core_analytics\model::create(
\core_analytics\manager::get_target('test_target_shortname'),
[
@@ -127,8 +122,6 @@ final class stats_test extends \advanced_testcase {
$this->markTestSkipped('mlbackend_python is not configured.');
}
$this->resetAfterTest(true);
$model = \core_analytics\model::create(
\core_analytics\manager::get_target('test_target_shortname'),
[
+6 -3
View File
@@ -41,8 +41,8 @@ final class memcached_test extends \advanced_testcase {
/** @var memcached|null $memcachedession An instance of the memcached session or null if not initialized. */
private ?memcached $memcachedession = null;
/** @var \Memcached $memcached An instance of the Memcached class used for handling session storage. */
private \Memcached $memcached;
/** @var ?\Memcached $memcached An instance of the Memcached class used for handling session storage. */
private ?\Memcached $memcached = null;
/** @var mock_handler $mockhandler Dedicated testing handler. */
private mock_handler $mockhandler;
@@ -87,7 +87,10 @@ final class memcached_test extends \advanced_testcase {
#[\Override]
public function tearDown(): void {
$this->memcached->quit();
if ($this->memcached !== null) {
$this->memcached->quit();
$this->memcached = null;
}
parent::tearDown();
}