MDL-87716 phpunit: Update phpunit configuration for composer

PHPUnit paths must be provided relative to the `phpunit.xml` file.

In current operation, the `phpunit.xml` is generated in the root
directory, and all paths are relative to this.

When installed using Composer, the Moodle directory is in a
sub-directory of the root package/directory, so the configuration must
reflect this.
This commit is contained in:
Andrew Nicols
2026-01-07 12:00:31 +08:00
parent 429eeaafab
commit 9142bd0ac6
12 changed files with 358 additions and 230 deletions

View File

@@ -2,7 +2,7 @@
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
bootstrap="public/lib/phpunit/bootstrap.php"
bootstrap="@root@public/lib/phpunit/bootstrap.php"
processIsolation="false"
backupGlobals="false"
cacheResult="false"
@@ -38,315 +38,315 @@
<testsuites>
<testsuite name="core_phpunit_testsuite">
<directory suffix="_test.php">public/lib/phpunit/tests</directory>
<exclude>public/lib/phpunit/tests/classes</exclude>
<exclude>public/lib/phpunit/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/phpunit/tests</directory>
<exclude>@root@public/lib/phpunit/tests/classes</exclude>
<exclude>@root@public/lib/phpunit/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_test_testsuite">
<directory suffix="_test.php">public/lib/testing/tests</directory>
<exclude>public/lib/testing/tests/classes</exclude>
<exclude>public/lib/testing/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/testing/tests</directory>
<exclude>@root@public/lib/testing/tests/classes</exclude>
<exclude>@root@public/lib/testing/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_ddl_testsuite">
<directory suffix="_test.php">public/lib/ddl/tests</directory>
<exclude>public/lib/ddl/tests/classes</exclude>
<exclude>public/lib/ddl/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/ddl/tests</directory>
<exclude>@root@public/lib/ddl/tests/classes</exclude>
<exclude>@root@public/lib/ddl/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_dml_testsuite">
<directory suffix="_test.php">public/lib/dml/tests</directory>
<exclude>public/lib/dml/tests/classes</exclude>
<exclude>public/lib/dml/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/dml/tests</directory>
<exclude>@root@public/lib/dml/tests/classes</exclude>
<exclude>@root@public/lib/dml/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_testsuite">
<directory suffix="_test.php">public/lib/tests</directory>
<exclude>public/lib/tests/classes</exclude>
<exclude>public/lib/tests/fixtures</exclude>
<!-- <directory suffix="_test.php">public/lib/ajax/tests</directory> -->
<directory suffix="_test.php">@root@public/lib/tests</directory>
<exclude>@root@public/lib/tests/classes</exclude>
<exclude>@root@public/lib/tests/fixtures</exclude>
<!-- <directory suffix="_test.php">@root@public/lib/ajax/tests</directory> -->
</testsuite>
<testsuite name="core_external_testsuite">
<directory suffix="_test.php">public/lib/external/tests</directory>
<exclude>public/lib/external/tests/classes</exclude>
<exclude>public/lib/external/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/external/tests</directory>
<exclude>@root@public/lib/external/tests/classes</exclude>
<exclude>@root@public/lib/external/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_favourites_testsuite">
<directory suffix="_test.php">public/favourites/tests</directory>
<exclude>public/favourites/tests/classes</exclude>
<exclude>public/favourites/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/favourites/tests</directory>
<exclude>@root@public/favourites/tests/classes</exclude>
<exclude>@root@public/favourites/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_form_testsuite">
<directory suffix="_test.php">public/lib/form/tests</directory>
<exclude>public/lib/form/tests/classes</exclude>
<exclude>public/lib/form/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/form/tests</directory>
<exclude>@root@public/lib/form/tests/classes</exclude>
<exclude>@root@public/lib/form/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_files_testsuite">
<directory suffix="_test.php">public/lib/filestorage/tests</directory>
<directory suffix="_test.php">public/lib/filebrowser/tests</directory>
<directory suffix="_test.php">public/files/tests</directory>
<exclude>public/lib/filestorage/tests/classes</exclude>
<exclude>public/lib/filestorage/tests/fixtures</exclude>
<exclude>public/lib/filebrowser/tests/classes</exclude>
<exclude>public/lib/filebrowser/tests/fixtures</exclude>
<exclude>public/files/tests/classes</exclude>
<exclude>public/files/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/filestorage/tests</directory>
<directory suffix="_test.php">@root@public/lib/filebrowser/tests</directory>
<directory suffix="_test.php">@root@public/files/tests</directory>
<exclude>@root@public/lib/filestorage/tests/classes</exclude>
<exclude>@root@public/lib/filestorage/tests/fixtures</exclude>
<exclude>@root@public/lib/filebrowser/tests/classes</exclude>
<exclude>@root@public/lib/filebrowser/tests/fixtures</exclude>
<exclude>@root@public/files/tests/classes</exclude>
<exclude>@root@public/files/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_filter_testsuite">
<directory suffix="_test.php">public/filter/tests</directory>
<exclude>public/filter/tests/classes</exclude>
<exclude>public/filter/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/filter/tests</directory>
<exclude>@root@public/filter/tests/classes</exclude>
<exclude>@root@public/filter/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_role_testsuite">
<directory suffix="_test.php">public/admin/roles/tests</directory>
<exclude>public/admin/roles/tests/classes</exclude>
<directory suffix="_test.php">@root@public/admin/roles/tests</directory>
<exclude>@root@public/admin/roles/tests/classes</exclude>
</testsuite>
<testsuite name="core_cohort_testsuite">
<directory suffix="_test.php">public/cohort/tests</directory>
<exclude>public/cohort/tests/classes</exclude>
<directory suffix="_test.php">@root@public/cohort/tests</directory>
<exclude>@root@public/cohort/tests/classes</exclude>
</testsuite>
<testsuite name="core_grades_testsuite">
<directory suffix="_test.php">public/lib/grade/tests</directory>
<directory suffix="_test.php">public/grade/tests</directory>
<directory suffix="_test.php">public/grade/grading/tests</directory>
<exclude>public/lib/grade/tests/classes</exclude>
<exclude>public/grade/tests/classes</exclude>
<exclude>public/grade/grading/tests/classes</exclude>
<directory suffix="_test.php">@root@public/lib/grade/tests</directory>
<directory suffix="_test.php">@root@public/grade/tests</directory>
<directory suffix="_test.php">@root@public/grade/grading/tests</directory>
<exclude>@root@public/lib/grade/tests/classes</exclude>
<exclude>@root@public/grade/tests/classes</exclude>
<exclude>@root@public/grade/grading/tests/classes</exclude>
</testsuite>
<testsuite name="core_analytics_testsuite">
<directory suffix="_test.php">public/analytics/tests</directory>
<exclude>public/analytics/tests/classes</exclude>
<directory suffix="_test.php">@root@public/analytics/tests</directory>
<exclude>@root@public/analytics/tests/classes</exclude>
</testsuite>
<testsuite name="core_availability_testsuite">
<directory suffix="_test.php">public/availability/tests</directory>
<exclude>public/availability/tests/classes</exclude>
<directory suffix="_test.php">@root@public/availability/tests</directory>
<exclude>@root@public/availability/tests/classes</exclude>
</testsuite>
<testsuite name="core_backup_testsuite">
<directory suffix="_test.php">public/backup/controller/tests</directory>
<directory suffix="_test.php">public/backup/converter/moodle1/tests</directory>
<directory suffix="_test.php">public/backup/moodle2/tests</directory>
<directory suffix="_test.php">public/backup/tests</directory>
<directory suffix="_test.php">public/backup/util</directory>
<exclude>public/backup/controller/tests/classes</exclude>
<exclude>public/backup/converter/moodle1/tests/classes</exclude>
<exclude>public/backup/moodle2/tests/classes</exclude>
<exclude>public/backup/tests/classes</exclude>
<exclude>public/backup/util/classes</exclude>
<directory suffix="_test.php">@root@public/backup/controller/tests</directory>
<directory suffix="_test.php">@root@public/backup/converter/moodle1/tests</directory>
<directory suffix="_test.php">@root@public/backup/moodle2/tests</directory>
<directory suffix="_test.php">@root@public/backup/tests</directory>
<directory suffix="_test.php">@root@public/backup/util</directory>
<exclude>@root@public/backup/controller/tests/classes</exclude>
<exclude>@root@public/backup/converter/moodle1/tests/classes</exclude>
<exclude>@root@public/backup/moodle2/tests/classes</exclude>
<exclude>@root@public/backup/tests/classes</exclude>
<exclude>@root@public/backup/util/classes</exclude>
</testsuite>
<testsuite name="core_badges_testsuite">
<directory suffix="_test.php">public/badges/tests</directory>
<exclude>public/badges/tests/classes</exclude>
<directory suffix="_test.php">@root@public/badges/tests</directory>
<exclude>@root@public/badges/tests/classes</exclude>
</testsuite>
<testsuite name="core_blog_testsuite">
<directory suffix="_test.php">public/blog/tests</directory>
<exclude>public/blog/tests/classes</exclude>
<directory suffix="_test.php">@root@public/blog/tests</directory>
<exclude>@root@public/blog/tests/classes</exclude>
</testsuite>
<testsuite name="core_customfield_testsuite">
<directory suffix="_test.php">public/customfield/tests</directory>
<exclude>public/customfield/tests/classes</exclude>
<directory suffix="_test.php">@root@public/customfield/tests</directory>
<exclude>@root@public/customfield/tests/classes</exclude>
</testsuite>
<testsuite name="core_iplookup_testsuite">
<directory suffix="_test.php">public/iplookup/tests</directory>
<exclude>public/iplookup/tests/classes</exclude>
<directory suffix="_test.php">@root@public/iplookup/tests</directory>
<exclude>@root@public/iplookup/tests/classes</exclude>
</testsuite>
<testsuite name="core_course_testsuite">
<directory suffix="_test.php">public/course/tests</directory>
<exclude>public/course/tests/classes</exclude>
<directory suffix="_test.php">@root@public/course/tests</directory>
<exclude>@root@public/course/tests/classes</exclude>
</testsuite>
<testsuite name="core_courseformat_testsuite">
<directory suffix="_test.php">public/course/format/tests</directory>
<exclude>public/course/format/tests/classes</exclude>
<directory suffix="_test.php">@root@public/course/format/tests</directory>
<exclude>@root@public/course/format/tests/classes</exclude>
</testsuite>
<testsuite name="core_privacy_testsuite">
<directory suffix="_test.php">public/privacy/tests</directory>
<exclude>public/privacy/tests/classes</exclude>
<directory suffix="_test.php">@root@public/privacy/tests</directory>
<exclude>@root@public/privacy/tests/classes</exclude>
</testsuite>
<testsuite name="core_question_testsuite">
<directory suffix="_test.php">public/question/engine/tests</directory>
<directory suffix="_test.php">public/question/tests</directory>
<directory suffix="_test.php">public/question/type/tests</directory>
<directory suffix="_test.php">public/question/engine/upgrade/tests</directory>
<exclude>public/question/engine/tests/classes</exclude>
<exclude>public/question/tests/classes</exclude>
<exclude>public/question/type/tests/classes</exclude>
<exclude>public/question/engine/upgrade/tests/classes</exclude>
<directory suffix="_test.php">@root@public/question/engine/tests</directory>
<directory suffix="_test.php">@root@public/question/tests</directory>
<directory suffix="_test.php">@root@public/question/type/tests</directory>
<directory suffix="_test.php">@root@public/question/engine/upgrade/tests</directory>
<exclude>@root@public/question/engine/tests/classes</exclude>
<exclude>@root@public/question/tests/classes</exclude>
<exclude>@root@public/question/type/tests/classes</exclude>
<exclude>@root@public/question/engine/upgrade/tests/classes</exclude>
</testsuite>
<testsuite name="core_cache_testsuite">
<directory suffix="_test.php">public/cache/tests</directory>
<exclude>public/cache/tests/classes</exclude>
<exclude>public/cache/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/cache/tests</directory>
<exclude>@root@public/cache/tests/classes</exclude>
<exclude>@root@public/cache/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_calendar_testsuite">
<directory suffix="_test.php">public/calendar/tests</directory>
<exclude>public/calendar/tests/classes</exclude>
<exclude>public/calendar/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/calendar/tests</directory>
<exclude>@root@public/calendar/tests/classes</exclude>
<exclude>@root@public/calendar/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_enrol_testsuite">
<directory suffix="_test.php">public/enrol/tests</directory>
<exclude>public/enrol/tests/classes</exclude>
<exclude>public/enrol/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/enrol/tests</directory>
<exclude>@root@public/enrol/tests/classes</exclude>
<exclude>@root@public/enrol/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_group_testsuite">
<directory suffix="_test.php">public/group/tests</directory>
<exclude>public/group/tests/classes</exclude>
<exclude>public/group/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/group/tests</directory>
<exclude>@root@public/group/tests/classes</exclude>
<exclude>@root@public/group/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_message_testsuite">
<directory suffix="_test.php">public/message/tests</directory>
<exclude>public/message/tests/classes</exclude>
<exclude>public/message/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/message/tests</directory>
<exclude>@root@public/message/tests/classes</exclude>
<exclude>@root@public/message/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_notes_testsuite">
<directory suffix="_test.php">public/notes/tests</directory>
<exclude>public/notes/tests/classes</exclude>
<exclude>public/notes/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/notes/tests</directory>
<exclude>@root@public/notes/tests/classes</exclude>
<exclude>@root@public/notes/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_tag_testsuite">
<directory suffix="_test.php">public/tag/tests</directory>
<exclude>public/tag/tests/classes</exclude>
<exclude>public/tag/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/tag/tests</directory>
<exclude>@root@public/tag/tests/classes</exclude>
<exclude>@root@public/tag/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_rating_testsuite">
<directory suffix="_test.php">public/rating/tests</directory>
<exclude>public/rating/tests/classes</exclude>
<exclude>public/rating/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/rating/tests</directory>
<exclude>@root@public/rating/tests/classes</exclude>
<exclude>@root@public/rating/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_repository_testsuite">
<directory suffix="_test.php">public/repository/tests</directory>
<exclude>public/repository/tests/classes</exclude>
<exclude>public/repository/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/repository/tests</directory>
<exclude>@root@public/repository/tests/classes</exclude>
<exclude>@root@public/repository/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_userkey_testsuite">
<directory suffix="_test.php">public/lib/userkey/tests</directory>
<exclude>public/lib/userkey/tests/classes</exclude>
<exclude>public/lib/userkey/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/userkey/tests</directory>
<exclude>@root@public/lib/userkey/tests/classes</exclude>
<exclude>@root@public/lib/userkey/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_user_testsuite">
<directory suffix="_test.php">public/user/tests</directory>
<exclude>public/user/tests/classes</exclude>
<exclude>public/user/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/user/tests</directory>
<exclude>@root@public/user/tests/classes</exclude>
<exclude>@root@public/user/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_webservice_testsuite">
<directory suffix="_test.php">public/webservice/tests</directory>
<exclude>public/webservice/tests/classes</exclude>
<exclude>public/webservice/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/webservice/tests</directory>
<exclude>@root@public/webservice/tests/classes</exclude>
<exclude>@root@public/webservice/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_mnet_testsuite">
<directory suffix="_test.php">public/mnet/tests</directory>
<exclude>public/mnet/tests/classes</exclude>
<exclude>public/mnet/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/mnet/tests</directory>
<exclude>@root@public/mnet/tests/classes</exclude>
<exclude>@root@public/mnet/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_completion_testsuite">
<directory suffix="_test.php">public/completion/tests</directory>
<exclude>public/completion/tests/classes</exclude>
<exclude>public/completion/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/completion/tests</directory>
<exclude>@root@public/completion/tests/classes</exclude>
<exclude>@root@public/completion/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_comment_testsuite">
<directory suffix="_test.php">public/comment/tests</directory>
<exclude>public/comment/tests/classes</exclude>
<exclude>public/comment/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/comment/tests</directory>
<exclude>@root@public/comment/tests/classes</exclude>
<exclude>@root@public/comment/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_search_testsuite">
<directory suffix="_test.php">public/search/tests</directory>
<exclude>public/search/tests/classes</exclude>
<exclude>public/search/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/search/tests</directory>
<exclude>@root@public/search/tests/classes</exclude>
<exclude>@root@public/search/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_competency_testsuite">
<directory suffix="_test.php">public/competency/tests</directory>
<exclude>public/competency/tests/classes</exclude>
<exclude>public/competency/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/competency/tests</directory>
<exclude>@root@public/competency/tests/classes</exclude>
<exclude>@root@public/competency/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_my_testsuite">
<directory suffix="_test.php">public/my/tests</directory>
<exclude>public/my/tests/classes</exclude>
<exclude>public/my/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/my/tests</directory>
<exclude>@root@public/my/tests/classes</exclude>
<exclude>@root@public/my/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_auth_testsuite">
<directory suffix="_test.php">public/auth/tests</directory>
<exclude>public/auth/tests/classes</exclude>
<exclude>public/auth/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/auth/tests</directory>
<exclude>@root@public/auth/tests/classes</exclude>
<exclude>@root@public/auth/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_block_testsuite">
<directory suffix="_test.php">public/blocks/tests</directory>
<exclude>public/blocks/tests/classes</exclude>
<exclude>public/blocks/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/blocks/tests</directory>
<exclude>@root@public/blocks/tests/classes</exclude>
<exclude>@root@public/blocks/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_login_testsuite">
<directory suffix="_test.php">public/login/tests</directory>
<exclude>public/login/tests/classes</exclude>
<exclude>public/login/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/login/tests</directory>
<exclude>@root@public/login/tests/classes</exclude>
<exclude>@root@public/login/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_plagiarism_testsuite">
<directory suffix="_test.php">public/plagiarism/tests</directory>
<exclude>public/plagiarism/tests/classes</exclude>
<exclude>public/plagiarism/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/plagiarism/tests</directory>
<exclude>@root@public/plagiarism/tests/classes</exclude>
<exclude>@root@public/plagiarism/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_portfolio_testsuite">
<directory suffix="_test.php">public/portfolio/tests</directory>
<exclude>public/portfolio/tests/classes</exclude>
<exclude>public/portfolio/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/portfolio/tests</directory>
<exclude>@root@public/portfolio/tests/classes</exclude>
<exclude>@root@public/portfolio/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_editor_testsuite">
<directory suffix="_test.php">public/lib/editor/tests</directory>
<exclude>public/lib/editor/tests/classes</exclude>
<exclude>public/lib/editor/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/editor/tests</directory>
<exclude>@root@public/lib/editor/tests/classes</exclude>
<exclude>@root@public/lib/editor/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_rss_testsuite">
<directory suffix="_test.php">public/rss/tests</directory>
<exclude>public/rss/tests/classes</exclude>
<exclude>public/rss/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/rss/tests</directory>
<exclude>@root@public/rss/tests/classes</exclude>
<exclude>@root@public/rss/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_table_testsuite">
<directory suffix="_test.php">public/lib/table/tests</directory>
<exclude>public/lib/table/tests/classes</exclude>
<exclude>public/lib/table/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/table/tests</directory>
<exclude>@root@public/lib/table/tests/classes</exclude>
<exclude>@root@public/lib/table/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_h5p_testsuite">
<directory suffix="_test.php">public/h5p/tests</directory>
<exclude>public/h5p/tests/classes</exclude>
<exclude>public/h5p/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/h5p/tests</directory>
<exclude>@root@public/h5p/tests/classes</exclude>
<exclude>@root@public/h5p/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_xapi_testsuite">
<directory suffix="_test.php">public/lib/xapi/tests</directory>
<exclude>public/lib/xapi/tests/classes</exclude>
<exclude>public/lib/xapi/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/lib/xapi/tests</directory>
<exclude>@root@public/lib/xapi/tests/classes</exclude>
<exclude>@root@public/lib/xapi/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_contentbank_testsuite">
<directory suffix="_test.php">public/contentbank/tests</directory>
<exclude>public/contentbank/tests/classes</exclude>
<exclude>public/contentbank/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/contentbank/tests</directory>
<exclude>@root@public/contentbank/tests/classes</exclude>
<exclude>@root@public/contentbank/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_payment_testsuite">
<directory suffix="_test.php">public/payment/tests</directory>
<exclude>public/payment/tests/classes</exclude>
<exclude>public/payment/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/payment/tests</directory>
<exclude>@root@public/payment/tests/classes</exclude>
<exclude>@root@public/payment/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_reportbuilder_testsuite">
<directory suffix="_test.php">public/reportbuilder/tests</directory>
<exclude>public/reportbuilder/tests/classes</exclude>
<exclude>public/reportbuilder/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/reportbuilder/tests</directory>
<exclude>@root@public/reportbuilder/tests/classes</exclude>
<exclude>@root@public/reportbuilder/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_adminpresets_testsuite">
<directory suffix="_test.php">public/admin/presets/tests</directory>
<exclude>public/admin/presets/tests/classes</exclude>
<exclude>public/admin/presets/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/admin/presets/tests</directory>
<exclude>@root@public/admin/presets/tests/classes</exclude>
<exclude>@root@public/admin/presets/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_admin_testsuite">
<directory suffix="_test.php">public/admin/tests</directory>
<exclude>public/admin/tests/classes</exclude>
<exclude>public/admin/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/admin/tests</directory>
<exclude>@root@public/admin/tests/classes</exclude>
<exclude>@root@public/admin/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_communication_testsuite">
<directory suffix="_test.php">public/communication/tests</directory>
<exclude>public/communication/tests/classes</exclude>
<exclude>public/communication/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/communication/tests</directory>
<exclude>@root@public/communication/tests/classes</exclude>
<exclude>@root@public/communication/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_ai_testsuite">
<directory suffix="_test.php">public/ai/tests</directory>
<exclude>public/ai/tests/classes</exclude>
<exclude>public/ai/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/ai/tests</directory>
<exclude>@root@public/ai/tests/classes</exclude>
<exclude>@root@public/ai/tests/fixtures</exclude>
</testsuite>
<testsuite name="core_sms_testsuite">
<directory suffix="_test.php">public/sms/tests</directory>
<exclude>public/sms/tests/classes</exclude>
<exclude>public/sms/tests/fixtures</exclude>
<directory suffix="_test.php">@root@public/sms/tests</directory>
<exclude>@root@public/sms/tests/classes</exclude>
<exclude>@root@public/sms/tests/fixtures</exclude>
</testsuite>
<!--Plugin suites: use admin/tool/phpunit/cli/util.php to build phpunit.xml from

