diff --git a/mod/assign/submission/file/locallib.php b/mod/assign/submission/file/locallib.php index 2a02a855fcb..3b1959bf7f3 100644 --- a/mod/assign/submission/file/locallib.php +++ b/mod/assign/submission/file/locallib.php @@ -513,8 +513,16 @@ class assign_submission_file extends assign_submission_plugin { * @return bool */ public function submission_is_empty(stdClass $data) { - $files = file_get_drafarea_files($data->files_filemanager); - return count($files->list) == 0; + global $USER; + $fs = get_file_storage(); + // Get a count of all the draft files, excluding any directories. + $files = $fs->get_area_files(context_user::instance($USER->id)->id, + 'user', + 'draft', + $data->files_filemanager, + 'id', + false); + return count($files) == 0; } /** diff --git a/mod/assign/submission/file/tests/locallib_test.php b/mod/assign/submission/file/tests/locallib_test.php index b033946bb33..c055ecedc80 100644 --- a/mod/assign/submission/file/tests/locallib_test.php +++ b/mod/assign/submission/file/tests/locallib_test.php @@ -72,6 +72,34 @@ class assignsubmission_file_locallib_testcase extends advanced_testcase { $this->assertTrue($result === $expected); } + /** + * Test that an empty directory is is not detected as a valid submission by submission_is_empty. + */ + public function test_submission_is_empty_directory_only() { + $this->resetAfterTest(); + $course = $this->getDataGenerator()->create_course(); + $student = $this->getDataGenerator()->create_and_enrol($course, 'student'); + $assign = $this->create_instance($course, [ + 'assignsubmission_file_enabled' => 1, + 'assignsubmission_file_maxfiles' => 12, + 'assignsubmission_file_maxsizebytes' => 10, + ]); + $this->setUser($student->id); + $itemid = file_get_unused_draft_itemid(); + $submission = (object)['files_filemanager' => $itemid]; + $plugin = $assign->get_submission_plugin_by_type('file'); + $fs = get_file_storage(); + $fs->create_directory( + context_user::instance($student->id)->id, + 'user', + 'draft', + $itemid, + '/subdirectory/' + ); + + $this->assertTrue($plugin->submission_is_empty($submission)); + } + /** * Test new_submission_empty * @@ -105,6 +133,34 @@ class assignsubmission_file_locallib_testcase extends advanced_testcase { $this->assertTrue($result === $expected); } + /** + * Test that an empty directory is is not detected as a valid submission by new_submission_is_empty. + */ + public function test_new_submission_empty_directory_only() { + $this->resetAfterTest(); + $course = $this->getDataGenerator()->create_course(); + $student = $this->getDataGenerator()->create_and_enrol($course, 'student'); + $assign = $this->create_instance($course, [ + 'assignsubmission_file_enabled' => 1, + 'assignsubmission_file_maxfiles' => 12, + 'assignsubmission_file_maxsizebytes' => 10, + ]); + $this->setUser($student->id); + $itemid = file_get_unused_draft_itemid(); + $submission = (object)['files_filemanager' => $itemid]; + $plugin = $assign->get_submission_plugin_by_type('file'); + $fs = get_file_storage(); + $fs->create_directory( + context_user::instance($student->id)->id, + 'user', + 'draft', + $itemid, + '/subdirectory/' + ); + + $this->assertTrue($assign->new_submission_empty($submission)); + } + /** * Dataprovider for the test_submission_is_empty testcase * @@ -121,6 +177,15 @@ class assignsubmission_file_locallib_testcase extends advanced_testcase { ], false ], + 'With file in directory' => [ + [ + 'component' => 'user', + 'filearea' => 'draft', + 'filepath' => '/subdir/', + 'filename' => 'not_a_virus.exe' + ], + false + ], 'Without file' => [null, true] ]; }