Autoría | Ultima modificación | Ver Log |
<?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 mod_forum\message\inbound;use advanced_testcase;use core\context\module;use core\message\inbound\{manager, processing_failed_exception};use mod_forum_generator;use stdClass;use Throwable;/*** Unit tests for the reply handler** @package mod_forum* @covers \mod_forum\message\inbound\reply_handler* @copyright 2024 Paul Holden <paulh@moodle.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/final class reply_handler_test extends advanced_testcase {/*** Test attachment processing*/public function test_process_message_attachments(): void {global $DB;$this->resetAfterTest();$course = $this->getDataGenerator()->create_course(['maxbytes' => 1024]);$forum = $this->getDataGenerator()->create_module('forum', ['course' => $course->id, 'maxbytes' => 0]);$user = $this->getDataGenerator()->create_and_enrol($course);$this->setUser($user);[$discussion, $post] = $this->create_discussion_with_post($forum, $user);$output = $this->reply_handler_process_message($post, 'My reply', 'Hello', (object) ['filename' => 'Foo.txt','content' => 'Foo','filesize' => 3,]);$this->assertMatchesRegularExpression('/Processing Foo.txt as an attachment./', $output);$this->assertMatchesRegularExpression('/Attaching Foo.txt to/', $output);$this->assertMatchesRegularExpression('/Created a post \d+ in \d+./', $output);// Assert our reply was added with attachment.$newpost = $DB->get_record('forum_posts', ['discussion' => $discussion->id,'subject' => 'My reply','attachment' => 1,], '*', MUST_EXIST);$attachments = get_file_storage()->get_area_files(module::instance($forum->cmid)->id,'mod_forum','attachment',$newpost->id,'id',false,);$this->assertCount(1, $attachments);$this->assertEquals('Foo.txt', reset($attachments)->get_filename());}/*** Test attachment processing where maxbytes is exceeded*/public function test_process_message_attachments_over_maxbytes(): void {$this->resetAfterTest();$course = $this->getDataGenerator()->create_course();$forum = $this->getDataGenerator()->create_module('forum', ['course' => $course->id, 'maxbytes' => 2]);$user = $this->getDataGenerator()->create_and_enrol($course);$this->setUser($user);[$discussion, $post] = $this->create_discussion_with_post($forum, $user);$this->expectException(processing_failed_exception::class);$this->expectExceptionMessage('Unable to post your reply, since the total attachment size (3 bytes) is greater than ' .'the maximum size allowed for the forum (2 bytes)');$this->reply_handler_process_message($post, 'My reply', 'Hello', (object) ['filename' => 'Foo.txt','content' => 'Foo','filesize' => 3,]);}/*** Helper to generate discussion/post data** @param stdClass $forum* @param stdClass $user* @return stdClass[]*/private function create_discussion_with_post(stdClass $forum, stdClass $user): array {/** @var mod_forum_generator $generator */$generator = $this->getDataGenerator()->get_plugin_generator('mod_forum');$discussion = $generator->create_discussion(['course' => $forum->course, 'forum' => $forum->id, 'userid' => $user->id]);$post = $generator->create_post(['discussion' => $discussion->id, 'userid' => $user->id]);return [$discussion, $post];}/*** Helper to process message details using the reply handler** @param stdClass $post* @param string $subject* @param string $message* @param stdClass $attachment* @return string Output buffer from the handler*/private function reply_handler_process_message(stdClass $post,string $subject,string $message,stdClass $attachment,): string {// Start capturing output.ob_start();/** @var reply_handler $handler */$handler = manager::get_handler(reply_handler::class);try {$handler->process_message((object) ['datavalue' => $post->id,],(object) ['envelope' => (object) ['subject' => $subject,],'plain' => $message,'attachments' => ['attachment' => [$attachment,],],'timestamp' => time(),],);} catch (Throwable $ex) {ob_end_clean();throw $ex;}// Return captured output buffer.return (string) ob_get_clean();}}