View File

@@ -44,6 +44,11 @@ putenv('BEHAT_CLI=0');
require_once(__DIR__ . '/../../../../lib/clilib.php');
require_once(__DIR__ . '/../../../../lib/behat/lib.php');
$autoload = __DIR__ . '/../../../../../vendor/autoload.php';
if (file_exists($autoload)) {
require_once($autoload);
}
list($options, $unrecognized) = cli_get_params(
array(
'parallel' => 0,

View File

@@ -94,7 +94,9 @@ if (!empty($options['help'])) {
// The command will install composer if not present. Usually composer libraries are
// installed when behat or phpunit are installed, but we do not want to force users
// to create all phpunit or behat databases tables just to run a test scenario locally.
if (!file_exists($CFG->dirroot . '/../vendor/autoload.php')) {
require_once(dirname(__DIR__, 4) . '/autoload.php');
if (!class_exists(\Composer\Autoload\ClassLoader::class)) {
// Force OPcache reset if used, we do not want any stale caches
// when preparing test environment.
if (function_exists('opcache_reset')) {

View File

@@ -42,6 +42,11 @@ require_once(__DIR__.'/../../../../lib/clilib.php');
require_once(__DIR__.'/../../../../lib/phpunit/bootstraplib.php');
require_once(__DIR__.'/../../../../lib/testing/lib.php');
$autoload = __DIR__ . '/../../../../../vendor/autoload.php';
if (file_exists($autoload)) {
require_once($autoload);
}
list($options, $unrecognized) = cli_get_params(
[
'help' => false,

View File

@@ -57,10 +57,21 @@ list($options, $unrecognized) = cli_get_params(
);
// Basic check to see if phpunit is installed.
if (!file_exists(__DIR__.'/../../../../../vendor/phpunit/phpunit/composer.json') ||
!file_exists(__DIR__.'/../../../../../vendor/bin/phpunit') ||
!file_exists(__DIR__.'/../../../../../vendor/autoload.php')) {
phpunit_bootstrap_error(PHPUNIT_EXITCODE_PHPUNITMISSING);
$autoload = __DIR__ . '/../../../../../vendor/autoload.php';
if (file_exists($autoload)) {
require_once($autoload);
}
$requiredclasses = [
\Composer\Autoload\ClassLoader::class,
\PHPUnit\Runner\Version::class,
];
foreach ($requiredclasses as $requiredclass) {
if (!class_exists($requiredclass)) {
phpunit_bootstrap_error(PHPUNIT_EXITCODE_PHPUNITMISSING);
}
}
if ($options['install'] || $options['drop']) {

View File

@@ -40,6 +40,22 @@ class coverage_info {
/** @var array The list of files relative to the plugin root to exclude from coverage generation. */
protected $excludelistfiles = [];
/** @var string The base directory to use */
protected string $basedir = "";
/**
* Specify the base directory to use for coverage.
*
* @param string $basedir
*/
final public function set_basedir(string $basedir): void {
if ($basedir === '') {
$this->basedir = '';
} else {
$this->basedir = trim($basedir, '/') . "/";
}
}
/**
* Get the formatted XML list of files and folders to include.
*
@@ -67,11 +83,11 @@ class coverage_info {
}
foreach (array_unique($includelistfolders) as $folder) {
$coverages[] = html_writer::tag('directory', "{$plugindir}{$folder}", ['suffix' => '.php']);
$coverages[] = html_writer::tag('directory', "{$this->basedir}{$plugindir}{$folder}", ['suffix' => '.php']);
}
foreach (array_unique($includelistfiles) as $file) {
$coverages[] = html_writer::tag('file', "{$plugindir}{$file}");
$coverages[] = html_writer::tag('file', "{$this->basedir}{$plugindir}{$file}");
}
return $coverages;
@@ -91,11 +107,11 @@ class coverage_info {
}
foreach ($this->excludelistfolders as $folder) {
$coverages[] = html_writer::tag('directory', "{$plugindir}{$folder}", ['suffix' => '.php']);
$coverages[] = html_writer::tag('directory', "{$this->basedir}{$plugindir}{$folder}", ['suffix' => '.php']);
}
foreach ($this->excludelistfiles as $file) {
$coverages[] = html_writer::tag('file', "{$plugindir}{$file}");
$coverages[] = html_writer::tag('file', "{$this->basedir}{$plugindir}{$file}");
}
return $coverages;

View File

@@ -0,0 +1,27 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core\test\phpunit\exception;
/**
* An exception thrown when an error is encountered in the setup, teardown, or other non-test parts of a unit test.
*
* @package core_testing
* @copyright Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class test_exception extends \core\exception\coding_exception {
}

View File

@@ -313,7 +313,7 @@ class phpunit_util extends \core\test\testing_util {
if ($warnings) {
$warnings = implode("\n", $warnings);
throw new \core_phpunit\exception\test_exception($warnings);
throw new \core\test\phpunit\exception\test_exception($warnings);
}
}
@@ -362,6 +362,10 @@ class phpunit_util extends \core\test\testing_util {
// Refresh data in all tables, clear caches, etc.
self::reset_all_data();
// Manually load the test_exception class here for legacy purposes.
require_once($CFG->libdir . '/phpunit/classes/exception/test_exception.php');
}
/**
@@ -524,11 +528,13 @@ class phpunit_util extends \core\test\testing_util {
public static function build_config_file() {
global $CFG;
$moodleroot = self::get_moodle_relative_to_root_package();
$template = <<<EOF
<testsuite name="@component@_testsuite">
<directory suffix="_test.php">public/@dir@</directory>
<exclude>public/@dir@/classes</exclude>
<exclude>public/@dir@/fixtures</exclude>
<directory suffix="_test.php">@root@@dir@</directory>
<exclude>@root@@dir@/classes</exclude>
<exclude>@root@@dir@/fixtures</exclude>
</testsuite>
EOF;
@@ -549,10 +555,10 @@ class phpunit_util extends \core\test\testing_util {
continue;
}
$dir = substr($fulldir, strlen($CFG->dirroot) + 1);
if ($coverageinfo = self::get_coverage_info($fulldir)) {
$includelists = array_merge($includelists, $coverageinfo->get_includelists("public/{$dir}"));
$excludelists = array_merge($excludelists, $coverageinfo->get_excludelists("public/{$dir}"));
$dir = substr($fulldir, strlen($CFG->root) + 1);
if ($coverageinfo = self::get_coverage_info($fulldir, $moodleroot)) {
$includelists = array_merge($includelists, $coverageinfo->get_includelists($dir));
$excludelists = array_merge($excludelists, $coverageinfo->get_excludelists($dir));
}
}
@@ -567,18 +573,19 @@ class phpunit_util extends \core\test\testing_util {
continue;
}
$dir = substr($plugindir, strlen($CFG->dirroot) + 1);
$dir = substr($plugindir, strlen($CFG->root) + 1);
$testdir = "{$dir}/tests";
$component = "{$type}_{$plug}";
$suite = str_replace('@component@', $component, $template);
$suite = str_replace('@dir@', $testdir, $suite);
$suite = str_replace('@root@', $moodleroot, $suite);
$suites .= $suite;
if ($coverageinfo = self::get_coverage_info($plugindir)) {
$includelists = array_merge($includelists, $coverageinfo->get_includelists("public/{$dir}"));
$excludelists = array_merge($excludelists, $coverageinfo->get_excludelists("public/{$dir}"));
if ($coverageinfo = self::get_coverage_info($plugindir, $moodleroot)) {
$includelists = array_merge($includelists, $coverageinfo->get_includelists($dir));
$excludelists = array_merge($excludelists, $coverageinfo->get_excludelists($dir));
}
}
}
@@ -594,18 +601,21 @@ class phpunit_util extends \core\test\testing_util {
'<const name="PHPUNIT_SEQUENCE_START" value="' . $sequencestart . '"/>',
$data
);
$data = str_replace('@root@', $moodleroot, $data);
$coverages = self::get_coverage_config($includelists, $excludelists);
$data = preg_replace('| *<!--@coveragelist@-->|s', trim($coverages, "\n"), $data);
$result = false;
if (is_writable($CFG->dirroot)) {
if ($result = file_put_contents("$CFG->root/phpunit.xml", $data)) {
testing_fix_file_permissions("$CFG->root/phpunit.xml");
$packageroot = self::get_package_root();
if (is_writable($packageroot)) {
if ($result = file_put_contents("$packageroot/phpunit.xml", $data)) {
testing_fix_file_permissions("$packageroot/phpunit.xml");
}
}
return (bool)$result;
return (bool) $result;
}
/**
@@ -642,9 +652,11 @@ class phpunit_util extends \core\test\testing_util {
// Use the upstream file as source for the distributed configurations.
$ftemplate = file_get_contents("$CFG->root/phpunit.xml.dist");
$ftemplate = preg_replace('| *<!--All core suites.*</testsuites>|s', '<!--@component_suite@-->', $ftemplate);
$ftemplate = str_replace('@root@', '', $ftemplate);
// Gets all the components with tests.
$components = \tests_finder::get_components_with_tests('phpunit');
$moodleroot = self::get_moodle_relative_to_root_package();
// Create the corresponding phpunit.xml file for each component.
foreach ($components as $cname => $cpath) {
@@ -655,7 +667,7 @@ class phpunit_util extends \core\test\testing_util {
$fcontents = str_replace('<!--@component_suite@-->', $ctemplate, $ftemplate);
// Check for coverage configurations.
if ($coverageinfo = self::get_coverage_info($cpath)) {
if ($coverageinfo = self::get_coverage_info($cpath, $moodleroot)) {
$coverages = self::get_coverage_config($coverageinfo->get_includelists(''), $coverageinfo->get_excludelists(''));
} else {
$coverages = $coveragedefault;
@@ -1039,21 +1051,26 @@ class phpunit_util extends \core\test\testing_util {
/**
* Get the \core\test\phpunit\coverage_info for the specified plugin or subsystem directory.
*
* @param string $fulldir The directory to find the coverage info file in.
* @return \core\test\phpunit\coverage_info
* @param string $fulldir The directory to find the coverage info file in
* @param string $moodleroot The base directory that Moodle is in relative to root package composer.json
* @return coverage_info
*/
protected static function get_coverage_info(string $fulldir): \core\test\phpunit\coverage_info {
protected static function get_coverage_info(
string $fulldir,
string $moodleroot,
): coverage_info {
$coverageconfig = "{$fulldir}/tests/coverage.php";
if (file_exists($coverageconfig)) {
$coverageinfo = require($coverageconfig);
if (!$coverageinfo instanceof \core\test\phpunit\coverage_info) {
throw new \coding_exception("{$coverageconfig} does not return a \core\test\phpunit\coverage_info");
if (!$coverageinfo instanceof coverage_info) {
throw new \core\exception\coding_exception("{$coverageconfig} does not return a \core\test\phpunit\coverage_info");
}
return $coverageinfo;
} else {
$coverageinfo = new coverage_info();
}
return new \core\test\phpunit\coverage_info();
$coverageinfo->set_basedir($moodleroot);
return $coverageinfo;
}
/**
@@ -1072,6 +1089,15 @@ class phpunit_util extends \core\test\testing_util {
protected static function get_framework() {
return 'phpunit';
}
/**
* Get the path to the root of the package Moodle is installed in.
*
* @return bool|string
*/
protected static function get_package_root(): string {
return realpath(\Composer\InstalledVersions::getRootPackage()['install_path']);
}
}
// Alias this class to the old name.

View File

@@ -1020,6 +1020,42 @@ abstract class testing_util {
return $env;
}
/**
* Get the path to the Moodle root, relative to the root package.
*
* @return string
*/
public static function get_moodle_relative_to_root_package(): string {
global $CFG;
$rootpackage = \Composer\InstalledVersions::getRootPackage();
$rootpath = realpath(\Composer\InstalledVersions::getRootPackage()['install_path']);
$moodlepath = realpath($CFG->root);
if ($rootpath === $moodlepath) {
// Moodle is the root package.
return '';
}
// At the moment there is no way to get the name of the Moodle core package from the provided package.
// So we need to get all installed moodle-core packages and check which one is installed.
// It's only really possible for a single moodle-core package to be installed.
$moodlecorepackages = \Composer\InstalledVersions::getInstalledPackagesByType('moodle-core');
if (count($moodlecorepackages) !== 1) {
throw new \core\exception\coding_exception('Unable to determine Moodle root relative to root package.');
}
$moodlecorepackage = reset($moodlecorepackages);
if (\Composer\InstalledVersions::isInstalled($moodlecorepackage)) {
$installpath = \Composer\InstalledVersions::getInstallPath($moodlecorepackage);
if ($installpath !== null) {
// Moodle core is installed as a composer package.
return basename($installpath) . '/';
}
}
throw new \core\exception\coding_exception('Unable to determine Moodle root relative to root package.');
}
}
// Alias this class to the old name.

View File

@@ -23,5 +23,5 @@ namespace core_phpunit\exception;
* @copyright Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class test_exception extends \core\exception\coding_exception {
}
class_alias(\core\test\phpunit\exception\test_exception::class, test_exception::class);

View File

@@ -16,7 +16,7 @@
namespace core;
use core_phpunit\exception\test_exception;
use core\test\phpunit\exception\test_exception;
/**
* Test advanced_testcase extra features.

View File

@@ -233,7 +233,7 @@ STRING;
global $DB;
$DB->set_field('user', 'confirmed', 1, ['id' => -1]);
$this->expectException(\core_phpunit\exception\test_exception::class);
$this->expectException(\core\test\phpunit\exception\test_exception::class);
$this->expectExceptionMessage('Warning: unexpected database modification');
phpunit_util::reset_all_data(true);
}